diff --git a/CNAME b/CNAME
new file mode 100644
index 000000000..cbbd2196d
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+blog.sakurasep.site
\ No newline at end of file
diff --git a/about/index.html b/about/index.html
new file mode 100644
index 000000000..305f188cf
--- /dev/null
+++ b/about/index.html
@@ -0,0 +1,4770 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Damedame
+
+
+
+
+
+
海猫!安哲拉才不是海猫!
+
20岁了,为梦想奋斗
+
个人简介
- 爱好:ACGN,Coding,创作
- 喜欢:探索新奇的事物,
可爱的女孩子 - 目前在玩的游戏:Arknights,CSGO,APEX,崩坏3
- 运动:散步,骑行
- 目标:人民教师||自由开发者||自媒体
- 希望拥有的技能:多国语言||美术设计||3D建模
+
+
Always believe that something wonderful is about to happen.
+
+
+
我的人生目标(暂时)
+
+
+
+
+
+
+
前端
+
+
+
项目截图
+
上杉九月-个人主页 上杉九月-Hexo博客 上杉九月-Typecho博客 上杉九月-Halo博客 上杉九月-Hugo博客 上杉九月-兰空图床 上杉九月-Cloudreve云盘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app.js b/app.js
new file mode 100644
index 000000000..6c2539d6d
--- /dev/null
+++ b/app.js
@@ -0,0 +1,1259 @@
+"use strict";
+
+function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
+function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
+function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
+function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
+function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
+function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
+function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
+function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
+document.addEventListener("DOMContentLoaded", function () {
+ volantis.requestAnimationFrame(function () {
+ VolantisApp.init();
+ VolantisApp.subscribe();
+ VolantisFancyBox.init();
+ highlightKeyWords.startFromURL();
+ locationHash();
+ });
+});
+
+/* 锚点定位 */
+var locationHash = function locationHash() {
+ if (window.location.hash) {
+ var locationID = decodeURI(window.location.hash.split('#')[1]).replace(/\ /g, '-');
+ var target = document.getElementById(locationID);
+ if (target) {
+ setTimeout(function () {
+ if (window.location.hash.startsWith('#fn')) {
+ // hexo-reference https://github.com/volantis-x/hexo-theme-volantis/issues/647
+ volantis.scroll.to(target, {
+ addTop: -volantis.dom.header.offsetHeight - 5,
+ behavior: 'instant',
+ observer: true
+ });
+ } else {
+ // 锚点中上半部有大片空白 高度大概是 volantis.dom.header.offsetHeight
+ volantis.scroll.to(target, {
+ addTop: 5,
+ behavior: 'instant',
+ observer: true
+ });
+ }
+ }, 1000);
+ }
+ }
+};
+Object.freeze(locationHash);
+
+/* Main */
+var VolantisApp = function () {
+ var fn = {},
+ COPYHTML = '';
+ var scrollCorrection = 80;
+ fn.init = function () {
+ if (volantis.dom.header) {
+ scrollCorrection = volantis.dom.header.clientHeight + 16;
+ }
+ window.onresize = function () {
+ if (document.documentElement.clientWidth < 500) {
+ volantis.isMobile = 1;
+ } else {
+ volantis.isMobile = 0;
+ }
+ if (volantis.isMobile != volantis.isMobileOld) {
+ fn.setGlobalHeaderMenuEvent();
+ fn.setHeader();
+ fn.setHeaderSearch();
+ }
+ };
+ volantis.scroll.push(fn.scrollEventCallBack, "scrollEventCallBack");
+ };
+ fn.event = function () {
+ var _volantis$dom$$;
+ (_volantis$dom$$ = volantis.dom.$(document.getElementById("scroll-down"))) === null || _volantis$dom$$ === void 0 ? void 0 : _volantis$dom$$.on('click', function () {
+ fn.scrolltoElement(volantis.dom.bodyAnchor);
+ });
+
+ // 如果 sidebar 为空,隐藏 sidebar。
+ var sidebar = document.querySelector("#l_side");
+ if (sidebar) {
+ var sectionList = sidebar.querySelectorAll("section");
+ if (!sectionList.length) {
+ document.querySelector("#l_main").classList.add("no_sidebar");
+ }
+ }
+
+ // 站点信息 最后活动日期
+ if (volantis.GLOBAL_CONFIG.sidebar.for_page.includes('webinfo') || volantis.GLOBAL_CONFIG.sidebar.for_post.includes('webinfo')) {
+ var lastupd = volantis.GLOBAL_CONFIG.sidebar.webinfo.lastupd;
+ if (!!document.getElementById('last-update-show') && lastupd.enable && lastupd.friendlyShow) {
+ document.getElementById('last-update-show').innerHTML = fn.utilTimeAgo(volantis.GLOBAL_CONFIG.lastupdate);
+ }
+ }
+
+ // 站点信息 运行时间
+ if (!!document.getElementById('webinfo-runtime-count')) {
+ var BirthDay = new Date(volantis.GLOBAL_CONFIG.sidebar.webinfo.runtime.data);
+ var timeold = new Date().getTime() - BirthDay.getTime();
+ var daysold = Math.floor(timeold / (24 * 60 * 60 * 1000));
+ document.getElementById('webinfo-runtime-count').innerHTML = "".concat(daysold, " ").concat(volantis.GLOBAL_CONFIG.sidebar.webinfo.runtime.unit);
+ }
+
+ // 消息提示 复制时弹出
+ document.body.oncopy = function () {
+ fn.messageCopyright();
+ };
+ };
+ fn.restData = function () {
+ scrollCorrection = volantis.dom.header ? volantis.dom.header.clientHeight + 16 : 80;
+ };
+ fn.setIsMobile = function () {
+ if (document.documentElement.clientWidth < 500) {
+ volantis.isMobile = 1;
+ volantis.isMobileOld = 1;
+ } else {
+ volantis.isMobile = 0;
+ volantis.isMobileOld = 0;
+ }
+ };
+
+ // 校正页面定位(被导航栏挡住的区域)
+ fn.scrolltoElement = function (elem) {
+ var correction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scrollCorrection;
+ volantis.scroll.to(elem, {
+ top: elem.getBoundingClientRect().top + document.documentElement.scrollTop - correction
+ });
+ };
+
+ // 滚动事件回调们
+ fn.scrollEventCallBack = function () {
+ // 【移动端 PC】//////////////////////////////////////////////////////////////////////
+
+ // 显示/隐藏 Header导航 topBtn 【移动端 PC】
+ var showHeaderPoint = volantis.dom.bodyAnchor.offsetTop - scrollCorrection;
+ var scrollTop = volantis.scroll.getScrollTop(); // 滚动条距离顶部的距离
+
+ // topBtn
+ if (volantis.dom.topBtn) {
+ if (scrollTop > volantis.dom.bodyAnchor.offsetTop) {
+ volantis.dom.topBtn.addClass('show');
+ // 向上滚动高亮 topBtn
+ if (volantis.scroll.del > 0) {
+ volantis.dom.topBtn.removeClass('hl');
+ } else {
+ volantis.dom.topBtn.addClass('hl');
+ }
+ } else {
+ volantis.dom.topBtn.removeClass('show').removeClass('hl');
+ }
+ }
+
+ // Header导航
+ if (volantis.dom.header) {
+ if (scrollTop - showHeaderPoint > -1) {
+ volantis.dom.header.addClass('show');
+ } else {
+ volantis.dom.header.removeClass('show');
+ }
+ }
+
+ // 决定一二级导航栏的切换 【向上滚动切换为一级导航栏;向下滚动切换为二级导航栏】 【移动端 PC】
+ if (pdata.ispage && volantis.dom.wrapper) {
+ if (volantis.scroll.del > 0 && scrollTop > 100) {
+ // 向下滚动
+ volantis.dom.wrapper.addClass('sub'); // <---- 二级导航显示
+ } else if (volantis.scroll.del < 0) {
+ // 向上滚动
+ volantis.dom.wrapper.removeClass('sub'); // <---- 取消二级导航显示 一级导航显示
+ }
+ }
+
+ // 【移动端】//////////////////////////////////////////////////////////////////////
+ if (volantis.isMobile) {
+ // 【移动端】 页面滚动 隐藏 移动端toc目录按钮
+ if (pdata.ispage && volantis.dom.tocTarget && volantis.dom.toc) {
+ volantis.dom.tocTarget.removeClass('active');
+ volantis.dom.toc.removeClass('active');
+ }
+ // 【移动端】 滚动时隐藏子菜单
+ if (volantis.dom.mPhoneList) {
+ volantis.dom.mPhoneList.forEach(function (e) {
+ volantis.dom.$(e).hide();
+ });
+ }
+ }
+ };
+
+ // 设置滚动锚点
+ fn.setScrollAnchor = function () {
+ // click topBtn 滚动至bodyAnchor 【移动端 PC】
+ if (volantis.dom.topBtn && volantis.dom.bodyAnchor) {
+ volantis.dom.topBtn.click(function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ fn.scrolltoElement(volantis.dom.bodyAnchor);
+ e.stopImmediatePropagation();
+ });
+ }
+ };
+
+ // 设置导航栏
+ fn.setHeader = function () {
+ // !!! 此处的Dom对象需要重载 !!!
+ if (!pdata.ispage) return;
+
+ // 填充二级导航文章标题 【移动端 PC】
+ volantis.dom.wrapper.find('.nav-sub .title').html(document.title.split(" - ")[0]);
+
+ // ====== bind events to every btn =========
+ // 评论按钮 【移动端 PC】
+ volantis.dom.comment = volantis.dom.$(document.getElementById("s-comment")); // 评论按钮 桌面端 移动端
+ volantis.dom.commentTarget = volantis.dom.$(document.querySelector('#l_main article#comments')); // 评论区域
+ if (volantis.dom.commentTarget) {
+ volantis.dom.comment.click(function (e) {
+ // 评论按钮点击后 跳转到评论区域
+ e.preventDefault();
+ e.stopPropagation();
+ volantis.cleanContentVisibility();
+ fn.scrolltoElement(volantis.dom.commentTarget);
+ e.stopImmediatePropagation();
+ });
+ } else volantis.dom.comment.style.display = 'none'; // 关闭了评论,则隐藏评论按钮
+
+ // 移动端toc目录按钮 【移动端】
+ if (volantis.isMobile) {
+ volantis.dom.toc = volantis.dom.$(document.getElementById("s-toc")); // 目录按钮 仅移动端
+ volantis.dom.tocTarget = volantis.dom.$(document.querySelector('#l_side .toc-wrapper')); // 侧边栏的目录列表
+ if (volantis.dom.tocTarget) {
+ // 点击移动端目录按钮 激活目录按钮 显示侧边栏的目录列表
+ volantis.dom.toc.click(function (e) {
+ e.stopPropagation();
+ volantis.dom.tocTarget.toggleClass('active');
+ volantis.dom.toc.toggleClass('active');
+ });
+ // 点击空白 隐藏
+ volantis.dom.$(document).click(function (e) {
+ e.stopPropagation();
+ if (volantis.dom.tocTarget) {
+ volantis.dom.tocTarget.removeClass('active');
+ }
+ volantis.dom.toc.removeClass('active');
+ });
+ } else if (volantis.dom.toc) volantis.dom.toc.style.display = 'none'; // 隐藏toc目录按钮
+ }
+ };
+
+ // 设置导航栏菜单选中状态 【移动端 PC】
+ fn.setHeaderMenuSelection = function () {
+ // !!! 此处的Dom对象需要重载 !!!
+ volantis.dom.headerMenu = volantis.dom.$(document.querySelectorAll('#l_header .navigation,#l_cover .navigation,#l_side .navigation')); // 导航列表
+
+ // 先把已经激活的取消激活
+ volantis.dom.headerMenu.forEach(function (element) {
+ var li = volantis.dom.$(element).find('li a.active');
+ if (li) li.removeClass('active');
+ var div = volantis.dom.$(element).find('div a.active');
+ if (div) div.removeClass('active');
+ });
+
+ // replace '%' '/' '.'
+ var idname = location.pathname.replace(/\/|%|\./g, '');
+ if (idname.length == 0) {
+ idname = 'home';
+ }
+ var page = idname.match(/page\d{0,}$/g);
+ if (page) {
+ page = page[0];
+ idname = idname.split(page)[0];
+ }
+ var index = idname.match(/index.html/);
+ if (index) {
+ index = index[0];
+ idname = idname.split(index)[0];
+ }
+ // 转义字符如 [, ], ~, #, @
+ idname = idname.replace(/(\[|\]|~|#|@)/g, '\\$1');
+ if (idname && volantis.dom.headerMenu) {
+ volantis.dom.headerMenu.forEach(function (element) {
+ // idname 不能为数字开头, 加一个 action- 前缀
+ var id = element.querySelector("[active-action=action-" + idname + "]");
+ if (id) {
+ volantis.dom.$(id).addClass('active');
+ }
+ });
+ }
+ };
+
+ // 设置全局事件
+ fn.setGlobalHeaderMenuEvent = function () {
+ if (volantis.isMobile) {
+ // 【移动端】 关闭已经展开的子菜单 点击展开子菜单
+ document.querySelectorAll('#l_header .m-phone li').forEach(function (e) {
+ if (e.querySelector(".list-v")) {
+ // 点击菜单
+ volantis.dom.$(e).click(function (e) {
+ e.stopPropagation();
+ // 关闭已经展开的子菜单
+ e.currentTarget.parentElement.childNodes.forEach(function (e) {
+ if (Object.prototype.toString.call(e) == '[object HTMLLIElement]') {
+ e.childNodes.forEach(function (e) {
+ if (Object.prototype.toString.call(e) == '[object HTMLUListElement]') {
+ volantis.dom.$(e).hide();
+ }
+ });
+ }
+ });
+ // 点击展开子菜单
+ var array = e.currentTarget.children;
+ for (var index = 0; index < array.length; index++) {
+ var element = array[index];
+ if (volantis.dom.$(element).title === 'menu') {
+ // 移动端菜单栏异常
+ volantis.dom.$(element).display = "flex"; // https://github.com/volantis-x/hexo-theme-volantis/issues/706
+ } else {
+ volantis.dom.$(element).show();
+ }
+ }
+ }, 0);
+ }
+ });
+ } else {
+ // 【PC端】 hover时展开子菜单,点击时[target.baseURI==origin时]隐藏子菜单? 现有逻辑大部分情况不隐藏子菜单
+ document.querySelectorAll('#wrapper .m-pc li > a[href]').forEach(function (e) {
+ volantis.dom.$(e.parentElement).click(function (e) {
+ e.stopPropagation();
+ if (e.target.origin == e.target.baseURI) {
+ document.querySelectorAll('#wrapper .m-pc .list-v').forEach(function (e) {
+ volantis.dom.$(e).hide(); // 大概率不会执行
+ });
+ }
+ }, 0);
+ });
+ }
+ fn.setPageHeaderMenuEvent();
+ };
+
+ // 【移动端】隐藏子菜单
+ fn.setPageHeaderMenuEvent = function () {
+ if (!volantis.isMobile) return;
+ // 【移动端】 点击空白处隐藏子菜单
+ volantis.dom.$(document).click(function (e) {
+ volantis.dom.mPhoneList.forEach(function (e) {
+ volantis.dom.$(e).hide();
+ });
+ });
+ };
+
+ // 设置导航栏搜索框 【移动端】
+ fn.setHeaderSearch = function () {
+ if (!volantis.isMobile) return;
+ if (!volantis.dom.switcher) return;
+ // 点击移动端搜索按钮
+ volantis.dom.switcher.click(function (e) {
+ e.stopPropagation();
+ volantis.dom.header.toggleClass('z_search-open'); // 激活移动端搜索框
+ volantis.dom.switcher.toggleClass('active'); // 移动端搜索按钮
+ });
+ // 点击空白取消激活
+ volantis.dom.$(document).click(function (e) {
+ volantis.dom.header.removeClass('z_search-open');
+ volantis.dom.switcher.removeClass('active');
+ });
+ // 移动端点击搜索框 停止事件传播
+ volantis.dom.search.click(function (e) {
+ e.stopPropagation();
+ });
+ };
+
+ // 设置 tabs 标签 【移动端 PC】
+ fn.setTabs = function () {
+ var tabs = document.querySelectorAll('#l_main .tabs .nav-tabs');
+ if (!tabs) return;
+ tabs.forEach(function (e) {
+ e.querySelectorAll('a').forEach(function (e) {
+ volantis.dom.$(e).on('click', function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var $tab = volantis.dom.$(e.target.parentElement.parentElement.parentElement);
+ $tab.find('.nav-tabs .active').removeClass('active');
+ volantis.dom.$(e.target.parentElement).addClass('active');
+ $tab.find('.tab-content .active').removeClass('active');
+ $tab.find(e.target.className).addClass('active');
+ return false;
+ });
+ });
+ });
+ };
+
+ // hexo-reference 页脚跳转 https://github.com/volantis-x/hexo-theme-volantis/issues/647
+ fn.footnotes = function () {
+ var ref = document.querySelectorAll('#l_main .footnote-backref, #l_main .footnote-ref > a');
+ ref.forEach(function (e, i) {
+ ref[i].click = function () {}; // 强制清空原 click 事件
+ volantis.dom.$(e).on('click', function (e) {
+ e.stopPropagation();
+ e.preventDefault();
+ var targetID = decodeURI(e.target.hash.split('#')[1]).replace(/\ /g, '-');
+ var target = document.getElementById(targetID);
+ if (target) {
+ volantis.scroll.to(target, {
+ addTop: -volantis.dom.header.offsetHeight - 5,
+ behavior: 'instant'
+ });
+ }
+ });
+ });
+ };
+
+ // 工具类:代码块复制
+ fn.utilCopyCode = function (Selector) {
+ document.querySelectorAll(Selector).forEach(function (node) {
+ var test = node.insertAdjacentHTML("beforebegin", COPYHTML);
+ var _BtnCopy = node.previousSibling;
+ _BtnCopy.onclick = function (e) {
+ e.stopPropagation();
+ var _icon = _BtnCopy.querySelector('i');
+ var _span = _BtnCopy.querySelector('span');
+ node.focus();
+ var range = new Range();
+ range.selectNodeContents(node);
+ document.getSelection().removeAllRanges();
+ document.getSelection().addRange(range);
+ var str = document.getSelection().toString();
+ fn.utilWriteClipText(str).then(function () {
+ fn.messageCopyright();
+ _BtnCopy.classList.add('copied');
+ _icon.classList.remove('fa-copy');
+ _icon.classList.add('fa-check-circle');
+ _span.innerText = "COPIED";
+ setTimeout(function () {
+ _icon.classList.remove('fa-check-circle');
+ _icon.classList.add('fa-copy');
+ _span.innerText = "COPY";
+ }, 2000);
+ })["catch"](function (e) {
+ VolantisApp.message('系统提示', e, {
+ icon: 'fa fa-exclamation-circle red'
+ });
+ _BtnCopy.classList.add('copied-failed');
+ _icon.classList.remove('fa-copy');
+ _icon.classList.add('fa-exclamation-circle');
+ _span.innerText = "COPY FAILED";
+ setTimeout(function () {
+ _icon.classList.remove('fa-exclamation-circle');
+ _icon.classList.add('fa-copy');
+ _span.innerText = "COPY";
+ });
+ });
+ };
+ });
+ };
+
+ // 工具类:复制字符串到剪切板
+ fn.utilWriteClipText = function (str) {
+ return navigator.clipboard.writeText(str).then(function () {
+ return Promise.resolve();
+ })["catch"](function (e) {
+ var input = document.createElement('textarea');
+ input.setAttribute('readonly', 'readonly');
+ document.body.appendChild(input);
+ input.innerHTML = str;
+ input.select();
+ try {
+ var _result = document.execCommand('copy');
+ document.body.removeChild(input);
+ if (!_result || _result === 'unsuccessful') {
+ return Promise.reject('复制文本失败!');
+ } else {
+ return Promise.resolve();
+ }
+ } catch (e) {
+ document.body.removeChild(input);
+ return Promise.reject('当前浏览器不支持复制功能,请检查更新或更换其他浏览器操作!');
+ }
+ });
+ };
+
+ // 工具类:返回时间间隔
+ fn.utilTimeAgo = function (dateTimeStamp) {
+ var minute = 1e3 * 60,
+ hour = minute * 60,
+ day = hour * 24,
+ week = day * 7,
+ month = day * 30;
+ var now = new Date().getTime();
+ var diffValue = now - dateTimeStamp;
+ var minC = diffValue / minute,
+ hourC = diffValue / hour,
+ dayC = diffValue / day,
+ weekC = diffValue / week,
+ monthC = diffValue / month;
+ if (diffValue < 0) {
+ result = "";
+ } else if (monthC >= 1 && monthC < 7) {
+ result = " " + parseInt(monthC) + " 月前";
+ } else if (weekC >= 1 && weekC < 4) {
+ result = " " + parseInt(weekC) + " 周前";
+ } else if (dayC >= 1 && dayC < 7) {
+ result = " " + parseInt(dayC) + " 天前";
+ } else if (hourC >= 1 && hourC < 24) {
+ result = " " + parseInt(hourC) + " 小时前";
+ } else if (minC >= 1 && minC < 60) {
+ result = " " + parseInt(minC) + " 分钟前";
+ } else if (diffValue >= 0 && diffValue <= minute) {
+ result = "刚刚";
+ } else {
+ var datetime = new Date();
+ datetime.setTime(dateTimeStamp);
+ var Nyear = datetime.getFullYear();
+ var Nmonth = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime.getMonth() + 1;
+ var Ndate = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate();
+ var Nhour = datetime.getHours() < 10 ? "0" + datetime.getHours() : datetime.getHours();
+ var Nminute = datetime.getMinutes() < 10 ? "0" + datetime.getMinutes() : datetime.getMinutes();
+ var Nsecond = datetime.getSeconds() < 10 ? "0" + datetime.getSeconds() : datetime.getSeconds();
+ result = Nyear + "-" + Nmonth + "-" + Ndate;
+ }
+ return result;
+ };
+
+ // 消息提示:标准
+ fn.message = function (title, message) {
+ var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ var done = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
+ if (typeof iziToast === "undefined") {
+ volantis.css(volantis.GLOBAL_CONFIG.cdn.izitoast_css);
+ volantis.js(volantis.GLOBAL_CONFIG.cdn.izitoast_js, function () {
+ tozashMessage(title, message, option, done);
+ });
+ } else {
+ tozashMessage(title, message, option, done);
+ }
+ function tozashMessage(title, message, option, done) {
+ var _iziToast$show;
+ var icon = option.icon,
+ time = option.time,
+ position = option.position,
+ transitionIn = option.transitionIn,
+ transitionOut = option.transitionOut,
+ messageColor = option.messageColor,
+ titleColor = option.titleColor,
+ backgroundColor = option.backgroundColor,
+ zindex = option.zindex,
+ displayMode = option.displayMode;
+ iziToast.show((_iziToast$show = {
+ layout: '2',
+ icon: 'Fontawesome',
+ closeOnEscape: 'true',
+ displayMode: displayMode || 'replace',
+ transitionIn: transitionIn || volantis.GLOBAL_CONFIG.plugins.message.transitionIn,
+ transitionOut: transitionOut || volantis.GLOBAL_CONFIG.plugins.message.transitionOut,
+ messageColor: messageColor || volantis.GLOBAL_CONFIG.plugins.message.messageColor,
+ titleColor: titleColor || volantis.GLOBAL_CONFIG.plugins.message.titleColor,
+ backgroundColor: backgroundColor || volantis.GLOBAL_CONFIG.plugins.message.backgroundColor,
+ zindex: zindex || volantis.GLOBAL_CONFIG.plugins.message.zindex
+ }, _defineProperty(_iziToast$show, "icon", icon || volantis.GLOBAL_CONFIG.plugins.message.icon["default"]), _defineProperty(_iziToast$show, "timeout", time || volantis.GLOBAL_CONFIG.plugins.message.time["default"]), _defineProperty(_iziToast$show, "position", position || volantis.GLOBAL_CONFIG.plugins.message.position), _defineProperty(_iziToast$show, "title", title), _defineProperty(_iziToast$show, "message", message), _defineProperty(_iziToast$show, "onClosed", function onClosed() {
+ if (done) done();
+ }), _iziToast$show));
+ }
+ };
+
+ // 消息提示:询问
+ fn.question = function (title, message) {
+ var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ var success = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
+ var cancel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
+ var done = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;
+ if (typeof iziToast === "undefined") {
+ volantis.css(volantis.GLOBAL_CONFIG.cdn.izitoast_css);
+ volantis.js(volantis.GLOBAL_CONFIG.cdn.izitoast_js, function () {
+ tozashQuestion(title, message, option, success, cancel, done);
+ });
+ } else {
+ tozashQuestion(title, message, option, success, cancel, done);
+ }
+ function tozashQuestion(title, message, option, success, cancel, done) {
+ var _iziToast$question;
+ var icon = option.icon,
+ time = option.time,
+ position = option.position,
+ transitionIn = option.transitionIn,
+ transitionOut = option.transitionOut,
+ messageColor = option.messageColor,
+ titleColor = option.titleColor,
+ backgroundColor = option.backgroundColor,
+ zindex = option.zindex;
+ iziToast.question((_iziToast$question = {
+ id: 'question',
+ icon: 'Fontawesome',
+ close: false,
+ overlay: true,
+ displayMode: 'once',
+ position: 'center',
+ messageColor: messageColor || volantis.GLOBAL_CONFIG.plugins.message.messageColor,
+ titleColor: titleColor || volantis.GLOBAL_CONFIG.plugins.message.titleColor,
+ backgroundColor: backgroundColor || volantis.GLOBAL_CONFIG.plugins.message.backgroundColor,
+ zindex: zindex || volantis.GLOBAL_CONFIG.plugins.message.zindex
+ }, _defineProperty(_iziToast$question, "icon", icon || volantis.GLOBAL_CONFIG.plugins.message.icon.quection), _defineProperty(_iziToast$question, "timeout", time || volantis.GLOBAL_CONFIG.plugins.message.time.quection), _defineProperty(_iziToast$question, "title", title), _defineProperty(_iziToast$question, "message", message), _defineProperty(_iziToast$question, "buttons", [['', function (instance, toast) {
+ instance.hide({
+ transitionOut: transitionOut || 'fadeOut'
+ }, toast, 'button');
+ if (success) success(instance, toast);
+ }], ['', function (instance, toast) {
+ instance.hide({
+ transitionOut: transitionOut || 'fadeOut'
+ }, toast, 'button');
+ if (cancel) cancel(instance, toast);
+ }]]), _defineProperty(_iziToast$question, "onClosed", function onClosed(instance, toast, closedBy) {
+ if (done) done(instance, toast, closedBy);
+ }), _iziToast$question));
+ }
+ };
+
+ // 消息提示:隐藏
+ fn.hideMessage = function () {
+ var done = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var toast = document.querySelector('.iziToast');
+ if (!toast) {
+ if (done) done();
+ return;
+ }
+ if (typeof iziToast === "undefined") {
+ volantis.css(volantis.GLOBAL_CONFIG.cdn.izitoast_css);
+ volantis.js(volantis.GLOBAL_CONFIG.cdn.izitoast_js, function () {
+ hideMessage(done);
+ });
+ } else {
+ hideMessage(done);
+ }
+ function hideMessage(done) {
+ iziToast.hide({}, toast);
+ if (done) done();
+ }
+ };
+
+ // 消息提示:复制
+ var messageCopyrightShow = 0;
+ fn.messageCopyright = function () {
+ // 消息提示 复制时弹出
+ if (volantis.GLOBAL_CONFIG.plugins.message.enable && volantis.GLOBAL_CONFIG.plugins.message.copyright.enable && messageCopyrightShow < 1) {
+ messageCopyrightShow++;
+ VolantisApp.message(volantis.GLOBAL_CONFIG.plugins.message.copyright.title, volantis.GLOBAL_CONFIG.plugins.message.copyright.message, {
+ icon: volantis.GLOBAL_CONFIG.plugins.message.copyright.icon,
+ transitionIn: 'flipInX',
+ transitionOut: 'flipOutX',
+ displayMode: 1
+ });
+ }
+ };
+ return {
+ init: function init() {
+ fn.init();
+ fn.event();
+ },
+ subscribe: function subscribe() {
+ fn.setIsMobile();
+ fn.setHeader();
+ fn.setHeaderMenuSelection();
+ fn.setGlobalHeaderMenuEvent();
+ fn.setHeaderSearch();
+ fn.setScrollAnchor();
+ fn.setTabs();
+ fn.footnotes();
+ },
+ utilCopyCode: fn.utilCopyCode,
+ utilWriteClipText: fn.utilWriteClipText,
+ utilTimeAgo: fn.utilTimeAgo,
+ message: fn.message,
+ question: fn.question,
+ hideMessage: fn.hideMessage,
+ messageCopyright: fn.messageCopyright,
+ scrolltoElement: fn.scrolltoElement
+ };
+}();
+Object.freeze(VolantisApp);
+
+/* FancyBox */
+var VolantisFancyBox = function () {
+ var fn = {};
+ fn.loadFancyBox = function (done) {
+ volantis.css(volantis.GLOBAL_CONFIG.cdn.fancybox_css);
+ volantis.js(volantis.GLOBAL_CONFIG.cdn.fancybox_js).then(function () {
+ if (done) done();
+ });
+ };
+
+ /**
+ * 加载及处理
+ *
+ * @param {*} checkMain 是否只处理文章区域的文章
+ * @param {*} done FancyBox 加载完成后的动作,默认执行分组绑定
+ * @returns
+ */
+ fn.init = function () {
+ var checkMain = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+ var done = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : fn.groupBind;
+ if (!document.querySelector(".md .gallery img, .fancybox") && checkMain) return;
+ if (typeof Fancybox === "undefined") {
+ fn.loadFancyBox(done);
+ } else {
+ done();
+ }
+ };
+
+ /**
+ * 图片元素预处理
+ *
+ * @param {*} selectors 选择器
+ * @param {*} name 分组
+ */
+ fn.elementHandling = function (selectors, name) {
+ var nodeList = document.querySelectorAll(selectors);
+ nodeList.forEach(function ($item) {
+ if ($item.hasAttribute('fancybox')) return;
+ $item.setAttribute('fancybox', '');
+ var $link = document.createElement('a');
+ $link.setAttribute('href', $item.src);
+ $link.setAttribute('data-caption', $item.alt);
+ $link.setAttribute('data-fancybox', name);
+ $link.classList.add('fancybox');
+ $link.append($item.cloneNode());
+ $item.replaceWith($link);
+ });
+ };
+
+ /**
+ * 原生绑定
+ *
+ * @param {*} selectors 选择器
+ */
+ fn.bind = function (selectors) {
+ fn.init(false, function () {
+ Fancybox.bind(selectors, {
+ groupAll: true,
+ Hash: false,
+ hideScrollbar: false,
+ Thumbs: {
+ autoStart: false
+ },
+ caption: function caption(fancybox, carousel, slide) {
+ return slide.$trigger.alt || null;
+ }
+ });
+ });
+ };
+
+ /**
+ * 分组绑定
+ *
+ * @param {*} groupName 分组名称
+ */
+ fn.groupBind = function () {
+ var groupName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+ var group = new Set();
+ document.querySelectorAll(".gallery").forEach(function (ele) {
+ if (ele.querySelector("img")) {
+ group.add(ele.getAttribute('data-group') || 'default');
+ }
+ });
+ if (!!groupName) group.add(groupName);
+ var _iterator = _createForOfIteratorHelper(group),
+ _step;
+ try {
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
+ var iterator = _step.value;
+ Fancybox.unbind('[data-fancybox="' + iterator + '"]');
+ Fancybox.bind('[data-fancybox="' + iterator + '"]', {
+ Hash: false,
+ hideScrollbar: false,
+ Thumbs: {
+ autoStart: false
+ }
+ });
+ }
+ } catch (err) {
+ _iterator.e(err);
+ } finally {
+ _iterator.f();
+ }
+ };
+ return {
+ init: fn.init,
+ bind: fn.bind,
+ groupBind: function groupBind(selectors) {
+ var groupName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'default';
+ try {
+ fn.elementHandling(selectors, groupName);
+ fn.init(false, function () {
+ fn.groupBind(groupName);
+ });
+ } catch (error) {
+ console.error(error);
+ }
+ }
+ };
+}();
+Object.freeze(VolantisFancyBox);
+
+// highlightKeyWords 与 搜索功能搭配 https://github.com/next-theme/hexo-theme-next/blob/eb194a7258058302baf59f02d4b80b6655338b01/source/js/third-party/search/local-search.js
+// Question: 锚点稳定性未知
+// ToDo: 查找模式
+// 0. (/////////要知道浏览器自带全页面查找功能 CTRL + F)
+// 1. 右键开启查找模式 / 导航栏菜单开启?? / CTRL + F ???
+// 2. 查找模式面板 (可拖动? or 固定?)
+// 3. keyword mark id 从 0 开始编号 查找下一处 highlightKeyWords.scrollToNextHighlightKeywordMark() 查找上一处 scrollToPrevHighlightKeywordMark() 循环查找(取模%)
+// 4. 可输入修改 查找关键词 keywords(type:list)
+// 5. 区分大小写 caseSensitive (/ 全字匹配?? / 正则匹配??)
+// 6. 在选定区域中查找 querySelector ??
+// 7. 关闭查找模式
+// 8. 搜索跳转 (URL 入口) 自动开启查找模式 调用 scrollToNextHighlightKeywordMark()
+var highlightKeyWords = function () {
+ var fn = {};
+ fn.markNum = 0;
+ fn.markNextId = -1;
+ fn.startFromURL = function () {
+ var params = decodeURI(new URL(location.href).searchParams.get('keyword'));
+ var keywords = params ? params.split(' ') : [];
+ var post = document.querySelector('#l_main');
+ if (keywords.length == 1 && keywords[0] == "null") {
+ return;
+ }
+ fn.start(keywords, post); // 渲染耗时较长
+ fn.scrollToFirstHighlightKeywordMark();
+ };
+ fn.scrollToFirstHighlightKeywordMark = function () {
+ volantis.cleanContentVisibility();
+ var target = fn.scrollToNextHighlightKeywordMark("0");
+ if (!target) {
+ volantis.requestAnimationFrame(fn.scrollToFirstHighlightKeywordMark);
+ }
+ };
+ fn.scrollToNextHighlightKeywordMark = function (id) {
+ // Next Id
+ var input = id || (fn.markNextId + 1) % fn.markNum;
+ fn.markNextId = parseInt(input);
+ var target = document.getElementById("keyword-mark-" + fn.markNextId);
+ if (!target) {
+ fn.markNextId = (fn.markNextId + 1) % fn.markNum;
+ target = document.getElementById("keyword-mark-" + fn.markNextId);
+ }
+ if (target) {
+ volantis.scroll.to(target, {
+ addTop: -volantis.dom.header.offsetHeight - 5,
+ behavior: 'instant'
+ });
+ }
+ // Current target
+ return target;
+ };
+ fn.scrollToPrevHighlightKeywordMark = function (id) {
+ // Prev Id
+ var input = id || (fn.markNextId - 1 + fn.markNum) % fn.markNum;
+ fn.markNextId = parseInt(input);
+ var target = document.getElementById("keyword-mark-" + fn.markNextId);
+ if (!target) {
+ fn.markNextId = (fn.markNextId - 1 + fn.markNum) % fn.markNum;
+ target = document.getElementById("keyword-mark-" + fn.markNextId);
+ }
+ if (target) {
+ volantis.scroll.to(target, {
+ addTop: -volantis.dom.header.offsetHeight - 5,
+ behavior: 'instant'
+ });
+ }
+ // Current target
+ return target;
+ };
+ fn.start = function (keywords, querySelector) {
+ fn.markNum = 0;
+ if (!keywords.length || !querySelector || keywords.length == 1 && keywords[0] == "null") return;
+ console.log(keywords);
+ var walk = document.createTreeWalker(querySelector, NodeFilter.SHOW_TEXT, null);
+ var allNodes = [];
+ while (walk.nextNode()) {
+ if (!walk.currentNode.parentNode.matches('button, select, textarea')) allNodes.push(walk.currentNode);
+ }
+ allNodes.forEach(function (node) {
+ var _fn$getIndexByWord = fn.getIndexByWord(keywords, node.nodeValue),
+ _fn$getIndexByWord2 = _slicedToArray(_fn$getIndexByWord, 1),
+ indexOfNode = _fn$getIndexByWord2[0];
+ if (!indexOfNode.length) return;
+ var slice = fn.mergeIntoSlice(0, node.nodeValue.length, indexOfNode);
+ fn.highlightText(node, slice, 'keyword');
+ fn.highlightStyle();
+ });
+ };
+ fn.getIndexByWord = function (words, text) {
+ var caseSensitive = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+ var index = [];
+ var included = new Set();
+ words.forEach(function (word) {
+ var div = document.createElement('div');
+ div.innerText = word;
+ word = div.innerHTML;
+ var wordLen = word.length;
+ if (wordLen === 0) return;
+ var startPosition = 0;
+ var position = -1;
+ if (!caseSensitive) {
+ text = text.toLowerCase();
+ word = word.toLowerCase();
+ }
+ while ((position = text.indexOf(word, startPosition)) > -1) {
+ index.push({
+ position: position,
+ word: word
+ });
+ included.add(word);
+ startPosition = position + wordLen;
+ }
+ });
+ index.sort(function (left, right) {
+ if (left.position !== right.position) {
+ return left.position - right.position;
+ }
+ return right.word.length - left.word.length;
+ });
+ return [index, included];
+ };
+ fn.mergeIntoSlice = function (start, end, index) {
+ var item = index[0];
+ var _item = item,
+ position = _item.position,
+ word = _item.word;
+ var hits = [];
+ var count = new Set();
+ while (position + word.length <= end && index.length !== 0) {
+ count.add(word);
+ hits.push({
+ position: position,
+ length: word.length
+ });
+ var wordEnd = position + word.length;
+ index.shift();
+ while (index.length !== 0) {
+ item = index[0];
+ position = item.position;
+ word = item.word;
+ if (wordEnd > position) {
+ index.shift();
+ } else {
+ break;
+ }
+ }
+ }
+ return {
+ hits: hits,
+ start: start,
+ end: end,
+ count: count.size
+ };
+ };
+ fn.highlightText = function (node, slice, className) {
+ var val = node.nodeValue;
+ var index = slice.start;
+ var children = [];
+ var _iterator2 = _createForOfIteratorHelper(slice.hits),
+ _step2;
+ try {
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+ var _step2$value = _step2.value,
+ position = _step2$value.position,
+ length = _step2$value.length;
+ var text = document.createTextNode(val.substring(index, position));
+ index = position + length;
+ var mark = document.createElement('mark');
+ mark.className = className;
+ mark = fn.highlightStyle(mark);
+ mark.appendChild(document.createTextNode(val.substr(position, length)));
+ children.push(text, mark);
+ }
+ } catch (err) {
+ _iterator2.e(err);
+ } finally {
+ _iterator2.f();
+ }
+ node.nodeValue = val.substring(index, slice.end);
+ children.forEach(function (element) {
+ node.parentNode.insertBefore(element, node);
+ });
+ };
+ fn.highlightStyle = function (mark) {
+ if (!mark) return;
+ mark.id = "keyword-mark-" + fn.markNum;
+ fn.markNum++;
+ mark.style.background = "transparent";
+ mark.style["border-bottom"] = "1px dashed #ff2a2a";
+ mark.style["color"] = "#ff2a2a";
+ mark.style["font-weight"] = "bold";
+ return mark;
+ };
+ fn.cleanHighlightStyle = function () {
+ document.querySelectorAll(".keyword").forEach(function (mark) {
+ mark.style.background = "transparent";
+ mark.style["border-bottom"] = null;
+ mark.style["color"] = null;
+ mark.style["font-weight"] = null;
+ });
+ };
+ return {
+ start: function start(keywords, querySelector) {
+ fn.start(keywords, querySelector);
+ },
+ startFromURL: function startFromURL() {
+ fn.startFromURL();
+ },
+ scrollToNextHighlightKeywordMark: function scrollToNextHighlightKeywordMark(id) {
+ fn.scrollToNextHighlightKeywordMark(id);
+ },
+ scrollToPrevHighlightKeywordMark: function scrollToPrevHighlightKeywordMark(id) {
+ fn.scrollToPrevHighlightKeywordMark(id);
+ },
+ cleanHighlightStyle: function cleanHighlightStyle() {
+ fn.cleanHighlightStyle();
+ }
+ };
+}();
+Object.freeze(highlightKeyWords);
+
+/* DOM 控制 */
+var DOMController = {
+ /**
+ * 控制元素显隐
+ */
+ visible: function visible(ele) {
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ if (ele) ele.style.display = type === true ? 'block' : 'none';
+ },
+ /**
+ * 移除元素
+ */
+ remove: function remove(param) {
+ var node = document.querySelectorAll(param);
+ node.forEach(function (ele) {
+ ele.remove();
+ });
+ },
+ removeList: function removeList(list) {
+ list.forEach(function (param) {
+ DOMController.remove(param);
+ });
+ },
+ /**
+ * 设置属性
+ */
+ setAttribute: function setAttribute(param, attrName, attrValue) {
+ var node = document.querySelectorAll(param);
+ node.forEach(function (ele) {
+ ele.setAttribute(attrName, attrValue);
+ });
+ },
+ setAttributeList: function setAttributeList(list) {
+ list.forEach(function (item) {
+ DOMController.setAttribute(item[0], item[1], item[2]);
+ });
+ },
+ /**
+ * 设置样式
+ */
+ setStyle: function setStyle(param, styleName, styleValue) {
+ var node = document.querySelectorAll(param);
+ node.forEach(function (ele) {
+ ele.style[styleName] = styleValue;
+ });
+ },
+ setStyleList: function setStyleList(list) {
+ list.forEach(function (item) {
+ DOMController.setStyle(item[0], item[1], item[2]);
+ });
+ },
+ fadeIn: function fadeIn(e) {
+ if (!e) return;
+ e.style.visibility = "visible";
+ e.style.opacity = 1;
+ e.style.display = "block";
+ e.style.transition = "all 0.5s linear";
+ return e;
+ },
+ fadeOut: function fadeOut(e) {
+ if (!e) return;
+ e.style.visibility = "hidden";
+ e.style.opacity = 0;
+ e.style.display = "none";
+ e.style.transition = "all 0.5s linear";
+ return e;
+ },
+ fadeToggle: function fadeToggle(e) {
+ if (!e) return;
+ if (e.style.visibility == "hidden") {
+ e = DOMController.fadeIn(e);
+ } else {
+ e = DOMController.fadeOut(e);
+ }
+ return e;
+ },
+ fadeToggleList: function fadeToggleList(list) {
+ list.forEach(function (param) {
+ DOMController.fadeToggle(param);
+ });
+ },
+ hasClass: function hasClass(e, c) {
+ if (!e) return;
+ return e.className.match(new RegExp('(\\s|^)' + c + '(\\s|$)'));
+ },
+ addClass: function addClass(e, c) {
+ if (!e) return;
+ e.classList.add(c);
+ return e;
+ },
+ removeClass: function removeClass(e, c) {
+ if (!e) return;
+ e.classList.remove(c);
+ return e;
+ },
+ toggleClass: function toggleClass(e, c) {
+ if (!e) return;
+ if (DOMController.hasClass(e, c)) {
+ DOMController.removeClass(e, c);
+ } else {
+ DOMController.addClass(e, c);
+ }
+ return e;
+ },
+ toggleClassList: function toggleClassList(list) {
+ list.forEach(function (item) {
+ DOMController.toggleClass(item[0], item[1]);
+ });
+ }
+};
+Object.freeze(DOMController);
+var VolantisRequest = {
+ timeoutFetch: function timeoutFetch(url, ms, requestInit) {
+ var _requestInit$signal;
+ var controller = new AbortController();
+ (_requestInit$signal = requestInit.signal) === null || _requestInit$signal === void 0 ? void 0 : _requestInit$signal.addEventListener('abort', function () {
+ return controller.abort();
+ });
+ var promise = fetch(url, _objectSpread(_objectSpread({}, requestInit), {}, {
+ signal: controller.signal
+ }));
+ if (ms > 0) {
+ var timer = setTimeout(function () {
+ return controller.abort();
+ }, ms);
+ promise["finally"](function () {
+ clearTimeout(timer);
+ });
+ }
+ promise = promise["catch"](function (err) {
+ throw (err || {}).name === 'AbortError' ? new Error("Fetch timeout: ".concat(url)) : err;
+ });
+ return promise;
+ },
+ Fetch: function () {
+ var _Fetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(url, requestInit) {
+ var timeout,
+ resp,
+ json,
+ _args = arguments;
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
+ while (1) switch (_context.prev = _context.next) {
+ case 0:
+ timeout = _args.length > 2 && _args[2] !== undefined ? _args[2] : 15000;
+ _context.next = 3;
+ return VolantisRequest.timeoutFetch(url, timeout, requestInit);
+ case 3:
+ resp = _context.sent;
+ if (resp.ok) {
+ _context.next = 6;
+ break;
+ }
+ throw new Error("Fetch error: ".concat(url, " | ").concat(resp.status));
+ case 6:
+ _context.next = 8;
+ return resp.json();
+ case 8:
+ json = _context.sent;
+ if (json.success) {
+ _context.next = 11;
+ break;
+ }
+ throw json;
+ case 11:
+ return _context.abrupt("return", json);
+ case 12:
+ case "end":
+ return _context.stop();
+ }
+ }, _callee);
+ }));
+ function Fetch(_x2, _x3) {
+ return _Fetch.apply(this, arguments);
+ }
+ return Fetch;
+ }(),
+ POST: function () {
+ var _POST = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(url, data) {
+ var requestInit, formData, json;
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
+ while (1) switch (_context2.prev = _context2.next) {
+ case 0:
+ requestInit = {
+ method: 'POST'
+ };
+ if (data) {
+ formData = new FormData();
+ Object.keys(data).forEach(function (key) {
+ return formData.append(key, String(data[key]));
+ });
+ requestInit.body = formData;
+ }
+ _context2.next = 4;
+ return VolantisRequest.Fetch(url, requestInit);
+ case 4:
+ json = _context2.sent;
+ return _context2.abrupt("return", json.data);
+ case 6:
+ case "end":
+ return _context2.stop();
+ }
+ }, _callee2);
+ }));
+ function POST(_x4, _x5) {
+ return _POST.apply(this, arguments);
+ }
+ return POST;
+ }(),
+ Get: function () {
+ var _Get = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(url, data) {
+ var json;
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
+ while (1) switch (_context3.prev = _context3.next) {
+ case 0:
+ _context3.next = 2;
+ return VolantisRequest.Fetch(url + (data ? "?".concat(new URLSearchParams(data)) : ''), {
+ method: 'GET'
+ });
+ case 2:
+ json = _context3.sent;
+ case 3:
+ case "end":
+ return _context3.stop();
+ }
+ }, _callee3);
+ }));
+ function Get(_x6, _x7) {
+ return _Get.apply(this, arguments);
+ }
+ return Get;
+ }()
+};
+Object.freeze(VolantisRequest);
\ No newline at end of file
diff --git a/archives/2020/12/index.html b/archives/2020/12/index.html
new file mode 100644
index 000000000..d5095aa3e
--- /dev/null
+++ b/archives/2020/12/index.html
@@ -0,0 +1,4851 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2020/12 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto算是一个集图床功能与图片展示为一体的项目,同时还提供了注册功能,如果你的服务器带宽允许,你可以邀请小伙伴为你的图片站扩充资源!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2020/index.html b/archives/2020/index.html
new file mode 100644
index 000000000..345d7d3dc
--- /dev/null
+++ b/archives/2020/index.html
@@ -0,0 +1,4851 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2020 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto算是一个集图床功能与图片展示为一体的项目,同时还提供了注册功能,如果你的服务器带宽允许,你可以邀请小伙伴为你的图片站扩充资源!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2021/01/index.html b/archives/2021/01/index.html
new file mode 100644
index 000000000..0f6a89fe6
--- /dev/null
+++ b/archives/2021/01/index.html
@@ -0,0 +1,4916 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2021/1 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 使用Python脚本自动打卡智慧曲园
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2020
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2021/03/index.html b/archives/2021/03/index.html
new file mode 100644
index 000000000..c82205984
--- /dev/null
+++ b/archives/2021/03/index.html
@@ -0,0 +1,4916 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2021/3 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PerfDog已经收费,本教程不再更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 安卓系统的根目录,本不应该如此混乱。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2021/09/index.html b/archives/2021/09/index.html
new file mode 100644
index 000000000..ea17fe9d9
--- /dev/null
+++ b/archives/2021/09/index.html
@@ -0,0 +1,4855 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2021/9 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本次更新内容 - 恢复更新,主题版本更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2021/11/index.html b/archives/2021/11/index.html
new file mode 100644
index 000000000..77c0787f1
--- /dev/null
+++ b/archives/2021/11/index.html
@@ -0,0 +1,4851 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2021/11 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CTF还是挺有趣的,每天都做一做当作放松吧
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2021/index.html b/archives/2021/index.html
new file mode 100644
index 000000000..ea45d969e
--- /dev/null
+++ b/archives/2021/index.html
@@ -0,0 +1,5180 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2021 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本次更新内容 - 恢复更新,主题版本更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CTF还是挺有趣的,每天都做一做当作放松吧
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PerfDog已经收费,本教程不再更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 安卓系统的根目录,本不应该如此混乱。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 使用Python脚本自动打卡智慧曲园
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2020
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2022/01/index.html b/archives/2022/01/index.html
new file mode 100644
index 000000000..1a8d1793e
--- /dev/null
+++ b/archives/2022/01/index.html
@@ -0,0 +1,4851 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2022/1 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2021
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2022/04/index.html b/archives/2022/04/index.html
new file mode 100644
index 000000000..f7baf811e
--- /dev/null
+++ b/archives/2022/04/index.html
@@ -0,0 +1,4916 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2022/4 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章讲述了`_config.yml`的内容配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章,将会从Hexo博客的基本搭建,以及如何将你的博客部署到网络进行访问。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2022/06/index.html b/archives/2022/06/index.html
new file mode 100644
index 000000000..7890a6223
--- /dev/null
+++ b/archives/2022/06/index.html
@@ -0,0 +1,4851 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2022/6 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在上次教程已经完成了基本搭建,本次教程来将主题应用到博客。因为目前很多Hexo主题都处于停更状态,我推荐使用Volantis主题或Butterfly主题。本教程仅介绍Volantis的使用方法。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2022/index.html b/archives/2022/index.html
new file mode 100644
index 000000000..119d296b9
--- /dev/null
+++ b/archives/2022/index.html
@@ -0,0 +1,5046 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2022 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在上次教程已经完成了基本搭建,本次教程来将主题应用到博客。因为目前很多Hexo主题都处于停更状态,我推荐使用Volantis主题或Butterfly主题。本教程仅介绍Volantis的使用方法。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章讲述了`_config.yml`的内容配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章,将会从Hexo博客的基本搭建,以及如何将你的博客部署到网络进行访问。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2021
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2023/01/index.html b/archives/2023/01/index.html
new file mode 100644
index 000000000..0b62ac6a9
--- /dev/null
+++ b/archives/2023/01/index.html
@@ -0,0 +1,4851 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2023/1 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Win11独占的WSA,如今Win10也能够使用,对于不想使用Bug11的AMD的用户来说,又有一个不更新系统的理由。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2023/09/index.html b/archives/2023/09/index.html
new file mode 100644
index 000000000..298431905
--- /dev/null
+++ b/archives/2023/09/index.html
@@ -0,0 +1,4853 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2023/9 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章实现了单链表的基本增删操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/2023/index.html b/archives/2023/index.html
new file mode 100644
index 000000000..a606bdd5e
--- /dev/null
+++ b/archives/2023/index.html
@@ -0,0 +1,4918 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档:2023 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章实现了单链表的基本增删操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Win11独占的WSA,如今Win10也能够使用,对于不想使用Bug11的AMD的用户来说,又有一个不更新系统的理由。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/index.html b/archives/index.html
new file mode 100644
index 000000000..4f14525eb
--- /dev/null
+++ b/archives/index.html
@@ -0,0 +1,5020 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2023
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2022
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2021
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2020
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/archives/page/2/index.html b/archives/page/2/index.html
new file mode 100644
index 000000000..9986ede15
--- /dev/null
+++ b/archives/page/2/index.html
@@ -0,0 +1,5020 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 归档 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2023
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2022
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2021
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2020
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/atom.xml b/atom.xml
new file mode 100644
index 000000000..928bed6a1
--- /dev/null
+++ b/atom.xml
@@ -0,0 +1,320 @@
+
+
+ 九月的生活
+
+ New Dream New Start
+
+
+
+ 2023-09-02T09:30:35.000Z
+ https://blog.sakurasep.site/
+
+
+ 上杉九月
+
+
+
+ Hexo
+
+
+ 算法通关村第一关-链表青铜挑战笔记
+
+ https://blog.sakurasep.site/posts/Yupi-Day1-01/
+ 2023-09-02T09:30:35.000Z
+ 2023-09-02T09:30:35.000Z
+
+ 前言本章节是关于单链表的增加和删除操作,根据题目要求把需要用到的函数都进行了自定义,方便重复调用
大部分的思路都以注释的方式展现,因为比较忙,就不放图了,效率第一!
希望各位可以指出我文章中的错误,因为个人的理解难免会出现差错,感谢!
更新日志
暂无
通关要求
1.理解C语言里是如何构造出链表的
2.链表增加元素,首部、中间和尾部分别会有什么问题,该如何处理?
3.链表删除元素,首部、中间和尾部分别会有什么问题,该如何处理?
代码思路
链表的定义
在链表的每一个结点都是由数据域和指针域构成,数据域可以有不同的数据类型
这种依靠指针的数据结构优点就是添加和删除操作比较简单,缺点也显而易见,由于数据是分散存储,导致访问其中某一个数据必须对链表进行遍历
struct ListNode{ int num; struct ListNode *next; };
|
链表的初始化
当我们对链表进行初始化的时候,首先应该新建一个头指针,并将指针初始化为NULL
然后创建头结点s,初始化它的指针为NULL.此时让头指针指向s,此时,一个最基础的链表诞生了
接下来就是不断创建新的结点,每一个新的结点都会成为链表的尾部,然后将头结点s的指针指向新创建的结点,将结点加入链表.
最后就是将头结点的位置向后移动,以便于下一次将新结点加入链表
struct ListNode* initList() { struct ListNode *p = NULL; struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = NULL; p = s; for(int i = 1; i < 5; i++) { struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->num = i; a->next = NULL; s->next = a; s = s->next; } return p; }
|
链表的遍历
链表的不便就在于获取链表的长度或是访问链表某一位置的数据,都需要对链表进行遍历,最佳情况肯定是数据在表头,最糟糕的情况就是数据在表尾
对于遍历链表,最重要的是知道什么时候停止遍历.单链表的表尾永远指向NULL,所以我们当我们从头开始遍历,直到结点指针指向NULL就停止,此时停留在表尾结点
int getListLength(struct ListNode *p) { int length = 0; struct ListNode *s = p; while (s->next != NULL) { length++; s = s->next; } return length; }
|
链表结点的增加
表头插入元素
这里我们首先要获取到头指针,先将新结点的指针指向头指针的指向的结点,然后将头指针指向新结点,此时就完成了表头插入元素的操作,当然不要忘了数值域
表尾插入元素
这里我们先要遍历链表获取到表尾结点,然后将表尾结点的指针指向新结点,此时就完成了表尾元素的插入
插入中间位置
举个例子,如果我要在2这个位置插入元素,那么先遍历到结点1,然后新建一个结点,将新结点的指针指向结点1所指向的结点2,然后将结点1的指针指向新结点,此时新结点变成了结点2,之前的结点2变成了结点3
bool addNode(struct ListNode *p, int op, int number) { if(p == NULL) { return false; } if(op == 1) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->num = number; s->next = p->next; p->next = s; } if(op == 2) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = p->next; while (s->next != NULL) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = a; a->num = number; a->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要插入的位置,只可以插入1-%d:\n", getListLength(p)-1); scanf("%d", &position); if(position < 1 || position >= getListLength(p)) { return false; } for (int i = 1; i <= position; i++) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->next = s->next; a->num = number; s->next = a; } return true; }
|
链表结点的删除
删除头部元素
因为我们知道头指针,所以很简单,只需要让头指针指向当前结点的下一个结点即可,此时表头将会变成结点2,结点1并没有被删除,而是被隐藏
删除尾部元素
首先要遍历整个链表,使得找到指向表尾元素的指针,也就是找到倒数第二个结点,将该结点的指针指向NULL,此时表尾结点被隐藏
删除中间元素
举个例子,我要删除位置2的结点,那么我找到位置1的结点,然后将该结点的指针指向位置3,也就是位置2结点的指针,此时结点2就不会有结点指向,相当于被隐藏
bool deleteNode(struct ListNode *p, int op) { if(p == NULL) { return false; } if(op == 1) { p->next = p->next->next; } if(op == 2) { struct ListNode *s = p; while(s->next->next != NULL) { s = s->next; } s->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要删除结点的位置,当前链表总长度为%d:\n", getListLength(p)); scanf("%d", &position); if(position < 1 || position > getListLength(p)) { return false; } for(int i = 1; i < position; i++) { s = s->next; } s->next = s->next->next; } return true; }
|
运行截图
完整运行代码
#include <iostream> using namespace std;
struct ListNode{ int num; struct ListNode *next; };
struct ListNode* initList() { struct ListNode *p = NULL; struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = NULL; p = s; for(int i = 1; i < 5; i++) { struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->num = i; a->next = NULL; s->next = a; s = s->next; } return p; }
int getListLength(struct ListNode *p) { int length = 0; struct ListNode *s = p; while (s->next != NULL) { length++; s = s->next; } return length; }
bool addNode(struct ListNode *p, int op, int number) { if(p == NULL) { return false; } if(op == 1) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->num = number; s->next = p->next; p->next = s; } if(op == 2) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = p->next; while (s->next != NULL) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = a; a->num = number; a->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要插入的位置,只可以插入1-%d:\n", getListLength(p)-1); scanf("%d", &position); if(position < 1 || position >= getListLength(p)) { return false; } for (int i = 1; i <= position; i++) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->next = s->next; a->num = number; s->next = a; } return true; }
bool deleteNode(struct ListNode *p, int op) { if(p == NULL) { return false; } if(op == 1) { p->next = p->next->next; } if(op == 2) { struct ListNode *s = p; while(s->next->next != NULL) { s = s->next; } s->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要删除结点的位置,当前链表总长度为%d:\n", getListLength(p)); scanf("%d", &position); if(position < 1 || position > getListLength(p)) { return false; } for(int i = 1; i < position; i++) { s = s->next; } s->next = s->next->next; } return true; }
void printList(struct ListNode *p) { struct ListNode *s = p; printf("链表长度为:%d\n链表数据为:\n", getListLength(p)); while (s->next != NULL) { s = s->next; printf("%d ", s->num); } printf("\n"); } int main() { struct ListNode *p = NULL; p = initList();
int number = 0, op = 0; printf("输入操作数,1为表头插入,2为表尾插入,3为表内插入:\n"); scanf("%d", &op); printf("输入插入的数据:\n"); scanf("%d", &number); if(addNode(p, op, number)) { printf("插入成功\n"); } else { printf("插入失败\n"); } printList(p);
printf("输入操作数,1为表头删除,2为表尾删除,3为表内删除:\n"); scanf("%d", &op); if(deleteNode(p, op)) { printf("删除成功\n"); } else { printf("删除失败\n"); } printList(p);
return 0; }
|
]]>
+
+
+ 本篇文章实现了单链表的基本增删操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 适用于Win10的安卓子系统
+
+ https://blog.sakurasep.site/posts/WSA_On_Win10/
+ 2023-01-12T13:36:39.000Z
+ 2023-01-15T13:36:39.000Z
+
+ 观前摘要本篇文章灵感来源酷安用户@Earth_Online,感谢这位大佬发现如此宝藏的Github项目,并给出了详细的实现教程.
本篇文章的整体思路参考LSPosed/MagiskOnWSALocal 和 cinit/WSAPatch 的说明文件,并根据我自己的实践理解进行更为详细简要的说明,方便小白或者有兴趣的发烧友进行学习.
本文作者 & 头图设计
发布平台 - 博客类(首发)
发布平台 - 社交平台
前言
对于我这台R7000P 2020, AMD 4800H
]]>
+
+
+ Win11独占的WSA,如今Win10也能够使用,对于不想使用Bug11的AMD的用户来说,又有一个不更新系统的理由。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hexo_03-Volantis主题的使用指南(一)
+
+ https://blog.sakurasep.site/posts/hexo03/
+ 2022-06-25T01:07:41.000Z
+ 2022-06-25T01:07:41.000Z
+
+ 更新中
关于我 ]]>
+
+
+ 在上次教程已经完成了基本搭建,本次教程来将主题应用到博客。因为目前很多Hexo主题都处于停更状态,我推荐使用Volantis主题或Butterfly主题。本教程仅介绍Volantis的使用方法。
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hexo_02-博客的配置文件解析
+
+ https://blog.sakurasep.site/posts/hexo02/
+ 2022-04-11T11:20:50.000Z
+ 2022-06-25T09:07:41.000Z
+
+ config文件介绍
此文件是对于Hexo最基本的修改,在使用主题后,由于主题作者设计的不同,某些设置将不会生效,你只需要填写必要设置,并且按照主题作者的文档进行修改即可。
Site
Site部分
title: 九月的生活
subtitle: New Dream New Start
description: 希望在这里分享我的经验与生活!
keywords:
author: 上杉九月
language: - zh-CN - en - zh-TW
timezone: ''
|
Url
Url部分
url: https://sakurasep.gitee.io
permalink: :year/:title/
permalink_defaults: pretty_urls: trailing_index: true trailing_html: true
|
Directory
Directory部分
source_dir: source public_dir: public tag_dir: tags archive_dir: archives category_dir: categories code_dir: downloads/code i18n_dir: :lang
skip_render:
|
Writing
Writing部分
new_post_name: :title.md
default_layout: post
titlecase: false
external_link: enable: true field: site exclude: ''
filename_case: 0
render_drafts: false
post_asset_folder: false
relative_link: false
future: false
highlight: enable: true line_number: true auto_detect: false tab_replace: '' wrap: true hljs: false prismjs: enable: false preprocess: true line_number: true tab_replace: ''
|
Home page setting
Home page setting部分
index_generator: path: '' per_page: 7 order_by: -date
|
Category & Tag
Category & Tag部分
default_category: uncategorized
category_map:
tag_map:
|
Metadata elements部分
Date / Time format部分
date_format: YYYY-MM-DD time_format: HH:mm:ss
updated_option: 'mtime'
|
Pagination部分
per_page: 7 pagination_dir: page
|
Include / Exclude file(s)
Include / Exclude file(s)部分
Extensions
Extensions部分
Deployment
Deployment部分
deploy: type: git repo: https://gitee.com/sakurasep/sakurasep.git branch: master
|
关于我 ]]>
+
+
+ 本篇文章讲述了`_config.yml`的内容配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hexo_01-博客的安装与部署
+
+ https://blog.sakurasep.site/posts/hexo01/
+ 2022-04-11T09:55:00.000Z
+ 2022-06-25T01:07:41.000Z
+
+ 本篇文章最后更新于2022.06.25 更改了一些遗留问题,更换了下载链接最近在尝试新的markdown语法格式排版,试试效果如何
一. 软件环境
Clash for Windows(任意加速器,保证能连接到Github)
我们会将搭建好的Hexo上传到Github,所以需要Git命令行支持。
Git官网页面 根据系统选择64/32位 选择下载LTS版本 如果你的网络无法进行下载,请访问以下链接进行下载:
1.3 检查安装是否成功
打开cmd命令行,输入node -v
后显示下图所示,即为安装成功
显示版本号 在电脑的任意目录点击右键,能够显示Git Bash Here
使用这个功能可以更方便的在当前目录启动命令行,当然你也可以使用cmd的cd命令到当前目录
右键菜单出现选项 二. 博客本地化部署
2.1 更改npm为cnpm源
国内某些网络环境访问npm会出现问题,建议使用taobao镜像源,能有效减少故障的发生
切换npm源
npm install -g cnpm --registry=https://registry.npm.taobao.org
|
cnpm切换过程 使用cnpm -v
后正常输出版本号,即为安装成功
显示版本号 2.2 安装hexo命令行
-g
是对全局安装hexo命令行
安装Hexo命令行
hexo-cli安装过程 2.3 Hexo博客初始化
选取一个想要安装Hexo的目录,路径中最好不要含有中文,后续会更好处理
Hexo初始化命令
初始化过程 此时文件夹内应有初始化文件,不过只要接下来能够成功运行,上述过程没有报错,就没问题。
hexo文件夹结构 如果初始化出现问题,即在运行hexo init
的时候报错(通常是由于网络而出现问题)
如果出现网络问题导致无法下载,请访问以下链接获取基础包:
2.4 运行博客
在博客根目录右键打开Git Bash Here
输入以下指令
Hexo初始化命令
hexo clean && hexo g && hexo s
|
本地部署过程 出现Hexo is running at http://localhost:4000/ . Press Ctrl+C to stop.
,并且没有后续的警告语句,说明部署成功,在浏览器中输入localhost:4000
查看部署效果。
运行成功 如果你的端口4000被占用,可以使用hexo s -p 端口号。然后访问http://localhost:端口号
以上,博客的最基本的本地化部署已经完成,接下来的内容是将博客部署到网络进行在线访问。
三. 博客部署到网络
基本介绍一下目前不同部署方式的差别。
Github:微软旗下的开源代码托管平台,国内某些运营商可能无法访问,一般来说还是推荐部署在Github Pages,这也是我本人目前主要用的服务。
Gitee:虽然是国内的代码托管平台,访问速度可以保证,但是它的Pages页面需要手动更新,并且不能够绑定自定义的域名(如果你想和别的博主交换友链,最好还是要有一个域名。因为一般有域名的博客更有动力维护下去)。
Coding:部署方式很复杂,新版的Coding Pages貌似是和腾讯云挂钩,按量付费,感觉没必要了。
Vercel:是一个静态网页部署平台,好像访问速度要比Github稍微快一些,并且提供修改自定义域名。
云服务器:访问速度很大程度上取决于你的服务器的带宽,而且现在服务器的价格也不便宜,以后部署其他需要服务器的项目时再使用比较好。
全球最大同性社交平台 3.1.1 创建Github仓库
注册完成Github账号,新建仓库用于保存上传博客代码。
Github账号注册时尽量不要使用国内邮箱,尤其是QQ邮箱
新建仓库 Tips:试试新建一个仓库名为你Github用户名的仓库
按照图示修改好仓库名后,确保仓库为公开(Public),其他设置按需更改,创建仓库。
3.1.2 获取与Github的连接
在任意位置打开Git Bash Here
,输入以下指令
建立与Github的连接
git config --global user.name "你的GitHub用户名" git config --global user.email "你的GitHub注册邮箱" ssh-keygen -t rsa -C "你的GitHub注册邮箱"
|
生成密钥 输入第三个命令后只需要连续按下三次回车,就会在C:\Users\用户名\.ssh
中生成密钥文件
打开id_rsa.pub
,复制文件内容,添加到
添加SSH公钥 添加SSH公钥 然后在Git Bash
中输入以下命令测试是否连通Github
测试与Github的连接
成功连通 3.1.3 上传博客到Github
首先在Git Bash
中输入以下命令安装部署插件
安装hexo-deployer-git
cnpm install hexo-deployer-git --save
|
安装成功 打开根目录下的_config.yml
文件
deploy配置 config文件配置
deploy: type: git repo: 填入仓库连接 branch: master
|
repo 可以复制此处的链接
复制仓库链接 填好后在Git Bash
中输入下列命令部署到Github仓库
部署到Github
hexo clean && hexo g && hexo d
|
Github同理(此为部署到Gitee) 此时访问https://Github用户名.github.io
即可访问
Github显示效果相同 3.1.4 绑定自定义域名
你可以自行选择域名提供商,购买完域名后,在域名解析里设置以下解析记录
标准解析设置 然后在_config.yml
中设置url为你解析的域名
url设置 最后再博客根目录/source
下新建CNAME文件
注意,没有拓展名! 文件内容为自定义的域名
用于Github识别项目的自定义地址 Gitee官网 3.2.1 创建Gitee仓库
部署到Gitee与部署到Github的流程相差很小,看一个就行。
新建Gitee仓库 3.2.2 获取与Gitee的连接
在任意位置打开Git Bash Here
,输入以下指令
连接到Gitee
git config --global user.name "你的Gitee用户名" git config --global user.email "你的Gitee注册邮箱" ssh-keygen -t rsa -C "你的Gitee注册邮箱"
|
获取SSH公钥 输入第三个命令后只需要连续按下三次回车,就会在C:\Users\用户名\.ssh
中生成密钥文件
打开id_rsa.pub
,复制文件内容,添加到
添加SSH公钥 然后在Git Bash
中输入以下命令测试是否连通Gitee
测试连接
连接成功 3.2.3 上传博客到Gitee
首先在Git Bash
中输入以下命令安装部署插件
安装hexo-deployer-git
cnpm install hexo-deployer-git --save
|
安装过程 打开根目录下的_config.yml
文件
Gitee配置 config文件配置
deploy: type: git repo: 填入仓库连接 branch: master
|
repo 可以复制此处的链接
复制仓库链接 填好后在Git Bash
中输入下列命令部署到Gitee仓库
部署到Gitee
hexo clean && hexo g && hexo d
|
上传成功 在仓库的服务-Gitee Pages
进行手动部署
Github Pages会自动使用你仓库的代码进行部署,而Gitee需要你手动更新。
手动更新Pages 打开强制使用Https
,更新部署
更新 等待部署结束后,访问Https://Gitee用户名.gitee.io
查看部署结果
部署完成 请在看过3.1部署到Github后再观看本部分教程。
官网 3.3.1 连接Github仓库
连接仓库 基本设置 稍等一段时间后,Vercel便部署完成了你的博客
部署完成 Vercel默认提供了域名,你也可以更改。
到Settings-Domains
中进行更改
更改域名 写在最后
本篇文章基本讲述了Hexo博客的基本部署,包括了本地化部署测试和上传到Github,Gitee或是Vercel等平台,使用托管平台提供的Page服务进行远程访问。
本篇教程属于面向与小白的零基础教程系列,如果在安装过程中出现任何问题,你可以在评论区提问,你的提问也是我充实文章的助力!
关注上杉九月,关注上杉九月谢谢喵! ]]>
+
+
+ 本篇文章,将会从Hexo博客的基本搭建,以及如何将你的博客部署到网络进行访问。
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我的2021年度总结
+
+ https://blog.sakurasep.site/posts/year2021/
+ 2022-01-16T14:13:22.000Z
+ 2023-12-11T16:57:45.000Z
+
+ 前言2021年,我对自己算是一半满意,一半不满意吧,有些事情不尽如人意,有些事情自己做的很好,希望在2022年我能够有所进步。
本文中所有内容截止于2022.1.1
New Dream New Start
这次的年终总结并不是按阶段划分的,而是分成了两个部分。
第一部分是对2021年全年的回顾,自己做了什么,还有什么需要改进的地方。
第二部分是对2022年的一个总体的规划,新的一年我应该向什么方向努力。
第一部分 我的2021
对于我来说,2021年研究了很多网站搭建的内容,熟练的掌握云服务器的各种应用方式,接下来就让我一一给各位梳理一下。
Hexo博客
图片介绍
首页图
首页图 主页信息流
主页 文章阅读
文章内容 简介
使用Hexo博客框架 + Github Pages
Hexo作为目前活跃度较高的博客框架,主题丰富,功能齐全,个人是十分喜欢由Hexo框架生成的静态博客,Github Pages的访问速度还是可以的,而且如果担心访问速度的话也可以将博客部署到Gitee。
主题使用了Volantis 5.0 Beta 美化思路参考枋柚梓的猫会发光 (inkss.cn)
Volantis算是一个不错的博客主题,属于是上限高,下限也高,新手通过Volantis官方文档也能配置完成一个不错的页面,而如果想更进一步,Volantis官方还收录了很多大佬的美化教程,可以进行参考。
该博客内容主攻计算机相关内容
由于是静态博客,写作相比于其他博客框架稍微有些繁琐,不适合日常更新。(不过有大佬写的HPP组件看起来还不错,等完善)。我在新的一年保证文章更新的情况下也会记录一下自己的其他方面的内容,放到博客分站吧。
还有些正在调试的内容
Hexo是支持分站的,即可以将其他Hexo主题作为主站点的其他访问风格,目前还在做主站的调试,等主站稳定了把分站会恢复的。
Halo博客
图片介绍
首页图
首页 主页信息流
主页 文章阅读
内容 简介
网站还处于调试期,打算把其他内容放在这里更新。
网站是由Halo博客框架搭建
Halo博客框架属于是动态部署的博客类型,需要依托于Java环境。我把该博客部署在腾讯云上。
主题使用的是GitHub - LIlGG/halo-theme-sakura: Halo 版本的樱花🌸主题
Typecho博客
图片介绍
首页图
首页 文章阅读
内容 简介
Typecho是我最喜欢的博客框架之一,响应速度快,写作方便。
不过Typecho也有它的缺点,就是很多插件已经不更新了。
Typecho的主题很多是需要付费的,当然也有免费的主题。这里我使用的是秦枫鸢梦 - 🌸花有重开日,人无再少年🏃♂️ (zwying.com)
Chevereto图片站
图片介绍
首页
首页 图片浏览
图片展示 简介
图片站在去年年底就进入测试阶段,年初开始稳定运行。属于我这些网站中运行最为稳定的一个。。。
图片站可以注册(目前仅为邀请码开放,如果想上传图片的话,可以评论区留言邮箱,私发邀请码)
小服务器,空间不大,带宽不大,没法做到开放注册。
当然如果只是浏览和下载还是完全开放的。
图片链接是无法进行引用的,网站开启了防盗链
第二部分 我的2022
去年对于我来说,其实是荒废了很多时间。
直到年底的几个月才认清了方向,明确了自己的未来的道路。
第一件事:健康的身体
185cm的高个子 87KG的体重,BMI是稍微超标的。
对于我来说,身体长时间处于一个亚健康状态,精神支撑不了我去干一些事情,容易累,嗜睡。
第二件事:英语
第三件事:考研
第四件事:专业水平
第五件事:文章更新
关注上杉九月,关注上杉九月谢谢喵! ]]>
+
+
+ 回顾一下我的2021
+
+
+
+
+
+
+
+
+
+
+
+ 《CTF学习笔记》
+
+ https://blog.sakurasep.site/posts/ctf/
+ 2021-11-15T13:32:12.000Z
+ 2023-12-11T16:57:45.000Z
+
+ 前言最近一位朋友入坑CTF,想起来开学还加了一个相关社团参加了几场比赛。还是挺有趣的。
每天做上一两个,就当是放松了。
正文
题目 题目
e00cf25ad42683b3df678c61f42c6bda
解法
题目写的很清楚 MD5,然后给出的这一端字符串(用多了能看出来很像MD5)
扔到**MD5解密网站**得到flag{admin1}
解密网站 PASS 题目 题目
flag:ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=
解法
Base64编码有个特点,编码末尾会出现=
特点 所以说仍然是放到**Base64解密网站**
解密得到 PASS
关注上杉九月,关注上杉九月谢谢喵! ]]>
+
+
+ CTF还是挺有趣的,每天都做一做当作放松吧
+
+
+
+
+
+
+
+
+
+
+
+ 博客日志-记录博客最新动态
+
+ https://blog.sakurasep.site/posts/about-blog/
+ 2021-09-21T11:39:01.000Z
+ 2022-06-28T01:56:41.000Z
+
+ 网站日志- 升级Volantis主题至6.0
- 由于BBtalk公众号处于停止运营的状态,暂时隐藏BBtalk功能
- 尝试修复twikoo的问题
- 对多篇文章进行归档隐藏
- 开始记录LeetCode学习记录
- 开始缓慢修复博客的问题,并且缓慢恢复更新(找工作,考研)
公告
你好,欢迎访问我的Hexo博客,博客现在处于正常运营状态,如果在某个地方出现使用问题或是加载缓慢的情况,请在本项目的Github Issues中进行反馈
这里我想要感谢
关于主站
网站基本信息
主站使用的是Github + Hexo + 腾讯云CDN
的部署模式,最大程度保证访问速度。
分享文件全部采用依靠Onedrive API的Cloudreve,毕竟没有限速,文件大小限制也少。
目前的加载速度已经经过很多优化,如果有加载缓慢的情况请联系站长。
网站内容
主要是分享知识。我个人认为知识应当没有门槛,做好知识分级,给不同阶段的朋友们都能带来收获。
目前个人技术有限,仅仅会写一些入门知识分享。
希望自己能够慢慢变强吧。
欢迎各位朋友能在思考之后积极的和我探讨交流。
关于分站
注意事项
分站没有去进行深度优化,仅仅作为一个基本的,保证能够阅读和互动的不同主题。
注意,分站仅仅是同步主站点的文章更新,有些信息可能没有及时更新
此外,本站所有文章都使用了Volantis独有的标签,分站没有进行优化,使用的默认标签类型
如何使用
本站将以往的配置的主题作为分站部署https://blog.sakurasep.site/主题名称
下,通过导航栏可以直接访问,当然你也可以在下方直接跳转。
你可以选择你所喜欢的博客主题进行文章阅读,希望带给你最好的阅读体验。
关于评论
- 本站在主站的评论系统已经更换为Twikoo,更棒的评论系统,欢迎大家使用!
- 本站的评论邮件提醒已经恢复,你在主站的评论收到回复后将可以接收邮件提醒。
关于更新
首先可以确定的是,我会首先保证质量,目前我的技术水平不足,很多地方做的不是很好,还希望各位能提出修改建议,我也会积极进行修改。
目前将学业与更新做个平衡的话,基本确定是月更,一篇or两篇,得看我的空闲时间。
目前的规划是
更新平台
首发更新
关注上杉九月,关注上杉九月谢谢喵! 更新预告
应用使用指南系列-老文章修改
Redirect Perfdog Hexo系列-新系列
新文章
FilterBox
关注上杉九月,关注上杉九月谢谢喵! ]]>
+
+
+ 本次更新内容 - 恢复更新,主题版本更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Perfdog-简单直观的性能测试工具
+
+ https://blog.sakurasep.site/posts/perfdog/
+ 2021-03-22T12:04:51.000Z
+ 2023-12-11T16:57:45.000Z
+
+ 一. 基本介绍当我们作为一位消费者购买电子产品时,我们获取第一手信息的方式大多是从各大视频平台的自媒体的首发测评。当我们拿到电子产品之后,如何对它的性能进行测试呢?
有的朋友首先会想到娱乐兔,HappyMatser等跑分软件。毕竟跑分很直观,高就是强,低就是弱。但是当跑分论成为大众的标准,厂商便会想出各种各样的方法来获取更高的跑分。例如前几天被曝光的Realme GT跑分作弊,还有各大厂商的跑分白名单(MIUI检测到跑分软件运行,会将CPU锁在最高频率)。这样的测试只能算是极限性能,可是真正的去游戏里测试,散热设计的不同,调度优化的不同便会产生巨大的差距。
很早之前我也对手里的电子产品进行测试,当时用的是GameBench,不过经常出问题,正版的价格更是无法接受。第二个使用的软件是快否,虽然偶尔会出现一些bug,但是使用体验还是很不错的。不过因为这软件最后一次更新时间是2019年6月,emmm,基本是凉凉了。
去年的时候,把手里的米9换成了米10,因为听说865的性能与功耗都平衡的很好,便产生了测试的想法。这一款由腾讯旗下WeTest开发的软件Perfdog吸引了我。支持Windows
,Mac OS X
两个PC平台,可以对安卓和iOS设备进行测试。
二. 软件测试环境
小米10 12G RAM MIUI12.5 21.3.12 官方包
iPad 2020 第八代 A12 iPad OS 14
三. 软件基本安装操作
Perfdog官方网站
在Perfdog的官网下载对应平台的软件压缩包后,将压缩包解压到电脑的目录中。
在目录找到Perfdog.exe可执行文件,打开后显示登陆界面,这里可以注册账号或使用QQ扫码登陆。
登录界面 登录后便会进入到软件的UI界面
软件UI 此时便可以将你的测试设备与电脑进行链接。初始化之后,在左侧的两个选项中选择测试方式(无线or有线 无线可以测试电池相关内容,有线可以同步显示并记录手机画面)和测试应用(支持应用名称搜索)
选择模式和设备(Windows平台可以多开Perfdog并同时对多部设备测试)
右下角的加号是添加和减少测试项目。勾选左边的对号便是对此项目进行测试,点击右边的方框选择是否在软件中显示该项目的数据。
安卓设备与iOS设备的测试项目稍有出入
安卓设备 iOS设备 选择好测试应用,调整好测试项目,拿起你的设备,准备开始吧。
3.1 软件数据解释与详细使用步骤
建议有能力的朋友前往官网去详细了解测试项目的具体作用。以下内容是我个人的解读,可能会有一些不准确的地方,还请多多指教。
3.2 概览
基本数据 性能基本指标
- 平均帧率 - Avg(FPS)
这一个数据对应的是整个测试过程的平均帧率,可以粗略的反应游戏的流畅程度。 - 卡顿次数/每10分钟 - Jank(/10min)
- 严重卡顿次数/每10分钟 - BigJank(/10min)
这里放出perfdog官方给出的计算思路和计算方式
3.2.1 PerfDog Jank 计算思路:
考虑视觉惯性,假设以前三帧的平均帧耗时为参考,作为vsync时间间隔,连续两次vsync没有新渲染画面刷新,则认为是一次潜在卡顿,也就是说下一帧耗时大于前三帧平均帧耗时2倍,则认为一次潜在卡顿。同时单帧耗时满足大于两倍电影帧耗时1000ms/24x2(由于人眼低于24帧才能辨别画面不连续性),则认为是一次真正卡顿。同时若单帧耗时大于3倍电影帧耗时,则认为是一次严重卡顿。
3.2.2 PerfDog Jank计算方法:
同时满足两条件,则认为是一次卡顿Jank.
①Display FrameTime>前三帧平均耗时2倍。
②Display FrameTime>两帧电影帧耗时 (1000ms/24x2≈83.33ms)。
同时满足两条件,则认为是一次严重卡顿BigJank.
①Display FrameTime >前三帧平均耗时2倍。
②Display FrameTime >三帧电影帧耗时(1000ms/24x3=125ms)。
其他内容
- 未规范化应用CPU利用率 - Avg(AppCPU)[%]
这里未规范化CPU利用率的计算方式 = CPU执行时间/CPU总时间。如果使用这一项利用率计算APP的性能消耗,会出现在低频运行时和高频运行时CPU利用率相同的情况。
所以Perfdog官方建议使用规范化CPU利用率。 - CPU平均温度 - Avg(CTemp)[°C]
- 规范化应用CPU利用率 - Avg(AppCPU)[%]Normalized
这种CPU利用率的计算方法将CPU的频率考虑进去。
CPU Usage(Normalized)= (CPU执行时间/CPU总时间) * (当前时刻所有CPU频率之和/所有CPU频率最大值之和)
这种计算方法可以更真实的反映出APP的性能消耗。 - 最大内存占用 - Peak(Memory)[MB]
- 平均上传速度 - Avg(Send)[KB/s]
- 平均下载速度 - Avg(Recv)[KB/s]
- 平均功耗 - Avg(Power)[mW]
3.3 FPS
测试项目解释
平均帧率 - Avg(FPS)
这一个数据对应的是整个测试过程的平均帧率,可以粗略的反应游戏的流畅程度
帧率方差 - Var(FPS)
这一个数据反映的是帧率的波动大小
大于等于某一帧率的测试数据百分比 - FPS>=30[%] FPS>=45[%]
这一数据显示可以修改,在右下角,可以看数据的大致分布
降帧次数 - Drop(FPS)[/h]
平均每小时两个相邻的FPS点相差大于8帧的次数,反映的是画面的流畅程度
卡顿次数/每10分钟 - Jank(/10min)
严重卡顿次数/每10分钟 - BigJank(/10min)
卡顿率 - Stutter[%]
计算方式 卡顿率 = 卡顿时长 / 总时长
平均单帧渲染时间 - Avg(FTime)[ms]
这一个数据可以结合第三张图 Frame Time分析
如果Frame Time时长在某一个点很大幅度超过平均单帧渲染时间,那么大概率是一次卡顿
单帧渲染时间超过100ms - FTime>=100ms[%]
单帧渲染时间过长,很有可能导致屏幕没有内容可以刷新,所以画面不动,即为卡顿
增量耗时 - Delta(FTime)>100ms[/h]
3.4 CPU
CPU测试数据 CPU总体使用率 CPU核心使用率 CPU时钟频率 CPU温度 测试项目解释
- 未规范化应用CPU利用率 - Avg(AppCPU)[%]
这里未规范化CPU利用率的计算方式 = CPU执行时间/CPU总时间。如果使用这一项利用率计算APP的性能消耗,会出现在低频运行时和高频运行时CPU利用率相同的情况。
所以Perfdog官方建议使用规范化CPU利用率。
未规范化应用CPU利用率小于等于50%/70% - AppCPU<=50%[%] AppCPU<=70%[%]
未规范化总的CPU利用率 - Avg(TotalCPU)[%]
未规范化总的CPU利用率小于等于50%/70% - TotalCPU<=50%[%] TotalCPU<=70%[%]
CPU平均温度 - Avg(CTemp)[°C]
下面一排都是规范化的CPU指标,不多赘述
CPU时钟频率 - CPU Clock
反映的是当前时间CPU各个核心的频率
3.5 Memory
这部分对于性能测试的参考性不是很高。
这里Perfdog提醒:在极限测试情况下,例如开启游戏超高帧率,建议不要勾选收集Memory Usage和Memory Detail,因为部分机型会有性能损耗。
内存测试数据 内存使用率 3.6 GPU
GPU测试数据 GPU使用率 3.7 Network
这一部分对于非实时对战游戏参考性不是很高。测试王者荣耀等对网络要求较高的游戏可以进行关注。
网络测试数据 网络收发数据 3.8 Battery
电池测试数据 电池测试图表 3.9 Energy Usage
能耗数据 监控应用使用的能耗情况,可以监控CPU,GPU,网络模块,定位模块等等
3.10 需要关注的数据
对于芯片的性能测试,我认为主要应该关注的数据项目为
反映的是设备的游戏运行稳定性,越接近设定的游戏帧率越好。
反映的是设备掉帧的严重程度,越小越好。
反映的是设备的掉帧次数(掉帧次数不等于卡顿次数),越少越好。
卡顿次数/每10分钟 - Jank(/10min)
反映的是人所能感知的小卡顿次数,越少越好。
严重卡顿次数/每10分钟 - BigJank(/10min)
反映的是人所能感知的严重卡顿次数,越少越好。
平均单帧渲染时间 - Avg(FTime)[ms]
反映的是设备对画面单一帧的渲染平均时间,若某一时刻对画面渲染的时间远远超过平均值,说明此时屏幕内容没有刷新,会觉得明显卡顿,单帧渲染时间越贴近平均值越好。
规范化的应用CPU利用率 - Avg(AppCPU)[%]Normalized
反映的是排除其他影响因素后应用对于CPU性能的消耗。
反映的是应用长时间运行使CPU升高的温度,作为温控降频的参考数据。
反映的是应用运行时CPU的调度情况,作为卡顿分析和功耗分析的参考数据。
平均GPU利用率 - Avg(GUsage)[%]
反映的是应用对于GPU的使用情况。
平均CPU时钟频率 - Avg(GClock)[MHz]
反映的是应用运行时GPU的调度情况,作为卡顿分析和功耗分析的参考数据。
反映的是应用运行时的平均功耗,高中低负载在功耗这一测试项目差距较大,例如骁龙888在高负载可以跑到11w的功耗,在低负载只有4w,续航和发热因此不同。
四. 云端页面功能介绍
4.1 我的数据
存放着测试结束后上传的测试结果,当测试结果较多时可以设置条件筛选数据。
测试记录 4.2 任务数据
Perfdog支持创建测试任务,你可以邀请小伙伴一起进行测试,并将数据归档到任务中进行分享。
类似是一个组织 4.3 项目
在这里可以针对不同应用数据进行分类显示
筛选条件 4.4 具体数据
4.4.1 图表基本操作(数据统计范围修改,图标曲线显示)
图表数据修改 4.4.2 图表拖选操作(查看某一时间段的测试数据)
区域数据查看 4.4.3 点选查看卡顿具体场景
具体场景分析 卡顿画面 4.5 不同测试范例对比
4.5.1 可以添加5条测试用例
用例数据对比 4.5.2 对比不同的测试用例
用例数据对比 五. 写在最后
PerfDog收费了,贵的离谱,面向的用户是各类数码KOL,我们自己想测试,需要找别的软件了。
听说华为的测试软件不错,有时间看看,写篇文章。
关注上杉九月,关注上杉九月谢谢喵! ]]>
+
+
+ PerfDog已经收费,本教程不再更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 存储空间隔离-还你一个干净整洁的根目录
+
+ https://blog.sakurasep.site/posts/redirect/
+ 2021-03-13T13:35:26.000Z
+ 2023-12-11T16:57:45.000Z
+
+ 一. 前言1.1 安卓根目录的混乱现象
每一次打开文件管理去寻找你所想要的文件,或是在聊天软件给朋友发送文件,总会看到目录里有着大量莫名奇妙的文件夹。一是不方便找到目标文件所在,二是对于强迫症挺不舒服的。
造成这种现象,主要是国内软件厂商不遵守开发规范导致。根据安卓规范,在 Android/data/包名
路径应该保存对应应用的数据文件,Android/obb/包名
路径应该保存对应应用的数据包文件。这两个文件夹是用户不应该去访问的,因此安卓11的新规范禁止系统(仅对于定制UI)的文件管理直接访问。如果介意(例如MIUI的默认文件管理)访问受限,可以安装相应的旧版本。
1.2 安卓11的新限制
如图所示,MIUI的文件管理在一次升级中已经不在允许访问,点击前往查看将会跳转安卓原生的文件管理。
不能访问Android/data 应用应该将自身数据保存在Android文件夹内部,将用户数据按照分类保存在标准文件夹,但是国内应用大部分不会遵循开发规范,便造成了安卓根目录混乱的现状。
1.3 某些应用开发者的错误理解
很多应用开发者为了适配安卓11的要求,做出了很多令人迷惑的行为。这里以腾讯的令人迷惑的操作举例。在QQ 8.2.8版本之后,将用户的下载文件位置从根目录更改到了Android文件夹内部,同时也是自身的数据文件夹。这让用户去查看自己下载的文件时十分麻烦。而且QQ在根目录仍然有着许多未知用途的文件夹。
1.4 标准文件夹的示例(MIUI)
- DCIM 保存相机拍摄的照片和视频(MIUI在该文件夹还存储了截图和屏幕录制)
- Documents 保存文档
- Download 保存下载文件
- Fonts 保存字体文件(MIUI系统字体文件保存在主题文件夹中)
- Movie 保存视频文件
- Music 保存音频文件
- Pictures 保存图片文件
- 等等
对于不同的定制系统同时也有自己存放关键系统文件的文件夹,例如MIUI会在根目录建立一个MIUI文件夹,用来存放各种系统软件的缓存文件和数据。
1.5 解决方案
- 依靠安卓大版本更新更严格的文件访问策略,强制应用使用更高的targetAPI。
- 依靠定制系统完善文件访问限制功能,感觉最近Flyme和MIUI的沙盒已经有了雏形了。
- 依靠Rikka开发的存储空间隔离(原名存储重定向),这也是我写本文的目的。
二. 安装与配置
这款软件在酷安上即有下载,原名存储重定向,现名存储空间隔离。
在使用这款软件之前,你需要接受以下的要求
- 手机已经获取了root权限
- 愿意为这款软件支付一定的费用
- 有耐心
- 可以接受某些奇奇怪怪的问题
- 可以主动寻找问题的解决方法
2.1 本机的使用环境为
小米10 MIUI12.5 21.2.3 Simplicity官改
2.2 模块介绍
在满足root的环境下,在Magsik模块安装页面,搜索riru关键字便可以看到riru系列模块
搜索模块 我们这里只安装两个模块
Riru核心 Riru - Enhanced mode for Storage Isolation V23.6
存储空间隔离 这里提醒一下,如果不安装Riru,而先去安装Riru - Enhanced mode for Storage Isolation,将会无法安装。所以请按照顺序安装模块。
2.3 下载软件
在酷安搜索存储空间隔离并下载
酷安 非Play平台 在Google Play搜索存储空间隔离并下载
Play平台 这里我推荐从Google Play下载,在Play商店购买的该软件,使用同一个谷歌账号可以多设备使用。
Play平台 目前软件的内购验证做的很完善,如果你是在Google Play下载,无需登录外网,直接点击恢复购买即可。
2.4 安装过程
下载完成后打开软件,便显示了软件的基本介绍
软件介绍 允许存储空间隔离获取Root权限,当出现提示成功时便可以进行下一步了。
获取Root权限 正常运行 如果出现问题,请按照以上步骤重新安装环境。
不过有的机型的确是有兼容问题。
主界面 2.5 备份文件
在这里,我会提供一份自己使用,基本没有错误的配置文件,你只需要在备份与还原里还原备份文件即可开始使用。
本配置文件的应用可能无法包含你所使用的应用,如果你想达到近乎完美的效果,请继续看下去。
三. 原理解释以及详细配置
3.1 原理
在存储空间隔离的官网,我们可以找到一些我们所需要的内容
以下内容是对官网指南的部分摘录以及我自己的理解
DCIM,Pictures,Download 等公共文件夹,用来保存用户的文件,允许应用在此根据需求新建文件夹来保存对应的文件。例如QQ应该将用户下载的文件保存在 Download/QQ
,而不是Android/data/包名
。
但是应用对于公共文件夹的访问应该是一次性的,有目的的。例如在QQ发送图片给好友,QQ在获取用户的允许后访问DCIM和Pictures文件夹,发送结束后系统应该收回访问权限。
Android文件夹内部对于用户来说是不应该进行访问的,对于应用来说则是无需授权就能够访问,在此保存应用的数据和缓存。
遗憾的是,目前原生安卓对于存储权限的选项只有允许和拒绝,此外,国内存在的大量“坏应用”如果被拒绝授权将不会运行。
存储空间隔离便是为了解决这一乱象而开发,这里感谢Rikka大佬开发了这款应用,在一定程度上很好解决了以上问题。
一般来说,不规范的应用会在根目录创建各种各样的文件夹。在启用存储空间隔离之后,应用将会在Android/data/包名/sdcard
内保存文件。
优点如下
因为卸载应用时只会清理应用的数据文件夹,在对应用进行隔离后,卸载时下载文件和应用数据一并删除
系统统计应用占用空间大小仅会统计数据文件夹,在对应用进行隔离后,系统统计大小功能将会正常工作
3.2 使用教程
3.2.1 软件权限
对于MIUI用户,因为MIUI魔改了很多对于应用的控制权限,这里需要手动为存储空间隔离打开部分权限
3.2.2 默认存储空间位置
在软件的设置 - 行为 - 默认隔离存储空间位置中,你有两种选择
- 保存在数据文件夹
- 保存在缓存文件夹
缓存文件夹有着和数据文件夹一样的特性,但是缓存文件夹可能被清理软件所清理。这里根据自己的需求吧。一般来说保存在数据文件夹即可。
两种选择 3.2.3 可访问文件夹模板
然后回到上一级,在可访问文件夹模板中进行设置
在这里所设置的文件夹就是允许应用访问的公共文件夹
我在默认的基础上添加了对于Movie文件夹的访问
访问模板 现在回到主页面,点击应用管理,就可以对应用进行单独设置
为了避免重定向系统应用带来各种各样的bug,我们先对第三方应用进行配置
不显示系统应用 3.3 根据需求配置
白描是一款特别好用的OCR识别和PDF导出应用,这里我们拿它来讲解如何对一款应用重定向。
3.3.1 需求考虑
我们应该考虑,这款应用会获取什么信息,因为我常常用它将图片转成PDF格式,所以DCIM(拍摄的图片)和Pictures(下载的图片)是可访问的文件夹。所以说我们对白描设置可访问文件夹为DCIM和Pictures。
白描的配置界面 3.3.2 模拟正常使用过程
使用白描正常导出一次PDF,在查看文件历史里可以看到PDF保存在Download/Baimiao中。因为我希望保存在Document/白描,所以我们打开白描的Download访问权限(刚才是白描试图访问Download,但是被定向到了数据文件夹内部的Download),重新保存一次PDF,这时白描就会创建此文件夹。
导出路径 3.3.3 将隔离的文件同步到标准文件夹
在导出被隔离的文件中添加同步文件夹规则,来源路径选择Download(新版存储空间隔离导出时会将该应用在目录内的全部文件进行同步)
编写规则 3.3.4 检查结果
可以看到PDF文件成功保存到指定位置
同步成功 这里很多使用者都会有一个误区-既然我要把文件保存到Documents目录,那么为什么不把Documents设置为可访问的文件夹呢?其实很好解释,你把可访问的文件夹当做读取权限,把导出被隔离的文件当作写入权限,这样就明白了吧。
但是有些应用是很规范的,他们保存在标准文件夹,所以你应该允许该应用访问。
3.4 应用之间互相访问
用过存储重定向的老用户都应该遇到过哔哩哔哩的视频分享到QQ,会出现系统繁忙的提示,就算偶尔可能分享成功,视频的封面也不见了。
这是因为哔哩哔哩老版本在根目录的tv.danmuku.bili存放自己的图片缓存,而对哔哩哔哩和QQ进行隔离后,QQ是访问不到这个文件夹的,就造成了分享失败的问题。
目前这个问题貌似得到了解决,哔哩哔哩在某一个版本对缓存文件的位置做了更改,移动到了数据文件夹,这是一个可能的原因。此外还可能因为哔哩哔哩的分享在QQ上被改为了小程序分享,分享短链接包含了封面地址,所以分享成功进行。
因为目前我并没有遇到该问题,所以希望各位可以在评论区反馈你们的使用情况,我会抽时间测试一下对应的软件版本。
好了,最近遇到了这一问题。同时也讲一下解决方案。同类问题都可以按照此思路解决。
哔哩哔哩的视频想要分享到QQ(空间,联系人等),QQ需要读取哔哩哔哩的封面缓存信息,而因为存储重定向的缘故,QQ无法对你允许访问文件夹之外的内容进行读取和写入操作,这就导致了分享的失败。所以为了解决这一问题,首先通过文件历史找到正常情况下哔哩哔哩的缓存保存位置。最新版缓存保存位置在 Android/data/tv.danmaku.bili/files/Images
。然后在QQ可访问的文件夹,在其他应用的文件夹中创建新的规则。
如下图所示。
解决隔离应用无法分享的问题 四. 最终的清理
按照以上的例子,对用户应用一一设置。设置完成之后,删除除了标准文件夹的所有冗余文件,正常使用一段时间,你会发现根目录仍然会有一些文件夹,这时候就需要精准定位。
手动删除文件 如上图所示,比如说我们想知道com.miui.voiceassist
其实很明显,是小爱同学,但请假装不知道是由哪一个应用创建。
我们将文件夹名复制,在文件监视中粘贴。
文件监视 然后就会显示有那些应用对该文件夹进行读取或者是写入。
不过我们要清楚读取和写入的区别,比如说这里显示了媒体存储设备对该文件夹的访问,而我们了解一点相关内容便可以知道个该软件是在扫描各个文件夹来查找媒体文件,并没有进行写入,所以文件夹不是由它创建。
向下拉便可以找到小爱同学的文件访问记录。
访问记录 现在点击小爱同学,对其进行隔离。
应用配置 五. 或许会更完美
5.1 解决下载文件被某些应用存储在Android目录的问题
QQ这类将用户下载的文件保存在数据文件夹的应用
我采用的是Rikka开发的另一款应用-保存副本
酷安 应用介绍 当你在QQ下载文件之后,只需要在打开方式里选择保存副本,软件就可以在Download目录复制一份相同的文件。
操作方法 复制成功 六. 效果展示
这里我自己把Malody的谱面文件存在了Map文件夹。
miad这一个空文件是为了防止MIUI的应用开屏广告产生(直接卸载掉智能服务com.miui.systemAdSolution
即可。可以使用搞机助手进行卸载。一直用官改,不知道MIUI将广告服务集成在此应用里,感谢酷安@水水水淼的建议)
mm是Magsik的MM管理器
如果和文章开头对比一下,可以说是强迫症狂喜。
最终的效果 七. 写在最后
个人情况
我在寒假里策划了很多内容,从这一篇文章开始,我会逐渐向给各位展示我策划的优质内容。
新的开始
这算是一个新坑,目的就是向各位推荐一些优质的应用,他们真的可以方便你的生活。目前我的更新频率(如果没有什么意外的话基本就是一个月更新两次,一次是安卓上的应用,一次是PC上的应用),毕竟我刚进入大学,自己安排了很多学习的内容,时间并不是很充裕,保证质量是第一位(还有要填坑)。
欢迎交流
这些应用对于各位来说有的可能没用过,有的可能早就熟练上手。我希望我写的图文可以帮助小白零基础上手优质应用,从而提高效率。同时期待和各路大佬交流使用心得,不断完善文章内容和呈现形式。
在这里我也会虚心听取意见,无论是对图文内容的建议,或是对某些优质应用的推荐等等。
关注上杉九月,关注上杉九月谢谢喵! ]]>
+
+
+ 安卓系统的根目录,本不应该如此混乱。
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 智慧曲园云端自动打卡
+
+ https://blog.sakurasep.site/posts/qfnu/
+ 2021-01-20T13:27:35.000Z
+ 2022-06-27T16:00:00.000Z
+
+ 前言班群没事就@全体成员
,用FilterBox过滤通知 + 自动签到,总算把这烦人的东西解决了。
正文
一. 软件环境
二. 开始配置
2.1 保存脚本文件
在合适的位置保存脚本文件
保存文件 2.2.1 对python脚本进行单独配置
如图所示是我们宿舍四人的python脚本
脚本文件 详细配置 执行命令
python3 /www/wwwroot/qfnuAutoTemperatureSubmit/xxx.py
|
python3命令是你没有设置系统变量时使用的,如果你将python3作为系统环境,这里只需要改成python
使用宝塔计划任务创建定时任务
当时不太懂云服务器的目录结构,放在了wwwroot网站目录
定时执行 2.2.2 使用原python文件
直接将脚本文件放在文件夹内
执行命令
python3 /www/wwwroot/qfnuAutoTemperatureSubmit/demo1.py 学号 密码
|
2.3 注意事项
执行python脚本报错的话
作者回复
关注上杉九月,关注上杉九月谢谢喵! ]]>
+
+
+ 使用Python脚本自动打卡智慧曲园
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我的2020年度总结
+
+ https://blog.sakurasep.site/posts/year2020/
+ 2021-01-19T13:52:06.000Z
+ 2023-12-11T16:57:45.000Z
+
+ 前言咕咕咕了好久的2020年度总结终于来啦!
~~才不是因为我懒~~
本文中所有内容截止于2021.1.1日
未来,一定更精彩!
第一阶段 高三下学期–高考
紧张的学习生活,每天基本都是两点一线的路线。
枯燥的学习生活,在最后的高考100天尤为如此,从周考到天天做不完的卷子。
温暖的学习生活,在向着理想的大学奋斗的路上,感谢每一位同学的陪伴,感谢老班的悉心辅导,感谢每一位老师的辛苦付出,满满的回忆。
终究有一个好结果。
下一个人生阶段,在曲师大度过。
第二阶段 暑假
放下了高三的压力,暑假便成为了我尽情发挥的舞台。
1. 第一台自己组装的主机
个人算是一个果粉吧。于是在进行配件选购的时候,并没有选择热门的AMD + N卡的组合,而是为了方便黑苹果的安装,选择了Intel + A卡的组合。
配置如下
CPU:Intel i5-9600K GPU:AMD RX5700 XT 内存:Kingston 骇客神条 3200MHz 8G x 2 固态:Western Digital SN750 500GB x 2 机械:TOSHIBA P300 3T 主板:MSI Z390 Gaming Puls 电源:Segotep 600W 散热:玄冰400 机箱:SAHARA 逆行者606 显示器:AOC 23.8英寸 24G2 1080P144 无线网卡:BCM943602CS
|
总体感觉还行吧,组装完成之后做了一个用OC引导的win10和macOS的双系统,这台电脑便是我暑假的主力机器。
电脑配置 关于macOS Catalina 10.15.6的EFI文件,我是参考Xjn´s Blog进行自己配置和调试,截止到文章书写的2021.1.18日,一切运行正常
关于macOS与其他苹果设备的联动,我个人用的是iPad mini2(网课专用板)。为了当前稳定的Wi-Fi链接和蓝牙功能(最初我是用的是USB网卡,不稳定,需要驱动支持),我入手了BCM943602CS这一款PCIE网卡。
从同学那里借来iPad Pro 2020做了一下测试,随航,接力,隔空投送都很完美。
这里建议对于macOS或是苹果全家桶生态有着需求的,不要考虑黑苹果主机,黑苹果在稳定性和方便程度都不如白苹果,而且,M1的MacBook好香!
2. 第一台个人笔记本
去上大学,当然不可以搬着一个MATX机箱去。
所以入手了一台R7000P(首发价格)
用了两年,看到当年的我说AMD YES,我真想穿越回去,告诉当年的我,Intel YES。
电脑配置 桌面如图
我的桌面 用了仿macOS的软件,还不错,基本的动画实现了,UI设计也挺不错的,但是经常出现崩溃。
正版macOS
正版macOS桌面 因为大学是软件工程专业,笔记本上搭建了python2,,python3,java,c等众多环境
3. 小米9 – 小米10
2022年了 865还是顶,4750的电池还是比较大,90Hz的屏幕还是舒服,完全没有换手机的欲望。而且手机对我个人来说就是休闲小游戏加联系工具,下一次换手机估计换个Redmi Note了。
我的手机 4. Sony ZV-1
2022年了,还在吃灰。。。。
第三阶段 初步迈入大学生活
1. Chevereto图片站
通过自己搭建图床,学到了不少关于云服务器的知识(之前搭建Wordpress博客接触过)。
上杉九月的图片站
图片站 搭建教程已经出了
2. Hexo
上杉九月的博客
博客首页 3. 云服务器
云服务器定时执行python脚本
python脚本原地址
4. 初接触CTF
想作为一个兴趣爱好,寒假继续学习。
总结
2020年经历了人生大考,虽然有很多波折,但也是顺利的度过了。
在2020年我个人多是在实践应用投入了精力,2021年我将会在原理以及应用的代码实现付出。
目标就是有事情做,写写教程,平平安安就是理想啦。
2020年真的是魔幻的一年,疫情迅速席卷全球,中国顶着巨大压力成功遏制,没想到(应该是意料之中),自由的西方资本主义国家没能遏制疫情传播,天灾人祸,诸如此类。
2021年一定会好起来的,提前在这祝福各位新年快乐,事事顺利,一切安好。
关注上杉九月,关注上杉九月谢谢喵! ]]>
+
+
+ 回顾一下我的2020
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto-属于你自己的图片站
+
+ https://blog.sakurasep.site/posts/chevereto/
+ 2020-12-25T12:20:23.000Z
+ 2022-06-27T16:00:00.000Z
+
+ 前言前几天用hexo搭建博客首页的时候,想给网站来一张高清的壁纸。然后用picgo把一张比较大的图片上传到gitee。
Picgo 这时出现了第一个问题,picgo不显示该图片的缩略图
无法显示缩略图 本来以为是picgo的bug(beta3版本),便用手机上的图床软件上传
上传完成 显示上传成功,打开gitee的仓库也可以正常访问
在感到很疑惑的同时,我将该图片的URL发到了群里,让朋友看看能不能访问
然后我收到了朋友的截图
Gitee限制图片大小 Gitee图床存在的问题
- 不能上传超过1M大小的图片,否则不能显示
- Gitee有段时间开启了防盗链,第三方引用全部失效
这时候我在图床APP的其他图床中看到了一段对于chevereto图床的描述
试试? 粗略的看了一下教程,实现效果还不错。
一. 方案总结
- 方案一:神枫云 + FTP外部存储
- 方案二:域名 + 轻量应用服务器
- 方案三:备案域名 + ECS服务器
我个人最推荐方案二
学生优惠或者新用户购买腾讯云或者阿里云的服务器挺便宜的,大概是一年60左右。
腾讯云 当然我之前介绍的神枫云也可以,而且可以省去配置宝塔面板的步骤
二. 方案实施
2.1 方案一:神枫云 + FTP外部存储
2.1.1 神枫云服务器配置
建议购买这个3RMB/月的服务器
相比于1RMB/月的,月流量变为无限是很重要的
服务器 稍微配置一下,进入主机的管理界面,进入在线文件管理
管理面板 2.1.2 安装前的准备
上传chevereto底包到根目录
chevereto 这里chevereto有免费版和付费版,我们使用付费版来进行搭建,因为付费版才可以使用外部存储,神枫云只提供了300M的数据库,存不了几张图片
然后解压底包到wwwroot文件夹
此时wwwroot文件夹内应该是下图所示的目录结构
目录结构 解压完成之后,进入域名绑定选项,这里有一个赠送的域名
默认域名 2.1.3 开始安装
访问该域名进入安装进程,只修改三项
如果忘记了可以在面板首页-虚拟主机信息找到
连接数据库 然后是注册管理员的界面
填写信息 顺利安装完成
安装完成 如果一切顺利的话现在网站已经跳转到了chevereto图床的首页
首页展示 点击右上角的登录,把刚刚注册的管理员账号输入进去,然后进入仪表盘,到这里整个安装过程基本结束了。
不过因为神枫云的数据库空间很小,只有300M,根本存不了几张图片,所以下文的外部存储功能便十分重要。
2.2 域名 + 腾讯云轻量服务器
2.2.1 安装宝塔镜像
首先去腾讯云购买一个轻量应用服务器,并且选择香港地区来免去备案,镜像选择宝塔面板
选择宝塔镜像 然后来到服务器的控制台,在防火墙里添加8888端口来允许宝塔面板的访问,后续可以更改默认访问端口,并添加安全入口提高安全性。
放行端口 在应用管理里面可以获取默认宝塔面板的登录密码
访问密码 后期记得修改宝塔面板的登录端口以及默认用户名和密码
登录实例,可以选择网页直接登录,上图右下角,先复制命令,然后点击登录
远程登录 2.2.2 软件环境
进入宝塔面板,在软件商店里安装(仅搭建图床)
软件列表 2.2.3 创建站点
然后在侧边栏找到网站,添加站点
填入你购买的域名,创建数据库
基本信息 然后在站点的设置里添加伪静态代码
伪静态代码
location / { index index.php; try_files $uri $uri/ /index.php?$query_string; }
|
伪静态 2.2.4 DNS解析
然后在你申请域名的服务商添加DNS解析
DNS解析 主机记录@ 记录类型A 解析线路默认 记录值是IP地址 TTL 10分钟
稍微等上一段时间,就可以用域名访问你的chevereto图床进行安装了
2.2.5 安装过程
访问该域名进入安装进程
连接数据库 然后是注册管理员的界面
填写信息 顺利安装完成
安装完成 如果一切顺利的话现在网站已经跳转到了chevereto图床的首页
首页展示 点击右上角的登录,把刚刚注册的管理员账号输入进去,然后进入仪表盘,到这里整个安装过程基本结束了。
如果你使用的是这种方式,那么一般来说数据库就有了一定的存储空间,例如我个人使用的就有约45G的数据空间
存储空间 这样的话存一些个人的图片还是没有问题的
2.3 备案域名 + 阿里云ECS服务器
这里ECS服务器我购买的是学生优惠版本
这里虽然显示最少购买6个月,其实可以在调整配置的时候可以买一个月先试试
价格 这里仅需要修改购买时长,操作系统等会去更换
购买界面 购买完成后去阿里云ECS控制台,将实例停止运行以更换操作系统和购买云盘容量
注意:云盘容量按需购买,因为服务器的云盘是按月付费
2.3.1 更换镜像
在镜像市场将操作系统更换为宝塔linux面板
更换镜像 自定义实例登录密码,一会要用到
修改登录密码 2.3.2 登录服务器
在实例管理界面,进行远程登录
远程登录 选择第一项网页登录
远程登录 输入”bt default”来获取宝塔面板的默认登录密码
获取默认密码 记得放行安全组端口8888,然后用公网IP:8888
访问宝塔面板
2.3.3 软件环境
进入宝塔面板,在软件商店里安装(仅搭建图床)
软件列表 2.3.4 创建站点
然后在侧边栏找到网站,添加站点
填入你购买的域名,创建数据库
基本信息 然后在站点的设置里添加伪静态代码
伪静态代码
location / { index index.php; try_files $uri $uri/ /index.php?$query_string; }
|
伪静态 2.3.5 DNS解析
然后在你申请域名的服务商添加DNS解析
DNS解析 主机记录@ 记录类型A 解析线路默认 记录值是IP地址 TTL 10分钟
稍微等上一段时间,就可以用域名访问你的chevereto图床进行安装了
2.3.6 安装过程
访问该域名进入安装进程
连接数据库 然后是注册管理员的界面
填写信息 顺利安装完成
安装完成 如果一切顺利的话现在网站已经跳转到了chevereto图床的首页
首页展示 点击右上角的登录,把刚刚注册的管理员账号输入进去,然后进入仪表盘,到这里整个安装过程基本结束了。
三. 为域名添加Https访问
打开你所购买域名服务商的控制台(这里以阿里云为例子)
在域名控制台-基本信息-SSL证书
用免费版就可以
填写一些必要的信息,审核通过后下载证书
获取证书 这里因为我们云服务器安装的是Nginx,所以下载该类型
下载证书 然后解压缩得到两个文件,一个key,一个pem,现在登录宝塔面板,复制证书密钥和内容到网站-设置-SSL-其他证书
设置证书 保存后你的域名就可以使用https访问了
四. chevereto图床基本设置
4.1 网站
推荐修改
- 网站名称
- 网站标题
- 网站描述
- 默认时区
- 网站运营模式
- 网站隐私模式
4.2 用户
4.3 图片上传
4.4 主页
4.5 电子邮件
4.6 防洪保护
推荐修改
- 防洪保护
- 以电子邮件通知
- 每分钟限额
- 每小时限额
- 每日限额
五. 总结
chevereto图床作为一个图片站来说还是很不错的,用来存放一些高清图片(壁纸,美图)等还是很不错的。不过搭建chevereto是需要一定的成本的,如果预算不是很多建议去找一些其他的公益图床。
如果平时只是写写文章的话,我还是推荐使用gitee图床,上传之前记得用格式工厂压缩一下图片,压缩成JPG格式,可以极大程度避免图片过大的问题
Gitee图床审查变得严格起来,出现了很多误封现象,这里建议使用Github仓库 + jsDelivr
。
关注上杉九月,关注上杉九月谢谢喵! ]]>
+
+
+ Chevereto算是一个集图床功能与图片展示为一体的项目,同时还提供了注册功能,如果你的服务器带宽允许,你可以邀请小伙伴为你的图片站扩充资源!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bangumis/index.html b/bangumis/index.html
new file mode 100644
index 000000000..3291bba3e
--- /dev/null
+++ b/bangumis/index.html
@@ -0,0 +1,8108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上杉九月的追番列表 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上杉九月的追番列表
+
+
+
+
+
+
+
+
+
+
+ 正在追的动漫
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 10.1 亿
+
+
+ 追番人数 473.5 万
+
+
+ 硬币数 165.0 万
+
+
+ 弹幕总数 3.1 亿
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 6266.0 万
+
+
+ 追番人数 214.3 万
+
+
+ 硬币数 13.3 万
+
+
+ 弹幕总数 143.3 万
+
+
+ 评分 9.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全36话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 1.4 亿
+
+
+ 追番人数 228.8 万
+
+
+ 硬币数 35.1 万
+
+
+ 弹幕总数 116.9 万
+
+
+ 评分 9.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 48.3 万
+
+
+ 追番人数 2.8 万
+
+
+ 硬币数 3441
+
+
+ 弹幕总数 1.1 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 107.0 万
+
+
+ 追番人数 4.7 万
+
+
+ 硬币数 3157
+
+
+ 弹幕总数 1.7 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全2话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 2560.7 万
+
+
+ 追番人数 452.8 万
+
+
+ 硬币数 27.5 万
+
+
+ 弹幕总数 13.7 万
+
+
+ 评分 9.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -0
+
+
+
+
+ 番剧 美国
+
+
+
+ 总播放 1.3 亿
+
+
+ 追番人数 95.8 万
+
+
+ 硬币数 19.7 万
+
+
+ 弹幕总数 19.4 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 3.5 亿
+
+
+ 追番人数 846.9 万
+
+
+ 硬币数 144.1 万
+
+
+ 弹幕总数 128.4 万
+
+
+ 评分 6.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 550.2 万
+
+
+ 追番人数 21.7 万
+
+
+ 硬币数 9.0 万
+
+
+ 弹幕总数 5.0 万
+
+
+ 评分 9.9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全13话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 8578.6 万
+
+
+ 追番人数 236.8 万
+
+
+ 硬币数 20.8 万
+
+
+ 弹幕总数 248.3 万
+
+
+ 评分 9.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 24.8 万
+
+
+ 追番人数 1.8 万
+
+
+ 硬币数 1887
+
+
+ 弹幕总数 5724
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 71.7 万
+
+
+ 追番人数 5.5 万
+
+
+ 硬币数 6474
+
+
+ 弹幕总数 2.0 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 28.2 万
+
+
+ 追番人数 2.4 万
+
+
+ 硬币数 2046
+
+
+ 弹幕总数 5161
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 39.6 万
+
+
+ 追番人数 2.3 万
+
+
+ 硬币数 2536
+
+
+ 弹幕总数 5189
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 61.1 万
+
+
+ 追番人数 2.3 万
+
+
+ 硬币数 4847
+
+
+ 弹幕总数 9711
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1.1 亿
+
+
+ 追番人数 863.4 万
+
+
+ 硬币数 246.1 万
+
+
+ 弹幕总数 117.9 万
+
+
+ 评分 9.9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1.1 亿
+
+
+ 追番人数 835.6 万
+
+
+ 硬币数 48.4 万
+
+
+ 弹幕总数 48.2 万
+
+
+ 评分 9.7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 3560.6 万
+
+
+ 追番人数 160.9 万
+
+
+ 硬币数 12.1 万
+
+
+ 弹幕总数 20.1 万
+
+
+ 评分 9.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 4234.5 万
+
+
+ 追番人数 189.8 万
+
+
+ 硬币数 22.2 万
+
+
+ 弹幕总数 34.7 万
+
+
+ 评分 5.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1.1 亿
+
+
+ 追番人数 418.7 万
+
+
+ 硬币数 109.5 万
+
+
+ 弹幕总数 130.1 万
+
+
+ 评分 9.7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全13话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1.9 亿
+
+
+ 追番人数 562.1 万
+
+
+ 硬币数 236.9 万
+
+
+ 弹幕总数 290.0 万
+
+
+ 评分 9.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全1话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1729.9 万
+
+
+ 追番人数 423.7 万
+
+
+ 硬币数 51.7 万
+
+
+ 弹幕总数 46.8 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全8话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 428.2 万
+
+
+ 追番人数 183.8 万
+
+
+ 硬币数 2.8 万
+
+
+ 弹幕总数 1.5 万
+
+
+ 评分 8.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全8话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 1047.3 万
+
+
+ 追番人数 190.1 万
+
+
+ 硬币数 8.4 万
+
+
+ 弹幕总数 4.2 万
+
+
+ 评分 8.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全2话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 1778.7 万
+
+
+ 追番人数 69.5 万
+
+
+ 硬币数 52.2 万
+
+
+ 弹幕总数 14.9 万
+
+
+ 评分 9.9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全24话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 72.3 万
+
+
+ 追番人数 4.4 万
+
+
+ 硬币数 3457
+
+
+ 弹幕总数 6924
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全16话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 3282.3 万
+
+
+ 追番人数 556.4 万
+
+
+ 硬币数 17.7 万
+
+
+ 弹幕总数 25.9 万
+
+
+ 评分 9.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全13话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1.1 亿
+
+
+ 追番人数 207.0 万
+
+
+ 硬币数 36.3 万
+
+
+ 弹幕总数 27.3 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 301.7 万
+
+
+ 追番人数 121.1 万
+
+
+ 硬币数 9914
+
+
+ 弹幕总数 1.9 万
+
+
+ 评分 3.7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1475.8 万
+
+
+ 追番人数 448.4 万
+
+
+ 硬币数 2.2 万
+
+
+ 弹幕总数 1.8 万
+
+
+ 评分 9.7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全8话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 792.9 万
+
+
+ 追番人数 154.3 万
+
+
+ 硬币数 6.3 万
+
+
+ 弹幕总数 4.4 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全8话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 590.0 万
+
+
+ 追番人数 153.6 万
+
+
+ 硬币数 4.0 万
+
+
+ 弹幕总数 2.5 万
+
+
+ 评分 9.7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 7147.4 万
+
+
+ 追番人数 588.2 万
+
+
+ 硬币数 91.2 万
+
+
+ 弹幕总数 53.2 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全8话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 1781.4 万
+
+
+ 追番人数 93.3 万
+
+
+ 硬币数 17.2 万
+
+
+ 弹幕总数 10.7 万
+
+
+ 评分 9.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1403.7 万
+
+
+ 追番人数 31.0 万
+
+
+ 硬币数 12.1 万
+
+
+ 弹幕总数 18.0 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全8话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 3805.9 万
+
+
+ 追番人数 157.5 万
+
+
+ 硬币数 53.3 万
+
+
+ 弹幕总数 28.9 万
+
+
+ 评分 9.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 3.2 亿
+
+
+ 追番人数 847.1 万
+
+
+ 硬币数 43.8 万
+
+
+ 弹幕总数 42.7 万
+
+
+ 评分 7.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全6话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 872.5 万
+
+
+ 追番人数 418.9 万
+
+
+ 硬币数 2.3 万
+
+
+ 弹幕总数 2.9 万
+
+
+ 评分 9.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 1519.9 万
+
+
+ 追番人数 934.2 万
+
+
+ 硬币数 1.9 万
+
+
+ 弹幕总数 6097
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 38.4 万
+
+
+ 追番人数 2.2 万
+
+
+ 硬币数 3022
+
+
+ 弹幕总数 1.5 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全13话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 207.0 万
+
+
+ 追番人数 10.8 万
+
+
+ 硬币数 2.0 万
+
+
+ 弹幕总数 2.8 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 44.5 万
+
+
+ 追番人数 3.7 万
+
+
+ 硬币数 5206
+
+
+ 弹幕总数 1.1 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 12.9 万
+
+
+ 追番人数 1.5 万
+
+
+ 硬币数 1010
+
+
+ 弹幕总数 1926
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 55.4 万
+
+
+ 追番人数 3.6 万
+
+
+ 硬币数 1893
+
+
+ 弹幕总数 4016
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 -
+
+
+
+ 总播放 193.5 万
+
+
+ 追番人数 11.1 万
+
+
+ 硬币数 1.9 万
+
+
+ 弹幕总数 3.6 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 99.0 万
+
+
+ 追番人数 5.0 万
+
+
+ 硬币数 7441
+
+
+ 弹幕总数 1.4 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全26话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 4641.2 万
+
+
+ 追番人数 74.4 万
+
+
+ 硬币数 11.7 万
+
+
+ 弹幕总数 14.0 万
+
+
+ 评分 8.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全13话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 54.6 万
+
+
+ 追番人数 3.3 万
+
+
+ 硬币数 2423
+
+
+ 弹幕总数 5894
+
+
+ 评分 6.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 124.7 万
+
+
+ 追番人数 6.0 万
+
+
+ 硬币数 1.4 万
+
+
+ 弹幕总数 1.6 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 226.5 万
+
+
+ 追番人数 9.4 万
+
+
+ 硬币数 3.3 万
+
+
+ 弹幕总数 4.5 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 20.5 万
+
+
+ 追番人数 2.4 万
+
+
+ 硬币数 1529
+
+
+ 弹幕总数 2968
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 118.0 万
+
+
+ 追番人数 5.5 万
+
+
+ 硬币数 7676
+
+
+ 弹幕总数 1.3 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 82.1 万
+
+
+ 追番人数 5.2 万
+
+
+ 硬币数 5990
+
+
+ 弹幕总数 9896
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 58.8 万
+
+
+ 追番人数 3.7 万
+
+
+ 硬币数 4507
+
+
+ 弹幕总数 9387
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 365.0 万
+
+
+ 追番人数 17.0 万
+
+
+ 硬币数 4.4 万
+
+
+ 弹幕总数 7.2 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 127.2 万
+
+
+ 追番人数 7.6 万
+
+
+ 硬币数 1.0 万
+
+
+ 弹幕总数 1.5 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 13.3 万
+
+
+ 追番人数 1.6 万
+
+
+ 硬币数 637
+
+
+ 弹幕总数 1830
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1761.0 万
+
+
+ 追番人数 106.1 万
+
+
+ 硬币数 11.0 万
+
+
+ 弹幕总数 70.2 万
+
+
+ 评分 9.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全10话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 4407.1 万
+
+
+ 追番人数 89.5 万
+
+
+ 硬币数 41.4 万
+
+
+ 弹幕总数 17.2 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 3127.8 万
+
+
+ 追番人数 128.7 万
+
+
+ 硬币数 26.5 万
+
+
+ 弹幕总数 36.7 万
+
+
+ 评分 9.7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全22话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 1.7 亿
+
+
+ 追番人数 826.3 万
+
+
+ 硬币数 92.2 万
+
+
+ 弹幕总数 710.7 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全13话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 70.8 万
+
+
+ 追番人数 4.5 万
+
+
+ 硬币数 4371
+
+
+ 弹幕总数 8181
+
+
+ 评分 9.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 81.1 万
+
+
+ 追番人数 3.9 万
+
+
+ 硬币数 4710
+
+
+ 弹幕总数 1.1 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 30.7 万
+
+
+ 追番人数 2.0 万
+
+
+ 硬币数 2877
+
+
+ 弹幕总数 5466
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 56.5 万
+
+
+ 追番人数 2.7 万
+
+
+ 硬币数 3097
+
+
+ 弹幕总数 8126
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 24.4 万
+
+
+ 追番人数 1.6 万
+
+
+ 硬币数 1906
+
+
+ 弹幕总数 2390
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 47.3 万
+
+
+ 追番人数 2.5 万
+
+
+ 硬币数 2530
+
+
+ 弹幕总数 4972
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 415.2 万
+
+
+ 追番人数 18.0 万
+
+
+ 硬币数 5.8 万
+
+
+ 弹幕总数 8.0 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 294.4 万
+
+
+ 追番人数 15.1 万
+
+
+ 硬币数 5.3 万
+
+
+ 弹幕总数 7.5 万
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全14话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 5755.2 万
+
+
+ 追番人数 221.8 万
+
+
+ 硬币数 38.6 万
+
+
+ 弹幕总数 54.8 万
+
+
+ 评分 9.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 4066.5 万
+
+
+ 追番人数 184.5 万
+
+
+ 硬币数 37.7 万
+
+
+ 弹幕总数 29.8 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 9792.7 万
+
+
+ 追番人数 301.8 万
+
+
+ 硬币数 53.9 万
+
+
+ 弹幕总数 74.0 万
+
+
+ 评分 9.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全14话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 5816.9 万
+
+
+ 追番人数 320.4 万
+
+
+ 硬币数 45.1 万
+
+
+ 弹幕总数 158.7 万
+
+
+ 评分 9.7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全52话0
+
+
+
+
+ 国创 中国大陆
+
+
+
+ 总播放 4746.0 万
+
+
+ 追番人数 96.6 万
+
+
+ 硬币数 4.7 万
+
+
+ 弹幕总数 21.2 万
+
+
+ 评分 5.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全12话0
+
+
+
+
+ 番剧 日本
+
+
+
+ 总播放 45.0 万
+
+
+ 追番人数 3.2 万
+
+
+ 硬币数 2495
+
+
+ 弹幕总数 7076
+
+
+ 评分 9.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/categories/Hexo\347\263\273\345\210\227/index.html" "b/categories/Hexo\347\263\273\345\210\227/index.html"
new file mode 100644
index 000000000..b45a6444f
--- /dev/null
+++ "b/categories/Hexo\347\263\273\345\210\227/index.html"
@@ -0,0 +1,4984 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类:Hexo系列 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在上次教程已经完成了基本搭建,本次教程来将主题应用到博客。因为目前很多Hexo主题都处于停更状态,我推荐使用Volantis主题或Butterfly主题。本教程仅介绍Volantis的使用方法。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章讲述了`_config.yml`的内容配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章,将会从Hexo博客的基本搭建,以及如何将你的博客部署到网络进行访问。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/categories/index.html b/categories/index.html
new file mode 100644
index 000000000..233c3a5d0
--- /dev/null
+++ b/categories/index.html
@@ -0,0 +1,4596 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 所有分类 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/categories/\345\205\254\345\221\212/index.html" "b/categories/\345\205\254\345\221\212/index.html"
new file mode 100644
index 000000000..e13f38b7a
--- /dev/null
+++ "b/categories/\345\205\254\345\221\212/index.html"
@@ -0,0 +1,4858 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类:公告 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本次更新内容 - 恢复更新,主题版本更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/categories/\345\255\246\344\271\240\347\254\224\350\256\260/index.html" "b/categories/\345\255\246\344\271\240\347\254\224\350\256\260/index.html"
new file mode 100644
index 000000000..d29c2497a
--- /dev/null
+++ "b/categories/\345\255\246\344\271\240\347\254\224\350\256\260/index.html"
@@ -0,0 +1,4921 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类:学习笔记 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章实现了单链表的基本增删操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CTF还是挺有趣的,每天都做一做当作放松吧
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/categories/\345\271\264\345\272\246\346\200\273\347\273\223/index.html" "b/categories/\345\271\264\345\272\246\346\200\273\347\273\223/index.html"
new file mode 100644
index 000000000..8dfc3307c
--- /dev/null
+++ "b/categories/\345\271\264\345\272\246\346\200\273\347\273\223/index.html"
@@ -0,0 +1,4919 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类:年度总结 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2021
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2020
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/categories/\345\272\224\347\224\250\344\275\277\347\224\250\346\214\207\345\215\227/index.html" "b/categories/\345\272\224\347\224\250\344\275\277\347\224\250\346\214\207\345\215\227/index.html"
new file mode 100644
index 000000000..a2c91412a
--- /dev/null
+++ "b/categories/\345\272\224\347\224\250\344\275\277\347\224\250\346\214\207\345\215\227/index.html"
@@ -0,0 +1,4919 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类:应用使用指南 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PerfDog已经收费,本教程不再更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 安卓系统的根目录,本不应该如此混乱。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/categories/\351\233\266\345\237\272\347\241\200\346\225\231\347\250\213/index.html" "b/categories/\351\233\266\345\237\272\347\241\200\346\225\231\347\250\213/index.html"
new file mode 100644
index 000000000..99c6beeb9
--- /dev/null
+++ "b/categories/\351\233\266\345\237\272\347\241\200\346\225\231\347\250\213/index.html"
@@ -0,0 +1,4984 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分类:零基础教程 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Win11独占的WSA,如今Win10也能够使用,对于不想使用Bug11的AMD的用户来说,又有一个不更新系统的理由。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 使用Python脚本自动打卡智慧曲园
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto算是一个集图床功能与图片展示为一体的项目,同时还提供了注册功能,如果你的服务器带宽允许,你可以邀请小伙伴为你的图片站扩充资源!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cinemas/index.html b/cinemas/index.html
new file mode 100644
index 000000000..b1cf31d98
--- /dev/null
+++ b/cinemas/index.html
@@ -0,0 +1,5668 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上杉九月的追剧列表 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上杉九月的追剧列表
+
+
+
+
+
+
+
+
+
+
+ 最近在看五郎叔
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全10集0
+
+
+
+
+ 纪录片 中国大陆
+
+
+
+ 总播放 1.4 亿
+
+
+ 追剧人数 60.8 万
+
+
+ 硬币数 16.9 万
+
+
+ 弹幕总数 49.9 万
+
+
+ 评分 9.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全8集0
+
+
+
+
+ 纪录片 中国大陆
+
+
+
+ 总播放 1.1 亿
+
+
+ 追剧人数 96.3 万
+
+
+ 硬币数 53.4 万
+
+
+ 弹幕总数 23.4 万
+
+
+ 评分 9.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -0
+
+
+
+
+ 电影 美国
+
+
+
+ 总播放 1876.3 万
+
+
+ 追剧人数 18.4 万
+
+
+ 硬币数 2.8 万
+
+
+ 弹幕总数 2.6 万
+
+
+ 评分 9.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全10集0
+
+
+
+
+ 纪录片 中国大陆
+
+
+
+ 总播放 4.1 亿
+
+
+ 追剧人数 389.4 万
+
+
+ 硬币数 129.8 万
+
+
+ 弹幕总数 247.2 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全1集0
+
+
+
+
+ 电影 日本
+
+
+
+ 总播放 2324.3 万
+
+
+ 追剧人数 650.4 万
+
+
+ 硬币数 6.2 万
+
+
+ 弹幕总数 7.3 万
+
+
+ 评分 8.9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全10集0
+
+
+
+
+ 综艺 中国大陆
+
+
+
+ 总播放 1.9 亿
+
+
+ 追剧人数 145.2 万
+
+
+ 硬币数 39.5 万
+
+
+ 弹幕总数 84.8 万
+
+
+ 评分 9.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全6集0
+
+
+
+
+ 纪录片 中国大陆
+
+
+
+ 总播放 4288.1 万
+
+
+ 追剧人数 30.8 万
+
+
+ 硬币数 3.9 万
+
+
+ 弹幕总数 3.6 万
+
+
+ 评分 9.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全2集0
+
+
+
+
+ 综艺 中国大陆
+
+
+
+ 总播放 2504.0 万
+
+
+ 追剧人数 51.8 万
+
+
+ 硬币数 60.5 万
+
+
+ 弹幕总数 12.2 万
+
+
+ 评分 9.9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全1集0
+
+
+
+
+ 综艺 中国大陆
+
+
+
+ 总播放 465.4 万
+
+
+ 追剧人数 161.3 万
+
+
+ 硬币数 14.7 万
+
+
+ 弹幕总数 2.7 万
+
+
+ 评分 9.9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全6集0
+
+
+
+
+ 纪录片 中国大陆
+
+
+
+ 总播放 3.2 亿
+
+
+ 追剧人数 361.4 万
+
+
+ 硬币数 129.7 万
+
+
+ 弹幕总数 70.9 万
+
+
+ 评分 9.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全41集0
+
+
+
+
+ 电视剧 中国大陆
+
+
+
+ 总播放 1883.3 万
+
+
+ 追剧人数 15.8 万
+
+
+ 硬币数 4.8 万
+
+
+ 弹幕总数 16.0 万
+
+
+ 评分 9.9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 未完结0
+
+
+
+
+ 电影 中国大陆
+
+
+
+ 总播放 137.4 万
+
+
+ 追剧人数 6.7 万
+
+
+ 硬币数 2.2 万
+
+
+ 弹幕总数 1.8 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全26集0
+
+
+
+
+ 纪录片 加拿大
+
+
+
+ 总播放 1127.4 万
+
+
+ 追剧人数 27.8 万
+
+
+ 硬币数 8185
+
+
+ 弹幕总数 3.8 万
+
+
+ 评分 9.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全1集0
+
+
+
+
+ 电影 日本
+
+
+
+ 总播放 3064.3 万
+
+
+ 追剧人数 820.6 万
+
+
+ 硬币数 59.9 万
+
+
+ 弹幕总数 42.3 万
+
+
+ 评分 9.9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全2集0
+
+
+
+
+ 纪录片 中国大陆
+
+
+
+ 总播放 129.0 万
+
+
+ 追剧人数 3.6 万
+
+
+ 硬币数 2331
+
+
+ 弹幕总数 649
+
+
+ 评分 -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全3集0
+
+
+
+
+ 综艺 中国大陆
+
+
+
+ 总播放 1.8 亿
+
+
+ 追剧人数 636.7 万
+
+
+ 硬币数 134.5 万
+
+
+ 弹幕总数 83.7 万
+
+
+ 评分 9.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全70集0
+
+
+
+
+ 纪录片 美国
+
+
+
+ 总播放 9980.9 万
+
+
+ 追剧人数 77.7 万
+
+
+ 硬币数 12.8 万
+
+
+ 弹幕总数 13.4 万
+
+
+ 评分 9.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全10集0
+
+
+
+
+ 纪录片 英国
+
+
+
+ 总播放 500.5 万
+
+
+ 追剧人数 17.6 万
+
+
+ 硬币数 6038
+
+
+ 弹幕总数 1.8 万
+
+
+ 评分 9.4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全10集0
+
+
+
+
+ 综艺 中国大陆
+
+
+
+ 总播放 2.6 亿
+
+
+ 追剧人数 130.8 万
+
+
+ 硬币数 128.7 万
+
+
+ 弹幕总数 379.8 万
+
+
+ 评分 9.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全5集0
+
+
+
+
+ 综艺 中国大陆
+
+
+
+ 总播放 1.9 亿
+
+
+ 追剧人数 508.3 万
+
+
+ 硬币数 160.9 万
+
+
+ 弹幕总数 124.3 万
+
+
+ 评分 9.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/content.json b/content.json
new file mode 100644
index 000000000..56d9658da
--- /dev/null
+++ b/content.json
@@ -0,0 +1 @@
+{"meta":{"title":"九月的生活","subtitle":"New Dream New Start","description":"希望在这里分享我的经验与生活!","author":"上杉九月","url":"https://blog.sakurasep.site","root":"/"},"pages":[{"title":"","date":"2023-12-11T16:57:45.000Z","updated":"2023-12-11T16:57:45.000Z","comments":true,"path":"about/index.html","permalink":"https://blog.sakurasep.site/about/index.html","excerpt":"","text":"Ocean Cat 关于我 资源链接 我的小项目Damedame 海猫!安哲拉才不是海猫! 20岁了,为梦想奋斗 个人简介爱好:ACGN,Coding,创作喜欢:探索新奇的事物,可爱的女孩子目前在玩的游戏:Arknights,CSGO,APEX,崩坏3运动:散步,骑行目标:人民教师||自由开发者||自媒体希望拥有的技能:多国语言||美术设计||3D建模 Always believe that something wonderful is about to happen. 我的人生目标(暂时) 我写的教程能帮助到初学者 持续运营自己的自媒体频道 开源一些实用的工具软件 有一个稳定的工作 给喜欢的妹子画插画 遇到命中注定的那一个人 走遍大江南北,记录下来我的旅程 目前开源的项目 请注意,使用本站代码时需要标明出处 九月的生活 前端 前端项目上杉九月-个人主页上杉九月-Hexo博客上杉九月-Typecho博客上杉九月-Halo博客上杉九月-Hugo博客上杉九月-兰空图床上杉九月-Cloudreve云盘 项目截图 上杉九月-个人主页上杉九月-Hexo博客上杉九月-Typecho博客上杉九月-Halo博客上杉九月-Hugo博客上杉九月-兰空图床上杉九月-Cloudreve云盘"},{"title":"所有分类","date":"2023-12-11T16:57:45.000Z","updated":"2023-12-11T16:57:45.000Z","comments":true,"path":"categories/index.html","permalink":"https://blog.sakurasep.site/categories/index.html","excerpt":"","text":""},{"title":"朋友圈","date":"2023-12-11T16:57:45.004Z","updated":"2023-12-11T16:57:45.004Z","comments":true,"path":"fcircle/index.html","permalink":"https://blog.sakurasep.site/fcircle/index.html","excerpt":"","text":""},{"title":"","date":"2023-12-11T16:57:45.004Z","updated":"2023-12-11T16:57:45.004Z","comments":true,"path":"friends/index.html","permalink":"https://blog.sakurasep.site/friends/index.html","excerpt":"","text":"欢迎来访,无限进步! 本站信息如何申请友链申请要求失效链接 访问地址:https://blog.sakurasep.site/ 站点名称:上杉九月的博客 头像地址:https://cdn.sakurasep.site/Website/new_avatar_512.png 网站缩略图:https://cdn.sakurasep.site/Article/IndexImg/Hexo.png 描述信息:分享生活,探索未来! 注意,本站资源开启防盗链,博主在审核通过您的友链申请后会将你的友链网站加入白名单,敬请谅解!本站有两种友链展示格式,如果你想要展示你网站的首页缩略图,请填写screenshot选项 本站采用的是动态issue申请,请访问Github Issue,按照模板添加友链申请。 如果不方便打开Github,请在评论区按照本站信息模板留言,谢谢。 HTTPS站点 稳定的自有域名 能够坚持运营博客 请先将本站加入友链 非法站点 已经失效的站点 暂无 以上内容的最后更新日期:2023年09月03日 上杉九月的其他站点九月的生活-Typecho内容算是同步更新,以后Hexo博客重构之后,会转移使用该博客九月的生活-halo内容专注于生活方面,主要是分享日常生活九月的生活-Hugo也许会使用这个博客,优点是部署快速,现在hexo部署太慢了Cloudreve云盘分享后续开放给部分用户使用,采用OnedriveE5账户个人主页我的个人主页,记录着所有运营着的网站兰空图床目前picgo+腾讯云cos用的还行,暂时不考虑图床 团队成员上杉九月分享生活,探索未来! 我的朋友们"},{"title":"留言板","date":"2023-12-11T16:57:45.004Z","updated":"2023-12-11T16:57:45.004Z","comments":true,"path":"info/index.html","permalink":"https://blog.sakurasep.site/info/index.html","excerpt":"","text":"欢迎留下你的建议"},{"title":"所有标签","date":"2023-12-11T16:57:45.004Z","updated":"2023-12-11T16:57:45.004Z","comments":true,"path":"tags/index.html","permalink":"https://blog.sakurasep.site/tags/index.html","excerpt":"","text":""}],"posts":[{"title":"算法通关村第一关-链表青铜挑战笔记","slug":"Study/算法通关村第一关-链表青铜挑战笔记","date":"2023-09-02T09:30:35.000Z","updated":"2023-09-02T09:30:35.000Z","comments":true,"path":"posts/Yupi-Day1-01/","link":"","permalink":"https://blog.sakurasep.site/posts/Yupi-Day1-01/","excerpt":"本篇文章实现了单链表的基本增删操作","text":"前言本章节是关于单链表的增加和删除操作,根据题目要求把需要用到的函数都进行了自定义,方便重复调用 大部分的思路都以注释的方式展现,因为比较忙,就不放图了,效率第一! 希望各位可以指出我文章中的错误,因为个人的理解难免会出现差错,感谢! 更新日志暂无 通关要求 1.理解C语言里是如何构造出链表的 2.链表增加元素,首部、中间和尾部分别会有什么问题,该如何处理? 3.链表删除元素,首部、中间和尾部分别会有什么问题,该如何处理? 代码思路链表的定义 在链表的每一个结点都是由数据域和指针域构成,数据域可以有不同的数据类型 这种依靠指针的数据结构优点就是添加和删除操作比较简单,缺点也显而易见,由于数据是分散存储,导致访问其中某一个数据必须对链表进行遍历 struct ListNode{ int num; // 数值 struct ListNode *next; // 指针}; 链表的初始化 当我们对链表进行初始化的时候,首先应该新建一个头指针,并将指针初始化为NULL 然后创建头结点s,初始化它的指针为NULL.此时让头指针指向s,此时,一个最基础的链表诞生了 接下来就是不断创建新的结点,每一个新的结点都会成为链表的尾部,然后将头结点s的指针指向新创建的结点,将结点加入链表. 最后就是将头结点的位置向后移动,以便于下一次将新结点加入链表 // 初始化链表struct ListNode* initList(){ // 1.创建头指针 struct ListNode *p = NULL; // 2.创建头结点 struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = NULL; p = s; // 头指针指向头结点 // 3.新建结点使得每一个加入的数值保存在新结点,并加入链表 for(int i = 1; i < 5; i++) { // 创建新结点a,给a赋值,并且指针指向链表尾部 struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->num = i; a->next = NULL; // 首先将头结点指向这个新建立的结点,此时这个结点已经加入了链表 s->next = a; // 然后头结点会相当于移动到a这个节点,此时头结点指针指向NULL,准备下一次的a结点加入链表 s = s->next; } // 返回整个链表的头指针,便于遍历 return p;} 链表的遍历 链表的不便就在于获取链表的长度或是访问链表某一位置的数据,都需要对链表进行遍历,最佳情况肯定是数据在表头,最糟糕的情况就是数据在表尾 对于遍历链表,最重要的是知道什么时候停止遍历.单链表的表尾永远指向NULL,所以我们当我们从头开始遍历,直到结点指针指向NULL就停止,此时停留在表尾结点 // 获取链表长度int getListLength(struct ListNode *p){ int length = 0; struct ListNode *s = p; while (s->next != NULL) { length++; s = s->next; } return length;} 链表结点的增加 表头插入元素 这里我们首先要获取到头指针,先将新结点的指针指向头指针的指向的结点,然后将头指针指向新结点,此时就完成了表头插入元素的操作,当然不要忘了数值域 表尾插入元素 这里我们先要遍历链表获取到表尾结点,然后将表尾结点的指针指向新结点,此时就完成了表尾元素的插入 插入中间位置 举个例子,如果我要在2这个位置插入元素,那么先遍历到结点1,然后新建一个结点,将新结点的指针指向结点1所指向的结点2,然后将结点1的指针指向新结点,此时新结点变成了结点2,之前的结点2变成了结点3 // 添加元素 函数传入的是头指针,操作数,插入数值// 1.头插法 2.尾插法 3.插入中间位置bool addNode(struct ListNode *p, int op, int number){ // 考虑此时为空链表 if(p == NULL) { return false; } // 头插法 if(op == 1) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->num = number; s->next = p->next; p->next = s; } // 尾插法 if(op == 2) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = p->next; while (s->next != NULL) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = a; a->num = number; a->next = NULL; } // 插入到中间位置 if(op == 3) { struct ListNode *s = p; int position = 0; // 插入位置 printf("请输入要插入的位置,只可以插入1-%d:\\n", getListLength(p)-1); scanf("%d", &position); // 考虑边界 if(position < 1 || position >= getListLength(p)) { return false; } for (int i = 1; i <= position; i++) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->next = s->next; a->num = number; s->next = a; } return true;} 链表结点的删除 删除头部元素 因为我们知道头指针,所以很简单,只需要让头指针指向当前结点的下一个结点即可,此时表头将会变成结点2,结点1并没有被删除,而是被隐藏 删除尾部元素 首先要遍历整个链表,使得找到指向表尾元素的指针,也就是找到倒数第二个结点,将该结点的指针指向NULL,此时表尾结点被隐藏 删除中间元素 举个例子,我要删除位置2的结点,那么我找到位置1的结点,然后将该结点的指针指向位置3,也就是位置2结点的指针,此时结点2就不会有结点指向,相当于被隐藏 // 删除元素 函数传入的是头指针,操作数// 1.删除头部元素 2.删除尾部元素 3.删除中间元素bool deleteNode(struct ListNode *p, int op){ // 考虑空链表 if(p == NULL) { return false; } // 删除头部元素 if(op == 1) { p->next = p->next->next; } // 删除尾部元素 if(op == 2) { struct ListNode *s = p; while(s->next->next != NULL) { s = s->next; } s->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要删除结点的位置,当前链表总长度为%d:\\n", getListLength(p)); scanf("%d", &position); // 考虑边界情况 if(position < 1 || position > getListLength(p)) { return false; } for(int i = 1; i < position; i++) { s = s->next; } s->next = s->next->next; } return true;} 运行截图 完整运行代码/*作者: 上杉九月题目: 算法通关村第一关-链表青铜挑战笔记时间: 2023.09.02*/#include <iostream>using namespace std;// 链表的定义struct ListNode{ int num; struct ListNode *next; // 指针};// 初始化链表struct ListNode* initList(){ // 1.创建头指针 struct ListNode *p = NULL; // 2.创建头结点 struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = NULL; p = s; // 头指针指向头结点 // 3.新建结点使得每一个加入的数值保存在新结点,并加入链表 for(int i = 1; i < 5; i++) { // 创建新结点a,给a赋值,并且指针指向链表尾部 struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->num = i; a->next = NULL; // 首先将头结点指向这个新建立的结点,此时这个结点已经加入了链表 s->next = a; // 然后头结点会相当于移动到a这个节点,此时头结点指针指向NULL,准备下一次的a结点加入链表 s = s->next; } // 返回整个链表的头指针,便于遍历 return p;}// 获取链表长度int getListLength(struct ListNode *p){ int length = 0; struct ListNode *s = p; while (s->next != NULL) { length++; s = s->next; } return length;}// 添加元素 函数传入的是头指针,操作数,插入数值// 1.头插法 2.尾插法 3.插入中间位置bool addNode(struct ListNode *p, int op, int number){ // 考虑此时为空链表 if(p == NULL) { return false; } // 头插法 if(op == 1) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->num = number; s->next = p->next; p->next = s; } // 尾插法 if(op == 2) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = p->next; while (s->next != NULL) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = a; a->num = number; a->next = NULL; } // 插入到中间位置 if(op == 3) { struct ListNode *s = p; int position = 0; // 插入位置 printf("请输入要插入的位置,只可以插入1-%d:\\n", getListLength(p)-1); scanf("%d", &position); // 考虑边界 if(position < 1 || position >= getListLength(p)) { return false; } for (int i = 1; i <= position; i++) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->next = s->next; a->num = number; s->next = a; } return true;}// 删除元素 函数传入的是头指针,操作数// 1.删除头部元素 2.删除尾部元素 3.删除中间元素bool deleteNode(struct ListNode *p, int op){ // 考虑空链表 if(p == NULL) { return false; } // 删除头部元素 if(op == 1) { p->next = p->next->next; } // 删除尾部元素 if(op == 2) { struct ListNode *s = p; while(s->next->next != NULL) { s = s->next; } s->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要删除结点的位置,当前链表总长度为%d:\\n", getListLength(p)); scanf("%d", &position); // 考虑边界情况 if(position < 1 || position > getListLength(p)) { return false; } for(int i = 1; i < position; i++) { s = s->next; } s->next = s->next->next; } return true;}// 输出链表void printList(struct ListNode *p){ struct ListNode *s = p; printf("链表长度为:%d\\n链表数据为:\\n", getListLength(p)); while (s->next != NULL) { s = s->next; printf("%d ", s->num); } printf("\\n");}int main(){ // p为头结点 struct ListNode *p = NULL; p = initList(); // 增 int number = 0, op = 0; printf("输入操作数,1为表头插入,2为表尾插入,3为表内插入:\\n"); scanf("%d", &op); printf("输入插入的数据:\\n"); scanf("%d", &number); if(addNode(p, op, number)) { printf("插入成功\\n"); } else { printf("插入失败\\n"); } printList(p); // 删 printf("输入操作数,1为表头删除,2为表尾删除,3为表内删除:\\n"); scanf("%d", &op); if(deleteNode(p, op)) { printf("删除成功\\n"); } else { printf("删除失败\\n"); } printList(p); return 0;}","categories":[{"name":"学习笔记","slug":"学习笔记","permalink":"https://blog.sakurasep.site/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"学习笔记","slug":"学习笔记","permalink":"https://blog.sakurasep.site/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"name":"鱼皮的算法通关村","slug":"鱼皮的算法通关村","permalink":"https://blog.sakurasep.site/tags/%E9%B1%BC%E7%9A%AE%E7%9A%84%E7%AE%97%E6%B3%95%E9%80%9A%E5%85%B3%E6%9D%91/"}],"author":"上杉九月"},{"title":"适用于Win10的安卓子系统","slug":"HowToDo/零基础教程 - 适用于Win10的WSA","date":"2023-01-12T13:36:39.000Z","updated":"2023-01-15T13:36:39.000Z","comments":true,"path":"posts/WSA_On_Win10/","link":"","permalink":"https://blog.sakurasep.site/posts/WSA_On_Win10/","excerpt":"Win11独占的WSA,如今Win10也能够使用,对于不想使用Bug11的AMD的用户来说,又有一个不更新系统的理由。","text":"观前摘要本篇文章灵感来源酷安用户@Earth_Online,感谢这位大佬发现如此宝藏的Github项目,并给出了详细的实现教程. 本篇文章的整体思路参考LSPosed/MagiskOnWSALocal 和 cinit/WSAPatch 的说明文件,并根据我自己的实践理解进行更为详细简要的说明,方便小白或者有兴趣的发烧友进行学习. 本文作者 & 头图设计 上杉九月 长楽 发布平台 - 博客类(首发) 上杉九月的博客(Hexo)https://blog.sakurasep.site 上杉九月的博客(Typecho)https://blog.sakurasep.club 上杉九月的小世界https://space.sakurasep.site 发布平台 - 社交平台 前言对于我这台R7000P 2020, AMD 4800H","categories":[{"name":"零基础教程","slug":"零基础教程","permalink":"https://blog.sakurasep.site/categories/%E9%9B%B6%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/"}],"tags":[{"name":"零基础","slug":"零基础","permalink":"https://blog.sakurasep.site/tags/%E9%9B%B6%E5%9F%BA%E7%A1%80/"},{"name":"WSA","slug":"WSA","permalink":"https://blog.sakurasep.site/tags/WSA/"},{"name":"Windows","slug":"Windows","permalink":"https://blog.sakurasep.site/tags/Windows/"}],"author":"上杉九月"},{"title":"Hexo_03-Volantis主题的使用指南(一)","slug":"Hexo/Hexo系列 - Volantis主题的使用指南_03","date":"2022-06-25T01:07:41.000Z","updated":"2022-06-25T01:07:41.000Z","comments":true,"path":"posts/hexo03/","link":"","permalink":"https://blog.sakurasep.site/posts/hexo03/","excerpt":"在上次教程已经完成了基本搭建,本次教程来将主题应用到博客。因为目前很多Hexo主题都处于停更状态,我推荐使用Volantis主题或Butterfly主题。本教程仅介绍Volantis的使用方法。","text":"更新中 关于我","categories":[{"name":"Hexo系列","slug":"Hexo系列","permalink":"https://blog.sakurasep.site/categories/Hexo%E7%B3%BB%E5%88%97/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://blog.sakurasep.site/tags/Hexo/"},{"name":"零基础","slug":"零基础","permalink":"https://blog.sakurasep.site/tags/%E9%9B%B6%E5%9F%BA%E7%A1%80/"}],"author":"上杉九月"},{"title":"Hexo_02-博客的配置文件解析","slug":"Hexo/Hexo系列 - 博客的配置文件解析_02","date":"2022-04-11T11:20:50.000Z","updated":"2022-06-25T09:07:41.000Z","comments":true,"path":"posts/hexo02/","link":"","permalink":"https://blog.sakurasep.site/posts/hexo02/","excerpt":"本篇文章讲述了`_config.yml`的内容配置","text":"config文件介绍此文件是对于Hexo最基本的修改,在使用主题后,由于主题作者设计的不同,某些设置将不会生效,你只需要填写必要设置,并且按照主题作者的文档进行修改即可。 Site Site部分 # 网站标题(必填)title: 九月的生活 # 副标题(在某些主题不生效)subtitle: New Dream New Start # 网站描述(建议填写,优化SEO)description: 希望在这里分享我的经验与生活! # 网站的关键字(选填,优化SEO)keywords: # 网站作者(必填)author: 上杉九月 # 网站使用的语言(取决于你主题目录下的语言文件)language:- zh-CN- en- zh-TW # 网站对应的时区(无需设置)timezone: '' Url Url部分 ## url这里有个主题分站的玩法,后期会讲到# 网站网址,如果设置了自定义域名,这里改为自定义的域名(必填)# Github: https://Github用户名.github.io# Gitee: https://Gitee仓库路径名.gitee.iourl: https://sakurasep.gitee.io # 文章的永久链接格式(选择性修改)permalink: :year/:title/ # (无需修改)permalink_defaults:pretty_urls: trailing_index: true trailing_html: true Directory Directory部分 # 以下内容保持默认即可source_dir: sourcepublic_dir: publictag_dir: tagsarchive_dir: archivescategory_dir: categoriescode_dir: downloads/codei18n_dir: :lang# 跳过指定文件的渲染,这里在后期做分站时需要跳过分站的目录,防止二次渲染skip_render: Writing Writing部分 # 新建文章的默认名称(无需修改)new_post_name: :title.md # 预设布局,hexo new命令可以创建post,draft,page三种页面,这里的值为post,hexo new "文章名“ 默认生成的是postdefault_layout: post# 将标题转换为首字母大写(无需修改)# 影响的是title属性,后续可以通过安装插件实现该功能,所以此处的设置在某些主题不生效titlecase: false# 是否在新标签页中打开链接(按需修改)external_link: enable: true # 仅仅对post类型的文章生效 field: site # 排除的域名 exclude: ''# 文件名称转换 0是不转换 1小写 2大写(无需修改)filename_case: 0# 是否渲染草稿文件(无需修改)render_drafts: false# 是否启用资源文件夹(按需修改)# 开启此选项后在hexo new文章时,会创建一个同名文件夹,用于保存你文章中所需资源。不过我建议使用网络图床。post_asset_folder: false# 相对链接(无需修改)relative_link: false# 是否显示未来的文章(按需修改)# 如果你文章的时间设置的未来的时间,打开这个即可显示# 这个可以用于定时发布某些文章,建议关闭future: false# 代码块高亮设置(根据所用主题按需设置)highlight: enable: true line_number: true auto_detect: false tab_replace: '' wrap: true hljs: falseprismjs: enable: false preprocess: true line_number: true tab_replace: '' Home page setting Home page setting部分 index_generator: path: '' # 每页显示的文章数量(按需修改) per_page: 7 # 文章排序方式,默认最新日期在最前面(无需修改) order_by: -date Category & Tag Category & Tag部分 # 以下内容不建议修改# 默认分类default_category: uncategorized# 分类别名category_map:# 标签别名tag_map: Metadata elements Metadata elements部分 # 元数据元素(无需修改)meta_generator: true Date / Time format Date / Time format部分 # 时间/日期格式(无需修改)date_format: YYYY-MM-DDtime_format: HH:mm:ss# 文章更新时间格式(按需修改)# 提供了三个选项 # mtime: 将文章修改时间作为文章更新时间# date: 将文章创建时间作为文章更新时间# empty: 没有文章更新时间updated_option: 'mtime' Pagination Pagination部分 # 分页时每页文章数量 设置为0 不分页(按需修改)per_page: 7pagination_dir: page Include / Exclude file(s) Include / Exclude file(s)部分 # 包括/不包括的文件(无需修改)include:exclude:ignore: Extensions Extensions部分 # 主题# 使用的主题名theme: volantis Deployment Deployment部分 # 部署设置deploy: type: git # 仓库地址 repo: https://gitee.com/sakurasep/sakurasep.git # 仓库分支 branch: master 关于我","categories":[{"name":"Hexo系列","slug":"Hexo系列","permalink":"https://blog.sakurasep.site/categories/Hexo%E7%B3%BB%E5%88%97/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://blog.sakurasep.site/tags/Hexo/"},{"name":"零基础","slug":"零基础","permalink":"https://blog.sakurasep.site/tags/%E9%9B%B6%E5%9F%BA%E7%A1%80/"}],"author":"上杉九月"},{"title":"Hexo_01-博客的安装与部署","slug":"Hexo/Hexo系列 - 博客的基本搭建_01","date":"2022-04-11T09:55:00.000Z","updated":"2022-06-25T01:07:41.000Z","comments":true,"path":"posts/hexo01/","link":"","permalink":"https://blog.sakurasep.site/posts/hexo01/","excerpt":"本篇文章,将会从Hexo博客的基本搭建,以及如何将你的博客部署到网络进行访问。","text":"本篇文章最后更新于2022.06.25 更改了一些遗留问题,更换了下载链接 最近在尝试新的markdown语法格式排版,试试效果如何 一. 软件环境Git Node.js Clash for Windows(任意加速器,保证能连接到Github) 1.1 Git官网我们会将搭建好的Hexo上传到Github,所以需要Git命令行支持。 Git官网页面根据系统选择64/32位 1.2 Node.js选择下载LTS版本 如果你的网络无法进行下载,请访问以下链接进行下载: Git-密码1128-来自上杉九月的网盘分享https://cloud.sakurasep.club/s/3RTl Node.js-密码1128-来自上杉九月的网盘分享https://cloud.sakurasep.club/s/EMfo 1.3 检查安装是否成功打开cmd命令行,输入node -v后显示下图所示,即为安装成功 显示版本号 在电脑的任意目录点击右键,能够显示Git Bash Here使用这个功能可以更方便的在当前目录启动命令行,当然你也可以使用cmd的cd命令到当前目录 右键菜单出现选项 二. 博客本地化部署2.1 更改npm为cnpm源国内某些网络环境访问npm会出现问题,建议使用taobao镜像源,能有效减少故障的发生 切换npm源 npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm切换过程 使用cnpm -v后正常输出版本号,即为安装成功 显示版本号 2.2 安装hexo命令行-g是对全局安装hexo命令行 安装Hexo命令行 cnpm install hexo-cli -g hexo-cli安装过程 2.3 Hexo博客初始化选取一个想要安装Hexo的目录,路径中最好不要含有中文,后续会更好处理 Hexo初始化命令 hexo init 初始化过程 此时文件夹内应有初始化文件,不过只要接下来能够成功运行,上述过程没有报错,就没问题。 hexo文件夹结构 如果初始化出现问题,即在运行hexo init的时候报错(通常是由于网络而出现问题) 如果出现网络问题导致无法下载,请访问以下链接获取基础包: Hexo_基础包文件-密码1128-来自上杉九月的网盘分享https://cloud.sakurasep.club/s/1Bt0 2.4 运行博客在博客根目录右键打开Git Bash Here 输入以下指令 Hexo初始化命令 hexo clean && hexo g && hexo s hexo clean 清除已经部署的网页静态文件 hexo g 编译当前博客 hexo s 启动本地服务器 本地部署过程 出现Hexo is running at http://localhost:4000/ . Press Ctrl+C to stop.,并且没有后续的警告语句,说明部署成功,在浏览器中输入localhost:4000查看部署效果。 运行成功 如果你的端口4000被占用,可以使用hexo s -p 端口号。然后访问http://localhost:端口号 以上,博客的最基本的本地化部署已经完成,接下来的内容是将博客部署到网络进行在线访问。 三. 博客部署到网络基本介绍一下目前不同部署方式的差别。 Github:微软旗下的开源代码托管平台,国内某些运营商可能无法访问,一般来说还是推荐部署在Github Pages,这也是我本人目前主要用的服务。 Gitee:虽然是国内的代码托管平台,访问速度可以保证,但是它的Pages页面需要手动更新,并且不能够绑定自定义的域名(如果你想和别的博主交换友链,最好还是要有一个域名。因为一般有域名的博客更有动力维护下去)。 Coding:部署方式很复杂,新版的Coding Pages貌似是和腾讯云挂钩,按量付费,感觉没必要了。 Vercel:是一个静态网页部署平台,好像访问速度要比Github稍微快一些,并且提供修改自定义域名。 云服务器:访问速度很大程度上取决于你的服务器的带宽,而且现在服务器的价格也不便宜,以后部署其他需要服务器的项目时再使用比较好。 3.1 部署到Github(推荐)全球最大同性社交平台 3.1.1 创建Github仓库注册完成Github账号,新建仓库用于保存上传博客代码。 Github账号注册时尽量不要使用国内邮箱,尤其是QQ邮箱 新建仓库 这里我已经存在该仓库,所以会爆红 Tips:试试新建一个仓库名为你Github用户名的仓库 按照图示修改好仓库名后,确保仓库为公开(Public),其他设置按需更改,创建仓库。 3.1.2 获取与Github的连接在任意位置打开Git Bash Here,输入以下指令 建立与Github的连接 git config --global user.name "你的GitHub用户名"git config --global user.email "你的GitHub注册邮箱"ssh-keygen -t rsa -C "你的GitHub注册邮箱" 生成密钥 输入第三个命令后只需要连续按下三次回车,就会在C:\\Users\\用户名\\.ssh中生成密钥文件 打开id_rsa.pub,复制文件内容,添加到 添加SSH公钥添加SSH公钥 然后在Git Bash中输入以下命令测试是否连通Github 测试与Github的连接 ssh -T git@github.com 成功连通 3.1.3 上传博客到Github首先在Git Bash中输入以下命令安装部署插件 安装hexo-deployer-git cnpm install hexo-deployer-git --save 安装成功 打开根目录下的_config.yml文件 deploy配置 config文件配置 # Deployment## Docs: https://hexo.io/docs/one-command-deploymentdeploy: type: git repo: 填入仓库连接 branch: master repo 可以复制此处的链接 复制仓库链接 填好后在Git Bash中输入下列命令部署到Github仓库 部署到Github hexo clean && hexo g && hexo d Github同理(此为部署到Gitee) 此时访问https://Github用户名.github.io即可访问 Github显示效果相同 3.1.4 绑定自定义域名你可以自行选择域名提供商,购买完域名后,在域名解析里设置以下解析记录 标准解析设置 解析记录简介主机记录:设置为@为泛解析,即访问域名为https://域名。如果想要设置为二级域名,请将主机记录设置为想要设置的名称,比如主机记录设置为hexo,即访问域名为https://hexo.域名记录类型:设置为CNAME,将域名解析到网址。因为Github建议将自定义域名以CNAME解析到Github用户名.github.io 然后在_config.yml中设置url为你解析的域名 url设置 最后再博客根目录/source下新建CNAME文件 注意,没有拓展名! 文件内容为自定义的域名 用于Github识别项目的自定义地址 3.2 部署到Gitee(备用方法)Gitee官网 3.2.1 创建Gitee仓库部署到Gitee与部署到Github的流程相差很小,看一个就行。 新建Gitee仓库 3.2.2 获取与Gitee的连接在任意位置打开Git Bash Here,输入以下指令 连接到Gitee git config --global user.name "你的Gitee用户名"git config --global user.email "你的Gitee注册邮箱"ssh-keygen -t rsa -C "你的Gitee注册邮箱" 获取SSH公钥 输入第三个命令后只需要连续按下三次回车,就会在C:\\Users\\用户名\\.ssh中生成密钥文件 打开id_rsa.pub,复制文件内容,添加到 添加SSH公钥 然后在Git Bash中输入以下命令测试是否连通Gitee 测试连接 ssh -T git@gitee.com 连接成功 3.2.3 上传博客到Gitee首先在Git Bash中输入以下命令安装部署插件 安装hexo-deployer-git cnpm install hexo-deployer-git --save 安装过程 打开根目录下的_config.yml文件 Gitee配置 config文件配置 # Deployment## Docs: https://hexo.io/docs/one-command-deploymentdeploy: type: git repo: 填入仓库连接 branch: master repo 可以复制此处的链接 复制仓库链接 填好后在Git Bash中输入下列命令部署到Gitee仓库 部署到Gitee hexo clean && hexo g && hexo d 上传成功 在仓库的服务-Gitee Pages进行手动部署 Github Pages会自动使用你仓库的代码进行部署,而Gitee需要你手动更新。 手动更新Pages 打开强制使用Https,更新部署 更新 等待部署结束后,访问Https://Gitee用户名.gitee.io查看部署结果 部署完成 3.3 部署到Vercel请在看过3.1部署到Github后再观看本部分教程。 官网 3.3.1 连接Github仓库连接仓库 项目名只能使用小写英文,无法使用大写英文,会报错 基本设置 稍等一段时间后,Vercel便部署完成了你的博客 部署完成 Vercel默认提供了域名,你也可以更改。到Settings-Domains中进行更改 更改域名 写在最后本篇文章基本讲述了Hexo博客的基本部署,包括了本地化部署测试和上传到Github,Gitee或是Vercel等平台,使用托管平台提供的Page服务进行远程访问。 本篇教程属于面向与小白的零基础教程系列,如果在安装过程中出现任何问题,你可以在评论区提问,你的提问也是我充实文章的助力! 关注上杉九月,关注上杉九月谢谢喵!","categories":[{"name":"Hexo系列","slug":"Hexo系列","permalink":"https://blog.sakurasep.site/categories/Hexo%E7%B3%BB%E5%88%97/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://blog.sakurasep.site/tags/Hexo/"},{"name":"零基础","slug":"零基础","permalink":"https://blog.sakurasep.site/tags/%E9%9B%B6%E5%9F%BA%E7%A1%80/"}],"author":"上杉九月"},{"title":"我的2021年度总结","slug":"Year/年终总结 - 2021年终总结","date":"2022-01-16T14:13:22.000Z","updated":"2023-12-11T16:57:45.000Z","comments":true,"path":"posts/year2021/","link":"","permalink":"https://blog.sakurasep.site/posts/year2021/","excerpt":"回顾一下我的2021","text":"前言2021年,我对自己算是一半满意,一半不满意吧,有些事情不尽如人意,有些事情自己做的很好,希望在2022年我能够有所进步。 本文中所有内容截止于2022.1.1 New Dream New Start 这次的年终总结并不是按阶段划分的,而是分成了两个部分。 第一部分是对2021年全年的回顾,自己做了什么,还有什么需要改进的地方。 第二部分是对2022年的一个总体的规划,新的一年我应该向什么方向努力。 第一部分 我的2021对于我来说,2021年研究了很多网站搭建的内容,熟练的掌握云服务器的各种应用方式,接下来就让我一一给各位梳理一下。 Hexo博客上杉九月的博客https://blog.sakurasep.site/ 图片介绍 首页图 首页图 主页信息流 主页 文章阅读 文章内容 简介 使用Hexo博客框架 + Github Pages Hexo作为目前活跃度较高的博客框架,主题丰富,功能齐全,个人是十分喜欢由Hexo框架生成的静态博客,Github Pages的访问速度还是可以的,而且如果担心访问速度的话也可以将博客部署到Gitee。 主题使用了Volantis 5.0 Beta 美化思路参考枋柚梓的猫会发光 (inkss.cn) Volantis算是一个不错的博客主题,属于是上限高,下限也高,新手通过Volantis官方文档也能配置完成一个不错的页面,而如果想更进一步,Volantis官方还收录了很多大佬的美化教程,可以进行参考。 该博客内容主攻计算机相关内容 由于是静态博客,写作相比于其他博客框架稍微有些繁琐,不适合日常更新。(不过有大佬写的HPP组件看起来还不错,等完善)。我在新的一年保证文章更新的情况下也会记录一下自己的其他方面的内容,放到博客分站吧。 还有些正在调试的内容 Hexo是支持分站的,即可以将其他Hexo主题作为主站点的其他访问风格,目前还在做主站的调试,等主站稳定了把分站会恢复的。 Halo博客上杉九月的生活博客https://halo.sakurasep.club/ 图片介绍 首页图 首页 主页信息流 主页 文章阅读 内容 简介网站还处于调试期,打算把其他内容放在这里更新。 网站是由Halo博客框架搭建 Halo博客框架属于是动态部署的博客类型,需要依托于Java环境。我把该博客部署在腾讯云上。 主题使用的是GitHub - LIlGG/halo-theme-sakura: Halo 版本的樱花🌸主题 Typecho博客上杉九月的综合博客https://blog.sakurasep.club/ 图片介绍 首页图 首页 文章阅读 内容 简介Typecho是我最喜欢的博客框架之一,响应速度快,写作方便。 不过Typecho也有它的缺点,就是很多插件已经不更新了。 Typecho的主题很多是需要付费的,当然也有免费的主题。这里我使用的是秦枫鸢梦 - 🌸花有重开日,人无再少年🏃♂️ (zwying.com) Chevereto图片站上杉九月的图片站https://pic.sakurasep.top/ 图片介绍 首页 首页 图片浏览 图片展示 简介图片站在去年年底就进入测试阶段,年初开始稳定运行。属于我这些网站中运行最为稳定的一个。。。 图片站可以注册(目前仅为邀请码开放,如果想上传图片的话,可以评论区留言邮箱,私发邀请码) 小服务器,空间不大,带宽不大,没法做到开放注册。 当然如果只是浏览和下载还是完全开放的。 图片链接是无法进行引用的,网站开启了防盗链 第二部分 我的2022去年对于我来说,其实是荒废了很多时间。 直到年底的几个月才认清了方向,明确了自己的未来的道路。 第一件事:健康的身体185cm的高个子 87KG的体重,BMI是稍微超标的。 对于我来说,身体长时间处于一个亚健康状态,精神支撑不了我去干一些事情,容易累,嗜睡。 2022 :第一件事 BMI回归正常水平,适当的增加肌肉 第二件事:英语 2022 :第二件事 2022年的两场考试,争取一遍过四级和六级 第三件事:考研 2022 :第三件事 2022年的两场考试,准备考研相关内容 第四件事:专业水平 2022 :第四件事 2022年的两场考试,全面提高自己的代码能力 第五件事:文章更新 2022 :第五件事 2022年的两场考试,持续产出高质量文章 关注上杉九月,关注上杉九月谢谢喵!","categories":[{"name":"年度总结","slug":"年度总结","permalink":"https://blog.sakurasep.site/categories/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"}],"tags":[{"name":"年度总结","slug":"年度总结","permalink":"https://blog.sakurasep.site/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"}],"author":"上杉九月"},{"title":"《CTF学习笔记》","slug":"Study/学习笔记 - CTF(Crypto)学习笔记","date":"2021-11-15T13:32:12.000Z","updated":"2023-12-11T16:57:45.000Z","comments":true,"path":"posts/ctf/","link":"","permalink":"https://blog.sakurasep.site/posts/ctf/","excerpt":"CTF还是挺有趣的,每天都做一做当作放松吧","text":"前言最近一位朋友入坑CTF,想起来开学还加了一个相关社团参加了几场比赛。还是挺有趣的。 每天做上一两个,就当是放松了。 正文BUUCTF在线评测 (buuoj.cn) – MD5题目 题目e00cf25ad42683b3df678c61f42c6bda 解法题目写的很清楚 MD5,然后给出的这一端字符串(用多了能看出来很像MD5) 扔到**MD5解密网站**得到flag{admin1} 解密网站PASS BUUCTF在线评测 (buuoj.cn) – 一眼就解密题目 题目flag:ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30= 解法Base64编码有个特点,编码末尾会出现= 特点 所以说仍然是放到**Base64解密网站** 解密得到 PASS 关注上杉九月,关注上杉九月谢谢喵!","categories":[{"name":"学习笔记","slug":"学习笔记","permalink":"https://blog.sakurasep.site/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"}],"tags":[{"name":"CTF","slug":"CTF","permalink":"https://blog.sakurasep.site/tags/CTF/"}],"author":"上杉九月"},{"title":"博客日志-记录博客最新动态","slug":"HexoAbout/博客公告 - 上杉九月的博客","date":"2021-09-21T11:39:01.000Z","updated":"2022-06-28T01:56:41.000Z","comments":true,"path":"posts/about-blog/","link":"","permalink":"https://blog.sakurasep.site/posts/about-blog/","excerpt":"本次更新内容 - 恢复更新,主题版本更新","text":"网站日志 2023-04-20 升级Volantis主题至6.0由于BBtalk公众号处于停止运营的状态,暂时隐藏BBtalk功能尝试修复twikoo的问题对多篇文章进行归档隐藏开始记录LeetCode学习记录开始缓慢修复博客的问题,并且缓慢恢复更新(找工作,考研) 公告你好,欢迎访问我的Hexo博客,博客现在处于正常运营状态,如果在某个地方出现使用问题或是加载缓慢的情况,请在本项目的Github Issues中进行反馈 Github Issues 这里我想要感谢 雨中的博客(wenchong.space)提供美化问题解答,非常感谢。 枋柚梓的猫会发光 (inkss.cn)的开源源码,对我的美化进程帮助很大,非常感谢。 关于主站网站基本信息 主站使用的是Github + Hexo + 腾讯云CDN的部署模式,最大程度保证访问速度。 分享文件全部采用依靠Onedrive API的Cloudreve,毕竟没有限速,文件大小限制也少。 目前的加载速度已经经过很多优化,如果有加载缓慢的情况请联系站长。 网站内容 主要是分享知识。我个人认为知识应当没有门槛,做好知识分级,给不同阶段的朋友们都能带来收获。 目前个人技术有限,仅仅会写一些入门知识分享。 希望自己能够慢慢变强吧。 欢迎各位朋友能在思考之后积极的和我探讨交流。 关于分站注意事项 分站没有去进行深度优化,仅仅作为一个基本的,保证能够阅读和互动的不同主题。注意,分站仅仅是同步主站点的文章更新,有些信息可能没有及时更新 此外,本站所有文章都使用了Volantis独有的标签,分站没有进行优化,使用的默认标签类型 如何使用 本站将以往的配置的主题作为分站部署https://blog.sakurasep.site/主题名称下,通过导航栏可以直接访问,当然你也可以在下方直接跳转。 你可以选择你所喜欢的博客主题进行文章阅读,希望带给你最好的阅读体验。 关于评论 本站在主站的评论系统已经更换为Twikoo,更棒的评论系统,欢迎大家使用! 本站的评论邮件提醒已经恢复,你在主站的评论收到回复后将可以接收邮件提醒。 关于更新首先可以确定的是,我会首先保证质量,目前我的技术水平不足,很多地方做的不是很好,还希望各位能提出修改建议,我也会积极进行修改。 目前将学业与更新做个平衡的话,基本确定是月更,一篇or两篇,得看我的空闲时间。 目前的规划是 旧文章的维护 稳定两个系列的更新(应用使用指南 + 零基础教程) 更新平台首发更新 首发平台上杉九月的博客上杉九月的知识屋(微信公众号) 关注上杉九月,关注上杉九月谢谢喵! 其他平台酷安数码-上杉九月哔哩哔哩-上杉九月微博-上杉九月 酷安B站微博 更新预告应用使用指南系列-老文章修改存储空间隔离-换你一个干净整洁的根目录Perfdog-简单直观的性能测试工具 RedirectPerfdog Hexo系列-新系列Hexo_01-博客的安装与部署Hexo_02-博客的配置文件解析Hexo_03-Volantis主题的使用指南(一) hexo01hexo02hexo03 新文章FilterBox-拯救你凌乱的通知栏 FilterBox 关注上杉九月,关注上杉九月谢谢喵!","categories":[{"name":"公告","slug":"公告","permalink":"https://blog.sakurasep.site/categories/%E5%85%AC%E5%91%8A/"}],"tags":[{"name":"博客","slug":"博客","permalink":"https://blog.sakurasep.site/tags/%E5%8D%9A%E5%AE%A2/"},{"name":"日志","slug":"日志","permalink":"https://blog.sakurasep.site/tags/%E6%97%A5%E5%BF%97/"},{"name":"公告","slug":"公告","permalink":"https://blog.sakurasep.site/tags/%E5%85%AC%E5%91%8A/"}],"author":"上杉九月"},{"title":"Perfdog-简单直观的性能测试工具","slug":"HowToUse/应用使用指南 - Perfdog","date":"2021-03-22T12:04:51.000Z","updated":"2023-12-11T16:57:45.000Z","comments":true,"path":"posts/perfdog/","link":"","permalink":"https://blog.sakurasep.site/posts/perfdog/","excerpt":"PerfDog已经收费,本教程不再更新","text":"一. 基本介绍当我们作为一位消费者购买电子产品时,我们获取第一手信息的方式大多是从各大视频平台的自媒体的首发测评。当我们拿到电子产品之后,如何对它的性能进行测试呢? 有的朋友首先会想到娱乐兔,HappyMatser等跑分软件。毕竟跑分很直观,高就是强,低就是弱。但是当跑分论成为大众的标准,厂商便会想出各种各样的方法来获取更高的跑分。例如前几天被曝光的Realme GT跑分作弊,还有各大厂商的跑分白名单(MIUI检测到跑分软件运行,会将CPU锁在最高频率)。这样的测试只能算是极限性能,可是真正的去游戏里测试,散热设计的不同,调度优化的不同便会产生巨大的差距。 很早之前我也对手里的电子产品进行测试,当时用的是GameBench,不过经常出问题,正版的价格更是无法接受。第二个使用的软件是快否,虽然偶尔会出现一些bug,但是使用体验还是很不错的。不过因为这软件最后一次更新时间是2019年6月,emmm,基本是凉凉了。 去年的时候,把手里的米9换成了米10,因为听说865的性能与功耗都平衡的很好,便产生了测试的想法。这一款由腾讯旗下WeTest开发的软件Perfdog吸引了我。支持Windows,Mac OS X两个PC平台,可以对安卓和iOS设备进行测试。 二. 软件测试环境小米10 12G RAM MIUI12.5 21.3.12 官方包 iPad 2020 第八代 A12 iPad OS 14 Windows10 20H2 三. 软件基本安装操作 Perfdog官方网站 在Perfdog的官网下载对应平台的软件压缩包后,将压缩包解压到电脑的目录中。 在目录找到Perfdog.exe可执行文件,打开后显示登陆界面,这里可以注册账号或使用QQ扫码登陆。 登录界面 登录后便会进入到软件的UI界面 软件UI 此时便可以将你的测试设备与电脑进行链接。初始化之后,在左侧的两个选项中选择测试方式(无线or有线 无线可以测试电池相关内容,有线可以同步显示并记录手机画面)和测试应用(支持应用名称搜索) 选择模式和设备(Windows平台可以多开Perfdog并同时对多部设备测试) 右下角的加号是添加和减少测试项目。勾选左边的对号便是对此项目进行测试,点击右边的方框选择是否在软件中显示该项目的数据。 安卓设备与iOS设备的测试项目稍有出入 安卓设备iOS设备 选择好测试应用,调整好测试项目,拿起你的设备,准备开始吧。 3.1 软件数据解释与详细使用步骤建议有能力的朋友前往官网去详细了解测试项目的具体作用。以下内容是我个人的解读,可能会有一些不准确的地方,还请多多指教。 3.2 概览基本数据 性能基本指标平均帧率 - Avg(FPS)这一个数据对应的是整个测试过程的平均帧率,可以粗略的反应游戏的流畅程度。卡顿次数/每10分钟 - Jank(/10min)严重卡顿次数/每10分钟 - BigJank(/10min) 这里放出perfdog官方给出的计算思路和计算方式 3.2.1 PerfDog Jank 计算思路: 考虑视觉惯性,假设以前三帧的平均帧耗时为参考,作为vsync时间间隔,连续两次vsync没有新渲染画面刷新,则认为是一次潜在卡顿,也就是说下一帧耗时大于前三帧平均帧耗时2倍,则认为一次潜在卡顿。同时单帧耗时满足大于两倍电影帧耗时1000ms/24x2(由于人眼低于24帧才能辨别画面不连续性),则认为是一次真正卡顿。同时若单帧耗时大于3倍电影帧耗时,则认为是一次严重卡顿。 3.2.2 PerfDog Jank计算方法: 同时满足两条件,则认为是一次卡顿Jank.①Display FrameTime>前三帧平均耗时2倍。②Display FrameTime>两帧电影帧耗时 (1000ms/24x2≈83.33ms)。同时满足两条件,则认为是一次严重卡顿BigJank.①Display FrameTime >前三帧平均耗时2倍。②Display FrameTime >三帧电影帧耗时(1000ms/24x3=125ms)。 其他内容未规范化应用CPU利用率 - Avg(AppCPU)[%]这里未规范化CPU利用率的计算方式 = CPU执行时间/CPU总时间。如果使用这一项利用率计算APP的性能消耗,会出现在低频运行时和高频运行时CPU利用率相同的情况。所以Perfdog官方建议使用规范化CPU利用率。CPU平均温度 - Avg(CTemp)[°C]规范化应用CPU利用率 - Avg(AppCPU)[%]Normalized这种CPU利用率的计算方法将CPU的频率考虑进去。CPU Usage(Normalized)= (CPU执行时间/CPU总时间) * (当前时刻所有CPU频率之和/所有CPU频率最大值之和)这种计算方法可以更真实的反映出APP的性能消耗。最大内存占用 - Peak(Memory)[MB]平均上传速度 - Avg(Send)[KB/s]平均下载速度 - Avg(Recv)[KB/s]平均功耗 - Avg(Power)[mW] 3.3 FPSFPS测试数据帧率图表Frame Time 测试项目解释平均帧率 - Avg(FPS)这一个数据对应的是整个测试过程的平均帧率,可以粗略的反应游戏的流畅程度帧率方差 - Var(FPS)这一个数据反映的是帧率的波动大小大于等于某一帧率的测试数据百分比 - FPS>=30[%] FPS>=45[%]这一数据显示可以修改,在右下角,可以看数据的大致分布降帧次数 - Drop(FPS)[/h]平均每小时两个相邻的FPS点相差大于8帧的次数,反映的是画面的流畅程度卡顿次数/每10分钟 - Jank(/10min)严重卡顿次数/每10分钟 - BigJank(/10min)卡顿率 - Stutter[%]计算方式 卡顿率 = 卡顿时长 / 总时长平均单帧渲染时间 - Avg(FTime)[ms]这一个数据可以结合第三张图 Frame Time分析如果Frame Time时长在某一个点很大幅度超过平均单帧渲染时间,那么大概率是一次卡顿单帧渲染时间超过100ms - FTime>=100ms[%]单帧渲染时间过长,很有可能导致屏幕没有内容可以刷新,所以画面不动,即为卡顿增量耗时 - Delta(FTime)>100ms[/h] 3.4 CPUCPU测试数据CPU总体使用率CPU核心使用率CPU时钟频率CPU温度 测试项目解释未规范化应用CPU利用率 - Avg(AppCPU)[%]这里未规范化CPU利用率的计算方式 = CPU执行时间/CPU总时间。如果使用这一项利用率计算APP的性能消耗,会出现在低频运行时和高频运行时CPU利用率相同的情况。所以Perfdog官方建议使用规范化CPU利用率。未规范化应用CPU利用率小于等于50%/70% - AppCPU<=50%[%] AppCPU<=70%[%]未规范化总的CPU利用率 - Avg(TotalCPU)[%]未规范化总的CPU利用率小于等于50%/70% - TotalCPU<=50%[%] TotalCPU<=70%[%]CPU平均温度 - Avg(CTemp)[°C]下面一排都是规范化的CPU指标,不多赘述CPU时钟频率 - CPU Clock反映的是当前时间CPU各个核心的频率 3.5 Memory这部分对于性能测试的参考性不是很高。 这里Perfdog提醒:在极限测试情况下,例如开启游戏超高帧率,建议不要勾选收集Memory Usage和Memory Detail,因为部分机型会有性能损耗。 内存测试数据内存使用率 3.6 GPUGPU测试数据GPU使用率 测试项目解释平均GPU利用率 - Avg(GUsage)[%]反映的是应用是否可以充分利用GPU性能平均CPU时钟频率 - Avg(GClock)[MHz]反映的是应用的负载压力 3.7 Network这一部分对于非实时对战游戏参考性不是很高。测试王者荣耀等对网络要求较高的游戏可以进行关注。 网络测试数据网络收发数据 3.8 Battery电池测试数据电池测试图表 测试项目解释平均功耗 - Avg(Power)[mW]在一定程度上反映了当前手机的功耗耗电量 - Sum(Battery)[mWh]手机在运行测试期间所消耗的电量平均电压 - Avg(Voltage)[mV]平均电流 - Avg(Current)[mA] 3.9 Energy Usage能耗数据 监控应用使用的能耗情况,可以监控CPU,GPU,网络模块,定位模块等等 3.10 需要关注的数据对于芯片的性能测试,我认为主要应该关注的数据项目为 平均帧率 - Avg(FPS) 反映的是设备的游戏运行稳定性,越接近设定的游戏帧率越好。 帧率方差 - Var(FPS) 反映的是设备掉帧的严重程度,越小越好。 降帧次数 - Drop(FPS)[/h] 反映的是设备的掉帧次数(掉帧次数不等于卡顿次数),越少越好。 卡顿次数/每10分钟 - Jank(/10min) 反映的是人所能感知的小卡顿次数,越少越好。 严重卡顿次数/每10分钟 - BigJank(/10min) 反映的是人所能感知的严重卡顿次数,越少越好。 平均单帧渲染时间 - Avg(FTime)[ms] 反映的是设备对画面单一帧的渲染平均时间,若某一时刻对画面渲染的时间远远超过平均值,说明此时屏幕内容没有刷新,会觉得明显卡顿,单帧渲染时间越贴近平均值越好。 规范化的应用CPU利用率 - Avg(AppCPU)[%]Normalized 反映的是排除其他影响因素后应用对于CPU性能的消耗。 CPU平均温度 - Avg(CTemp)[°C] 反映的是应用长时间运行使CPU升高的温度,作为温控降频的参考数据。 CPU时钟频率 - CPU Clock 反映的是应用运行时CPU的调度情况,作为卡顿分析和功耗分析的参考数据。 平均GPU利用率 - Avg(GUsage)[%] 反映的是应用对于GPU的使用情况。 平均CPU时钟频率 - Avg(GClock)[MHz] 反映的是应用运行时GPU的调度情况,作为卡顿分析和功耗分析的参考数据。 平均功耗 - Avg(Power)[mW] 反映的是应用运行时的平均功耗,高中低负载在功耗这一测试项目差距较大,例如骁龙888在高负载可以跑到11w的功耗,在低负载只有4w,续航和发热因此不同。 四. 云端页面功能介绍4.1 我的数据存放着测试结束后上传的测试结果,当测试结果较多时可以设置条件筛选数据。 测试记录 4.2 任务数据Perfdog支持创建测试任务,你可以邀请小伙伴一起进行测试,并将数据归档到任务中进行分享。 类似是一个组织 4.3 项目在这里可以针对不同应用数据进行分类显示 筛选条件 4.4 具体数据4.4.1 图表基本操作(数据统计范围修改,图标曲线显示)图表数据修改 4.4.2 图表拖选操作(查看某一时间段的测试数据)区域数据查看 4.4.3 点选查看卡顿具体场景具体场景分析 卡顿画面 4.5 不同测试范例对比4.5.1 可以添加5条测试用例用例数据对比 4.5.2 对比不同的测试用例用例数据对比 五. 写在最后PerfDog收费了,贵的离谱,面向的用户是各类数码KOL,我们自己想测试,需要找别的软件了。 听说华为的测试软件不错,有时间看看,写篇文章。 关注上杉九月,关注上杉九月谢谢喵!","categories":[{"name":"应用使用指南","slug":"应用使用指南","permalink":"https://blog.sakurasep.site/categories/%E5%BA%94%E7%94%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/"}],"tags":[{"name":"PC","slug":"PC","permalink":"https://blog.sakurasep.site/tags/PC/"},{"name":"应用使用指南","slug":"应用使用指南","permalink":"https://blog.sakurasep.site/tags/%E5%BA%94%E7%94%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/"}],"author":"上杉九月"},{"title":"存储空间隔离-还你一个干净整洁的根目录","slug":"HowToUse/应用使用指南 - 存储空间隔离","date":"2021-03-13T13:35:26.000Z","updated":"2023-12-11T16:57:45.000Z","comments":true,"path":"posts/redirect/","link":"","permalink":"https://blog.sakurasep.site/posts/redirect/","excerpt":"安卓系统的根目录,本不应该如此混乱。","text":"一. 前言1.1 安卓根目录的混乱现象每一次打开文件管理去寻找你所想要的文件,或是在聊天软件给朋友发送文件,总会看到目录里有着大量莫名奇妙的文件夹。一是不方便找到目标文件所在,二是对于强迫症挺不舒服的。 优化前的根目录,充斥着各种文件夹 造成这种现象,主要是国内软件厂商不遵守开发规范导致。根据安卓规范,在 Android/data/包名 路径应该保存对应应用的数据文件,Android/obb/包名路径应该保存对应应用的数据包文件。这两个文件夹是用户不应该去访问的,因此安卓11的新规范禁止系统(仅对于定制UI)的文件管理直接访问。如果介意(例如MIUI的默认文件管理)访问受限,可以安装相应的旧版本。 1.2 安卓11的新限制如图所示,MIUI的文件管理在一次升级中已经不在允许访问,点击前往查看将会跳转安卓原生的文件管理。 不能访问Android/data 应用应该将自身数据保存在Android文件夹内部,将用户数据按照分类保存在标准文件夹,但是国内应用大部分不会遵循开发规范,便造成了安卓根目录混乱的现状。 1.3 某些应用开发者的错误理解很多应用开发者为了适配安卓11的要求,做出了很多令人迷惑的行为。这里以腾讯的令人迷惑的操作举例。在QQ 8.2.8版本之后,将用户的下载文件位置从根目录更改到了Android文件夹内部,同时也是自身的数据文件夹。这让用户去查看自己下载的文件时十分麻烦。而且QQ在根目录仍然有着许多未知用途的文件夹。 1.4 标准文件夹的示例(MIUI)DCIM 保存相机拍摄的照片和视频(MIUI在该文件夹还存储了截图和屏幕录制)Documents 保存文档Download 保存下载文件Fonts 保存字体文件(MIUI系统字体文件保存在主题文件夹中)Movie 保存视频文件Music 保存音频文件Pictures 保存图片文件等等 对于不同的定制系统同时也有自己存放关键系统文件的文件夹,例如MIUI会在根目录建立一个MIUI文件夹,用来存放各种系统软件的缓存文件和数据。 1.5 解决方案依靠安卓大版本更新更严格的文件访问策略,强制应用使用更高的targetAPI。依靠定制系统完善文件访问限制功能,感觉最近Flyme和MIUI的沙盒已经有了雏形了。依靠Rikka开发的存储空间隔离(原名存储重定向),这也是我写本文的目的。 二. 安装与配置这款软件在酷安上即有下载,原名存储重定向,现名存储空间隔离。在使用这款软件之前,你需要接受以下的要求 手机已经获取了root权限愿意为这款软件支付一定的费用有耐心可以接受某些奇奇怪怪的问题可以主动寻找问题的解决方法 2.1 本机的使用环境为小米10 MIUI12.5 21.2.3 Simplicity官改 Magsik 21.4 App 22.0 2.2 模块介绍在满足root的环境下,在Magsik模块安装页面,搜索riru关键字便可以看到riru系列模块 搜索模块 我们这里只安装两个模块 Riru V23.6 Riru核心 Riru - Enhanced mode for Storage Isolation V23.6 存储空间隔离 这里提醒一下,如果不安装Riru,而先去安装Riru - Enhanced mode for Storage Isolation,将会无法安装。所以请按照顺序安装模块。 2.3 下载软件在酷安搜索存储空间隔离并下载 酷安 非Google Play平台软件价格 非Play平台 在Google Play搜索存储空间隔离并下载 Play平台 这里我推荐从Google Play下载,在Play商店购买的该软件,使用同一个谷歌账号可以多设备使用。 Play平台软件价格 Play平台 目前软件的内购验证做的很完善,如果你是在Google Play下载,无需登录外网,直接点击恢复购买即可。 2.4 安装过程下载完成后打开软件,便显示了软件的基本介绍 软件介绍 允许存储空间隔离获取Root权限,当出现提示成功时便可以进行下一步了。 获取Root权限正常运行 如果出现问题,请按照以上步骤重新安装环境。 不过有的机型的确是有兼容问题。 到这一步,就已经安装完成了 主界面 2.5 备份文件在这里,我会提供一份自己使用,基本没有错误的配置文件,你只需要在备份与还原里还原备份文件即可开始使用。 备份文件221128-密码1128-来自上杉九月的网盘分享https://cloud.sakurasep.club/s/L5HE 本配置文件的应用可能无法包含你所使用的应用,如果你想达到近乎完美的效果,请继续看下去。 本配置文件有的地方会有一些问题,你需要自行修改。 三. 原理解释以及详细配置3.1 原理在存储空间隔离的官网,我们可以找到一些我们所需要的内容 官方网站 以下内容是对官网指南的部分摘录以及我自己的理解 公共文件夹 DCIM,Pictures,Download 等公共文件夹,用来保存用户的文件,允许应用在此根据需求新建文件夹来保存对应的文件。例如QQ应该将用户下载的文件保存在 Download/QQ,而不是Android/data/包名。 但是应用对于公共文件夹的访问应该是一次性的,有目的的。例如在QQ发送图片给好友,QQ在获取用户的允许后访问DCIM和Pictures文件夹,发送结束后系统应该收回访问权限。 数据文件夹 Android文件夹内部对于用户来说是不应该进行访问的,对于应用来说则是无需授权就能够访问,在此保存应用的数据和缓存。 遗憾的是,目前原生安卓对于存储权限的选项只有允许和拒绝,此外,国内存在的大量“坏应用”如果被拒绝授权将不会运行。 存储空间隔离便是为了解决这一乱象而开发,这里感谢Rikka大佬开发了这款应用,在一定程度上很好解决了以上问题。 一般来说,不规范的应用会在根目录创建各种各样的文件夹。在启用存储空间隔离之后,应用将会在Android/data/包名/sdcard 内保存文件。 优点如下 因为卸载应用时只会清理应用的数据文件夹,在对应用进行隔离后,卸载时下载文件和应用数据一并删除系统统计应用占用空间大小仅会统计数据文件夹,在对应用进行隔离后,系统统计大小功能将会正常工作 3.2 使用教程3.2.1 软件权限对于MIUI用户,因为MIUI魔改了很多对于应用的控制权限,这里需要手动为存储空间隔离打开部分权限 在后台弹出界面 应用自启动以及省电策略 后台弹出自启动后台运行 3.2.2 默认存储空间位置在软件的设置 - 行为 - 默认隔离存储空间位置中,你有两种选择 保存在数据文件夹 保存在缓存文件夹 缓存文件夹有着和数据文件夹一样的特性,但是缓存文件夹可能被清理软件所清理。这里根据自己的需求吧。一般来说保存在数据文件夹即可。 两种选择 3.2.3 可访问文件夹模板然后回到上一级,在可访问文件夹模板中进行设置在这里所设置的文件夹就是允许应用访问的公共文件夹 我在默认的基础上添加了对于Movie文件夹的访问 访问模板 现在回到主页面,点击应用管理,就可以对应用进行单独设置 为了避免重定向系统应用带来各种各样的bug,我们先对第三方应用进行配置 不显示系统应用 3.3 根据需求配置白描是一款特别好用的OCR识别和PDF导出应用,这里我们拿它来讲解如何对一款应用重定向。 3.3.1 需求考虑我们应该考虑,这款应用会获取什么信息,因为我常常用它将图片转成PDF格式,所以DCIM(拍摄的图片)和Pictures(下载的图片)是可访问的文件夹。所以说我们对白描设置可访问文件夹为DCIM和Pictures。 白描的配置界面 3.3.2 模拟正常使用过程使用白描正常导出一次PDF,在查看文件历史里可以看到PDF保存在Download/Baimiao中。因为我希望保存在Document/白描,所以我们打开白描的Download访问权限(刚才是白描试图访问Download,但是被定向到了数据文件夹内部的Download),重新保存一次PDF,这时白描就会创建此文件夹。 导出路径 3.3.3 将隔离的文件同步到标准文件夹在导出被隔离的文件中添加同步文件夹规则,来源路径选择Download(新版存储空间隔离导出时会将该应用在目录内的全部文件进行同步) 编写规则 3.3.4 检查结果可以看到PDF文件成功保存到指定位置 同步成功 这里很多使用者都会有一个误区-既然我要把文件保存到Documents目录,那么为什么不把Documents设置为可访问的文件夹呢?其实很好解释,你把可访问的文件夹当做读取权限,把导出被隔离的文件当作写入权限,这样就明白了吧。 但是有些应用是很规范的,他们保存在标准文件夹,所以你应该允许该应用访问。 3.4 应用之间互相访问用过存储重定向的老用户都应该遇到过哔哩哔哩的视频分享到QQ,会出现系统繁忙的提示,就算偶尔可能分享成功,视频的封面也不见了。 这是因为哔哩哔哩老版本在根目录的tv.danmuku.bili存放自己的图片缓存,而对哔哩哔哩和QQ进行隔离后,QQ是访问不到这个文件夹的,就造成了分享失败的问题。 目前这个问题貌似得到了解决,哔哩哔哩在某一个版本对缓存文件的位置做了更改,移动到了数据文件夹,这是一个可能的原因。此外还可能因为哔哩哔哩的分享在QQ上被改为了小程序分享,分享短链接包含了封面地址,所以分享成功进行。 因为目前我并没有遇到该问题,所以希望各位可以在评论区反馈你们的使用情况,我会抽时间测试一下对应的软件版本。 好了,最近遇到了这一问题。同时也讲一下解决方案。同类问题都可以按照此思路解决。 哔哩哔哩的视频想要分享到QQ(空间,联系人等),QQ需要读取哔哩哔哩的封面缓存信息,而因为存储重定向的缘故,QQ无法对你允许访问文件夹之外的内容进行读取和写入操作,这就导致了分享的失败。所以为了解决这一问题,首先通过文件历史找到正常情况下哔哩哔哩的缓存保存位置。最新版缓存保存位置在 Android/data/tv.danmaku.bili/files/Images 。然后在QQ可访问的文件夹,在其他应用的文件夹中创建新的规则。 如下图所示。 解决隔离应用无法分享的问题 四. 最终的清理按照以上的例子,对用户应用一一设置。设置完成之后,删除除了标准文件夹的所有冗余文件,正常使用一段时间,你会发现根目录仍然会有一些文件夹,这时候就需要精准定位。 手动删除文件 如上图所示,比如说我们想知道com.miui.voiceassist其实很明显,是小爱同学,但请假装不知道是由哪一个应用创建。 我们将文件夹名复制,在文件监视中粘贴。 文件监视 然后就会显示有那些应用对该文件夹进行读取或者是写入。 不过我们要清楚读取和写入的区别,比如说这里显示了媒体存储设备对该文件夹的访问,而我们了解一点相关内容便可以知道个该软件是在扫描各个文件夹来查找媒体文件,并没有进行写入,所以文件夹不是由它创建。 向下拉便可以找到小爱同学的文件访问记录。 访问记录 现在点击小爱同学,对其进行隔离。 应用配置 五. 或许会更完美5.1 解决下载文件被某些应用存储在Android目录的问题QQ这类将用户下载的文件保存在数据文件夹的应用 酷安@Kotch给出了一种解决方案https://www.coolapk.com/feed/24654978?shareKey=MzIxM2M0ZDcxYmE2NjA0Y2I3MzU~&shareUid=3334957&shareFrom=com.coolapk.market_11.0.3 我采用的是Rikka开发的另一款应用-保存副本 酷安应用介绍 当你在QQ下载文件之后,只需要在打开方式里选择保存副本,软件就可以在Download目录复制一份相同的文件。 操作方法复制成功 六. 效果展示这里我自己把Malody的谱面文件存在了Map文件夹。 miad这一个空文件是为了防止MIUI的应用开屏广告产生(直接卸载掉智能服务com.miui.systemAdSolution即可。可以使用搞机助手进行卸载。一直用官改,不知道MIUI将广告服务集成在此应用里,感谢酷安@水水水淼的建议) mm是Magsik的MM管理器 如果和文章开头对比一下,可以说是强迫症狂喜。 最终的效果 七. 写在最后个人情况我在寒假里策划了很多内容,从这一篇文章开始,我会逐渐向给各位展示我策划的优质内容。 新的开始这算是一个新坑,目的就是向各位推荐一些优质的应用,他们真的可以方便你的生活。目前我的更新频率(如果没有什么意外的话基本就是一个月更新两次,一次是安卓上的应用,一次是PC上的应用),毕竟我刚进入大学,自己安排了很多学习的内容,时间并不是很充裕,保证质量是第一位(还有要填坑)。 欢迎交流这些应用对于各位来说有的可能没用过,有的可能早就熟练上手。我希望我写的图文可以帮助小白零基础上手优质应用,从而提高效率。同时期待和各路大佬交流使用心得,不断完善文章内容和呈现形式。 在这里我也会虚心听取意见,无论是对图文内容的建议,或是对某些优质应用的推荐等等。 关注上杉九月,关注上杉九月谢谢喵!","categories":[{"name":"应用使用指南","slug":"应用使用指南","permalink":"https://blog.sakurasep.site/categories/%E5%BA%94%E7%94%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/"}],"tags":[{"name":"应用使用指南","slug":"应用使用指南","permalink":"https://blog.sakurasep.site/tags/%E5%BA%94%E7%94%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/"},{"name":"安卓","slug":"安卓","permalink":"https://blog.sakurasep.site/tags/%E5%AE%89%E5%8D%93/"}],"author":"上杉九月"},{"title":"智慧曲园云端自动打卡","slug":"HowToDo/零基础教程 - 智慧曲园云端自动打卡","date":"2021-01-20T13:27:35.000Z","updated":"2022-06-27T16:00:00.000Z","comments":true,"path":"posts/qfnu/","link":"","permalink":"https://blog.sakurasep.site/posts/qfnu/","excerpt":"使用Python脚本自动打卡智慧曲园","text":"前言班群没事就@全体成员,用FilterBox过滤通知 + 自动签到,总算把这烦人的东西解决了。 正文Github:qfnuAutoTemperatureSubmit-智慧曲园自动签到 一. 软件环境云服务器(使用宝塔面板) Python3 二. 开始配置2.1 保存脚本文件在合适的位置保存脚本文件 保存文件 2.2.1 对python脚本进行单独配置如图所示是我们宿舍四人的python脚本 脚本文件详细配置 执行命令 python3 /www/wwwroot/qfnuAutoTemperatureSubmit/xxx.pypython3命令是你没有设置系统变量时使用的,如果你将python3作为系统环境,这里只需要改成python 使用宝塔计划任务创建定时任务 当时不太懂云服务器的目录结构,放在了wwwroot网站目录 定时执行 2.2.2 使用原python文件直接将脚本文件放在文件夹内 执行命令 python3 /www/wwwroot/qfnuAutoTemperatureSubmit/demo1.py 学号 密码 2.3 注意事项执行python脚本报错的话 作者回复 关注上杉九月,关注上杉九月谢谢喵!","categories":[{"name":"零基础教程","slug":"零基础教程","permalink":"https://blog.sakurasep.site/categories/%E9%9B%B6%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/"}],"tags":[{"name":"零基础","slug":"零基础","permalink":"https://blog.sakurasep.site/tags/%E9%9B%B6%E5%9F%BA%E7%A1%80/"},{"name":"云服务器","slug":"云服务器","permalink":"https://blog.sakurasep.site/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"},{"name":"Python","slug":"Python","permalink":"https://blog.sakurasep.site/tags/Python/"}],"author":"上杉九月"},{"title":"我的2020年度总结","slug":"Year/年终总结 - 2020年终总结","date":"2021-01-19T13:52:06.000Z","updated":"2023-12-11T16:57:45.000Z","comments":true,"path":"posts/year2020/","link":"","permalink":"https://blog.sakurasep.site/posts/year2020/","excerpt":"回顾一下我的2020","text":"前言咕咕咕了好久的2020年度总结终于来啦! ~~才不是因为我懒~~ 本文中所有内容截止于2021.1.1日 未来,一定更精彩! 第一阶段 高三下学期–高考紧张的学习生活,每天基本都是两点一线的路线。 枯燥的学习生活,在最后的高考100天尤为如此,从周考到天天做不完的卷子。 温暖的学习生活,在向着理想的大学奋斗的路上,感谢每一位同学的陪伴,感谢老班的悉心辅导,感谢每一位老师的辛苦付出,满满的回忆。 终究有一个好结果。 下一个人生阶段,在曲师大度过。 第二阶段 暑假放下了高三的压力,暑假便成为了我尽情发挥的舞台。 1. 第一台自己组装的主机个人算是一个果粉吧。于是在进行配件选购的时候,并没有选择热门的AMD + N卡的组合,而是为了方便黑苹果的安装,选择了Intel + A卡的组合。 配置如下 CPU:Intel i5-9600K GPU:AMD RX5700 XT内存:Kingston 骇客神条 3200MHz 8G x 2固态:Western Digital SN750 500GB x 2机械:TOSHIBA P300 3T主板:MSI Z390 Gaming Puls电源:Segotep 600W散热:玄冰400机箱:SAHARA 逆行者606显示器:AOC 23.8英寸 24G2 1080P144无线网卡:BCM943602CS 总体感觉还行吧,组装完成之后做了一个用OC引导的win10和macOS的双系统,这台电脑便是我暑假的主力机器。 电脑配置 关于macOS Catalina 10.15.6的EFI文件,我是参考Xjn´s Blog进行自己配置和调试,截止到文章书写的2021.1.18日,一切运行正常 关于macOS与其他苹果设备的联动,我个人用的是iPad mini2(网课专用板)。为了当前稳定的Wi-Fi链接和蓝牙功能(最初我是用的是USB网卡,不稳定,需要驱动支持),我入手了BCM943602CS这一款PCIE网卡。 从同学那里借来iPad Pro 2020做了一下测试,随航,接力,隔空投送都很完美。 macOS镜像下载:黑果小兵的部落阁 这里建议对于macOS或是苹果全家桶生态有着需求的,不要考虑黑苹果主机,黑苹果在稳定性和方便程度都不如白苹果,而且,M1的MacBook好香! 2. 第一台个人笔记本去上大学,当然不可以搬着一个MATX机箱去。所以入手了一台R7000P(首发价格) 用了两年,看到当年的我说AMD YES,我真想穿越回去,告诉当年的我,Intel YES。 电脑配置 桌面如图 我的桌面 用了仿macOS的软件,还不错,基本的动画实现了,UI设计也挺不错的,但是经常出现崩溃。 正版macOS 正版macOS桌面 因为大学是软件工程专业,笔记本上搭建了python2,,python3,java,c等众多环境 3. 小米9 – 小米10 2022年了 865还是顶,4750的电池还是比较大,90Hz的屏幕还是舒服,完全没有换手机的欲望。而且手机对我个人来说就是休闲小游戏加联系工具,下一次换手机估计换个Redmi Note了。 我的手机 4. Sony ZV-1 2022年了,还在吃灰。。。。 第三阶段 初步迈入大学生活1. Chevereto图片站通过自己搭建图床,学到了不少关于云服务器的知识(之前搭建Wordpress博客接触过)。 上杉九月的图片站 上杉九月的图片站https://pic.sakurasep.top/ 图片站 搭建教程已经出了 2. Hexo 上杉九月的博客 博客首页 3. 云服务器云服务器定时执行python脚本 python脚本原地址 4. 初接触CTF想作为一个兴趣爱好,寒假继续学习。 总结2020年经历了人生大考,虽然有很多波折,但也是顺利的度过了。 在2020年我个人多是在实践应用投入了精力,2021年我将会在原理以及应用的代码实现付出。 目标就是有事情做,写写教程,平平安安就是理想啦。 2020年真的是魔幻的一年,疫情迅速席卷全球,中国顶着巨大压力成功遏制,没想到(应该是意料之中),自由的西方资本主义国家没能遏制疫情传播,天灾人祸,诸如此类。 2021年一定会好起来的,提前在这祝福各位新年快乐,事事顺利,一切安好。 关注上杉九月,关注上杉九月谢谢喵!","categories":[{"name":"年度总结","slug":"年度总结","permalink":"https://blog.sakurasep.site/categories/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"}],"tags":[{"name":"年度总结","slug":"年度总结","permalink":"https://blog.sakurasep.site/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"}],"author":"上杉九月"},{"title":"Chevereto-属于你自己的图片站","slug":"HowToDo/零基础教程 - Chevereto图床","date":"2020-12-25T12:20:23.000Z","updated":"2022-06-27T16:00:00.000Z","comments":true,"path":"posts/chevereto/","link":"","permalink":"https://blog.sakurasep.site/posts/chevereto/","excerpt":"Chevereto算是一个集图床功能与图片展示为一体的项目,同时还提供了注册功能,如果你的服务器带宽允许,你可以邀请小伙伴为你的图片站扩充资源!","text":"前言前几天用hexo搭建博客首页的时候,想给网站来一张高清的壁纸。然后用picgo把一张比较大的图片上传到gitee。 Picgo 这时出现了第一个问题,picgo不显示该图片的缩略图 无法显示缩略图 本来以为是picgo的bug(beta3版本),便用手机上的图床软件上传 上传完成 显示上传成功,打开gitee的仓库也可以正常访问 在感到很疑惑的同时,我将该图片的URL发到了群里,让朋友看看能不能访问 然后我收到了朋友的截图 Gitee限制图片大小 Gitee图床存在的问题不能上传超过1M大小的图片,否则不能显示Gitee有段时间开启了防盗链,第三方引用全部失效 这时候我在图床APP的其他图床中看到了一段对于chevereto图床的描述 试试? 粗略的看了一下教程,实现效果还不错。 上杉九月的图片站-Chevereto 一. 方案总结方案一:神枫云 + FTP外部存储方案二:域名 + 轻量应用服务器方案三:备案域名 + ECS服务器 我个人最推荐方案二 学生优惠或者新用户购买腾讯云或者阿里云的服务器挺便宜的,大概是一年60左右。 腾讯云 当然我之前介绍的神枫云也可以,而且可以省去配置宝塔面板的步骤 二. 方案实施2.1 方案一:神枫云 + FTP外部存储神枫云首页 2.1.1 神枫云服务器配置建议购买这个3RMB/月的服务器 相比于1RMB/月的,月流量变为无限是很重要的 服务器 稍微配置一下,进入主机的管理界面,进入在线文件管理 管理面板 2.1.2 安装前的准备上传chevereto底包到根目录 chevereto 这里chevereto有免费版和付费版,我们使用付费版来进行搭建,因为付费版才可以使用外部存储,神枫云只提供了300M的数据库,存不了几张图片 chevereto免费版-Cloudreve-密码1128 chevereto收费版-Cloudreve-密码1128 然后解压底包到wwwroot文件夹 此时wwwroot文件夹内应该是下图所示的目录结构 目录结构 解压完成之后,进入域名绑定选项,这里有一个赠送的域名 默认域名 2.1.3 开始安装访问该域名进入安装进程,只修改三项 如果忘记了可以在面板首页-虚拟主机信息找到 连接数据库 然后是注册管理员的界面 填写信息 顺利安装完成 安装完成 如果一切顺利的话现在网站已经跳转到了chevereto图床的首页 首页展示 点击右上角的登录,把刚刚注册的管理员账号输入进去,然后进入仪表盘,到这里整个安装过程基本结束了。 不过因为神枫云的数据库空间很小,只有300M,根本存不了几张图片,所以下文的外部存储功能便十分重要。 2.2 域名 + 腾讯云轻量服务器2.2.1 安装宝塔镜像首先去腾讯云购买一个轻量应用服务器,并且选择香港地区来免去备案,镜像选择宝塔面板 选择宝塔镜像 然后来到服务器的控制台,在防火墙里添加8888端口来允许宝塔面板的访问,后续可以更改默认访问端口,并添加安全入口提高安全性。 放行端口 在应用管理里面可以获取默认宝塔面板的登录密码 访问密码 后期记得修改宝塔面板的登录端口以及默认用户名和密码 登录实例,可以选择网页直接登录,上图右下角,先复制命令,然后点击登录 远程登录 2.2.2 软件环境进入宝塔面板,在软件商店里安装(仅搭建图床) Nginx 1.16 php 7.3 MySQL 5.6 phpMyadmin 4.9 软件列表 2.2.3 创建站点然后在侧边栏找到网站,添加站点 填入你购买的域名,创建数据库 基本信息 然后在站点的设置里添加伪静态代码 伪静态代码 location / { index index.php; try_files $uri $uri/ /index.php?$query_string;} 伪静态 2.2.4 DNS解析然后在你申请域名的服务商添加DNS解析 DNS解析 主机记录@ 记录类型A 解析线路默认 记录值是IP地址 TTL 10分钟 稍微等上一段时间,就可以用域名访问你的chevereto图床进行安装了 2.2.5 安装过程访问该域名进入安装进程 连接数据库 然后是注册管理员的界面 填写信息 顺利安装完成 安装完成 如果一切顺利的话现在网站已经跳转到了chevereto图床的首页 首页展示 点击右上角的登录,把刚刚注册的管理员账号输入进去,然后进入仪表盘,到这里整个安装过程基本结束了。 如果你使用的是这种方式,那么一般来说数据库就有了一定的存储空间,例如我个人使用的就有约45G的数据空间 存储空间 这样的话存一些个人的图片还是没有问题的 2.3 备案域名 + 阿里云ECS服务器这里ECS服务器我购买的是学生优惠版本 这里虽然显示最少购买6个月,其实可以在调整配置的时候可以买一个月先试试 价格 这里仅需要修改购买时长,操作系统等会去更换 购买界面 购买完成后去阿里云ECS控制台,将实例停止运行以更换操作系统和购买云盘容量 注意:云盘容量按需购买,因为服务器的云盘是按月付费 2.3.1 更换镜像在镜像市场将操作系统更换为宝塔linux面板 更换镜像 自定义实例登录密码,一会要用到 修改登录密码 2.3.2 登录服务器在实例管理界面,进行远程登录 远程登录 选择第一项网页登录 远程登录 输入”bt default”来获取宝塔面板的默认登录密码 获取默认密码 记得放行安全组端口8888,然后用公网IP:8888访问宝塔面板 2.3.3 软件环境进入宝塔面板,在软件商店里安装(仅搭建图床) Nginx 1.16 php 7.3 MySQL 5.6 phpMyadmin 4.9 软件列表 2.3.4 创建站点然后在侧边栏找到网站,添加站点 填入你购买的域名,创建数据库 基本信息 然后在站点的设置里添加伪静态代码 伪静态代码 location / { index index.php; try_files $uri $uri/ /index.php?$query_string;} 伪静态 2.3.5 DNS解析然后在你申请域名的服务商添加DNS解析 DNS解析 主机记录@ 记录类型A 解析线路默认 记录值是IP地址 TTL 10分钟 稍微等上一段时间,就可以用域名访问你的chevereto图床进行安装了 2.3.6 安装过程访问该域名进入安装进程 连接数据库 然后是注册管理员的界面 填写信息 顺利安装完成 安装完成 如果一切顺利的话现在网站已经跳转到了chevereto图床的首页 首页展示 点击右上角的登录,把刚刚注册的管理员账号输入进去,然后进入仪表盘,到这里整个安装过程基本结束了。 三. 为域名添加Https访问打开你所购买域名服务商的控制台(这里以阿里云为例子) 在域名控制台-基本信息-SSL证书 用免费版就可以 填写一些必要的信息,审核通过后下载证书 获取证书 这里因为我们云服务器安装的是Nginx,所以下载该类型 下载证书 然后解压缩得到两个文件,一个key,一个pem,现在登录宝塔面板,复制证书密钥和内容到网站-设置-SSL-其他证书 设置证书 保存后你的域名就可以使用https访问了 四. chevereto图床基本设置4.1 网站推荐修改网站名称网站标题网站描述默认时区网站运营模式网站隐私模式 4.2 用户推荐修改开放注册 4.3 图片上传推荐修改最大文件大小缩略图大小中等图片大小水印 4.4 主页推荐修改样式封面图片标题段落 4.5 电子邮件推荐修改发送名称发件人的电子邮件地址电子邮件地址 4.6 防洪保护推荐修改防洪保护以电子邮件通知每分钟限额每小时限额每日限额 五. 总结chevereto图床作为一个图片站来说还是很不错的,用来存放一些高清图片(壁纸,美图)等还是很不错的。不过搭建chevereto是需要一定的成本的,如果预算不是很多建议去找一些其他的公益图床。 如果平时只是写写文章的话,我还是推荐使用gitee图床,上传之前记得用格式工厂压缩一下图片,压缩成JPG格式,可以极大程度避免图片过大的问题 Gitee图床审查变得严格起来,出现了很多误封现象,这里建议使用Github仓库 + jsDelivr。 关注上杉九月,关注上杉九月谢谢喵!","categories":[{"name":"零基础教程","slug":"零基础教程","permalink":"https://blog.sakurasep.site/categories/%E9%9B%B6%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/"}],"tags":[{"name":"零基础","slug":"零基础","permalink":"https://blog.sakurasep.site/tags/%E9%9B%B6%E5%9F%BA%E7%A1%80/"},{"name":"云服务器","slug":"云服务器","permalink":"https://blog.sakurasep.site/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"},{"name":"图床","slug":"图床","permalink":"https://blog.sakurasep.site/tags/%E5%9B%BE%E5%BA%8A/"}],"author":"上杉九月"}],"categories":[{"name":"学习笔记","slug":"学习笔记","permalink":"https://blog.sakurasep.site/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"name":"零基础教程","slug":"零基础教程","permalink":"https://blog.sakurasep.site/categories/%E9%9B%B6%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/"},{"name":"Hexo系列","slug":"Hexo系列","permalink":"https://blog.sakurasep.site/categories/Hexo%E7%B3%BB%E5%88%97/"},{"name":"年度总结","slug":"年度总结","permalink":"https://blog.sakurasep.site/categories/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"},{"name":"公告","slug":"公告","permalink":"https://blog.sakurasep.site/categories/%E5%85%AC%E5%91%8A/"},{"name":"应用使用指南","slug":"应用使用指南","permalink":"https://blog.sakurasep.site/categories/%E5%BA%94%E7%94%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/"}],"tags":[{"name":"学习笔记","slug":"学习笔记","permalink":"https://blog.sakurasep.site/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"name":"鱼皮的算法通关村","slug":"鱼皮的算法通关村","permalink":"https://blog.sakurasep.site/tags/%E9%B1%BC%E7%9A%AE%E7%9A%84%E7%AE%97%E6%B3%95%E9%80%9A%E5%85%B3%E6%9D%91/"},{"name":"零基础","slug":"零基础","permalink":"https://blog.sakurasep.site/tags/%E9%9B%B6%E5%9F%BA%E7%A1%80/"},{"name":"WSA","slug":"WSA","permalink":"https://blog.sakurasep.site/tags/WSA/"},{"name":"Windows","slug":"Windows","permalink":"https://blog.sakurasep.site/tags/Windows/"},{"name":"Hexo","slug":"Hexo","permalink":"https://blog.sakurasep.site/tags/Hexo/"},{"name":"年度总结","slug":"年度总结","permalink":"https://blog.sakurasep.site/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"},{"name":"CTF","slug":"CTF","permalink":"https://blog.sakurasep.site/tags/CTF/"},{"name":"博客","slug":"博客","permalink":"https://blog.sakurasep.site/tags/%E5%8D%9A%E5%AE%A2/"},{"name":"日志","slug":"日志","permalink":"https://blog.sakurasep.site/tags/%E6%97%A5%E5%BF%97/"},{"name":"公告","slug":"公告","permalink":"https://blog.sakurasep.site/tags/%E5%85%AC%E5%91%8A/"},{"name":"PC","slug":"PC","permalink":"https://blog.sakurasep.site/tags/PC/"},{"name":"应用使用指南","slug":"应用使用指南","permalink":"https://blog.sakurasep.site/tags/%E5%BA%94%E7%94%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/"},{"name":"安卓","slug":"安卓","permalink":"https://blog.sakurasep.site/tags/%E5%AE%89%E5%8D%93/"},{"name":"云服务器","slug":"云服务器","permalink":"https://blog.sakurasep.site/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"},{"name":"Python","slug":"Python","permalink":"https://blog.sakurasep.site/tags/Python/"},{"name":"图床","slug":"图床","permalink":"https://blog.sakurasep.site/tags/%E5%9B%BE%E5%BA%8A/"}]}
\ No newline at end of file
diff --git a/css/Readme.html b/css/Readme.html
new file mode 100644
index 000000000..77d5e162c
--- /dev/null
+++ b/css/Readme.html
@@ -0,0 +1,9 @@
+样式文件说明
样式拆分说明
方案是对 https://blog.skk.moe/post/improve-fcp-for-my-blog/ 的开源实现
+first.styl
首屏样式, 内含 首屏基础样式、 cover、 navbar、 首屏search、首屏暗黑模式、首屏字体 等样式, 首屏样式采用硬编码的方式写在HTML中.
+内联硬编码自动化方案 see:scripts/helpers/first-style/index.js
+style.styl
异步加载样式, 除首屏样式外的其他样式, 最终生成 /css/style.css 异步加载.
+暗黑模式样式说明
暗黑模式样式被拆分为首屏暗黑模式样式和异步暗黑模式样式,其中在 source/css/ 文件夹下:
+_first/dark_first.styl : 包含 首屏暗黑模式样式 的 暗黑模式 CSS 变量 和 强制覆盖样式
+_style/_plugins/_dark : 异步暗黑模式样式文件夹
+_style/_plugins/_dark/dark_async.styl : 包含 异步暗黑模式样式 的 暗黑模式 CSS 变量
+_style/_plugins/_dark/dark_plugins.styl : 包含 异步暗黑模式样式 的 强制覆盖样式
diff --git a/css/first.css b/css/first.css
new file mode 100644
index 000000000..02b780f2e
--- /dev/null
+++ b/css/first.css
@@ -0,0 +1 @@
+*,a:active,a:hover{outline:0}#safearea{display:none}:root{--color-site-body:#f4f4f4;--color-site-bg:#f4f4f4;--color-site-inner:#fff;--color-site-footer:#666;--color-card:#fff;--color-text:#444;--color-block:#f6f6f6;--color-inlinecode:#c74f00;--color-codeblock:#fff7ea;--color-h1:#3a3a3a;--color-h2:#3a3a3a;--color-h3:#333;--color-h4:#444;--color-h5:#555;--color-h6:#666;--color-p:#444;--color-list:#666;--color-list-hl:#30ad91;--color-meta:#888;--color-read-bkg:#e0d8c8;--color-read-post:#f8f1e2;--color-copyright-bkg:#f5f5f5}*{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;margin:0;padding:0}::-webkit-scrollbar{height:4px;width:4px}::-webkit-scrollbar-track-piece{background:0 0}::-webkit-scrollbar-thumb{background:#3dd9b6;cursor:pointer;border-radius:2px;-webkit-border-radius:2px}::-webkit-scrollbar-thumb:hover{background:#ff5722}html{color:var(--color-text);width:100%;height:100%;font-family:MiSans,Menlo,Monaco,monospace,sans-serif;font-size:16px}html>::-webkit-scrollbar{height:4px;width:4px}html>::-webkit-scrollbar-track-piece{background:0 0}html>::-webkit-scrollbar-thumb{background:#3dd9b6;cursor:pointer;border-radius:2px;-webkit-border-radius:2px}hr,img{border:0}html>::-webkit-scrollbar-thumb:hover{background:#ff5722}body{background-color:var(--color-site-body);text-rendering:optimizelegibility;-webkit-tap-highlight-color:rgba(0,0,0,0);line-height:1.6;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body.modal-active{overflow:hidden}@media screen and (max-width:680px){body.modal-active{position:fixed;top:0;right:0;bottom:0;left:0}}a{color:#2092ec;cursor:pointer;text-decoration:none;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}a:hover{color:#ff5722}ol,ul{padding-left:0}ol li,ul li{list-style:none}header{display:-webkit-box;display:-moz-box;display:block}img{background:0 0;max-width:100%}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;height:0;border-radius:1px;-webkit-border-radius:1px;border-bottom:1px solid rgba(68,68,68,.1)}button,input{color:inherit;font:inherit;margin:0}button{overflow:visible;text-transform:none;-webkit-appearance:button;cursor:pointer}@supports (backdrop-filter:blur(20px)){.blur{background:rgba(255,255,255,.9)!important;backdrop-filter:saturate(200%) blur(20px)}.blur#comments{backdrop-filter:unset}}#layoutHelper-comments{margin-bottom:100px}.shadow{box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.shadow.floatable{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.shadow.floatable:hover{box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}#l_cover{min-height:64px}.cover-wrapper{top:0;left:0;height:100vh;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-khtml-flex-wrap:nowrap;-moz-flex-wrap:nowrap;-o-flex-wrap:nowrap;-ms-flex-wrap:nowrap;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;align-self:center;align-content:center;color:var(--color-site-inner);padding:0 16px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;position:relative;overflow:hidden;margin-bottom:-100px}.cover-wrapper .cover-body{z-index:1;position:relative;width:100%;height:100%;margin-top:64px;margin-bottom:100px}.cover-wrapper#full{height:calc(100vh + 100px);padding-bottom:100px}.cover-wrapper#half{max-height:640px;min-height:400px;height:calc(36vh - 64px + 200px)}.cover-wrapper #scroll-down{width:100%;height:64px;position:absolute;bottom:100px;text-align:center;cursor:pointer}.cover-wrapper #scroll-down .scroll-down-effects{color:#fff;font-size:24px;line-height:64px;position:absolute;width:24px;left:calc(50% - 12px);text-shadow:0 1px 2px rgba(0,0,0,.1);animation:scroll-down-effect 1.5s infinite;-webkit-animation:scroll-down-effect 1.5s infinite;-khtml-animation:scroll-down-effect 1.5s infinite;-moz-animation:scroll-down-effect 1.5s infinite;-o-animation:scroll-down-effect 1.5s infinite;-ms-animation:scroll-down-effect 1.5s infinite}@-moz-keyframes scroll-down-effect{0%,100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:.4;-moz-opacity:.4}}@-webkit-keyframes scroll-down-effect{0%,100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:.4;-moz-opacity:.4}}@-o-keyframes scroll-down-effect{0%,100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:.4;-moz-opacity:.4}}@keyframes scroll-down-effect{0%,100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:.4;-moz-opacity:.4}}#u-search,.l_header{top:0;position:fixed}.cover-wrapper .cover-body,.cover-wrapper .cover-body .bottom,.cover-wrapper .cover-body .top{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;max-width:100%}.cover-wrapper .list-h,.cover-wrapper.search .bottom .menu .list-h a{-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-webkit-box-direction:normal;-moz-box-direction:normal}.cover-wrapper .cover-body .bottom{margin-top:32px}.cover-wrapper .cover-body .title{font-family:MaShanZheng,Helvetica,monospace;font-size:3.125rem;line-height:1.2;text-shadow:0 1px 2px rgba(0,0,0,.1)}.cover-wrapper .cover-body .subtitle{font-size:20px}.cover-wrapper .cover-body .logo{max-height:120px;max-width:calc(100% - 4 * 16px)}@media screen and (min-height:1024px){.cover-wrapper .cover-body .title{font-size:3rem}.cover-wrapper .cover-body .subtitle{font-size:1.05rem}.cover-wrapper .cover-body .logo{max-height:150px}}.cover-wrapper .cover-body .m_search{position:relative;max-width:calc(100% - 16px);width:320px;vertical-align:middle}.cover-wrapper .cover-body .m_search .form{position:relative;display:-webkit-box;display:-moz-box;display:block;width:100%}.cover-wrapper .cover-body .m_search .icon,.cover-wrapper .cover-body .m_search .input{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.cover-wrapper .cover-body .m_search .icon{position:absolute;display:-webkit-box;display:-moz-box;display:block;line-height:2.5rem;width:32px;top:0;left:5px;color:rgba(68,68,68,.75)}.cover-wrapper .cover-body .m_search .input{display:-webkit-box;display:-moz-box;display:block;height:2.5rem;width:100%;box-shadow:none;-webkit-box-shadow:none;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;font-size:.875rem;-webkit-appearance:none;padding-left:36px;border-radius:1.4rem;-webkit-border-radius:1.4rem;background:rgba(255,255,255,.6);backdrop-filter:blur(10px);border:none;color:var(--color-text)}.cover-wrapper .list-h,.cover-wrapper .list-h a{display:-webkit-box;display:-moz-box;display:-ms-flexbox}.cover-wrapper .cover-body .m_search .input:hover{background:rgba(255,255,255,.8)}.cover-wrapper .cover-body .m_search .input:focus{background:#fff}.cover-wrapper .list-h{display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;align-items:stretch;border-radius:4px;-webkit-border-radius:4px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.cover-wrapper .list-h a{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1 0;-ms-flex:1 0;flex:1 0;display:-webkit-flex;display:flex;font-weight:600}.cover-wrapper .list-h a img{display:-webkit-box;display:-moz-box;display:block;border-radius:2px;-webkit-border-radius:2px;margin:4px;min-width:40px;max-width:44px}@media screen and (max-width:768px){.cover-wrapper .list-h a img{min-width:36px;max-width:40px}}@media screen and (max-width:500px){.cover-wrapper .cover-body .m_search .input{padding-left:36px}.cover-wrapper .list-h a img{margin:2px 4px;min-width:32px;max-width:36px}}@media screen and (max-width:375px){.cover-wrapper .list-h a img{min-width:28px;max-width:32px}}.cover-wrapper{max-width:100%}.cover-wrapper.search .bottom .menu{margin-top:16px}.cover-wrapper.search .bottom .menu .list-h a{white-space:nowrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;align-items:baseline;padding:2px;margin:4px;color:var(--color-site-inner);opacity:.75;-webkit-opacity:.75;-moz-opacity:.75;text-shadow:0 1px 2px rgba(0,0,0,.05);border-bottom:2px solid transparent}.cover-wrapper.search .bottom .menu .list-h a i{margin-right:4px}.cover-wrapper.search .bottom .menu .list-h a p{font-size:.9375rem}.cover-wrapper.search .bottom .menu .list-h a.active,.cover-wrapper.search .bottom .menu .list-h a:active,.cover-wrapper.search .bottom .menu .list-h a:hover{opacity:1;-webkit-opacity:1;-moz-opacity:1;border-bottom:2px solid var(--color-site-inner)}.cover-wrapper.dock .menu,.cover-wrapper.featured .menu,.cover-wrapper.focus .menu{border-radius:6px;-webkit-border-radius:6px}.cover-wrapper.dock .menu .list-h a,.cover-wrapper.featured .menu .list-h a,.cover-wrapper.focus .menu .list-h a{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;padding:12px;line-height:24px;border-radius:4px;-webkit-border-radius:4px;border-bottom:none;text-align:center;align-content:flex-end;color:rgba(68,68,68,.7);font-size:1.5rem}.cover-wrapper.dock .menu .list-h a i,.cover-wrapper.featured .menu .list-h a i,.cover-wrapper.focus .menu .list-h a i{margin:8px}.cover-wrapper.dock .menu .list-h a p,.cover-wrapper.featured .menu .list-h a p,.cover-wrapper.focus .menu .list-h a p{font-size:.875rem}.cover-wrapper.dock .menu .list-h a.active,.cover-wrapper.featured .menu .list-h a.active,.cover-wrapper.focus .menu .list-h a.active{background:var(--color-card);backdrop-filter:none}.cover-wrapper.dock .menu .list-h a.active i,.cover-wrapper.dock .menu .list-h a.active i+p,.cover-wrapper.featured .menu .list-h a.active i,.cover-wrapper.featured .menu .list-h a.active i+p,.cover-wrapper.focus .menu .list-h a.active i,.cover-wrapper.focus .menu .list-h a.active i+p{color:#3dd9b6}.cover-wrapper.dock .menu .list-h a.active img+p,.cover-wrapper.featured .menu .list-h a.active img+p,.cover-wrapper.focus .menu .list-h a.active img+p{color:var(--color-text)}.cover-wrapper.dock .menu .list-h a:hover,.cover-wrapper.featured .menu .list-h a:hover,.cover-wrapper.focus .menu .list-h a:hover{background:var(--color-card)}.cover-wrapper.dock .top{margin-bottom:48px}.cover-wrapper.dock .menu{background:rgba(255,255,255,.5);position:absolute;bottom:0;max-width:100%}.cover-wrapper.dock .menu .list-h{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-khtml-flex-wrap:nowrap;-moz-flex-wrap:nowrap;-o-flex-wrap:nowrap;-ms-flex-wrap:nowrap;margin:4px}.cover-wrapper.dock .menu .list-h a+a{margin-left:4px}@media screen and (max-width:500px){.cover-wrapper.dock .menu .list-h a,.cover-wrapper.featured .menu .list-h a,.cover-wrapper.focus .menu .list-h a{padding:12px 8px}.cover-wrapper.dock .menu .list-h{overflow-x:scroll}.cover-wrapper.dock .menu .list-h::-webkit-scrollbar{height:0;width:0}.cover-wrapper.dock .menu .list-h::-webkit-scrollbar-track-piece{background:0 0}.cover-wrapper.dock .menu .list-h::-webkit-scrollbar-thumb{background:#3dd9b6;cursor:pointer;border-radius:0;-webkit-border-radius:0}.cover-wrapper.dock .menu .list-h::-webkit-scrollbar-thumb:hover{background:#ff5722}}@supports (backdrop-filter:blur(20px)){.cover-wrapper.dock .menu{background:rgba(255,255,255,.5);backdrop-filter:saturate(200%) blur(20px)}}.cover-wrapper #parallax-window{position:absolute;width:100%;height:100%;background:0 0}.parallax-mirror{animation-delay:0s;animation-duration:.5s;animation-fill-mode:forwards;animation-timing-function:ease-out;animation-name:fadeIn}@-moz-keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-webkit-keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-o-keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@media (prefers-color-scheme:dark){:root{--color-mode:'dark'}:root:not([color-scheme]){--color-site-body:#121212;--color-read-bkg:#1f1f1f;--color-read-post:#262626;--color-site-bg:#1f1f1f;--color-site-inner:rgba(238,238,238,0.871);--color-site-footer:rgba(170,170,170,0.871);--color-card:#262626;--color-text:rgba(238,238,238,0.871);--color-block:#434343;--color-codeblock:#1f1f1f;--color-inlinecode:#d56d28;--color-h1:rgba(255,255,255,0.871);--color-h2:rgba(255,255,255,0.871);--color-h3:rgba(255,255,255,0.6);--color-h4:rgba(255,255,255,0.6);--color-h5:rgba(255,255,255,0.6);--color-h6:rgba(255,255,255,0.6);--color-p:rgba(217,217,217,0.871);--color-list:rgba(217,217,217,0.871);--color-list-hl:#63e0c4;--color-meta:rgba(191,191,191,0.871);--color-link:rgba(191,191,191,0.871);--color-copyright-bkg:#21252b}:root:not([color-scheme]) img{filter:brightness(70%)!important}:root:not([color-scheme]) .blur{background:rgba(31,31,31,.9)!important}:root:not([color-scheme]) .white-box.blur{background:rgba(38,38,38,.9)!important}:root:not([color-scheme]) .nav-main .u-search-input{background:var(--color-card)!important}:root:not([color-scheme]) #l_main .article .prev-next>a{background:var(--color-block)!important}:root:not([color-scheme]) #l_main .article .prev-next>a:hover{background:var(--color-site-bg)!important}:root:not([color-scheme]) .article blockquote{background:var(--color-block)!important}:root:not([color-scheme]) .article-title a{color:var(--color-h1)!important}:root:not([color-scheme]) details>summary{color:var(--color-p)!important;background:var(--color-site-bg)!important}:root:not([color-scheme]) details{border:1px solid var(--color-site-bg)!important;background:var(--color-site-bg)!important}:root:not([color-scheme]) #u-search .modal,:root:not([color-scheme]) #u-search .modal-body,:root:not([color-scheme]) #u-search .modal-header{background:var(--color-card)!important}:root:not([color-scheme]) #u-search .modal-body .modal-results .result:hover{background:var(--color-block)!important}:root:not([color-scheme]) .u-search-input:hover{background:var(--color-block)!important}:root:not([color-scheme]) .u-search-input:focus{background:var(--color-site-body)!important}}[color-scheme=dark]{--color-site-body:#121212;--color-read-bkg:#1f1f1f;--color-read-post:#262626;--color-site-bg:#1f1f1f;--color-site-inner:rgba(238,238,238,0.871);--color-site-footer:rgba(170,170,170,0.871);--color-card:#262626;--color-text:rgba(238,238,238,0.871);--color-block:#434343;--color-codeblock:#1f1f1f;--color-inlinecode:#d56d28;--color-h1:rgba(255,255,255,0.871);--color-h2:rgba(255,255,255,0.871);--color-h3:rgba(255,255,255,0.6);--color-h4:rgba(255,255,255,0.6);--color-h5:rgba(255,255,255,0.6);--color-h6:rgba(255,255,255,0.6);--color-p:rgba(217,217,217,0.871);--color-list:rgba(217,217,217,0.871);--color-list-hl:#63e0c4;--color-meta:rgba(191,191,191,0.871);--color-link:rgba(191,191,191,0.871);--color-copyright-bkg:#21252b}[color-scheme=dark] img{filter:brightness(70%)!important}[color-scheme=dark] .blur{background:rgba(31,31,31,.9)!important}[color-scheme=dark] .white-box.blur{background:rgba(38,38,38,.9)!important}[color-scheme=dark] .nav-main .u-search-input{background:var(--color-card)!important}[color-scheme=dark] #l_main .article .prev-next>a{background:var(--color-block)!important}[color-scheme=dark] #l_main .article .prev-next>a:hover{background:var(--color-site-bg)!important}[color-scheme=dark] .article blockquote{background:var(--color-block)!important}[color-scheme=dark] .article-title a{color:var(--color-h1)!important}[color-scheme=dark] details>summary{color:var(--color-p)!important;background:var(--color-site-bg)!important}[color-scheme=dark] details{border:1px solid var(--color-site-bg)!important;background:var(--color-site-bg)!important}[color-scheme=dark] #u-search .modal,[color-scheme=dark] #u-search .modal-body,[color-scheme=dark] #u-search .modal-header{background:var(--color-card)!important}[color-scheme=dark] #u-search .modal-body .modal-results .result:hover,[color-scheme=dark] .u-search-input:hover{background:var(--color-block)!important}[color-scheme=dark] .u-search-input:focus{background:var(--color-site-body)!important}@media screen and (max-width:500px){[color-scheme=dark] .l_header .m_search{background:var(--color-site-bg)!important}}@font-face{font-family:MiSans;src:url(https://cdn.sakurasep.site/Source/fonts-cdn/MiSans/MiSans-Regular.woff);font-weight:'normal';font-style:'normal';font-display:swap}@font-face{font-family:MaShanZheng;src:url(https://cdn.sakurasep.site/Source/fonts-cdn/canva/MaShanZheng-Regular.woff2);font-weight:'normal';font-style:'normal';font-display:swap}.l_header{z-index:1000;width:100%;height:64px;background:var(--color-card);box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.l_header.auto{transition:opacity .4s ease;-webkit-transition:opacity .4s ease;-khtml-transition:opacity .4s ease;-moz-transition:opacity .4s ease;-o-transition:opacity .4s ease;-ms-transition:opacity .4s ease;visibility:hidden}.l_header.auto.show{opacity:1!important;-webkit-opacity:1!important;-moz-opacity:1!important;visibility:visible}.l_header .container{margin-left:16px;margin-right:16px}.l_header #wrapper{height:100%;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.l_header #wrapper .nav-main,.l_header #wrapper .nav-sub{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-khtml-flex-wrap:nowrap;-moz-flex-wrap:nowrap;-o-flex-wrap:nowrap;-ms-flex-wrap:nowrap;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;align-items:center}.l_header #wrapper .nav-main{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.l_header #wrapper .nav-sub,.l_header .switcher>li{transition:all .28s ease;-khtml-transition:all .28s ease}.l_header #wrapper.sub .nav-main{transform:translateY(-64px);-webkit-transform:translateY(-64px);-khtml-transform:translateY(-64px);-moz-transform:translateY(-64px);-o-transform:translateY(-64px);-ms-transform:translateY(-64px)}.l_header #wrapper .nav-sub{-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;opacity:0;-webkit-opacity:0;-moz-opacity:0;height:64px;width:calc(100% - 2 * 16px);position:absolute}.l_header #wrapper .nav-sub ::-webkit-scrollbar{display:-webkit-box;display:-moz-box;display:none}@media screen and (min-width:2048px){.l_header #wrapper .nav-sub{max-width:55vw;margin:auto}}.l_header #wrapper.sub .nav-sub{opacity:1;-webkit-opacity:1;-moz-opacity:1}.l_header #wrapper .title{position:relative;color:var(--color-text);padding-left:24px;max-height:64px}.l_header #wrapper .nav-main .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0;line-height:64px;padding:0 24px;font-size:1.25rem;font-family:MaShanZheng,Helvetica,monospace}.l_header #wrapper .nav-main .title img{height:64px}.l_header .nav-sub{max-width:1080px;margin:auto}.l_header .nav-sub .title{font-weight:700;font-family:MiSans,Menlo,Monaco,monospace,sans-serif;line-height:1.2;max-height:64px;white-space:normal;flex-shrink:1}.l_header .switcher{display:-webkit-box;display:-moz-box;display:none;line-height:64px;align-items:center}.l_header .switcher .s-toc{display:-webkit-box;display:-moz-box;display:none}@media screen and (max-width:768px){.l_header .switcher .s-toc{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}}.l_header .switcher>li{height:48px;-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;margin:2px}.l_header .m_search,.l_header .switcher>li>a{transition:all .28s ease;-khtml-transition:all .28s ease}.l_header .switcher>li>a{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;align-items:center;width:48px;height:48px;padding:.85em 1.1em;border-radius:100px;-webkit-border-radius:100px;border:none;-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;color:#3dd9b6}.l_header .m_search,.l_header .nav-sub .switcher{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex}.l_header .switcher>li>a:hover{border:none}.l_header .switcher>li>a.active,.l_header .switcher>li>a:active{border:none;background:var(--color-site-bg)}@media screen and (max-width:500px){.l_header .switcher>li{margin:0 1px;height:48px}.l_header .switcher>li>a{width:36px;height:48px}}.l_header .nav-sub .switcher{display:flex}.l_header .m_search{display:flex;height:64px;width:240px;-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.l_header .m_search .input,ul.list-v>li>a{transition:all .28s ease;-khtml-transition:all .28s ease}@media screen and (max-width:1024px){.l_header .m_search{width:44px;min-width:44px}.l_header .m_search input::placeholder{opacity:0;-webkit-opacity:0;-moz-opacity:0}.l_header .m_search:hover{width:240px}.l_header .m_search:hover input::placeholder{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@media screen and (min-width:500px){.l_header .m_search:hover .input{width:100%}.l_header .m_search:hover .input::placeholder{opacity:1;-webkit-opacity:1;-moz-opacity:1}}.l_header .m_search .form{position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;width:100%;align-items:center}.l_header .m_search .icon{position:absolute;width:36px;left:5px;color:var(--color-meta)}@media screen and (max-width:500px){.l_header .m_search{min-width:0}.l_header .m_search input::placeholder{opacity:1;-webkit-opacity:1;-moz-opacity:1}.l_header .m_search .icon{display:-webkit-box;display:-moz-box;display:none}}.l_header .m_search .input{display:-webkit-box;display:-moz-box;display:block;padding-top:8px;padding-bottom:8px;line-height:1.3;width:100%;color:var(--color-text);background:#fafafa;box-shadow:none;-webkit-box-shadow:none;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;padding-left:40px;font-size:.875rem;border-radius:8px;-webkit-border-radius:8px;border:none;-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}@media screen and (min-width:500px){.l_header .m_search .input:focus{box-shadow:0 4px 8px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.1)}}@media screen and (max-width:500px){.l_header .m_search .input{background:var(--color-block);padding-left:8px;border:none}.l_header .m_search .input:focus,.l_header .m_search .input:hover{border:none}}@media (max-width:500px){.l_header .m_search{left:0;width:0;overflow:hidden;position:absolute;background:#fff;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.l_header .m_search .input{border-radius:32px;-webkit-border-radius:32px;margin-left:16px;padding-left:16px}.l_header.z_search-open .m_search{width:100%}.l_header.z_search-open .m_search .input{width:calc(100% - 120px)}}ul.m-pc>li>a{color:inherit;border-bottom:2px solid transparent}ul.m-pc>li>a.active,ul.m-pc>li>a:active{border-bottom:2px solid #3dd9b6}ul.list-v li:hover>ul.list-v,ul.m-pc li:hover>ul.list-v{display:-webkit-box;display:-moz-box;display:block}ul.list-v,ul.nav-list-h{display:-webkit-box;display:-moz-box}ul.nav-list-h{display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:stretch}ul.nav-list-h>li{position:relative;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;height:100%;line-height:2.4;border-radius:4px;-webkit-border-radius:4px}ul.nav-list-h>li>a{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-weight:600}ul.list-v{z-index:1;display:none;position:absolute;background:var(--color-card);box-shadow:0 2px 4px 0 rgba(0,0,0,.08),0 4px 8px 0 rgba(0,0,0,.08),0 8px 16px 0 rgba(0,0,0,.08);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.08),0 4px 8px 0 rgba(0,0,0,.08),0 8px 16px 0 rgba(0,0,0,.08);margin-top:-6px;border-radius:4px;-webkit-border-radius:4px;padding:8px 0}ul.list-v.show,ul.list-v>li ul{display:-webkit-box;display:-moz-box}ul.list-v.show{display:block}ul.list-v hr{margin-top:8px;margin-bottom:8px}ul.list-v>li{white-space:nowrap;word-break:keep-all}ul.list-v>li.header{font-size:.78125rem;font-weight:700;line-height:2em;color:var(--color-meta);margin:8px 16px 4px}ul.list-v>li.header i{margin-right:8px}ul.list-v>li ul{margin-left:0;display:none;margin-top:-40px}ul.list-v .aplayer-container{min-height:64px;padding:6px 16px}ul.list-v>li>a{-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;display:-webkit-box;display:-moz-box;display:block;color:var(--color-list);font-size:.875rem;font-weight:700;line-height:36px;padding:0 20px 0 16px;text-overflow:ellipsis;margin:0 4px;border-radius:4px;-webkit-border-radius:4px}ul.list-v>li>a.active,ul.list-v>li>a:active,ul.list-v>li>a:hover{color:var(--color-list-hl)}@media screen and (max-width:1024px){ul.list-v>li>a{line-height:40px}}ul.list-v>li>a>i{margin-right:8px}ul.list-v>li>a:hover{background:var(--color-site-bg)}.l_header .menu>ul>li>a{display:-webkit-box;display:-moz-box;display:block;padding:0 8px}.l_header .menu>ul>li>a>i{margin-right:4px}.l_header ul.nav-list-h>li{color:var(--color-list);line-height:64px}.l_header ul.nav-list-h>li>a{max-height:64px;overflow:hidden;color:inherit}.l_header ul.nav-list-h>li>a.active,.l_header ul.nav-list-h>li>a:active{color:#3dd9b6}.l_header ul.nav-list-h>li:hover>a{color:var(--color-list-hl)}.l_header ul.nav-list-h>li i.music{animation:rotate-effect 1.5s linear infinite;-webkit-animation:rotate-effect 1.5s linear infinite;-khtml-animation:rotate-effect 1.5s linear infinite;-moz-animation:rotate-effect 1.5s linear infinite;-o-animation:rotate-effect 1.5s linear infinite;-ms-animation:rotate-effect 1.5s linear infinite}@-moz-keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-webkit-keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-o-keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}.menu-phone li ul.list-v,.menu-phone li ul.list-v ul{right:calc(100% - .5 * 16px)}#wrapper{max-width:1080px;margin:auto}@media screen and (min-width:2048px){#wrapper{max-width:55vw}}#wrapper .menu{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1 1;-ms-flex:1 1;flex:1 1;margin:0 16px 0 0}#wrapper .menu .list-v ul{left:calc(100% - .5 * 16px)}.menu-phone{display:-webkit-box;display:-moz-box;display:none;margin-top:16px;right:8px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.menu-phone ul{right:calc(100% - .5 * 16px)}.l_header{max-width:65vw;left:calc((100% - 65vw) * .5);border-bottom-left-radius:8px;border-bottom-right-radius:8px}@media screen and (max-width:2048px){.l_header{max-width:1112px;left:calc((100% - 1112px) * .5)}}@media screen and (max-width:1112px){.l_header{left:0;border-radius:0;-webkit-border-radius:0;max-width:100%}}@media screen and (max-width:500px){.menu-phone{display:-webkit-box;display:-moz-box;display:block}.l_header .container{margin-left:0;margin-right:0}.l_header #wrapper .nav-main .title{padding-left:16px;padding-right:16px}.l_header #wrapper .nav-sub{width:100%}.l_header #wrapper .nav-sub .title{overflow-y:scroll;margin-top:2px;padding:8px 16px}.l_header #wrapper .switcher{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;margin-right:8px}.l_header .menu{display:-webkit-box;display:-moz-box;display:none}.list-v li{max-width:270px}}#u-search{display:-webkit-box;display:-moz-box;display:none;left:0;width:100%;height:100%;padding:60px 20px;z-index:1001}@media screen and (max-width:680px){#u-search{padding:0}}@media screen and (prefers-color-scheme:dark) and (max-width:500px){.l_header .m_search{background:var(--color-site-bg)!important}}
\ No newline at end of file
diff --git a/css/hbe.style.css b/css/hbe.style.css
new file mode 100644
index 000000000..f140e3856
--- /dev/null
+++ b/css/hbe.style.css
@@ -0,0 +1 @@
+.hbe,.hbe:after,.hbe:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hbe-container{margin:0 auto;overflow:hidden}.hbe-content{text-align:center;font-size:150%;padding:1em 0}.hbe-input{position:relative;z-index:1;display:inline-block;margin:1em;width:80%;min-width:200px;vertical-align:top}.hbe-input-field{line-height:normal;font-size:100%;margin:0;position:relative;display:block;float:right;padding:.8em;width:60%;border:none;border-radius:0;background:#f0f0f0;color:#aaa;font-weight:400;font-family:"Avenir Next","Helvetica Neue",Helvetica,Arial,sans-serif;-webkit-appearance:none}.hbe-input-field:focus{outline:0}.hbe-input-label{display:inline-block;float:right;padding:0 1em;width:40%;color:#696969;font-weight:700;font-size:70.25%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.hbe-input-label-content{position:relative;display:block;padding:1.6em 0;width:100%}.hbe-graphic{position:absolute;top:0;left:0;fill:none}.hbe-button{width:130px;height:40px;background:linear-gradient(to bottom,#4eb5e5 0,#389ed5 100%);border:none;border-radius:5px;position:relative;border-bottom:4px solid #2b8bc6;color:#fbfbfb;font-weight:600;font-family:'Open Sans',sans-serif;text-shadow:1px 1px 1px rgba(0,0,0,.4);font-size:15px;text-align:left;text-indent:5px;box-shadow:0 3px 0 0 rgba(0,0,0,.2);cursor:pointer;display:block;margin:0 auto 20px}.hbe-button:active{box-shadow:0 2px 0 0 rgba(0,0,0,.2);top:1px}.hbe-button:after{content:"";width:0;height:0;display:block;border-top:20px solid #187dbc;border-bottom:20px solid #187dbc;border-left:16px solid transparent;border-right:20px solid #187dbc;position:absolute;opacity:.6;right:0;top:0;border-radius:0 5px 5px 0}.hbe-input-default{overflow:hidden}.hbe-input-field-default{width:100%;background:0 0;padding:.5em;margin-bottom:2em;color:#f9f7f6;z-index:100;opacity:0}.hbe-input-label-default{width:100%;position:absolute;text-align:left;padding:.5em 0;pointer-events:none;font-size:1em}.hbe-input-label-default::after,.hbe-input-label-default::before{content:'';position:absolute;width:100%;left:0}.hbe-input-label-default::before{height:100%;background:#666;top:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);-webkit-transition:-webkit-transform .2s;transition:transform .2s}.hbe-input-label-default::after{height:2px;background:#666;top:100%;-webkit-transition:opacity .2s;transition:opacity .2s}.hbe-input-label-content-default{padding:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transition:-webkit-transform .2s,color .2s;transition:transform .2s,color .2s}.hbe-input--filled .hbe-input-field-default,.hbe-input-field-default:focus{opacity:1;-webkit-transition:opacity 0s .2s;transition:opacity 0s .2s}.hbe-input--filled .hbe-input-field-default,.hbe-input-field-default:focus,.hbe-input-label-content-default,.hbe-input-label-default::after,.hbe-input-label-default::before{-webkit-transition-timing-function:cubic-bezier(0,.25,.5,1);transition-timing-function:cubic-bezier(0,.25,.5,1)}.hbe-input--filled .hbe-input-label-default::before,.hbe-input-field-default:focus+.hbe-input-label-default::before{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.hbe-input--filled .hbe-input-label-default::after,.hbe-input-field-default:focus+.hbe-input-label-default::after{opacity:0}.hbe-input--filled .hbe-input-label-default .hbe-input-label-content-default,.hbe-input-field-default:focus+.hbe-input-label-default .hbe-input-label-content-default{color:#555;-webkit-transform:translate3d(0,2.1em,0) scale3d(.65,.65,1);transform:translate3d(0,2.1em,0) scale3d(.65,.65,1)}.hbe-input-up{overflow:hidden;padding-top:2em}.hbe-input-field-up{width:100%;background:0 0;opacity:0;padding:.35em;z-index:100;color:#837482}.hbe-input-label-up{width:100%;bottom:0;position:absolute;pointer-events:none;text-align:left;color:#8E9191;padding:0 .5em}.hbe-input-label-up::before{content:'';position:absolute;width:100%;height:4em;top:100%;left:0;background:#fff;border-top:4px solid #9B9F9F;-webkit-transform:translate3d(0,-3px,0);transform:translate3d(0,-3px,0);-webkit-transition:-webkit-transform .4s;transition:transform .4s;-webkit-transition-timing-function:cubic-bezier(.7,0,.3,1);transition-timing-function:cubic-bezier(.7,0,.3,1)}.hbe-input-label-content-up{padding:.5em 0;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transition:-webkit-transform .4s,color .4s;transition:transform .4s,color .4s;-webkit-transition-timing-function:cubic-bezier(.7,0,.3,1);transition-timing-function:cubic-bezier(.7,0,.3,1)}.hbe-input-field-up:focus,.input--filled .hbe-input-field-up{cursor:text;opacity:1;-webkit-transition:opacity 0s .4s;transition:opacity 0s .4s}.hbe-input-field-up:focus+.hbe-input-label-up::before,.input--filled .hbe-input-label-up::before{-webkit-transition-delay:50ms;transition-delay:50ms;-webkit-transform:translate3d(0,-3.3em,0);transform:translate3d(0,-3.3em,0)}.hbe-input-field-up:focus+.hbe-input-label-up .hbe-input-label-content-up,.input--filled .hbe-input-label-content-up{color:#6B6E6E;-webkit-transform:translate3d(0,-3.3em,0) scale3d(.81,.81,1);transform:translate3d(0,-3.3em,0) scale3d(.81,.81,1)}.hbe-input-wave{overflow:hidden;padding-top:1em}.hbe-input-field-wave{padding:.5em 0 .25em;width:100%;background:0 0;color:#9da8b2;font-size:1.25em}.hbe-input-label-wave{position:absolute;top:.95em;font-size:.85em;left:0;display:block;width:100%;text-align:left;padding:0;pointer-events:none;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transition:-webkit-transform .2s .15s,color 1s;transition:transform .2s .15s,color 1s;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out}.hbe-graphic-wave{stroke:#92989e;pointer-events:none;-webkit-transition:-webkit-transform .7s,stroke .7s;transition:transform .7s,stroke .7s;-webkit-transition-timing-function:cubic-bezier(0,.25,.5,1);transition-timing-function:cubic-bezier(0,.25,.5,1)}.hbe-input-field-wave:focus+.hbe-input-label-wave,.input--filled .hbe-input-label-wave{color:#333;-webkit-transform:translate3d(0,-1.25em,0) scale3d(.75,.75,1);transform:translate3d(0,-1.25em,0) scale3d(.75,.75,1)}.hbe-input-field-wave:focus~.hbe-graphic-wave,.input--filled .graphic-wave{stroke:#333;-webkit-transform:translate3d(-66.6%,0,0);transform:translate3d(-66.6%,0,0)}.hbe-input-field-flip{width:100%;background-color:#d0d1d0;border:2px solid transparent;-webkit-transition:background-color .25s,border-color .25s;transition:background-color .25s,border-color .25s}.hbe-input-label-flip{width:100%;text-align:left;position:absolute;bottom:100%;pointer-events:none;overflow:hidden;padding:0 1.25em;-webkit-transform:translate3d(0,3em,0);transform:translate3d(0,3em,0);-webkit-transition:-webkit-transform .25s;transition:transform .25s;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out}.hbe-input-label-content-flip{color:#8B8C8B;padding:.25em 0;-webkit-transition:-webkit-transform .25s;transition:transform .25s;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out}.hbe-input-label-content-flip::after{content:attr(data-content);position:absolute;font-weight:800;bottom:100%;left:0;height:100%;width:100%;color:#666;padding:.25em 0;letter-spacing:1px;font-size:1em}.hbe-input-field-flip:focus+.hbe-input-label-flip,.input--filled .hbe-input-label-flip{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.hbe-input-field-flip:focus+.hbe-input-label-flip .hbe-input-label-content-flip,.input--filled .hbe-input-label-content-flip{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.hbe-input-field-flip:focus+.hbe-input-field-flip,.input--filled .hbe-input-field-flip{background-color:transparent;border-color:#666}.hbe-input-xray{overflow:hidden;padding-bottom:2.5em}.hbe-input-field-xray{padding:0;margin-top:1.2em;width:100%;background:0 0;color:#84AF9B;font-size:1.55em}.hbe-input-label-xray{position:absolute;top:2em;left:0;display:block;width:100%;text-align:left;padding:0;letter-spacing:1px;color:#84AF9B;pointer-events:none;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transition:-webkit-transform .2s .1s,color .3s;transition:transform .2s .1s,color .3s;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out}.hbe-graphic-xray{stroke:#84AF9B;pointer-events:none;stroke-width:2px;top:1.25em;bottom:0;height:3.275em;-webkit-transition:-webkit-transform .7s,stroke .7s;transition:transform .7s,stroke .7s;-webkit-transition-timing-function:cubic-bezier(0,.25,.5,1);transition-timing-function:cubic-bezier(0,.25,.5,1)}.hbe-input-field-xray:focus+.hbe-input-label-xray,.input--filled .hbe-input-label-xray{color:#84AF9B;-webkit-transform:translate3d(0,3.5em,0) scale3d(.85,.85,1);transform:translate3d(0,3.5em,0) scale3d(.85,.85,1)}.hbe-input-field-xray:focus~.hbe-graphic-xray,.input--filled .graphic-xray{stroke:#84AF9B;-webkit-transform:translate3d(-66.6%,0,0);transform:translate3d(-66.6%,0,0)}.hbe-input-blink{padding-top:1em}.hbe-input-field-blink{width:100%;padding:.8em .5em;background:0 0;border:2px solid;color:#8781bd;-webkit-transition:border-color .25s;transition:border-color .25s}.hbe-input-label-blink{width:100%;position:absolute;top:0;text-align:left;overflow:hidden;padding:0;pointer-events:none;-webkit-transform:translate3d(0,3em,0);transform:translate3d(0,3em,0)}.hbe-input-label-content-blink{padding:0 1em;font-weight:400;color:#b5b5b5}.hbe-input-label-content-blink::after{content:attr(data-content);position:absolute;top:-200%;left:0;color:#8781bd;font-weight:800}.hbe-input-field-blink:focus,.input--filled .hbe-input-field-blink{border-color:#8781bd}.hbe-input-field-blink:focus+.hbe-input-label-blink,.input--filled .hbe-input-label-blink{-webkit-animation:anim-blink-1 .25s forwards;animation:anim-blink-1 .25s forwards}.hbe-input-field-blink:focus+.hbe-input-label-blink .hbe-input-label-content-blink,.input--filled .hbe-input-label-content-blink{-webkit-animation:anim-blink-2 .25s forwards ease-in;animation:anim-blink-2 .25s forwards ease-in}@-webkit-keyframes anim-blink-1{0%,70%{-webkit-transform:translate3d(0,3em,0);transform:translate3d(0,3em,0)}100%,71%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes anim-blink-2{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}70%,71%{-webkit-transform:translate3d(0,125%,0);transform:translate3d(0,125%,0);opacity:0;-webkit-animation-timing-function:ease-out}100%{color:transparent;-webkit-transform:translate3d(0,200%,0);transform:translate3d(0,200%,0)}}@keyframes anim-blink-1{0%,70%{-webkit-transform:translate3d(0,3em,0);transform:translate3d(0,3em,0)}100%,71%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes anim-blink-2{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}70%,71%{-webkit-transform:translate3d(0,125%,0);transform:translate3d(0,125%,0);opacity:0;-webkit-animation-timing-function:ease-out}100%{color:transparent;-webkit-transform:translate3d(0,200%,0);transform:translate3d(0,200%,0)}}.hbe-input-surge{overflow:hidden;padding-bottom:1em}.hbe-input-field-surge{padding:.25em .5em;margin-top:1.25em;width:100%;background:0 0;color:#D0D0D0;font-size:1.55em;opacity:0}.hbe-input-label-surge{width:100%;text-align:left;position:absolute;top:1em;pointer-events:none;overflow:hidden;padding:0 .25em;-webkit-transform:translate3d(1em,2.75em,0);transform:translate3d(1em,2.75em,0);-webkit-transition:-webkit-transform .3s;transition:transform .3s}.hbe-input-label-content-surge{color:#A4A5A6;padding:.4em 0 .25em;-webkit-transition:-webkit-transform .3s;transition:transform .3s}.hbe-input-label-content-surge::after{content:attr(data-content);position:absolute;font-weight:800;top:100%;left:0;height:100%;width:100%;color:#2C3E50;padding:.25em 0;letter-spacing:1px;font-size:.85em}.hbe-graphic-surge{fill:#2C3E50;pointer-events:none;top:1em;bottom:0;height:4.5em;z-index:-1;-webkit-transition:-webkit-transform .7s,fill .7s;transition:transform .7s,fill .7s;-webkit-transition-timing-function:cubic-bezier(0,.25,.5,1);transition-timing-function:cubic-bezier(0,.25,.5,1)}.hbe-input-field-surge:focus,.input--filled .hbe-input-field-surge{-webkit-transition:opacity 0s .35s;transition:opacity 0s .35s;opacity:1}.hbe-input-field-surge:focus+.hbe-input-label-surge,.input--filled .hbe-input-label-surge{-webkit-transition-delay:.15s;transition-delay:.15s;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.hbe-input-field-surge:focus+.hbe-input-label-surge .hbe-input-label-content-surge,.input--filled .hbe-input-label-content-surge{-webkit-transition-delay:.15s;transition-delay:.15s;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.hbe-input-field-surge:focus~.hbe-graphic-surge,.input--filled .graphic-surge{fill:#2C3E50;-webkit-transform:translate3d(-66.6%,0,0);transform:translate3d(-66.6%,0,0)}.hbe-input-field-shrink{width:100%;background:0 0;padding:.5em 0;margin-bottom:2em;color:#2C3E50}.hbe-input-label-shrink{width:100%;position:absolute;text-align:left;font-size:1em;padding:10px 0 5px;pointer-events:none}.hbe-input-label-shrink::after{content:'';position:absolute;width:100%;height:7px;background:#B7C3AC;left:0;top:100%;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transition:-webkit-transform .3s,background-color .3s;transition:transform .3s,background-color .3s}.hbe-input-label-content-shrink{padding:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transition:-webkit-transform .3s,color .3s;transition:transform .3s,color .3s}.hbe-input-field-shrink:focus+.hbe-input-label-shrink::after,.input--filled .hbe-input-label-shrink::after{background:#84AF9B;-webkit-transform:scale3d(1,.25,1);transform:scale3d(1,.25,1)}.hbe-input-field-shrink:focus+.hbe-input-label-shrink .hbe-input-label-content-shrink,.input--filled .hbe-input-label-shrink .hbe-input-label-content-shrink{color:#84AF9B;-webkit-transform:translate3d(0,2em,0) scale3d(.655,.655,1);transform:translate3d(0,2em,0) scale3d(.655,.655,1)}
\ No newline at end of file
diff --git a/css/style.css b/css/style.css
new file mode 100644
index 000000000..a0258b8b3
--- /dev/null
+++ b/css/style.css
@@ -0,0 +1 @@
+#l_main .post .article-meta .new-meta-box .new-meta-item .notlink,button[disabled],html input[disabled]{cursor:default}pre,textarea{overflow:auto}#safearea{display:block}:root{--block-hover:#ededed;--text-p1:#222;--text-p3:#777;--card:#fff}::-moz-selection{background:rgba(33,150,243,.2)}::selection{background:rgba(33,150,243,.2)}h1,h2{font-size:1.5rem}h3{font-size:1.25rem}h4{font-size:1.125rem}h5,h6{font-size:1rem}h1,h2,h3,h4,h6{font-weight:400}a:not([href]){cursor:default}pre{tab-size:4;-moz-tab-size:4;-o-tab-size:4;-webkit-tab-size:4}.clearfix{zoom:1}.clearfix:after,.clearfix:before{content:" ";display:-webkit-box;display:-moz-box;display:table}.hidden,.vertical{display:-webkit-box;display:-moz-box}.clearfix:after{clear:both}.hidden{text-indent:-9999px;visibility:hidden;display:none}.inner{position:relative;width:80%;max-width:710px;margin:0 auto}.vertical{display:table-cell;vertical-align:middle}article,aside,details,figcaption,figure,footer,hgroup,main,menu,nav,section,summary{display:-webkit-box;display:-moz-box;display:block}article{overflow:hidden}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:50%;line-height:1em}sup{vertical-align:text-top}sub{vertical-align:text-bottom}figure{margin:1em 40px}span.dot,span.sep{font-size:.9em;margin:0 .2rem}span.dot:before{content:'·'}span.sep:before{content:'/'}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}optgroup,select,textarea{color:inherit;font:inherit;margin:0}select{text-transform:none}html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}optgroup{font-weight:700}table:not([class]){border-collapse:collapse;overflow:auto;display:-webkit-box;display:-moz-box;display:inline-block;max-width:100%;vertical-align:text-top}table:not([class]) th{background-color:#f1f1f1}table:not([class]) td,table:not([class]) th{padding:8px 16px;border:2px solid #f1f1f1;line-height:1.5;font-size:90%}table:not([class]) tr{word-break:keep-all;background-color:#fefefe;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}table:not([class]) tr:hover{background-color:#f1f1f1}td,th{padding:0}@font-face{font-family:JetBrainsMono;src:url(https://cdn.sakurasep.site/Source/fonts-cdn/jetbrains/JetBrainsMono-Bold.woff2);font-weight:'';font-style:'';font-display:swap}article#arc,article#cat,article#tag{padding-top:48px;padding-bottom:48px}article#arc h2,article#cat h2,article#tag h2{font-weight:600}article#arc h2:first-child,article#cat h2:first-child,article#tag h2:first-child{margin-top:0}article#arc{margin-bottom:32px;padding-bottom:64px}article#arc .timenode:after,article#arc .timenode:before{margin-left:12px}article#arc .timenode .meta{padding:6px 0;line-height:1.5;height:auto;max-width:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;font-size:.9375rem;font-weight:500;border-radius:2px;-webkit-border-radius:2px;color:var(--color-list)}article#arc .timenode .meta:before{display:-webkit-box;display:-moz-box;display:none}article#arc .timenode .meta:after{margin-left:14px}article#arc .timenode .meta:hover{color:var(--color-p);background:var(--color-site-bg)}article#arc .timenode .meta time{color:var(--color-meta);margin-left:34px;margin-right:4px;flex-shrink:0;width:60px}article#arc .timenode .meta i{line-height:1.5;color:#ff5722}article#arc .timenode .meta i.red{color:#fe5f58}article#arc .timenode .meta i.green{color:#3dc550}article#arc .timenode .meta i.yellow{color:#ffbd2b}article#arc .timenode .meta i.blue{color:#1bcdfc}article#arc .timenode .meta i.theme{color:#3dd9b6}article#arc .timenode .meta i.accent,article#arc .timenode .meta i.orange{color:#ff5722}article#cat .all-cats a{display:-webkit-box;display:-moz-box;display:block;padding:8px 16px;border-radius:4px;-webkit-border-radius:4px;color:var(--color-list);font-size:.9375rem;font-weight:500}article#cat .all-cats a:hover{color:var(--color-list-hl);background:var(--color-site-bg)}article#cat .all-cats a.child{padding-left:48px}article#tag .all-tags{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start;align-items:baseline;text-align:center}article#tag .all-tags ul{margin:0 -8px;padding:0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap}article#tag .all-tags ul li{list-style:none;margin:8px;border-radius:4px;-webkit-border-radius:4px;overflow:hidden;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;position:relative;font-size:.9375rem}.article h1,.article h2{margin-top:48px;text-align:left}article#tag .all-tags ul li a{display:-webkit-box;display:-moz-box;display:inline-block;color:var(--color-list);padding:4px 52px 4px 16px;background:var(--color-block);font-weight:500}article#tag .all-tags ul li a:hover{background:#ff5722;color:#fff}article#tag .all-tags ul li span{color:var(--color-meta);background:var(--color-card);padding:2px 8px;border-radius:2px;-webkit-border-radius:2px;pointer-events:none;position:absolute;right:2px;top:2px;height:calc(100% - 4px)}article#tag .all-tags ul li span:before{content:'x'}.article{color:var(--color-p);word-wrap:break-word}.article a{word-break:break-word}.article h1.title,.article h2.title{left:0}.article h1.title:before,.article h2.title:before{content:none}.article h1,.article h2{padding-bottom:.2rem;margin-bottom:1rem;border-bottom:1px solid rgba(68,68,68,.1)}.article h1{color:var(--color-h1)}.article h2{color:var(--color-h2)}.article h3{text-align:left;color:var(--color-h3);margin-top:24px}.article h4{text-align:left;color:var(--color-h4);margin-top:16px}.article h5{font-weight:700;color:var(--color-h5);margin-top:1em}.article h6{color:var(--color-h6);margin-top:1em}.article center,.article center p{text-align:center}.article .aplayer{margin:1em 0;display:-webkit-box;display:-moz-box;display:inline-block;width:400px;max-width:100%;border-radius:4px;-webkit-border-radius:4px;color:#666}.article div.small-img img,.article p.small-img img{width:auto;max-width:100%;margin:0;box-shadow:none;-webkit-box-shadow:none}.article s{color:#8e8e8e;text-decoration-color:#8e8e8e}.article p{margin-top:1em;margin-bottom:1em;text-align:justify;max-width:100%;line-height:inherit}.article .subtitle h6{color:rgba(68,68,68,.9)}.article figure figcaption span{display:-webkit-box;display:-moz-box;display:inline-block;margin-right:5px}.article blockquote{background:var(--color-block);border-left:4px solid #3dd9b6;border-radius:4px;-webkit-border-radius:4px;position:relative;width:100%;padding:16px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.article .widget,footer.footer a{transition:all .28s ease;-khtml-transition:all .28s ease}.article blockquote,.article blockquote ol,.article blockquote p,.article blockquote ul{text-align:left;word-wrap:normal;font-size:.9375rem;margin-top:.5em;margin-bottom:.5em}.article pre,footer.footer,footer.footer p{font-size:.8125rem}.article blockquote footer{padding:0;text-align:justify;color:inherit;font-style:italic;margin:1em 0}.article blockquote footer cite{color:var(--color-meta);margin-left:1em}.article blockquote footer cite::before{content:'----';padding:0 .3em}.article blockquote.pullquote.right{border-left:none;border-right:4px solid #3dd9b6}.article blockquote.pullquote.right p{text-align:right}.article pre{display:-webkit-box;display:-moz-box;display:block;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;margin-top:1em;margin-bottom:1em;overflow:auto;background:var(--color-codeblock);font-family:JetBrainsMono,monospace,courier,sans-serif;border:1px solid #ffebcb;padding:16px;border-radius:4px;-webkit-border-radius:4px}.article pre>code:not([class]){background:0 0}.article div>pre{border-radius:4px;-webkit-border-radius:4px}.article div>pre>code:not([class]){padding:0;margin:0;background:0 0;color:rgba(68,68,68,.9)}.article code{font-family:JetBrainsMono,monospace,courier,sans-serif}.article code:not([class]){word-break:break-all;color:var(--color-inlinecode);border-radius:2px;-webkit-border-radius:2px}@media screen and (max-width:500px){.article ol,.article ul{font-size:.875rem}.article figure{font-size:13px;line-height:1.5}}.article .widget{margin:1em 0;box-shadow:none;-webkit-box-shadow:none;border-radius:4px;-webkit-border-radius:4px;cursor:auto;background:var(--color-block);padding:8px 0;-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;width:100%}.article .widget:active,.article .widget:hover{box-shadow:none;-webkit-box-shadow:none}.article .widget header{padding:4px .6em 0}.article .widget header,.article .widget header a{color:rgba(68,68,68,.85)}.article .widget.copyright,.article .widget.qrcode{background:0 0;padding:0}.article .widget.copyright header,.article .widget.qrcode header{display:-webkit-box;display:-moz-box;display:none}.article .widget.copyright .content,.article .widget.qrcode .content{padding:0}.article .widget.list .content,.article .widget.related_posts .content{padding:0 .6em!important}.article .widget.list .content a,.article .widget.related_posts .content a{color:#2092ec}.article .widget.list .content a:hover,.article .widget.related_posts .content a:hover{color:#ff5722}.article .widget .content{padding:0 .6em;margin:0}.article .widget .content ul{padding-left:4px;margin-left:16px}.article .widget .content ul a{transition:all .1s ease;-webkit-transition:all .1s ease;-khtml-transition:all .1s ease;-moz-transition:all .1s ease;-o-transition:all .1s ease;-ms-transition:all .1s ease;display:-webkit-box;display:-moz-box;display:inline;border-left:none;padding:0 0 0 4px;color:#2092ec;font-weight:400;text-decoration:none}.article .widget .content ul a.active,.article .widget .content ul a:active,.article .widget .content ul a:hover{border-left:none!important;background:0 0!important}.article .widget .content ul a:hover{color:#ff5722}.article .widget .content .list a .name{display:-webkit-box;display:-moz-box;display:inline;color:#2092ec}.article .widget .content .list a:hover .name{color:#ff5722}.article .widget.qrcode>.content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;align-items:center;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;padding-left:16px;padding-right:16px;margin-bottom:4px}.article .widget.qrcode>.content>.fancybox,.article .widget.qrcode>.content>img{margin:0 8px}.article .article_footer,.md .footer{margin-top:64px}.article .widget.qrcode>.content img{margin-bottom:4px}.article .widget-blur{backdrop-filter:none}.md .footer>div{margin-top:1em;margin-bottom:1em}.md .footer .header{line-height:1.75;padding-bottom:8px;font-weight:500;font-size:.875rem;color:var(--color-list)}.md .footer .header i{margin-right:2px}.md .footer .body ol,.md .footer .body ul{margin-top:0;margin-bottom:0}.md .footer .references,.md .footer .related_posts{background:var(--color-block);border-radius:4px;-webkit-border-radius:4px;padding:16px}.md .footer .references .body a{font-size:.9375rem;font-weight:500}.md .footer .related_posts .body{margin:4px;overflow:hidden;border-radius:2px;-webkit-border-radius:2px}.md .footer .related_posts .body .vlts-rps{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.md .footer .related_posts .body .vlts-rps .item{flex-shrink:0;width:240px}.md .footer .related_posts .body .vlts-rps .item+.item{margin-left:16px}.md .footer .related_posts .body .vlts-rps img{border-radius:2px;-webkit-border-radius:2px;width:100%;height:120px;object-fit:cover}.md .footer .related_posts .body .vlts-rps span{text-align:justify;display:-webkit-box;display:-moz-box;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.md .footer .related_posts .body .vlts-rps .title{font-weight:600;-webkit-line-clamp:1}.md .footer .related_posts .body .vlts-rps .excerpt{font-size:.875rem;color:var(--color-meta);-webkit-line-clamp:3}.md .footer .copyright blockquote p{font-size:.875rem;margin:.25em 0}.md .footer .copyright blockquote p a{font-weight:500}.md .footer .donate{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;margin:0 auto}.md .footer .donate .imgs{display:-webkit-box;display:-moz-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;margin:0 auto}.md .footer .donate .imgs .fancybox{margin:8px}.md .footer .donate .imgs img{width:80px}article .readmore{display:-webkit-box;display:-moz-box;display:block;margin-top:24px;font-size:.875rem}.copyright.license{background:var(--color-copyright-bkg);color:var(--color-meta);display:-webkit-box;display:-moz-box;display:block;font-size:.95rem;line-height:1.2;margin:15px -40px;overflow:hidden;padding:1.25em 40px;position:relative;border-radius:4px;-webkit-border-radius:4px}.copyright.license:after{background:url("data:image/svg+xml;charset=utf-8,%3Csvg version='1.1' id='Capa_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 367.467 367.467' style='enable-background:new 0 0 367.467 367.467;' xml:space='preserve'%3E%3Cg%3E%3Cpath d='M183.73,0.018C82.427,0.018,0,82.404,0,183.733c0,101.289,82.427,183.716,183.73,183.716 c101.315,0,183.737-82.427,183.737-183.716C367.467,82.404,285.045,0.018,183.73,0.018z M183.73,326.518 c-78.743,0-142.798-64.052-142.798-142.784c0-78.766,64.055-142.817,142.798-142.817c78.752,0,142.807,64.052,142.807,142.817 C326.536,262.466,262.481,326.518,183.73,326.518z'/%3E%3Cpath d='M244.036,217.014c-11.737,20.141-33.562,32.635-56.956,32.635c-36.329,0-65.921-29.585-65.921-65.915 c0-36.36,29.592-65.955,65.921-65.955c23.395,0,45.219,12.54,56.956,32.641l1.517,2.627h44.28l-2.658-7.129 c-7.705-20.413-21.225-37.769-39.122-50.157c-17.942-12.42-39.017-19.009-60.973-19.009c-58.981,0-106.946,48.006-106.946,106.982 c0,58.98,47.965,106.941,106.946,106.941c21.956,0,43.03-6.567,60.973-19.006c17.897-12.391,31.417-29.741,39.122-50.154 l2.658-7.133h-44.28L244.036,217.014z'/%3E%3C/g%3E%3C/svg%3E");content:" ";opacity:.1;-webkit-opacity:.1;-moz-opacity:.1;height:180px;right:-10px;top:-35px;width:180px;position:absolute}.copyright.license a{color:var(--color-meta)}.copyright.license a:hover{color:#ff5722}.copyright.license .license-meta-title,.copyright.license .license-title{margin:0 0 .25rem}.copyright.license .license-link,.copyright.license .license-meta-title{font-size:.8rem}.copyright.license .license-title{font-weight:700}.copyright.license .license-link{margin-bottom:1rem}.copyright.license .license-meta{align-items:center;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start}.copyright.license .license-meta-item{margin:0 2rem 1em 0}.copyright.license .license-meta-text{margin:0}.copyright.license .license-meta-text a{border-bottom:1px solid var(--color-meta)}.copyright.license .license-meta-text a:hover{border-bottom-color:#ff5722}.recommended-article{overflow:hidden}.recommended-article .recommended-article-header{margin-top:8px;margin-left:8px;margin-right:0}.recommended-article .recommended-article-group{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;overflow:hidden}@media screen and (max-width:768px){.recommended-article .recommended-article-group{height:190px;overflow:scroll;-ms-overflow-style:none}.recommended-article .recommended-article-group::-webkit-scrollbar{width:0!important}}.recommended-article .recommended-article-group .recommended-article-item{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;align-content:center;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;align-items:center;overflow:hidden;width:calc(100%/3 - 16px);max-height:200px;margin-top:8px;margin-left:8px;margin-right:0}@media screen and (max-width:768px){.recommended-article .recommended-article-group .recommended-article-item{width:calc(100%/2 - 16px)}}@media screen and (max-width:500px){.recommended-article .recommended-article-group .recommended-article-item{width:calc(100% - 16px)}}.recommended-article .recommended-article-group .recommended-article-item img{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;width:100%;height:150px}.recommended-article .recommended-article-group .recommended-article-item span{text-align:justify;display:-webkit-box;display:-moz-box;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;overflow:hidden}footer.footer{position:relative;padding:40px 10px 120px;width:100%;color:var(--color-site-footer);margin:0 auto;overflow:hidden;text-align:center}footer.footer .licenses{color:fade(,50%)}footer.footer .social-wrapper{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;margin:4px 8px}footer.footer a{color:var(--color-site-footer);padding:0;-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}footer.footer a:hover{color:#ff5722}footer.footer a:not(.social):hover{text-decoration:underline}footer.footer a.social{position:relative;text-align:center;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;align-items:center;min-width:36px;min-height:36px;margin:4px;opacity:.75;-webkit-opacity:.75;-moz-opacity:.75;border-radius:4px;-webkit-border-radius:4px;font-size:1rem}footer.footer a.social img{margin:8px;height:24px}footer.footer a.social:hover{color:#ff5722;background:rgba(255,87,34,.1)}footer.footer .copyright{margin-top:16px}footer.footer .copyright p{font-size:.78125rem}@media screen and (max-width:768px){footer.footer{justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center}}.article.l_friends .friends-group .friend-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;margin:-8px;border-radius:8px;-webkit-border-radius:8px;align-items:flex-start;line-height:1.3}.article.l_friends .friends-group .friend-content .friend-card{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;border-radius:4px;-webkit-border-radius:4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1);padding:8px 0;margin:8px;margin-top:calc(2.25 * 16px + 32px);color:var(--color-meta);background:var(--color-block);justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start;align-content:flex-start;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:calc(100%/4 - 16px)}@media screen and (max-width:1024px){.article.l_friends .friends-group .friend-content .friend-card{width:calc(100%/4 - 16px)}}@media screen and (max-width:768px){.article.l_friends .friends-group .friend-content .friend-card{width:calc(100%/3 - 16px)}}@media screen and (max-width:500px){.article.l_friends .friends-group .friend-content .friend-card{width:calc(100%/2 - 16px)}}.article.l_friends .friends-group .friend-content .friend-card:hover .friend-left .avatar{transform:scale(1.2) rotate(12deg);-webkit-transform:scale(1.2) rotate(12deg);-khtml-transform:scale(1.2) rotate(12deg);-moz-transform:scale(1.2) rotate(12deg);-o-transform:scale(1.2) rotate(12deg);-ms-transform:scale(1.2) rotate(12deg);box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}.article.l_friends .friends-group .friend-content .friend-card .friend-left{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-self:center}.article.l_friends .friends-group .friend-content .friend-card .friend-left .avatar{width:64px;height:64px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1);margin:16px 8px 4px;margin-top:calc(-1.25 * 16px - 32px);border-radius:100%;-webkit-border-radius:100%;border:2px solid #fff;background:#fff}.article.l_friends .friends-group .friend-content .friend-card .friend-right{margin:4px 8px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;text-align:center}.article.l_friends .friends-group .friend-content .friend-card .friend-right .friend-tags-wrapper{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;margin-left:-2px;word-break:break-all}.article.l_friends .friends-group .friend-content .friend-card .friend-right p{text-align:center;margin:0}.article.l_friends .friends-group .friend-content .friend-card .friend-right p.friend-name{font-size:.8125rem;padding-top:4px;font-weight:700}.article.l_friends .friends-group .friend-content .friend-card .friend-right p.tags{font-size:.78125rem;display:-webkit-box;display:-moz-box;display:inline;background:0 0;word-wrap:break-word;padding-right:4px}.md img{position:relative;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.md div>img,.md p>img{display:-webkit-box;display:-moz-box;display:block;margin:auto;border-radius:4px;-webkit-border-radius:4px}@media screen and (max-width:500px){.md img{box-shadow:none;-webkit-box-shadow:none}.md div>img,.md p>img{border-radius:2px;-webkit-border-radius:2px}}.md span img{display:-webkit-box;display:-moz-box;display:inline;margin:auto}.md .img-wrap,.md .video-wrap{margin:1.5rem auto}.md .img-wrap{text-align:center;border-radius:2px;-webkit-border-radius:2px;overflow:hidden}.md .img-wrap .img-bg{width:100%}.md .img-wrap .image-caption{display:-webkit-box;display:-moz-box;display:block;margin:.75rem auto;font-size:.8125rem;color:var(--color-meta)}.md .img-wrap .image-caption:empty{display:-webkit-box;display:-moz-box;display:none}#l_body div.loading,svg.loading{width:100%;display:-webkit-box;display:-moz-box}svg.loading{display:block;position:absolute;color:var(--text-p3);height:2rem;margin:auto;animation:spin infinite 2s;-webkit-animation:spin infinite 2s;-khtml-animation:spin infinite 2s;-moz-animation:spin infinite 2s;-o-animation:spin infinite 2s;-ms-animation:spin infinite 2s;animation-timing-function:linear}@-moz-keyframes spin{from{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}to{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-webkit-keyframes spin{from{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}to{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-o-keyframes spin{from{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}to{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@keyframes spin{from{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}to{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}#safearea{margin:16px 16px 0}#l_body{position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#l_body div.loading{margin:16px 0;display:block}#l_body div.loading,#l_body div.loading p{text-align:center}#l_body #s-top{transition:all .6s ease;-webkit-transition:all .6s ease;-khtml-transition:all .6s ease;-moz-transition:all .6s ease;-o-transition:all .6s ease;-ms-transition:all .6s ease;z-index:50;position:fixed;width:48px;height:48px;line-height:48px;border-radius:100%;-webkit-border-radius:100%;bottom:32px;right:32px;transform:translateY(100px) scale(0);-webkit-transform:translateY(100px) scale(0);-khtml-transform:translateY(100px) scale(0);-moz-transform:translateY(100px) scale(0);-o-transform:translateY(100px) scale(0);-ms-transform:translateY(100px) scale(0);transform-origin:bottom;-webkit-transform-origin:bottom;-khtml-transform-origin:bottom;-moz-transform-origin:bottom;-o-transform-origin:bottom;-ms-transform-origin:bottom;color:var(--color-text)}#l_body #s-top.show{transform:translateY(0) scale(1);-webkit-transform:translateY(0) scale(1);-khtml-transform:translateY(0) scale(1);-moz-transform:translateY(0) scale(1);-o-transform:translateY(0) scale(1);-ms-transform:translateY(0) scale(1)}#l_body #s-top.show.hl{background:#3dd9b6;color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}@media screen and (min-width:768px){#l_body #s-top:hover{transform:scale(1.2);-webkit-transform:scale(1.2);-khtml-transform:scale(1.2);-moz-transform:scale(1.2);-o-transform:scale(1.2);-ms-transform:scale(1.2);border-radius:25%;-webkit-border-radius:25%;background:#3dd9b6;color:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}#l_body #s-top:hover.hl{box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}}#l_main{width:calc(100% - 1 * 240px);padding-left:16px;float:left;-webkit-box-ordinal-group:2;-moz-box-ordinal-group:2;-ms-flex-order:2;-webkit-order:2;order:2}@media screen and (max-width:768px){#l_body #s-top{right:16px}#l_main{width:100%;padding-left:0}}#l_main.no_sidebar{width:100%;padding-right:0;max-width:840px;margin:auto}@media screen and (min-width:2048px){#l_main.no_sidebar{max-width:calc(55vw - 240px)}}#l_main.no_sidebar~#l_side{display:-webkit-box;display:-moz-box;display:none}#l_main .post-list{position:relative;margin-bottom:16px;column-gap:16px;-webkit-column-gap:16px;-moz-column-gap:16px}#l_main .widget .content .post,#l_main .widget .content .tabs,#l_main .widget .content details,#l_main .widget .content ol,#l_main .widget .content p,#l_main .widget .content table,#l_main .widget .content ul{margin-top:1em;margin-bottom:1em}#l_main .post-list.multiple-columns{columns:320px}#l_main .post-wrapper{column-break-inside:avoid;break-inside:avoid-column}#l_main .widget .content .post{padding-top:0;padding-bottom:0}#l_main .widget.grid .content .grid.fixed a{width:calc(100%/8 - 0 * 16px)}@media screen and (max-width:1024px){#l_main .widget.grid .content .grid.fixed a{width:calc(100%/7 - 0 * 16px)}}@media screen and (max-width:768px){#l_main .widget.grid .content .grid.fixed a{width:calc(100%/6 - 0 * 16px)}}@media screen and (max-width:500px){#l_main .widget.grid .content .grid.fixed a{width:calc(100%/5 - 0 * 16px)}}@media screen and (max-width:425px){#l_main .widget.grid .content .grid.fixed a{width:calc(100%/4 - 0 * 16px)}}@media screen and (max-width:375px){#l_main .widget.grid .content .grid.fixed a{width:calc(100%/3 - 0 * 16px)}}#l_main .post{position:relative;margin-bottom:16px;padding:24px;border-radius:8px;-webkit-border-radius:8px}#l_main .post h1.title{font-size:1.5rem;margin:0;padding-bottom:4px;border-bottom:none}#l_main .post .article-meta{color:var(--color-meta);margin-bottom:16px;line-height:normal}#l_main .post .article-meta#top{margin-top:16px;margin-bottom:32px}#l_main .post .article-meta#bottom{margin-top:32px;margin-bottom:8px}#l_main .post .article-meta .aplayer,#l_main .post .article-meta .aplayer-pic,#l_main .post .article-meta .thumbnail{width:48px;height:48px}#l_main .post .article-meta .aplayer,#l_main .post .article-meta .thumbnail{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;border-radius:100%;-webkit-border-radius:100%;float:right;margin:2px;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}#l_main .post .article-meta .aplayer:hover,#l_main .post .article-meta .thumbnail:hover{border-radius:25%;-webkit-border-radius:25%;transform:scale(1.1);-webkit-transform:scale(1.1);-khtml-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}@media screen and (max-width:500px){#l_main .post .article-meta .aplayer:hover,#l_main .post .article-meta .thumbnail:hover{border-radius:100%;-webkit-border-radius:100%;transform:scale(1);-webkit-transform:scale(1);-khtml-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}}#l_main .post .article-meta .thumbnail{width:auto;border-radius:4px;-webkit-border-radius:4px;box-shadow:none;-webkit-box-shadow:none;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}#l_main .post .article-meta .thumbnail:hover{border-radius:4px;-webkit-border-radius:4px;transform:scale(1.1) rotate(4deg);-webkit-transform:scale(1.1) rotate(4deg);-khtml-transform:scale(1.1) rotate(4deg);-moz-transform:scale(1.1) rotate(4deg);-o-transform:scale(1.1) rotate(4deg);-ms-transform:scale(1.1) rotate(4deg);box-shadow:none;-webkit-box-shadow:none}#l_main .post .article-meta .new-meta-box{transition:all .1s ease;-webkit-transition:all .1s ease;-khtml-transition:all .1s ease;-moz-transition:all .1s ease;-o-transition:all .1s ease;-ms-transition:all .1s ease;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:center;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}#l_main .post .article-meta .new-meta-box,#l_main .post .article-meta .new-meta-box i,#l_main .post .article-meta .new-meta-box p{font-size:.8125rem}#l_main .post .article-meta .new-meta-box .new-meta-item{color:var(--color-meta);display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:baseline;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;margin:0 16px 0 0;padding:8px 0}#l_main .post .article-meta .new-meta-box .new-meta-item .notlink:hover,#l_main .post .article-meta .new-meta-box .new-meta-item .notlink:hover p{color:var(--color-meta)}#l_main .post .article-meta .new-meta-box .new-meta-item:last-child{margin-right:0}#l_main .post .article-meta .new-meta-box .new-meta-item i,#l_main .post .article-meta .new-meta-box .new-meta-item img{display:-webkit-box;display:-moz-box;display:inline-block}#l_main .post .article-meta .new-meta-box .new-meta-item i{margin-right:4px;border-radius:0;-webkit-border-radius:0}#l_main .post .article-meta .new-meta-box .new-meta-item i.fa-hashtag{margin-right:2px}#l_main .post .article-meta .new-meta-box .new-meta-item a,#l_main .post .article-meta .new-meta-box .new-meta-item p{color:var(--color-meta);padding:3px 0}#l_main .post .article-meta .new-meta-box .new-meta-item a{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;align-items:center}#l_main .post .article-meta .new-meta-box .new-meta-item a img{height:16px;width:16px;margin-right:8px}#l_main .post .article-meta .new-meta-box .new-meta-item a p{margin:0;font-weight:400;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}#l_main .post .article-meta .new-meta-box .new-meta-item a:hover,#l_main .post .article-meta .new-meta-box .new-meta-item a:hover p{color:#ff5722}#l_main .post .article-meta .new-meta-box .author i,#l_main .post .article-meta .new-meta-box .author img{border-radius:100%;-webkit-border-radius:100%}#l_main .post .article-meta .new-meta-box .author img{transform:translateY(-.5px);-webkit-transform:translateY(-.5px);-khtml-transform:translateY(-.5px);-moz-transform:translateY(-.5px);-o-transform:translateY(-.5px);-ms-transform:translateY(-.5px)}@media screen and (max-width:500px){#l_main .post .article-meta .new-meta-box .share{width:100%;margin-top:16px;background:var(--color-block);border-radius:4px;-webkit-border-radius:4px}}#l_main .post .article-meta .new-meta-box .share-body{position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;margin:0;padding:0 2px}#l_main .post .article-meta .new-meta-box .share-body a{padding:0;margin:0 1px}#l_main .post .article-meta .new-meta-box .share-body a img{margin:2px;height:24px;width:auto;background:0 0}@media screen and (max-width:500px){#l_main .post .article-meta .new-meta-box .share-body a img{height:32px;margin:8px}#l_main .post .article-meta .new-meta-box .share-body div.hoverbox div.target{position:absolute}}#l_main .post .article-meta .new-meta-box .share-body div.hoverbox div.target{display:-webkit-box;display:-moz-box;display:none;position:absolute;background:var(--color-card);border-radius:8px;-webkit-border-radius:8px;box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);padding:8px;left:50%;top:-20px;transform:translate(-50%,-100%);-webkit-transform:translate(-50%,-100%);-khtml-transform:translate(-50%,-100%);-moz-transform:translate(-50%,-100%);-o-transform:translate(-50%,-100%);-ms-transform:translate(-50%,-100%)}#l_main .post .article-meta .new-meta-box .share-body div.hoverbox div.target img{display:-webkit-box;display:-moz-box;display:block;margin:0;padding:0;height:128px;width:128px;min-width:128px}#l_main .prev-next,.body-wrapper{display:-ms-flexbox;display:-webkit-flex}#l_main .post .article-meta .new-meta-box .share-body div.hoverbox:hover div.target{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}#l_main .post span>img{display:-webkit-box;display:-moz-box;display:inline-block}#l_main .post a img{display:-webkit-box;display:-moz-box;display:inline}@media screen and (max-width:768px){#l_main{padding-right:0}}@media screen and (max-width:768px) and (max-width:500px){#l_main{width:100%}}.body-wrapper{position:relative;display:-webkit-box;display:-moz-box;display:flex;width:100%;max-width:1080px;margin:0 auto;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;align-items:stretch}@media screen and (min-width:2048px){.body-wrapper{max-width:55vw}}article#comments p[ct]{margin-top:0;margin-bottom:1em;font-size:1.125rem;color:var(--color-text);font-weight:600}article#comments p[cst]{margin-top:1em;margin-bottom:1em;font-size:.875rem}article#comments #load-btns,article#comments #loading-comments{text-align:center;margin:16px 0}.md h3,.md h4,.md h5,.md h6,.md ol,.md ul{margin-bottom:1em}article#comments #load-btns,article#comments #load-btns a,article#comments #load-btns i,article#comments #loading-comments,article#comments #loading-comments a,article#comments #loading-comments i{line-height:3em}article#comments #load-btns a.load-comments,article#comments #loading-comments a.load-comments{display:-webkit-box;display:-moz-box;display:inline-block;border-radius:2px;-webkit-border-radius:2px;cursor:pointer;background:#44d7b6;color:#fff;padding-left:48px;padding-right:48px}article#comments #load-btns a.load-comments:hover,article#comments #loading-comments a.load-comments:hover{background:#ff5722}#u-search .modal,.white-box{background:var(--color-card)}img{max-width:100%}img.lazyload:not(.placeholder){transition:filter .25s ease-out 0s;-webkit-transition:filter .25s ease-out 0s;-khtml-transition:filter .25s ease-out 0s;-moz-transition:filter .25s ease-out 0s;-o-transition:filter .25s ease-out 0s;-ms-transition:filter .25s ease-out 0s}img.lazyload:not(.placeholder):not(.loaded){opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(8px)}img.lazyload:not(.placeholder).loaded{opacity:1;-webkit-opacity:1;-moz-opacity:1;filter:none}.md>p{padding-top:4px}.md h1,.md h2,.md h3,.md h4,.md h5,.md h6{position:relative;pointer-events:none;margin-top:0;font-weight:500}.md h1>a,.md h2>a,.md h3>a,.md h4>a,.md h5>a,.md h6>a{color:inherit;pointer-events:auto}.md h1>a:hover,.md h2>a:hover,.md h3>a:hover,.md h4>a:hover,.md h5>a:hover,.md h6>a:hover{color:#ff5722}.md h1:before,.md h2:before,.md h3:before,.md h4:before,.md h5:before,.md h6:before{content:'';display:-webkit-box;display:-moz-box;display:block;margin-top:-48px;height:96px;visibility:hidden;pointer-events:none}.md h1:before,.md h2:before{margin-top:-32px}.md .article-meta+h1,.md .article-meta+h2{margin-top:-80px}.md h3:before{margin-top:-56px}.md h4:before{margin-top:-64px}.md h5{font-weight:700}.md h2+h3:before{margin-top:-80px}.md ol,.md ul{font-size:.9375rem;list-style:outside;padding-left:8px;margin-left:16px;margin-top:1em}#u-search .modal .modal-body .modal-results,.md ol.task-list li,.md ul.task-list li,.widget>.content ul.entry,.widget>.content ul.popular-posts,div.dropmenu ul>li{list-style:none}.md ol li,.md ol li li,.md ol ol,.md ol ul,.md ul li,.md ul li li,.md ul ol,.md ul ul{margin-top:0;margin-bottom:0}.md ol li p,.md ul li p{margin-top:4px;margin-bottom:0}.md ol.task-list,.md ul.task-list{padding-left:0;margin-left:4px}.md ol.task-list li input,.md ul.task-list li input{margin-right:4px}.md ul>li{list-style:outside}.md ol>li{list-style:decimal}.md .div-ori-link{display:-webkit-box;display:-moz-box;display:block;text-align:center;margin:4rem 0}.md .ori-link{margin:auto;padding:1em 3em;border:1px solid #3dd9b6;border-radius:4px;-webkit-border-radius:4px;color:#3dd9b6;font-weight:500}.md .ori-link:hover{color:#ff5722;border-color:#ff5722}#l_main .prev-next{width:100%;display:-webkit-box;display:-moz-box;display:flex;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;align-items:baseline;color:var(--color-meta);margin:0;font-weight:600}#l_main .article .prev-next,.meta-v3{display:-moz-box;display:-ms-flexbox;display:-webkit-flex}#l_main .prev-next .prev{text-align:left;border-top-right-radius:32px;border-bottom-right-radius:32px}#l_main .prev-next .next{text-align:right;border-top-left-radius:32px;border-bottom-left-radius:32px}#l_main .prev-next p{margin:16px}#l_main .prev-next section{color:var(--color-meta);padding:16px;border-radius:8px;-webkit-border-radius:8px}#l_main .prev-next section:hover{color:#ff5722}#l_main .article .prev-next{width:100%;display:-webkit-box;display:flex;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;align-content:flex-start;margin-top:8px}#l_main .article .prev-next>a{width:100%;padding:8px;color:var(--color-meta);background:var(--color-block);border-radius:4px;-webkit-border-radius:4px}#l_main .article .prev-next>a:hover{background:#ffeee8}#l_main .article .prev-next>a:hover p.title{color:#ff5722}#l_main .article .prev-next>a p{margin:8px .5rem}#l_main .article .prev-next>a p.title{font-weight:600;font-size:1rem}#l_main .article .prev-next>a p.title>i{width:1rem}#l_main .article .prev-next>a p.content{font-size:.875rem;font-weight:400;text-align:justify;word-break:break-all}#l_main .article .prev-next>a:only-child{margin-left:0;margin-right:0}#l_main .article .prev-next .prev{margin-left:0;margin-right:8px}#l_main .article .prev-next .prev p.title{text-align:left}#l_main .article .prev-next .next{margin-left:8px;margin-right:0}#l_main .article .prev-next .next p.title{text-align:right}.article-title{font-weight:500;margin-bottom:12px;line-height:1.4}.article-title a{color:var(--color-h1)}.article-title a:hover{color:#ff5722}.article-title[pin]{margin-right:36px}.article-desc{word-break:break-word}.post-v3{overflow:hidden;text-align:justify}.post-v3 .md{color:var(--color-p)}.post-v3 .pin{position:absolute;width:20px;height:20px;border-radius:20px;-webkit-border-radius:20px;right:24px;top:24px;z-index:1;pointer-events:none}.meta-v3[line_style=solid]{border-top:1px solid rgba(68,68,68,.1)}.meta-v3[line_style=dashed]{border-top:2px dashed rgba(68,68,68,.1)}.meta-v3[line_style=dotted]{border-top:4px dotted rgba(68,68,68,.1)}.meta-v3{margin-top:16px;padding-top:12px;display:-webkit-box;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;color:var(--color-meta)}.meta-v3>div{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:center;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.meta-v3 time{font-size:.875rem}.meta-v3 .category-link{font-size:.875rem;color:var(--color-meta);-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.meta-v3 .category-link:hover{color:#ff5722}.meta-v3 .readmore{font-weight:700}.meta-v3 .avatar{line-height:0;margin-right:.75em}.meta-v3 .avatar img{width:24px;height:24px;display:-webkit-box;display:-moz-box;display:block;border-radius:12px;-webkit-border-radius:12px;object-fit:cover}.headimg-div{display:-webkit-box;display:-moz-box;display:block;margin-left:-24px;margin-top:-24px;margin-bottom:20px;width:calc(100% + 3 * 16px)}.headimg-div .headimg-a{display:-webkit-box;display:-moz-box;display:block;overflow:hidden;height:280px}@media screen and (max-width:768px){.headimg-div .headimg-a{height:250px}}@media screen and (max-width:500px){.headimg-div .headimg-a{height:220px}}@media screen and (max-width:425px){.headimg-div .headimg-a{height:190px}}.headimg-div .headimg{object-fit:cover;width:100%;height:100%;transition:transform 3s ease-out;-webkit-transition:transform 3s ease-out;-khtml-transition:transform 3s ease-out;-moz-transition:transform 3s ease-out;-o-transition:transform 3s ease-out;-ms-transition:transform 3s ease-out}.headimg-div .headimg:hover{transform:scale(1.1);-webkit-transform:scale(1.1);-khtml-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1)}.headimg-div .headimg.lazyload:not(.placeholder){transition:transform 3s ease-out,opacity .5s ease-out;-webkit-transition:transform 3s ease-out,opacity .5s ease-out;-khtml-transition:transform 3s ease-out,opacity .5s ease-out;-moz-transition:transform 3s ease-out,opacity .5s ease-out;-o-transition:transform 3s ease-out,opacity .5s ease-out;-ms-transition:transform 3s ease-out,opacity .5s ease-out}.headimg-div .headimg.lazyload:not(.placeholder):not(.loaded){opacity:0;-webkit-opacity:0;-moz-opacity:0}.headimg-div .headimg.lazyload:not(.placeholder).loaded{opacity:1;-webkit-opacity:1;-moz-opacity:1}#u-search .modal{position:fixed;height:80%;width:100%;max-width:640px;left:50%;top:0;margin:64px 0 0 -320px;z-index:3;border-radius:8px;-webkit-border-radius:8px;overflow:hidden}#u-search .modal #resule-hits-empty,#u-search .modal .search-icon{position:absolute;top:50%;left:50%;width:50%;text-align:center;transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-khtml-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}#u-search .modal #resule-hits-empty i,#u-search .modal .search-icon i{font-size:8em;color:#e8e8e8;margin-bottom:10px}@media screen and (max-width:680px){#u-search .modal{box-shadow:none;-webkit-box-shadow:none;max-width:none;top:0;left:0;margin:0;height:100%;border-radius:0;-webkit-border-radius:0}}#u-search .modal .modal-header{position:relative;width:100%;height:64px;z-index:3;border-top-left-radius:8px;border-top-right-radius:8px;font-size:$fontsize;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1);background:#fff;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}@media screen and (max-width:680px){#u-search .modal .modal-header{border-radius:0;-webkit-border-radius:0;padding:0}}#u-search .modal .modal-header .btn-close{display:-webkit-box;display:-moz-box;display:block;position:absolute;width:55px;height:64px;top:0;right:0;color:#3dd9b6;cursor:pointer;text-align:center;line-height:64px;vertical-align:middle;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;z-index:2}#u-search .modal .modal-header .btn-close:hover{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}#u-search .modal .modal-header #u-search-modal-form{position:relative;width:100%;height:100%;z-index:2}#u-search .modal .modal-header #u-search-modal-form input{color:var(--color-text)}#u-search .modal .modal-header #u-search-modal-form #u-search-modal-input{margin:16px 50px;padding:0 8px;width:calc(100% - 100px - 16px);line-height:2rem;border-radius:8px;-webkit-border-radius:8px;vertical-align:middle;border:none;appearance:none;box-shadow:none;-webkit-box-shadow:none;background:0 0;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.widget.blogger,.widget>.content ul>li a{transition:all .28s ease;-khtml-transition:all .28s ease}@media screen and (max-width:680px){#u-search .modal .modal-header #u-search-modal-form #u-search-modal-input{padding:0}}#u-search .modal .modal-header #u-search-modal-form #u-search-modal-input:focus{border-top-left-radius:8px;border-top-right-radius:8px}#u-search .modal .modal-header #u-search-modal-btn-submit{position:absolute;top:0;left:0;padding-left:5px;padding-top:2px;background:0 0;border:none;width:50px;height:64px;vertical-align:middle;color:#3dd9b6;z-index:2}#u-search .modal .modal-body{position:absolute;padding:16px;width:100%;height:calc(100% - 64px);top:64px;left:0;overflow-y:scroll;-webkit-overflow-scrolling:touch;background:var(--color-card);border-radius:8px;-webkit-border-radius:8px}#u-search .modal .modal-body::-webkit-scrollbar{height:4px;width:4px}#u-search .modal .modal-body::-webkit-scrollbar-track-piece{background:0 0}#u-search .modal .modal-body::-webkit-scrollbar-thumb{background:#3dd9b6;cursor:pointer;border-radius:2px;-webkit-border-radius:2px}#u-search .modal .modal-body::-webkit-scrollbar-thumb:hover{background:#ff5722}#u-search .modal .modal-body .modal-results .result{position:relative;display:-webkit-box;display:-moz-box;display:block;padding:16px;border-radius:8px;-webkit-border-radius:8px}#u-search .modal .modal-body .modal-results .result b[mark]{color:#25be9c;text-decoration:underline;font-size:120%;background-color:#ffe600}#u-search .modal .modal-body .modal-results .result:hover{background:var(--color-site-bg)}#u-search .modal .modal-body .modal-results .result:hover .title{color:var(--color-list-hl)}#u-search .modal .modal-body .modal-results .result .title{display:-webkit-box;display:-moz-box;display:inline-block;max-width:100%;color:var(--color-list);font-weight:700;padding:1px;margin-bottom:2px;white-space:normal;overflow:hidden;text-overflow:ellipsis;font-size:1.125rem}#u-search .modal .modal-body .modal-results .result .digest{display:-webkit-box;display:-moz-box;display:block;white-space:inherit;overflow:hidden;word-break:break-all;text-overflow:ellipsis;font-size:.8125rem;color:var(--color-meta)}#l_side,.widget{display:-webkit-box;display:-moz-box}#u-search .modal .modal-body .modal-results .result .icon{position:absolute;top:50%;right:0;margin-top:-4px;font-size:11px;color:var(--color-meta)}#u-search .modal-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.7);z-index:1}#l_side{width:240px;float:right;-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-ms-flex-order:1;-webkit-order:1;order:1;position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}#l_side .widget{overflow:hidden}#l_side .widget.sticky{position:sticky;top:80px;z-index:1}#l_side .widget>.content{max-height:200vh;overflow:auto;text-align:justify;font-size:.875rem;max-width:100%}@media screen and (max-width:768px){#l_side{width:100%}#l_side .widget>.content{max-height:none}}#l_side .widget>.content::-webkit-scrollbar{height:4px;width:4px}#l_side .widget>.content::-webkit-scrollbar-track-piece{background:0 0}#l_side .widget>.content::-webkit-scrollbar-thumb{background:#3dd9b6;cursor:pointer;border-radius:2px;-webkit-border-radius:2px}.widget header,.widget.blogger .content>.avatar{border-top-left-radius:8px;border-top-right-radius:8px}#l_side .widget>.content::-webkit-scrollbar-thumb:hover{background:#ff5722}.widget{z-index:0;background:var(--color-card);margin-bottom:16px;border-radius:8px;-webkit-border-radius:8px;width:100%;display:none}.widget ol li,.widget ul li{margin-top:0;margin-bottom:0}.widget.desktop{display:-webkit-box;display:-moz-box;display:block}@media screen and (max-width:768px){.widget{display:-webkit-box;display:-moz-box;display:none!important}.widget.mobile{display:-webkit-box;display:-moz-box;display:block!important}}.widget header{padding:calc(16px - 2px);font-weight:700;font-size:.875rem;padding-bottom:0}.widget header,.widget header a{color:var(--color-meta)}.widget header>a:hover{color:#ff5722}.widget header span.name{margin-left:8px}.widget>.content{padding:8px 0}.widget>.content p{margin-top:1em;margin-bottom:1em}.widget>.content p:first-child{margin-top:.5em}.widget>.content ul>li a{color:var(--color-meta);padding:0 16px 0 12px;line-height:2;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;align-content:center;border-left:2px solid transparent;-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.widget>.content ul.entry a,.widget>.content ul.popular-posts a{color:var(--color-list)}.widget>.content ul.entry a .name,.widget>.content ul.popular-posts a .name{-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto 0;-ms-flex:auto 0;flex:auto 0}.widget>.content ul.entry a .badge,.widget>.content ul.popular-posts a .badge{-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none 0;-ms-flex:none 0;flex:none 0;font-weight:400;font-size:.875rem;color:rgba(68,68,68,.7)}.widget>.content ul.entry a.active,.widget>.content ul.popular-posts a.active{border-left:2px solid #3dd9b6;color:var(--color-list-hl)}.widget>.content ul.entry a.active .badge,.widget>.content ul.popular-posts a.active .badge{color:rgba(61,217,182,.9)}.widget>.content ul.entry a.child,.widget>.content ul.popular-posts a.child{padding-left:32px}.widget>.content ul.entry a:hover,.widget>.content ul.popular-posts a:hover{border-left:2px solid #3dd9b6;color:var(--color-list-hl);background:var(--color-site-bg)}.widget.blogger{-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.widget.blogger .content{padding:0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:stretch}.widget.blogger .content>.avatar{align-self:center;overflow:hidden;position:relative;line-height:0}.widget.blogger .content>.avatar.circle{border-radius:100%;-webkit-border-radius:100%;width:128px;height:128px;margin-top:32px;margin-bottom:1em}.widget.blogger .content>.avatar.circle img{display:-webkit-box;display:-moz-box;display:block;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-khtml-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.widget.blogger .content .text :first-child{margin-top:16px}.widget.blogger .content h2{text-align:center;font-weight:700;margin:8px}@media screen and (max-width:768px){.widget.blogger .content>.avatar{width:80px;height:80px;border-radius:100%;-webkit-border-radius:100%;border:2px solid #fff}.widget.blogger .content>.avatar img{display:-webkit-box;display:-moz-box;display:block;top:50%;left:50%;transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-khtml-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);position:absolute}.widget.blogger .content h2{margin:8px}}.widget.blogger .content p{text-align:center;font-weight:700;margin:8px 8px 0;empty-cells:hide}.widget.blogger .content .social-wrapper{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;margin:4px}.widget.blogger .content .social-wrapper a{color:var(--color-meta);padding:0;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.widget.blogger .content .social-wrapper a:hover{color:#ff5722}.widget.blogger .content .social-wrapper a.social{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;align-items:center;width:32px;height:32px;margin:4px;border-radius:100px;-webkit-border-radius:100px}.widget.blogger .content .social-wrapper a.social:hover{background:#ebfbf7;color:#3dd9b6}@media screen and (max-width:768px){.widget.blogger .content .social-wrapper{justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;display:-webkit-box;display:-moz-box;display:none}.widget.blogger{box-shadow:none;-webkit-box-shadow:none;background:0 0!important;margin-top:32px;backdrop-filter:none;color:var(--color-site-inner)}}.widget.text .content{padding:4px 16px}.widget.text .content,.widget.text .content p{font-size:.875rem;word-break:break-all}.widget.text .content a{color:#2092ec;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.widget.text .content a:hover{color:#ff5722}.widget.text .content a:active{color:#d93400}.widget.list .content{padding:8px 0}.widget.list .content a{font-size:.875rem;font-weight:700;line-height:1.5;padding-top:6px;padding-bottom:6px}.widget.list .content a i,.widget.list .content a img{margin-right:4px}.widget.list .content a i{margin-left:1px}.widget.list .content a img{vertical-align:middle;height:20px;width:20px;margin-bottom:4px}.widget.list .content a img#round{border-radius:100%;-webkit-border-radius:100%}.widget.grid .content .grid{border:none;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;justify-content:space-around;-webkit-justify-content:space-around;-khtml-justify-content:space-around;-moz-justify-content:space-around;-o-justify-content:space-around;-ms-justify-content:space-around;padding:4px 16px}.widget.grid .content .grid a{text-align:center;border-radius:2px;-webkit-border-radius:2px;margin:0;padding:4px 8px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;font-size:.78125rem;font-weight:700;color:rgba(68,68,68,.7);line-height:1.5;word-wrap:break-word}.widget.grid .content .grid a.active,.widget.grid .content .grid a:hover{color:var(--color-list-hl);background:var(--color-site-bg)}.widget.grid .content .grid a i{margin-top:.3em;margin-bottom:.3em;font-size:1.8em}.widget.grid .content .grid a img{display:-webkit-box;display:-moz-box;display:inline;vertical-align:middle;margin-bottom:4px}.widget.grid .content .grid a img#round{border-radius:100%;-webkit-border-radius:100%}.widget.grid .content .grid a:hover{border-radius:2px;-webkit-border-radius:2px}.widget.grid .content .grid.fixed a{width:calc(100%/3 - 0 * 16px)}@media screen and (max-width:768px){.widget.grid .content .grid.fixed a{width:calc(100%/6 - 0 * 16px)}}@media screen and (max-width:500px){.widget.grid .content .grid.fixed a{width:calc(100%/5 - 0 * 16px)}}@media screen and (max-width:425px){.widget.grid .content .grid.fixed a{width:calc(100%/4 - 0 * 16px)}}@media screen and (max-width:375px){.widget.grid .content .grid.fixed a{width:calc(100%/3 - 0 * 16px)}}.widget.tagcloud .content{text-align:justify;padding:8px 16px}.widget.tagcloud .content a{display:-webkit-box;display:-moz-box;display:inline-block;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;line-height:1.2em;margin:4px 0;border-bottom:1px solid transparent}.widget.tagcloud .content a:hover{color:#ff5722!important;border-bottom:1px solid #ff5722}.widget.related_posts .content{font-weight:700}.widget.related_posts .content ul{margin-top:8px;margin-bottom:8px}.widget.related_posts .content h3{font-size:.875rem;font-weight:700;margin:0}.widget.related_posts .content h3 a{line-height:inherit;padding-top:4px;padding-bottom:4px}.widget.qrcode .content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;align-items:center;justify-content:space-around;-webkit-justify-content:space-around;-khtml-justify-content:space-around;-moz-justify-content:space-around;-o-justify-content:space-around;-ms-justify-content:space-around;padding-left:16px;padding-right:16px}.widget.qrcode .content,.widget.qrcode .content img{margin-bottom:4px}#l_side>.widget.page>.content{padding-top:0;padding-left:12px;padding-right:12px}.webinfo{padding:.2rem 1rem}.webinfo .webinfo-item{display:-webkit-box;display:-moz-box;display:block;padding:4px 0 0}.webinfo .webinfo-item div:first-child{display:-webkit-box;display:-moz-box;display:inline-block}.webinfo .webinfo-item div:last-child{display:-webkit-box;display:-moz-box;display:inline-block;float:right}.widget-last{display:-webkit-box;display:-moz-box;display:block!important}.widget-last .item{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;font-size:.8rem}.widget-last .item-title{width:100%;display:-webkit-box;display:-moz-box;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.widget-sticky{position:sticky;top:80px;z-index:10}.bber-talk{padding:.2rem 1rem}.bber-talk :hover{border-color:#49b1f5;box-shadow:none;-webkit-box-shadow:none}.bber-talk a{color:var(--font-color)}.bber-talk .talk-list{display:-webkit-box;display:-moz-box;display:block!important;max-height:25px;overflow:hidden}.bber-talk .talk-list :hover{color:#49b1f5!important;transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;-khtml-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out}.bber-talk .talk-list .item{text-overflow:ellipsis;white-space:nowrap;width:98%;overflow:hidden}.snackbar-wrap{position:fixed;width:100%;left:0;bottom:0;background:#3dd9b6;padding:16px;z-index:2}.snackbar-content{max-width:1080px;margin:16px auto}@media screen and (max-width:1080px){.snackbar-content{max-width:100%}}.snackbar-content p{margin-top:.5rem;margin-bottom:.5rem;color:#fff}.snackbar-content .title{font-size:1.5rem;font-weight:600}.snackbar-content .action{display:-webkit-box;display:-moz-box;display:block;margin:1.5rem -4px}.snackbar-content .action a{margin:4px;cursor:pointer;color:#fff;display:-webkit-box;display:-moz-box;display:inline-block;padding:.4em 2em;font-weight:600;border-radius:2px;-webkit-border-radius:2px;border:1px solid #fff}.snackbar-content .action a:hover{color:#3dd9b6;background:#fff}.snackbar-wrap[theme=warning]{background:#f7e751}.snackbar-wrap[theme=warning] .snackbar-content p{color:#000}.snackbar-wrap[theme=warning] .snackbar-content a{color:#000;border-color:#000}.snackbar-wrap[theme=warning] .snackbar-content a:hover{color:#f7e751;background:#000}#l_side .toc-wrapper{z-index:1;overflow:hidden;border-radius:8px;-webkit-border-radius:8px;line-height:1.6;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}#l_side .toc-wrapper header{position:sticky;width:100%;top:0;padding-bottom:4px}#l_side .toc-wrapper .content{max-height:calc(100vh - 144px)}#l_side .toc-wrapper .content a{border-left:2px solid transparent}#l_side .toc-wrapper .content a.active,#l_side .toc-wrapper .content a:hover{color:var(--color-list-hl);border-left:2px solid #3dd9b6}#l_side .toc-wrapper .content a:hover{background:var(--color-site-bg)}@media screen and (max-width:768px){#l_side .toc-wrapper{z-index:1001;position:fixed;max-height:1000px;width:auto;max-width:calc(100% - 2 * 16px);top:48px;right:16px;border-radius:4px;-webkit-border-radius:4px;box-shadow:0 4px 8px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.1);border:1px solid #e7e7e7;visibility:hidden;transform:scale(0,0);-webkit-transform:scale(0,0);-khtml-transform:scale(0,0);-moz-transform:scale(0,0);-o-transform:scale(0,0);-ms-transform:scale(0,0);transform-origin:right top;-webkit-transform-origin:right top;-khtml-transform-origin:right top;-moz-transform-origin:right top;-o-transform-origin:right top;-ms-transform-origin:right top}#l_side .toc-wrapper.active{visibility:visible;transform:scale(1,1);-webkit-transform:scale(1,1);-khtml-transform:scale(1,1);-moz-transform:scale(1,1);-o-transform:scale(1,1);-ms-transform:scale(1,1)}}@media screen and (max-width:375px){#l_side .toc-wrapper{right:0}}#l_side .toc-wrapper a{padding-left:8px;color:var(--color-meta);font-size:.875rem;display:-webkit-box;display:-moz-box;display:inline-block}#l_side .toc-wrapper ol .toc-child a,#l_side .toc-wrapper ul .toc-child a{font-weight:400}#l_side .toc-wrapper ol .toc-item.toc-level-1 .toc-child a,#l_side .toc-wrapper ul .toc-item.toc-level-1 .toc-child a{padding-left:12.8px}#l_side .toc-wrapper ol .toc-item.toc-level-2 .toc-child a,#l_side .toc-wrapper ul .toc-item.toc-level-2 .toc-child a{padding-left:25.6px}#l_side .toc-wrapper ol .toc-item.toc-level-3 .toc-child a,#l_side .toc-wrapper ul .toc-item.toc-level-3 .toc-child a{padding-left:38.4px}#l_side .toc-wrapper ol .toc-item.toc-level-4 .toc-child a,#l_side .toc-wrapper ul .toc-item.toc-level-4 .toc-child a{padding-left:51.2px}#l_side .toc-wrapper ol .toc-item.toc-level-5 .toc-child a,#l_side .toc-wrapper ul .toc-item.toc-level-5 .toc-child a{padding-left:64px}#l_side .toc-wrapper ol .toc-item.toc-level-6 .toc-child a,#l_side .toc-wrapper ul .toc-item.toc-level-6 .toc-child a{padding-left:76.8px}#l_side .toc-wrapper ol li,#l_side .toc-wrapper ul li{width:auto;text-align:left}#l_side .toc-wrapper ol li a,#l_side .toc-wrapper ul li a{padding:0 8px 0 11px;font-weight:700;width:100%}#l_side .toc-wrapper:empty{display:-webkit-box;display:-moz-box;display:none}#l_side .toc-wrapper .toc-child{font-size:1rem;overflow:hidden;transition:max-height .6s ease-in;-webkit-transition:max-height .6s ease-in;-khtml-transition:max-height .6s ease-in;-moz-transition:max-height .6s ease-in;-o-transition:max-height .6s ease-in;-ms-transition:max-height .6s ease-in;max-height:0}.article div.btns a,.article span.btn a,.md div.btns a,.md span.btn a{transition:all .28s ease;-khtml-transition:all .28s ease;text-decoration:none}#l_side .toc-wrapper .toc-item.active>.toc-link{color:var(--color-list-hl);border-left:2px solid #3dd9b6}#l_side .toc-wrapper .toc-item.active>.toc-child{max-height:1000px}.article span.btn,.md span.btn{display:-webkit-box;display:-moz-box;display:inline}.article span.btn a,.md span.btn a{display:-webkit-box;display:-moz-box;display:inline-block;padding:3px 4px 2px;margin:2px;line-height:1.1;border-radius:2px;-webkit-border-radius:2px;-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.article span.btn a i,.article span.btn.regular a i,.btn-copy>i,.md span.btn a i,.md span.btn.regular a i{margin-right:4px}.article span.btn a:not([href]),.md span.btn a:not([href]){opacity:.5;-webkit-opacity:.5;-moz-opacity:.5}.article span.btn a:not([href]):hover,.md span.btn a:not([href]):hover{cursor:$not-allowed,not-allowed}.article span.btn a,.article span.btn.regular a,.md span.btn a,.md span.btn.regular a{color:#44d7b6;border:1px solid #44d7b6}.article span.btn a:hover,.article span.btn.regular a:hover,.md span.btn a:hover,.md span.btn.regular a:hover{color:#ff5722;border-color:#ff5722}.article span.btn.regular a,.article span.btn.solid a,.md span.btn.regular a,.md span.btn.solid a{padding:8px 12px}.article span.btn.solid a,.md span.btn.solid a{border:none;background:#44d7b6;color:#fff}.article span.btn.solid a:hover,.md span.btn.solid a:hover{color:#fff;background:#ff5722}.article span.btn.large a,.md span.btn.large a{font-size:1rem;padding:12px 36px}.article span.btn.large a i,.md span.btn.large a i{margin-right:8px}.article span.btn.center,.md span.btn.center{display:-webkit-box;display:-moz-box;display:block;text-align:center}.article div.btns,.md div.btns{margin:0 -8px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;align-items:flex-start;overflow:visible;line-height:1.8}.md .checkbox,div.gallery,div.gallery>p{display:-webkit-flex;display:-ms-flexbox}.article div.btns,.article div.btns a,.article div.btns p,.md div.btns,.md div.btns a,.md div.btns p{font-size:.8125rem;color:var(--color-p)}.article div.btns b,.md div.btns b{font-size:.875rem}.article div.btns.wide>a,.md div.btns.wide>a{padding-left:32px;padding-right:32px}.article div.btns.fill>a,.md div.btns.fill>a{flex-grow:1;width:auto}.article div.btns.around,.md div.btns.around{justify-content:space-around;-webkit-justify-content:space-around;-khtml-justify-content:space-around;-moz-justify-content:space-around;-o-justify-content:space-around;-ms-justify-content:space-around}.article div.btns.center,.md div.btns.center{justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center}.article div.btns.grid2>a,.md div.btns.grid2>a{width:calc(100%/2 - 16px)}@media screen and (max-width:1024px){.article div.btns.grid2>a,.md div.btns.grid2>a{width:calc(100%/2 - 16px)}}@media screen and (max-width:768px){.article div.btns.grid2>a,.md div.btns.grid2>a{width:calc(100%/2 - 16px)}}@media screen and (max-width:500px){.article div.btns.grid2>a,.md div.btns.grid2>a{width:calc(100%/1 - 16px)}}.article div.btns.grid3>a,.md div.btns.grid3>a{width:calc(100%/3 - 16px)}@media screen and (max-width:1024px){.article div.btns.grid3>a,.md div.btns.grid3>a{width:calc(100%/3 - 16px)}}@media screen and (max-width:768px){.article div.btns.grid3>a,.md div.btns.grid3>a{width:calc(100%/3 - 16px)}}@media screen and (max-width:500px){.article div.btns.grid3>a,.md div.btns.grid3>a{width:calc(100%/1 - 16px)}}.article div.btns.grid4>a,.md div.btns.grid4>a{width:calc(100%/4 - 16px)}@media screen and (max-width:1024px){.article div.btns.grid4>a,.md div.btns.grid4>a{width:calc(100%/3 - 16px)}}@media screen and (max-width:768px){.article div.btns.grid4>a,.md div.btns.grid4>a{width:calc(100%/3 - 16px)}}@media screen and (max-width:500px){.article div.btns.grid4>a,.md div.btns.grid4>a{width:calc(100%/2 - 16px)}}.article div.btns.grid5>a,.md div.btns.grid5>a{width:calc(100%/5 - 16px)}@media screen and (max-width:1024px){.article div.btns.grid5>a,.md div.btns.grid5>a{width:calc(100%/4 - 16px)}}@media screen and (max-width:768px){.article div.btns.grid5>a,.md div.btns.grid5>a{width:calc(100%/3 - 16px)}}@media screen and (max-width:500px){.article div.btns.grid5>a,.md div.btns.grid5>a{width:calc(100%/2 - 16px)}}.article div.btns a,.md div.btns a{-webkit-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;border-bottom:none;margin:8px;margin-top:calc(1.25 * 16px + 32px);min-width:120px;font-weight:700;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start;align-content:center;align-items:center;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:8px;text-align:center;background:var(--color-block);border-radius:4px;-webkit-border-radius:4px}.article div.btns a>i:first-child,.article div.btns a>img:first-child,.md div.btns a>i:first-child,.md div.btns a>img:first-child{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;height:64px;width:64px;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1);margin:16px 8px 4px;margin-top:calc(-1.25 * 16px - 32px);border:2px solid var(--color-card);background:#fff;line-height:60px;font-size:28px}.article div.btns a>i:first-child.auto,.article div.btns a>img:first-child.auto,.md div.btns a>i:first-child.auto,.md div.btns a>img:first-child.auto{width:auto}.article div.btns a>i:first-child,.md div.btns a>i:first-child{color:#fff;background:#3dd9b6}.article div.btns a b,.article div.btns a p,.md div.btns a b,.md div.btns a p{margin:.25em;font-weight:400;line-height:1.25;word-wrap:break-word}.article div.btns a b,.md div.btns a b{font-weight:700;line-height:1.3}.article div.btns a img,.md div.btns a img{margin:.4em auto}.article div.btns a:not([href]),.md div.btns a:not([href]){cursor:default;color:inherit}.article div.btns a[href]:hover,.md div.btns a[href]:hover{background:rgba(255,87,34,.15)}.article div.btns a[href]:hover,.article div.btns a[href]:hover b,.md div.btns a[href]:hover,.md div.btns a[href]:hover b{color:#ff5722}.article div.btns a[href]:hover>i:first-child,.article div.btns a[href]:hover>img:first-child,.md div.btns a[href]:hover>i:first-child,.md div.btns a[href]:hover>img:first-child{transform:scale(1.1) translateY(-8px);-webkit-transform:scale(1.1) translateY(-8px);-khtml-transform:scale(1.1) translateY(-8px);-moz-transform:scale(1.1) translateY(-8px);-o-transform:scale(1.1) translateY(-8px);-ms-transform:scale(1.1) translateY(-8px);box-shadow:0 4px 8px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.1)}.article div.btns a[href]:hover>i:first-child,.md div.btns a[href]:hover>i:first-child{background:#ff5722}.article div.btns.circle a>i:first-child,.article div.btns.circle a>img:first-child,.md div.btns.circle a>i:first-child,.md div.btns.circle a>img:first-child{border-radius:32px;-webkit-border-radius:32px}.article div.btns.rounded a>i:first-child,.article div.btns.rounded a>img:first-child,.md div.btns.rounded a>i:first-child,.md div.btns.rounded a>img:first-child{border-radius:16px;-webkit-border-radius:16px}.md .checkbox{display:-webkit-box;display:-moz-box;display:flex;align-items:center;margin-top:1em;margin-bottom:1em}.md .checkbox+.checkbox{margin-top:-1em}.md .checkbox input{transform:translate(0,-1px);-webkit-transform:translate(0,-1px);-khtml-transform:translate(0,-1px);-moz-transform:translate(0,-1px);-o-transform:translate(0,-1px);-ms-transform:translate(0,-1px);-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;appearance:none;position:relative;height:16px;width:16px;transition:all .15s ease-out 0s;-webkit-transition:all .15s ease-out 0s;-khtml-transition:all .15s ease-out 0s;-moz-transition:all .15s ease-out 0s;-o-transition:all .15s ease-out 0s;-ms-transition:all .15s ease-out 0s;cursor:pointer;display:-webkit-box;display:-moz-box;display:inline-block;outline:0;border-radius:2px;-webkit-border-radius:2px;flex-shrink:0;margin-right:8px;pointer-events:none}.md .checkbox input[type=checkbox]:after,.md .checkbox input[type=checkbox]:before{position:absolute;content:"";background:#fff}.md .checkbox input[type=checkbox]:before{left:1px;top:5px;width:0;height:2px;transition:all .2s ease-in;-webkit-transition:all .2s ease-in;-khtml-transition:all .2s ease-in;-moz-transition:all .2s ease-in;-o-transition:all .2s ease-in;-ms-transition:all .2s ease-in;transform:rotate(45deg);-khtml-transform:rotate(45deg);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg)}.md .checkbox input[type=checkbox]:after{right:7px;bottom:3px;width:2px;height:0;transition:all .2s ease-out;-webkit-transition:all .2s ease-out;-khtml-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;-ms-transition:all .2s ease-out;transform:rotate(40deg);-khtml-transform:rotate(40deg);-webkit-transform:rotate(40deg);-moz-transform:rotate(40deg);-ms-transform:rotate(40deg);-o-transform:rotate(40deg);transition-delay:.25s;-webkit-transition-delay:.25s;-khtml-transition-delay:.25s;-moz-transition-delay:.25s;-o-transition-delay:.25s;-ms-transition-delay:.25s}.md .checkbox input[type=checkbox]:checked:before{left:0;top:7px;width:6px;height:2px}.md .checkbox input[type=checkbox]:checked:after{right:3px;bottom:1px;width:2px;height:10px}.md .checkbox.minus input[type=checkbox]:after,.md .checkbox.minus input[type=checkbox]:before{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);left:1px;top:5px;width:0;height:2px}.md .checkbox.minus input[type=checkbox]:checked:before{left:1px;top:5px;width:10px;height:2px}.md .checkbox.minus input[type=checkbox]:checked:after{left:1px;top:5px;width:10px;height:2px}.md .checkbox.plus input[type=checkbox]:before{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);left:1px;top:5px;width:0;height:2px}.md .checkbox.plus input[type=checkbox]:after{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);left:5px;top:1px;width:2px;height:0}.md .checkbox.plus input[type=checkbox]:checked:before{left:1px;top:5px;width:10px;height:2px}.md .checkbox.plus input[type=checkbox]:checked:after{left:5px;top:1px;width:2px;height:10px}.md .checkbox.times input[type=checkbox]:before{transform:rotate(45deg);-webkit-transform:rotate(45deg);-khtml-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-transform:rotate(45deg);left:3px;top:1px;width:0;height:2px}.md .checkbox.times input[type=checkbox]:after{transform:rotate(135deg);-webkit-transform:rotate(135deg);-khtml-transform:rotate(135deg);-moz-transform:rotate(135deg);-o-transform:rotate(135deg);-ms-transform:rotate(135deg);right:3px;top:1px;width:0;height:2px}.md .checkbox.times input[type=checkbox]:checked:before{left:1px;top:5px;width:10px;height:2px}.md .checkbox.times input[type=checkbox]:checked:after{right:1px;top:5px;width:10px;height:2px}.md .checkbox input[type=radio]{border-radius:50%;-webkit-border-radius:50%}.md .checkbox input[type=radio]:before{content:"";display:-webkit-box;display:-moz-box;display:block;width:8px;height:8px;border-radius:50%;-webkit-border-radius:50%;margin:2px;transform:scale(0);-webkit-transform:scale(0);-khtml-transform:scale(0);-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);transition:all .25s ease-out;-webkit-transition:all .25s ease-out;-khtml-transition:all .25s ease-out;-moz-transition:all .25s ease-out;-o-transition:all .25s ease-out;-ms-transition:all .25s ease-out}.md .checkbox input[type=radio]:checked:before{transform:scale(1);-webkit-transform:scale(1);-khtml-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);background:#3dd9b6}.md .checkbox input{border:2px solid #3dd9b6}.md .checkbox input[type=checkbox]:checked{background:#3dd9b6}.md .checkbox.red input{border-color:#fe5f58}.md .checkbox.red input[type=checkbox]:checked{background:#fe5f58}.md .checkbox.red input[type=radio]:checked:before{background:#fe5f58}.md .checkbox.green input{border-color:#3dc550}.md .checkbox.green input[type=checkbox]:checked{background:#3dc550}.md .checkbox.green input[type=radio]:checked:before{background:#3dc550}.md .checkbox.yellow input{border-color:#ffbd2b}.md .checkbox.yellow input[type=checkbox]:checked{background:#ffbd2b}.md .checkbox.yellow input[type=radio]:checked:before{background:#ffbd2b}.md .checkbox.cyan input{border-color:#1bcdfc}.md .checkbox.cyan input[type=checkbox]:checked{background:#1bcdfc}.md .checkbox.cyan input[type=radio]:checked:before{background:#1bcdfc}.md .checkbox.blue input{border-color:#2196f3}.md .checkbox.blue input[type=checkbox]:checked{background:#2196f3}.md .checkbox.blue input[type=radio]:checked:before{background:#2196f3}article .checkbox p{display:-webkit-box;display:-moz-box;display:inline-block;margin-top:0!important;margin-bottom:0!important}div.dropmenu-wrapper{display:-webkit-box;display:-moz-box;display:inline-block}div.dropmenu{position:relative;display:-webkit-box;display:-moz-box;display:inline-block;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;color:#2092ec}div.dropmenu:hover{color:inherit}div.dropmenu:hover>ul{display:-webkit-box;display:-moz-box;display:block;left:0;margin-left:0;margin-top:0}div.dropmenu ul>li>a:hover{text-decoration:none!important}div.dropmenu .list-v .list-v{left:calc(100% - .5 * 16px)}div.gallery{margin:1em 0;overflow:hidden}div.gallery+.gallery{margin-top:-1em}div.gallery>.fancybox,div.gallery>p>.fancybox{margin:1px;padding:0;position:relative}div.gallery>.fancybox a,div.gallery>p>.fancybox a{height:100%;width:100%}div.gallery>.fancybox img,div.gallery>p>.fancybox img{object-fit:cover;height:100%;width:100%}div.gallery>.fancybox .image-caption,div.gallery>p>.fancybox .image-caption{opacity:0;-webkit-opacity:0;-moz-opacity:0;transform:translateY(100%);-webkit-transform:translateY(100%);-khtml-transform:translateY(100%);-moz-transform:translateY(100%);-o-transform:translateY(100%);-ms-transform:translateY(100%);transition:all .3s ease;-webkit-transition:all .3s ease;-khtml-transition:all .3s ease;-moz-transition:all .3s ease;-o-transition:all .3s ease;-ms-transition:all .3s ease;pointer-events:none;position:absolute;width:100%;bottom:0;text-align:center;background:rgba(0,0,0,.3);color:#fff}div.gallery>.fancybox .image-caption:empty,div.gallery>p>.fancybox .image-caption:empty{display:-webkit-box;display:-moz-box;display:none}div.gallery>.fancybox:hover .image-caption,div.gallery>p>.fancybox:hover .image-caption{opacity:1;-webkit-opacity:1;-moz-opacity:1;transform:translateY(0);-webkit-transform:translateY(0);-khtml-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0)}div.gallery,div.gallery>p{display:-webkit-box;display:-moz-box;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-khtml-flex-wrap:nowrap;-moz-flex-wrap:nowrap;-o-flex-wrap:nowrap;-ms-flex-wrap:nowrap;padding:0!important;align-items:stretch}div.gallery[col]{flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start}div.gallery[col='2']>.fancybox{width:calc(50% - 2 * 1px)}div.gallery[col='3']>.fancybox{width:calc(33.33% - 2 * 1px)}div.gallery[col='4']>.fancybox{width:calc(25% - 2 * 1px)}div.gallery[col='5']>.fancybox{width:calc(20% - 2 * 1px)}div.gallery[col='6']>.fancybox{width:calc(16.66% - 2 * 1px)}div.gallery[col='7']>.fancybox{width:calc(14.2857% - 2 * 1px)}div.gallery[col='8']>.fancybox{width:calc(12.5% - 2 * 1px)}div.gallery>p{margin:0}div.gallery.left,div.gallery.left>p{justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start}div.gallery.center,div.gallery.center>p{justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center}div.gallery.right,div.gallery.right>p{justify-content:flex-end;-webkit-justify-content:flex-end;-khtml-justify-content:flex-end;-moz-justify-content:flex-end;-o-justify-content:flex-end;-ms-justify-content:flex-end}div.gallery.stretch,div.gallery.stretch>p{align-items:stretch}.md .frame-wrap,div.fancybox{-webkit-flex-direction:column;overflow:hidden;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical}div.fancybox{margin-top:1em;margin-bottom:1em;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;flex-direction:column;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;align-items:center;flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-khtml-flex-wrap:nowrap;-moz-flex-wrap:nowrap;-o-flex-wrap:nowrap;-ms-flex-wrap:nowrap;padding:0!important;border-radius:2px;-webkit-border-radius:2px}@media screen and (max-width:500px){div.fancybox{border-radius:1px;-webkit-border-radius:1px}}div.fancybox a{line-height:0;margin:0 auto;align-items:stretch}div.fancybox .gallery{overflow:hidden}div.fancybox .image-caption{font-size:.8125rem;padding-top:.5em;padding-bottom:1em;color:var(--color-meta)}div.fancybox .image-caption:empty{display:-webkit-box;display:-moz-box;display:none}details{display:-webkit-box;display:-moz-box;display:block;padding:16px;margin:1em 0;border-radius:4px;-webkit-border-radius:4px;background:var(--color-card);font-size:.9375rem;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;border:1px solid var(--color-block)}details summary{cursor:pointer;padding:16px;margin:-16px;border-radius:4px;-webkit-border-radius:4px;color:rgba(68,68,68,.7);font-size:.875rem;font-weight:700;position:relative;line-height:normal}details summary>h1,details summary>h2,details summary>h3,details summary>h4,details summary>h5,details summary>h6,details summary>p{display:-webkit-box;display:-moz-box;display:inline;border-bottom:none!important}details summary:hover{color:var(--color-p)}details summary:hover:after{position:absolute;content:'+';text-align:center;top:50%;transform:translateY(-50%);-webkit-transform:translateY(-50%);-khtml-transform:translateY(-50%);-moz-transform:translateY(-50%);-o-transform:translateY(-50%);-ms-transform:translateY(-50%);right:16px}details>summary{background:var(--color-block)}details[blue]{border-color:#e8f4fd}details[blue]>summary{background:#e8f4fd}details[cyan]{border-color:#e8fafe}details[cyan]>summary{background:#e8fafe}details[green]{border-color:#ebf9ed}details[green]>summary{background:#ebf9ed}details[yellow]{border-color:#fff8e9}details[yellow]>summary{background:#fff8e9}details[red]{border-color:#feefee}details[red]>summary{background:#feefee}details[open]{border-color:rgba(68,68,68,.2)}details[open]>summary{border-bottom:1px solid rgba(68,68,68,.2);border-bottom-left-radius:0;border-bottom-right-radius:0;color:#444;margin-bottom:0}details[open][blue]{border-color:rgba(33,150,243,.3)}details[open][blue]>summary{border-bottom-color:rgba(33,150,243,.3)}details[open][cyan]{border-color:rgba(27,205,252,.3)}details[open][cyan]>summary{border-bottom-color:rgba(27,205,252,.3)}details[open][green]{border-color:rgba(61,197,80,.3)}details[open][green]>summary{border-bottom-color:rgba(61,197,80,.3)}details[open][yellow]{border-color:rgba(255,189,43,.3)}details[open][yellow]>summary{border-bottom-color:rgba(255,189,43,.3)}details[open][red]{border-color:rgba(254,95,88,.3)}details[open][red]>summary{border-bottom-color:rgba(254,95,88,.3)}details[open]>summary:hover:after{content:'-'}details[open]>div.content{padding:16px;margin:0 -16px -16px}details[open]>div.content p>a:hover{text-decoration:underline}details[open]>div.content>.highlight:first-child,details[open]>div.content>.note:first-child,details[open]>div.content>.tabs:first-child,details[open]>div.content>details:first-child,details[open]>div.content>ol:first-child,details[open]>div.content>p:first-child,details[open]>div.content>ul:first-child{margin-top:0}details[open]>div.content>.highlight:last-child,details[open]>div.content>.note:last-child,details[open]>div.content>.tabs:last-child,details[open]>div.content>details:last-child,details[open]>div.content>ol:last-child,details[open]>div.content>p:last-child,details[open]>div.content>ul:last-child{margin-bottom:0}.md .frame-wrap{position:relative;margin:0 auto;max-width:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;flex-direction:column;align-items:center}.md .frame-wrap img,.md .frame-wrap video{border-radius:0;-webkit-border-radius:0}.md .frame-wrap .frame{z-index:1;display:-webkit-box;display:-moz-box;display:block;position:absolute;background-size:100%;-webkit-background-size:100%;-moz-background-size:100%;background-repeat:no-repeat;overflow:hidden}.md .img-wrap .frame-wrap[part]{height:auto}.md .frame-wrap#iphone11 img,.md .frame-wrap#iphone11 video{width:287px;margin-top:19px;margin-bottom:20px}.md .frame-wrap#iphone11 .frame{background-image:url(https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@3/img/frame/iphone11.svg);width:329px;height:658px}.md .frame-wrap[part=top] img,.md .frame-wrap[part=top] video{margin-bottom:0!important}.md .frame-wrap:not([part=bottom]) .frame{top:0}.md .frame-wrap[part=bottom] img,.md .frame-wrap[part=bottom] video{bottom:0;margin-top:0!important}.md .frame-wrap[part=bottom] .frame{bottom:0}@media screen and (max-width:500px){.md .frame-wrap#iphone11 img,.md .frame-wrap#iphone11 video{width:208px;margin-top:13px;margin-bottom:14px}.md .frame-wrap#iphone11 .frame{width:238px;height:476px}}.sites-wrap .group-header,.users-wrap .group-header{margin:0 0 1rem}.users-wrap{overflow:hidden}.users-wrap .group-header p{margin:0;font-size:.875rem}.users-wrap .group-header p:first-child{font-size:1.25rem;font-weight:500}.users-wrap .group-body{width:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;align-items:stretch;margin-bottom:2rem}.users-wrap .friendsjs-wrap{display:-webkit-box;display:-moz-box;display:block}.users-wrap .friendsjs-wrap .loading-wrap{min-height:50px;margin:2rem 0;text-align:center}.users-wrap .user-card{flex-shrink:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:stretch;width:12.5%}@media screen and (max-width:980px){.users-wrap .user-card{width:14.28%}}@media screen and (max-width:900px){.users-wrap .user-card{width:16.66%}}@media screen and (max-width:820px){.users-wrap .user-card{width:20%}}@media screen and (max-width:768px){.users-wrap .user-card{width:16.66%}}@media screen and (max-width:500px){.users-wrap .user-card{width:25%}}.users-wrap .user-card .card-link{margin:0;width:100%;color:var(--text-p1);font-size:10px;font-weight:500;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;text-align:center;line-height:1.2;border-radius:4px;-webkit-border-radius:4px;overflow:hidden;position:relative;padding:1rem .5rem}.md .link-card p.text,p.p.bold,p.p.subtitle,span.p.bold{font-weight:700}.users-wrap .user-card .card-link img{object-fit:cover;display:-webkit-box;display:-moz-box;display:block;width:48px;height:48px;background:var(--card);border-radius:64px;-webkit-border-radius:64px;margin:0 0 .5rem}a.ghcard,img.inline{display:-webkit-box}.users-wrap .user-card .card-link>img{transition:transform .2s ease-out,box-shadow .2s ease-out;-webkit-transition:transform .2s ease-out,box-shadow .2s ease-out;-khtml-transition:transform .2s ease-out,box-shadow .2s ease-out;-moz-transition:transform .2s ease-out,box-shadow .2s ease-out;-o-transition:transform .2s ease-out,box-shadow .2s ease-out;-ms-transition:transform .2s ease-out,box-shadow .2s ease-out}.users-wrap .user-card .card-link:hover{background:var(--block-hover)}.md .link-card,div.note{background:var(--color-block)}.users-wrap .user-card .card-link:hover img{transform:scale(1.2) rotate(8deg);-webkit-transform:scale(1.2) rotate(8deg);-khtml-transform:scale(1.2) rotate(8deg);-moz-transform:scale(1.2) rotate(8deg);-o-transform:scale(1.2) rotate(8deg);-ms-transform:scale(1.2) rotate(8deg);box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}a.ghcard{display:-moz-box;display:inline-block;line-height:0}.md .ghcard-group{column-count:2;-webkit-column-count:2;-moz-column-count:2;column-gap:0;-webkit-column-gap:0;-moz-column-gap:0;margin:0 -8px}.md .ghcard-group .ghcard{margin:8px}.md .img{object-fit:contain}img.inline{display:-moz-box;display:inline!important;vertical-align:middle;transform:translateY(-4px);-webkit-transform:translateY(-4px);-khtml-transform:translateY(-4px);-moz-transform:translateY(-4px);-o-transform:translateY(-4px);-ms-transform:translateY(-4px)}.md .tag.link{margin-top:1em;margin-bottom:1em}.md .link-card{margin-right:1em;display:-webkit-box;display:-moz-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;align-items:center;cursor:pointer;text-align:center;width:361px;max-width:100%;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1);color:var(--color-p);border-radius:8px;-webkit-border-radius:8px}@media screen and (max-width:425px){.md .link-card{max-width:100%;width:100%}}.md .link-card:hover{box-shadow:0 4px 8px 0 rgba(0,0,0,.1),0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.1),0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}.md .link-card div.left,.md .link-card div.right{pointer-events:none}.md .link-card div.left{width:54px;height:54px;margin:12px;overflow:hidden;flex-shrink:0;position:relative}.md .link-card div.left i{font-size:32px;line-height:48px;margin-left:4px}.md .link-card div.left img{display:-webkit-box;display:-moz-box;display:block;position:absolute;border-radius:8px/4;-webkit-border-radius:8px/4;top:50%;left:50%;transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-khtml-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}div.note,div.tabs,div.timenode{position:relative}.md .link-card div.right{overflow:hidden;margin-right:16px}.md .link-card p{margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.md .link-card p.url{flex-shrink:0;color:var(--color-meta);font-size:.8125rem}.md .link-group{display:-webkit-box;display:-moz-box;display:grid;grid-template-columns:1fr 1fr;grid-gap:16px}.sites-wrap .sitesjs-wrap,div.videos{display:-moz-box;display:-webkit-box}@media screen and (max-width:850px){.md .link-group{grid-template-columns:1fr}}.md .link-group .tag.link{margin:0}.md .link-group .link-card{width:100%}audio,video{border-radius:4px;-webkit-border-radius:4px;max-width:100%}video{z-index:1;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}video:hover{box-shadow:0 4px 8px 0 rgba(0,0,0,.24),0 8px 16px 0 rgba(0,0,0,.24);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.24),0 8px 16px 0 rgba(0,0,0,.24)}div.video{line-height:0;text-align:center}div.videos{max-width:calc(100% + 2 * 4px);display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start;align-items:flex-end;margin:1em -4px}div.videos .video,div.videos iframe{width:100%;margin:4px}div.videos iframe{border-radius:4px;-webkit-border-radius:4px;width:100%;min-height:300px}div.videos.left{justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start}div.videos.center{justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center}div.videos.right{justify-content:flex-end;-webkit-justify-content:flex-end;-khtml-justify-content:flex-end;-moz-justify-content:flex-end;-o-justify-content:flex-end;-ms-justify-content:flex-end}div.videos.stretch{align-items:stretch}div.videos[col='1'] .video,div.videos[col='1'] iframe{width:100%}div.videos[col='2'] .video,div.videos[col='2'] iframe{width:calc(50% - 2 * 4px)}div.videos[col='3'] .video,div.videos[col='3'] iframe{width:calc(33.33% - 2 * 4px)}div.videos[col='4'] .video,div.videos[col='4'] iframe{width:calc(25% - 2 * 4px)}div.note{margin-top:1em;margin-bottom:1em;padding:16px;padding-left:calc(16px + 16px);border-radius:4px;-webkit-border-radius:4px;font-size:.9375rem;border-left:4px solid #3dd9b6}div.note h2,div.note h3,div.note h4,div.note h5,div.note h6{margin-top:3px;margin-bottom:0;padding-top:0!important;border-bottom:initial}div.note blockquote,div.note img,div.note ol,div.note p,div.note ul{margin-top:.5em;margin-bottom:.5em}div.note .link-card{background:var(--color-card)}div.note::before{position:absolute;top:calc(50% - 24px * .5);left:4px;width:24px;height:24px;text-align:center;font-weight:600;line-height:24px;vertical-align:middle;font-family:'Font Awesome 6 Pro';color:#3dd9b6;content:'\f054'}div.note.quote{background:#e8f4fd;border-color:#2196f3}div.note.quote::before{color:#2196f3;content:'\f10d'}div.note.info{background:#ebfbf7;border-color:#3dd9b6}div.note.info::before{color:#3dd9b6;content:'\f129'}div.note.done,div.note.success{background:#ebf9ed;border-color:#3dc550}div.note.done::before,div.note.success::before{color:#3dc550;content:'\f00c'}div.note.warning{background:#fff8e9;border-color:#ffbd2b}div.note.warning::before{color:#ffbd2b;content:'\f12a'}div.note.danger,div.note.error{background:#feefee;border-color:#fe5f58}div.note.danger::before,div.note.error::before{color:#fe5f58;content:'\f00d'}div.note.radiation::before{content:'\f7b9'}div.note.bug::before{content:'\f188'}div.note.idea::before{content:'\f0eb'}div.note.link::before{content:'\f0c1'}div.note.paperclip::before{content:'\f0c6'}div.note.todo::before{content:'\f0ae'}div.note.message::before{content:'\f4ad'}div.note.guide::before{content:'\f277'}div.note.download::before{content:'\f019'}div.note.up::before{content:'\f102'}div.note.undo::before{content:'\f2ea'}div.note.play::before{content:'\f144'}div.note.clear{background:0 0;border-color:none}div.note.light{background:#f5f5f5;border-color:#a1a1a1}div.note.light::before{color:#a1a1a1}div.note.gray{background:#f5f5f5;border-color:#696969}div.note.gray::before{color:#696969}div.note.theme{background:#ebfbf7;border-color:#3dd9b6}div.note.theme::before{color:#3dd9b6}div.note.red{background:#feefee;border-color:#fe5f58}div.note.red::before{color:#fe5f58}div.note.yellow{background:#fff8e9;border-color:#ffbd2b}div.note.yellow::before{color:#ffbd2b}div.note.green{background:#ebf9ed;border-color:#3dc550}div.note.green::before{color:#3dc550}div.note.cyan{background:#e8fafe;border-color:#1bcdfc}div.note.cyan::before{color:#1bcdfc}div.note.blue{background:#e8f4fd;border-color:#2196f3}div.note.blue::before{color:#2196f3}.sites-wrap .group-header p{margin:0;font-size:.875rem}.sites-wrap .group-header p:first-child{font-size:1.25rem;font-weight:500}.sites-wrap .sitesjs-wrap{display:block}.sites-wrap .sitesjs-wrap .loading-wrap{min-height:50px;margin:2rem 0;text-align:center}.sites-wrap .group-body{width:100%;display:-webkit-box;display:-moz-box;display:grid;grid-gap:1rem 1rem;grid-template-columns:repeat(auto-fill,calc((100% - 3 * 1rem)/ 4));margin-bottom:2rem}@media screen and (max-width:1024px){.sites-wrap .group-body{grid-template-columns:repeat(auto-fill,calc((100% - 2 * 1rem)/ 3))}}@media screen and (max-width:900px){.sites-wrap .group-body{grid-template-columns:repeat(auto-fill,calc((100% - 1 * 1rem)/ 2))}}@media screen and (max-width:768px){.sites-wrap .group-body{grid-template-columns:repeat(auto-fill,calc((100% - 2 * 1rem)/ 3))}}.sites-wrap .group-body .site-card .card-link{width:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.sites-wrap .group-body .site-card .card-link>img{width:100%;height:120px;border-radius:4px;-webkit-border-radius:4px;object-fit:cover;box-shadow:0 1px 2px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.2)}@media screen and (max-width:1024px){.sites-wrap .group-body .site-card .card-link>img{height:150px}}@media screen and (max-width:900px){.sites-wrap .group-body .site-card .card-link>img{height:180px}}@media screen and (max-width:768px){.sites-wrap .group-body .site-card .card-link>img{height:150px}}.sites-wrap .group-body .site-card .card-link .info{margin-top:.5rem;line-height:1.2}.sites-wrap .group-body .site-card .card-link .info>img{width:28px;height:28px;border-radius:28px;-webkit-border-radius:28px;float:left;margin-right:8px;margin-top:2px}.sites-wrap .group-body .site-card .card-link .info span{display:-webkit-box;display:-moz-box;display:block}.sites-wrap .group-body .site-card .card-link .info .title{font-weight:500;color:var(--text-p1);font-size:.875rem;margin-top:1px;display:-webkit-box;display:-moz-box;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;-webkit-line-clamp:1}.sites-wrap .group-body .site-card .card-link .info .desc{font-size:10px;margin-top:2px;word-wrap:break-word;color:var(--text-p3);display:-webkit-box;display:-moz-box;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;-webkit-line-clamp:2}.sites-wrap .site-card .card-link>img{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.sites-wrap .site-card .card-link:hover>img{box-shadow:0 4px 8px 0 rgba(0,0,0,.1),0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.1),0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}p.p.subtitle{color:#3eb399;font-size:1.25rem!important;padding-top:1.5rem}p.p.subtitle:first-child{padding-top:1rem}p.p.logo,span.p.logo{font-family:MaShanZheng,Helvetica,monospace}.article mjx-container,.highlight,p.p.code,span.p.code{font-family:JetBrainsMono,monospace,courier,sans-serif}p.p.left,span.p.left{display:-webkit-box;display:-moz-box;display:block;text-align:left}p.p.center,span.p.center{display:-webkit-box;display:-moz-box;display:block;text-align:center}p.p.right,span.p.right{display:-webkit-box;display:-moz-box;display:block;text-align:right}p.p.small,span.p.small{font-size:.875rem}p.p.large,span.p.large{font-size:2.5rem;line-height:1.4}p.p.huge,span.p.huge{font-size:4rem;line-height:1.4}p.p.ultra,span.p.ultra{font-size:6rem;line-height:1.4}p.p.huge,p.p.large,p.p.small,p.p.ultra,span.p.huge,span.p.large,span.p.small,span.p.ultra{margin:0;padding:0}p.p.h1,p.p.h2,span.p.h1,span.p.h2{padding-bottom:.2rem;font-weight:500}p.p.h1,span.p.h1{font-size:1.5rem;color:var(--color-h1);padding-top:2em}p.p.h2,span.p.h2{font-size:1.5rem;color:var(--color-h2);padding-top:2em;border-bottom:1px solid rgba(68,68,68,.1)}p.p.h3,span.p.h3{font-size:1.25rem;color:var(--color-h3);padding-top:2em}p.p.h4,span.p.h4{font-size:1.125rem;color:var(--color-h4);padding-top:2em}p.p.h5,span.p.h5{font-size:1rem;color:var(--color-h5);padding-top:1.5em}p.p.red,span.p.red{color:#fe5f58}p.p.yellow,span.p.yellow{color:#ffbd2b}p.p.green,span.p.green{color:#3dc550}p.p.cyan,span.p.cyan{color:#1bcdfc}p.p.blue,span.p.blue{color:#2196f3}p.p.purple,span.p.purple{color:#9c27b0}p.p.gray,span.p.gray{color:#999}.swiper-container{width:100%;border-radius:4px;-webkit-border-radius:4px;--gap-p:2rem}.swiper-container:not(.swiper-container-initialized){display:-webkit-box;display:-moz-box;display:none}.md .table table,div.swiper-slide{display:-webkit-box;display:-moz-box}div.swiper-slide{text-align:center;display:-ms-flexbox;display:-webkit-flex;display:-ms-flexbox;display:-webkit-flex;display:flex;align-self:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;width:50%}div.swiper-slide img{border-radius:4px;-webkit-border-radius:4px}.swiper-container[width=max] div.swiper-slide{width:100%}.swiper-container[width=min] div.swiper-slide{width:25%}.swiper-button-next,.swiper-button-prev{padding:1rem .5rem;margin-top:-2rem!important;border-radius:4px;-webkit-border-radius:4px;background:rgba(255,255,255,.25);transition:background .2s ease-out;-webkit-transition:background .2s ease-out;-khtml-transition:background .2s ease-out;-moz-transition:background .2s ease-out;-o-transition:background .2s ease-out;-ms-transition:background .2s ease-out;--swiper-theme-color:#000!important}.md .table,div.tabs,div.tabs .highlight,div.tabs details,div.tabs div.note,div.tabs ol,div.tabs p,div.tabs ul{margin-top:1em;margin-bottom:1em}.swiper-button-next:after,.swiper-button-prev:after{font-size:1.2rem!important;font-weight:700!important}.swiper-button-next:hover,.swiper-button-prev:hover{background:#fff!important;--swiper-theme-color:#ff5722!important}.md .table{overflow:auto}.md .table table{display:table;width:100%}div.tabs{display:-webkit-box;display:-moz-box;display:block;border-radius:4px;-webkit-border-radius:4px;background:var(--color-card);border:1px solid rgba(68,68,68,.2);font-size:.9375rem}div.tabs ul.nav-tabs{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;overflow-x:auto;white-space:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start;-khtml-justify-content:flex-start;-moz-justify-content:flex-start;-o-justify-content:flex-start;-ms-justify-content:flex-start;margin:0!important;padding:8px 8px 0;background:var(--color-block);border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;line-height:1.5}div.tabs ul.nav-tabs li.tab{list-style-type:none;margin-top:0;margin-bottom:0}div.tabs ul.nav-tabs li.tab:last-child{padding-right:16px}div.tabs ul.nav-tabs li.tab a{display:-webkit-box;display:-moz-box;display:block;cursor:pointer;border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;padding:8px;text-align:center;font-size:.875rem;line-height:inherit;font-weight:700;color:var(--color-meta);border:1px solid transparent}div.tabs ul.nav-tabs li.tab a:hover{color:var(--color-p)}div.tabs ul.nav-tabs li.tab a i{pointer-events:none}div.tabs ul.nav-tabs li.tab.active a{cursor:default;color:var(--color-p);background:#fff;border:1px solid rgba(68,68,68,.2);border-bottom:1px solid var(--color-card)}div.tabs .tab-content{border-top:1px solid rgba(68,68,68,.2);margin-top:-1px}div.tabs .tab-content .tab-pane{padding:16px}div.tabs .tab-content .tab-pane:not(.active){display:-webkit-box;display:-moz-box;display:none}div.tabs .tab-content .tab-pane.active{display:-webkit-box;display:-moz-box;display:block}div.tabs .tab-content .tab-pane>.highlight:first-child,div.tabs .tab-content .tab-pane>.note:first-child,div.tabs .tab-content .tab-pane>.tabs:first-child,div.tabs .tab-content .tab-pane>ol:first-child,div.tabs .tab-content .tab-pane>p:first-child,div.tabs .tab-content .tab-pane>ul:first-child{margin-top:0}div.tabs .tab-content .tab-pane>.highlight:last-child,div.tabs .tab-content .tab-pane>.note:last-child,div.tabs .tab-content .tab-pane>.tabs:last-child,div.tabs .tab-content .tab-pane>ol:last-child,div.tabs .tab-content .tab-pane>p:last-child,div.tabs .tab-content .tab-pane>ul:last-child{margin-bottom:0}.article del{color:#8e8e8e;text-decoration-color:#8e8e8e}.article emp,.article u,.article wavy,div.timenode:hover .meta{color:var(--color-text)}.article u{text-decoration:none;border-bottom:1px solid #fe5f58}.article emp{border-bottom:4px dotted #fe5f58}.article wavy{text-decoration-style:wavy;text-decoration-line:underline;text-decoration-color:#fe5f58}.article psw{color:transparent;background:#a1a1a1;border-radius:2px;-webkit-border-radius:2px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.article psw:hover{color:var(--color-p);background:0 0}.article kbd{border-radius:4px;-webkit-border-radius:4px;border:1px solid #d2d2d2;border-bottom-width:2px;background:#fafafa;padding-left:4px;padding-right:4px}div.timenode:after,div.timenode:before{content:'';z-index:1;position:absolute;background:rgba(61,217,182,.5);width:2px;left:7px}div.timenode:before{top:0;height:6px}div.timenode:after{top:26px;height:calc(100% - 26px)}div.timenode:last-child:after{height:calc(100% - 26px - 16px);border-bottom-left-radius:2px;border-bottom-right-radius:2px}div.timenode .body,div.timenode .meta{max-width:calc(100% - 24px)}div.timenode .meta{position:relative;color:var(--color-meta);font-size:.875rem;line-height:32px;height:32px}div.timenode .meta:after,div.timenode .meta:before{content:'';position:absolute;top:8px;z-index:2}div.timenode .meta:before{background:rgba(61,217,182,.5);width:16px;height:16px;border-radius:8px;-webkit-border-radius:8px}div.timenode .meta:after{background:#3dd9b6;margin-left:2px;margin-top:2px;width:12px;height:12px;border-radius:6px;-webkit-border-radius:6px;transform:scale(.5);-webkit-transform:scale(.5);-khtml-transform:scale(.5);-moz-transform:scale(.5);-o-transform:scale(.5);-ms-transform:scale(.5);transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}div.timenode .meta p{font-weight:700;margin:0 0 0 24px}div.timenode .body{margin:4px 0 16px 24px;padding:16px;border-radius:8px;-webkit-border-radius:8px;background:var(--color-block);display:-webkit-box;display:-moz-box;display:inline-block}div.timenode .body:empty{display:-webkit-box;display:-moz-box;display:none}div.timenode .body>:first-child{margin-top:.25em}div.timenode .body>:last-child{margin-bottom:.25em}div.timenode .body .highlight{border:1px solid #e4e4e4}div.timenode:hover .meta:before{background:rgba(255,87,34,.5)}div.timenode:hover .meta:after{background:#ff5722;transform:scale(1);-webkit-transform:scale(1);-khtml-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1)}.article mjx-container{padding:16px 8px;border-radius:4px;-webkit-border-radius:4px;min-width:0!important}.article .has-jax,.article mjx-container[jax=CHTML][display=true]{overflow:auto hidden}.article mjx-container+br{display:-webkit-box;display:-moz-box;display:none}.btn-copy,.highlight{display:-webkit-box;transition:all .28s ease}.fa-duotone.red,.fa-light.red,.fa-regular.red,.fa-solid.red,.fa-thin.red,.fa.red,.fad.red,.fal.red,.far.red,.fas.red,.iziToast>.iziToast-body .iziToast-icon.red{color:#f44336}.fa-duotone.pink,.fa-light.pink,.fa-regular.pink,.fa-solid.pink,.fa-thin.pink,.fa.pink,.fad.pink,.fal.pink,.far.pink,.fas.pink,.iziToast>.iziToast-body .iziToast-icon.pink{color:#e91e63}.fa-duotone.purple,.fa-light.purple,.fa-regular.purple,.fa-solid.purple,.fa-thin.purple,.fa.purple,.fad.purple,.fal.purple,.far.purple,.fas.purple,.iziToast>.iziToast-body .iziToast-icon.purple{color:#9c27b0}.fa-duotone.indigo,.fa-light.indigo,.fa-regular.indigo,.fa-solid.indigo,.fa-thin.indigo,.fa.indigo,.fad.indigo,.fal.indigo,.far.indigo,.fas.indigo,.iziToast>.iziToast-body .iziToast-icon.indigo{color:#3f51b5}.fa-duotone.light-blue,.fa-light.light-blue,.fa-regular.light-blue,.fa-solid.light-blue,.fa-thin.light-blue,.fa.light-blue,.fad.light-blue,.fal.light-blue,.far.light-blue,.fas.light-blue,.iziToast>.iziToast-body .iziToast-icon.light-blue{color:#4ba7ee}.fa-duotone.deep-blue,.fa-light.deep-blue,.fa-regular.deep-blue,.fa-solid.deep-blue,.fa-thin.deep-blue,.fa.deep-blue,.fad.deep-blue,.fal.deep-blue,.far.deep-blue,.fas.deep-blue,.iziToast>.iziToast-body .iziToast-icon.deep-blue{color:#3367d6}.fa-duotone.teal,.fa-light.teal,.fa-regular.teal,.fa-solid.teal,.fa-thin.teal,.fa.teal,.fad.teal,.fal.teal,.far.teal,.fas.teal,.iziToast>.iziToast-body .iziToast-icon.teal{color:#009688}.fa-duotone.light-green,.fa-light.light-green,.fa-regular.light-green,.fa-solid.light-green,.fa-thin.light-green,.fa.light-green,.fad.light-green,.fal.light-green,.far.light-green,.fas.light-green,.iziToast>.iziToast-body .iziToast-icon.light-green{color:#8bc34a}.fa-duotone.orange,.fa-light.orange,.fa-regular.orange,.fa-solid.orange,.fa-thin.orange,.fa.orange,.fad.orange,.fal.orange,.far.orange,.fas.orange,.iziToast>.iziToast-body .iziToast-icon.orange{color:#ff9800}.fa-duotone.deep-orange,.fa-light.deep-orange,.fa-regular.deep-orange,.fa-solid.deep-orange,.fa-thin.deep-orange,.fa.deep-orange,.fad.deep-orange,.fal.deep-orange,.far.deep-orange,.fas.deep-orange,.iziToast>.iziToast-body .iziToast-icon.deep-orange{color:#ff5722}.fa-duotone.brown,.fa-light.brown,.fa-regular.brown,.fa-solid.brown,.fa-thin.brown,.fa.brown,.fad.brown,.fal.brown,.far.brown,.fas.brown,.iziToast>.iziToast-body .iziToast-icon.brown{color:#795548}.fa-duotone.blue-grey,.fa-light.blue-grey,.fa-regular.blue-grey,.fa-solid.blue-grey,.fa-thin.blue-grey,.fa.blue-grey,.fad.blue-grey,.fal.blue-grey,.far.blue-grey,.fas.blue-grey,.iziToast>.iziToast-body .iziToast-icon.blue-grey{color:#607d8b}.fa-duotone.yellow,.fa-light.yellow,.fa-regular.yellow,.fa-solid.yellow,.fa-thin.yellow,.fa.yellow,.fad.yellow,.fal.yellow,.far.yellow,.fas.yellow,.iziToast>.iziToast-body .iziToast-icon.yellow{color:#fcec60}.fa-duotone.TURQUOISE,.fa-light.TURQUOISE,.fa-regular.TURQUOISE,.fa-solid.TURQUOISE,.fa-thin.TURQUOISE,.fa.TURQUOISE,.fad.TURQUOISE,.fal.TURQUOISE,.far.TURQUOISE,.fas.TURQUOISE,.iziToast>.iziToast-body .iziToast-icon.TURQUOISE{color:#1abc9c}.fa-duotone.EMERALD,.fa-light.EMERALD,.fa-regular.EMERALD,.fa-solid.EMERALD,.fa-thin.EMERALD,.fa.EMERALD,.fad.EMERALD,.fal.EMERALD,.far.EMERALD,.fas.EMERALD,.iziToast>.iziToast-body .iziToast-icon.EMERALD{color:#2ecc71}.fa-duotone.PETERRIVE,.fa-light.PETERRIVE,.fa-regular.PETERRIVE,.fa-solid.PETERRIVE,.fa-thin.PETERRIVE,.fa.PETERRIVE,.fad.PETERRIVE,.fal.PETERRIVE,.far.PETERRIVE,.fas.PETERRIVE,.iziToast>.iziToast-body .iziToast-icon.PETERRIVE{color:#3498db}.fa-duotone.AMETHYST,.fa-light.AMETHYST,.fa-regular.AMETHYST,.fa-solid.AMETHYST,.fa-thin.AMETHYST,.fa.AMETHYST,.fad.AMETHYST,.fal.AMETHYST,.far.AMETHYST,.fas.AMETHYST,.iziToast>.iziToast-body .iziToast-icon.AMETHYST{color:#9b59b6}.fa-duotone.WETASPHALT,.fa-light.WETASPHALT,.fa-regular.WETASPHALT,.fa-solid.WETASPHALT,.fa-thin.WETASPHALT,.fa.WETASPHALT,.fad.WETASPHALT,.fal.WETASPHALT,.far.WETASPHALT,.fas.WETASPHALT,.iziToast>.iziToast-body .iziToast-icon.WETASPHALT{color:#34495e}.fa-duotone.GREENSEA,.fa-light.GREENSEA,.fa-regular.GREENSEA,.fa-solid.GREENSEA,.fa-thin.GREENSEA,.fa.GREENSEA,.fad.GREENSEA,.fal.GREENSEA,.far.GREENSEA,.fas.GREENSEA,.iziToast>.iziToast-body .iziToast-icon.GREENSEA{color:#16a085}.fa-duotone.NEPHRITIS,.fa-light.NEPHRITIS,.fa-regular.NEPHRITIS,.fa-solid.NEPHRITIS,.fa-thin.NEPHRITIS,.fa.NEPHRITIS,.fad.NEPHRITIS,.fal.NEPHRITIS,.far.NEPHRITIS,.fas.NEPHRITIS,.iziToast>.iziToast-body .iziToast-icon.NEPHRITIS{color:#27ae60}.fa-duotone.BELIZEHOLE,.fa-light.BELIZEHOLE,.fa-regular.BELIZEHOLE,.fa-solid.BELIZEHOLE,.fa-thin.BELIZEHOLE,.fa.BELIZEHOLE,.fad.BELIZEHOLE,.fal.BELIZEHOLE,.far.BELIZEHOLE,.fas.BELIZEHOLE,.iziToast>.iziToast-body .iziToast-icon.BELIZEHOLE{color:#2980b9}.fa-duotone.WISTERIA,.fa-light.WISTERIA,.fa-regular.WISTERIA,.fa-solid.WISTERIA,.fa-thin.WISTERIA,.fa.WISTERIA,.fad.WISTERIA,.fal.WISTERIA,.far.WISTERIA,.fas.WISTERIA,.iziToast>.iziToast-body .iziToast-icon.WISTERIA{color:#8e44ad}.fa-duotone.MIDNIGHTBLUE,.fa-light.MIDNIGHTBLUE,.fa-regular.MIDNIGHTBLUE,.fa-solid.MIDNIGHTBLUE,.fa-thin.MIDNIGHTBLUE,.fa.MIDNIGHTBLUE,.fad.MIDNIGHTBLUE,.fal.MIDNIGHTBLUE,.far.MIDNIGHTBLUE,.fas.MIDNIGHTBLUE,.iziToast>.iziToast-body .iziToast-icon.MIDNIGHTBLUE{color:#2c3e50}.fa-duotone.SUNFLOWER,.fa-light.SUNFLOWER,.fa-regular.SUNFLOWER,.fa-solid.SUNFLOWER,.fa-thin.SUNFLOWER,.fa.SUNFLOWER,.fad.SUNFLOWER,.fal.SUNFLOWER,.far.SUNFLOWER,.fas.SUNFLOWER,.iziToast>.iziToast-body .iziToast-icon.SUNFLOWER{color:#f1c40f}.fa-duotone.CARROT,.fa-light.CARROT,.fa-regular.CARROT,.fa-solid.CARROT,.fa-thin.CARROT,.fa.CARROT,.fad.CARROT,.fal.CARROT,.far.CARROT,.fas.CARROT,.iziToast>.iziToast-body .iziToast-icon.CARROT{color:#e67e22}.fa-duotone.ALIZARIN,.fa-light.ALIZARIN,.fa-regular.ALIZARIN,.fa-solid.ALIZARIN,.fa-thin.ALIZARIN,.fa.ALIZARIN,.fad.ALIZARIN,.fal.ALIZARIN,.far.ALIZARIN,.fas.ALIZARIN,.iziToast>.iziToast-body .iziToast-icon.ALIZARIN{color:#e74c3c}.fa-duotone.CLOUDS,.fa-light.CLOUDS,.fa-regular.CLOUDS,.fa-solid.CLOUDS,.fa-thin.CLOUDS,.fa.CLOUDS,.fad.CLOUDS,.fal.CLOUDS,.far.CLOUDS,.fas.CLOUDS,.iziToast>.iziToast-body .iziToast-icon.CLOUDS{color:#ecf0f1}.fa-duotone.CONCRETE,.fa-light.CONCRETE,.fa-regular.CONCRETE,.fa-solid.CONCRETE,.fa-thin.CONCRETE,.fa.CONCRETE,.fad.CONCRETE,.fal.CONCRETE,.far.CONCRETE,.fas.CONCRETE,.iziToast>.iziToast-body .iziToast-icon.CONCRETE{color:#95a5a6}.fa-duotone.ORANGE,.fa-light.ORANGE,.fa-regular.ORANGE,.fa-solid.ORANGE,.fa-thin.ORANGE,.fa.ORANGE,.fad.ORANGE,.fal.ORANGE,.far.ORANGE,.fas.ORANGE,.iziToast>.iziToast-body .iziToast-icon.ORANGE{color:#f39c12}.fa-duotone.PUMPKIN,.fa-light.PUMPKIN,.fa-regular.PUMPKIN,.fa-solid.PUMPKIN,.fa-thin.PUMPKIN,.fa.PUMPKIN,.fad.PUMPKIN,.fal.PUMPKIN,.far.PUMPKIN,.fas.PUMPKIN,.iziToast>.iziToast-body .iziToast-icon.PUMPKIN{color:#d35400}.fa-duotone.POMEGRANATE,.fa-light.POMEGRANATE,.fa-regular.POMEGRANATE,.fa-solid.POMEGRANATE,.fa-thin.POMEGRANATE,.fa.POMEGRANATE,.fad.POMEGRANATE,.fal.POMEGRANATE,.far.POMEGRANATE,.fas.POMEGRANATE,.iziToast>.iziToast-body .iziToast-icon.POMEGRANATE{color:#c0392b}.fa-duotone.SILVER,.fa-light.SILVER,.fa-regular.SILVER,.fa-solid.SILVER,.fa-thin.SILVER,.fa.SILVER,.fad.SILVER,.fal.SILVER,.far.SILVER,.fas.SILVER,.iziToast>.iziToast-body .iziToast-icon.SILVER{color:#bdc3c7}.fa-duotone.ASBESTOS,.fa-light.ASBESTOS,.fa-regular.ASBESTOS,.fa-solid.ASBESTOS,.fa-thin.ASBESTOS,.fa.ASBESTOS,.fad.ASBESTOS,.fal.ASBESTOS,.far.ASBESTOS,.fas.ASBESTOS,.iziToast>.iziToast-body .iziToast-icon.ASBESTOS{color:#7f8c8d}.highlight{position:relative}.btn-copy{z-index:1;display:-moz-box;display:inline-block;cursor:pointer;border:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-appearance:none;font-family:Menlo,JetBrainsMono,monospace,courier,sans-serif;font-size:11px;font-weight:700;padding:4px 8px;color:var(--color-meta);background:var(--color-block);border-radius:3px;-webkit-border-radius:3px;box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1);position:absolute;top:1px;right:1px;opacity:0;-webkit-opacity:0;-moz-opacity:0;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.btn-copy:hover{color:#ff5722;background:#ffeee8}.article pre:hover .btn-copy,.highlight:hover .btn-copy{opacity:1;-webkit-opacity:1;-moz-opacity:1}.highlight:before,.hljs:before{position:absolute;top:0;right:0;color:var(--color-meta);font-size:13px;padding:4px 8px}.highlight.markdown:before,.highlight.md:before,.hljs.markdown:before,.hljs.md:before{content:"md"}.highlight.yaml:before,.hljs.yaml:before{content:"YAML"}.highlight.json:before,.hljs.json:before{content:"JSON"}.highlight.html:before,.hljs.html:before{content:"HTML"}.highlight.javascript:before,.highlight.js:before,.hljs.javascript:before,.hljs.js:before{content:"JS"}.highlight.css:before,.hljs.css:before{content:"CSS"}.highlight.less:before,.hljs.less:before{content:"Less"}.highlight.stylus:before,.hljs.stylus:before{content:"Stylus"}.highlight.bash:before,.hljs.bash:before{content:"bash"}.highlight.shell:before,.hljs.shell:before{content:"shell"}.highlight.sh:before,.hljs.sh:before{content:"sh"}.highlight.ini:before,.hljs.ini:before{content:"ini"}.highlight.c:before,.hljs.c:before{content:"C"}.highlight.cpp:before,.hljs.cpp:before{content:"C++"}.highlight.objc:before,.highlight.objectivec:before,.hljs.objc:before,.hljs.objectivec:before{content:"Objective-C"}.highlight.swift:before,.hljs.swift:before{content:"Swift"}.highlight.java:before,.hljs.java:before{content:"Java"}.highlight.python:before,.hljs.python:before{content:"Python"}.highlight.php:before,.hljs.php:before{content:"PHP"}.highlight.rust:before,.hljs.rust:before{content:"Rust"}.highlight.sql:before,.hljs.sql:before{content:"SQL"}.highlight.ruby:before,.hljs.ruby:before{content:"Ruby"}.highlight.makefile:before,.hljs.makefile:before{content:"Makefile"}.highlight.go:before,.hljs.go:before{content:"Go"}.highlight.typescript:before,.hljs.typescript:before{content:"TypeScript"}.highlight pre .line,.highlight pre .params{color:rgba(68,68,68,.9)}.highlight pre .line .addition{color:#3fa33f}.highlight pre .line .deletion{color:#ee2b29}.highlight pre .marked{background-color:rgba(254,213,66,.4);padding:2px 8px 2px 0;border-radius:2px;-webkit-border-radius:2px;width:100%}.highlight pre .attr,.highlight pre .attribute,.highlight pre .title{color:#3f51b5}.highlight pre .comment,.highlight>table .code:before,.highlight>table .gutter pre{color:var(--color-meta)}.highlight pre .javascript .function,.highlight pre .keyword,.highlight pre .meta-keyword{color:#9c27b0}.highlight pre .built_in,.highlight pre .tag .name,.highlight pre .type{color:#4ba7ee}.highlight pre .constant,.highlight pre .css .class,.highlight pre .css .id,.highlight pre .css .pseudo,.highlight pre .html .doctype,.highlight pre .literal,.highlight pre .number,.highlight pre .preprocessor,.highlight pre .regexp,.highlight pre .ruby .constant,.highlight pre .variable,.highlight pre .xml .doctype,.highlight pre .xml .pi,.highlight pre .xml .tag .title{color:#fd8607}.highlight pre .class,.highlight pre .css .rules .attribute,.highlight pre .ruby .class .title{color:#ff9800}.highlight pre .meta-string,.highlight pre .string{color:#449e48}.highlight pre .header,.highlight pre .inheritance,.highlight pre .ruby .symbol,.highlight pre .value,.highlight pre .xml .cdata{color:#4caf50}.highlight pre .css .hexcolor{color:#6cc}.highlight pre .coffeescript .title,.highlight pre .function,.highlight pre .javascript .title,.highlight pre .perl .sub,.highlight pre .python .decorator,.highlight pre .python .title,.highlight pre .ruby .function .title,.highlight pre .ruby .title .keyword{color:#69c}.highlight.css .line .selector-tag,.highlight.css .line .tag .name,.highlight.html .line .selector-tag,.highlight.html .line .tag .name,.highlight.less .line .selector-tag,.highlight.less .line .tag .name,.highlight.stylus .line .selector-tag,.highlight.stylus .line .tag .name{color:#ee2b29}.highlight.css .line .selector-attr,.highlight.css .line .selector-class,.highlight.html .line .selector-attr,.highlight.html .line .selector-class,.highlight.less .line .selector-attr,.highlight.less .line .selector-class,.highlight.stylus .line .selector-attr,.highlight.stylus .line .selector-class{color:#fd8607}.highlight.css .line .attribute,.highlight.html .line .attribute,.highlight.less .line .attribute,.highlight.stylus .line .attribute{color:#3f51b5}.highlight.css .line .number,.highlight.html .line .number,.highlight.less .line .number,.highlight.stylus .line .number{color:#17afca}.highlight.c .line .meta,.highlight.objc .line .meta,.highlight.objectivec .line .meta,.highlight.swift .line .meta{color:#9c27b0}.highlight.c .line .meta-string,.highlight.c .line .string,.highlight.objc .line .meta-string,.highlight.objc .line .string,.highlight.objectivec .line .meta-string,.highlight.objectivec .line .string,.highlight.swift .line .meta-string,.highlight.swift .line .string{color:#fb3f1b}.highlight.c .line .class,.highlight.objc .line .class,.highlight.objectivec .line .class,.highlight.swift .line .class{color:rgba(68,68,68,.9)}.highlight.c .line .class .title,.highlight.objc .line .class .title,.highlight.objectivec .line .class .title,.highlight.swift .line .class .title{color:#1e80f0}.highlight.c .line .comment,.highlight.objc .line .comment,.highlight.objectivec .line .comment,.highlight.swift .line .comment{color:#3fa33f}.highlight.json .line .attr{color:#e24f5a}.highlight.json .line .literal{color:#3f51b5}.highlight.yaml .line .attr{color:#e24f5a}pre{position:relative}.hljs{margin:-16px!important;padding:16px!important;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.hljs::-webkit-scrollbar{height:4px;width:4px}.hljs::-webkit-scrollbar-track-piece{background:0 0}.hljs::-webkit-scrollbar-thumb{background:#3dd9b6;cursor:pointer;border-radius:2px;-webkit-border-radius:2px}.hljs::-webkit-scrollbar-thumb:hover{background:#ff5722}.highlight{width:100%;margin:1em 0;display:-moz-box;display:block;background:var(--color-block);font-size:.8125rem;border-radius:4px;-webkit-border-radius:4px;line-height:1.5;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.highlight:hover{background:var(--color-codeblock)}.highlight:hover figcaption{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;background:#ffeed2}.highlight:hover .gutter{background:#ffedd0}.highlight figcaption{font-size:13px;position:sticky;left:0;padding:4px 8px;background:#eaeaea;border-top-left-radius:calc(4px - 1px);border-top-right-radius:calc(4px - 1px)}.highlight>table{overflow:auto;display:-webkit-box;display:-moz-box;display:block;margin:0;background-color:transparent;border:none}.highlight>table::-webkit-scrollbar{height:4px;width:4px}.highlight>table::-webkit-scrollbar-track-piece{background:0 0}.highlight>table::-webkit-scrollbar-thumb{background:0 0;cursor:pointer;border-radius:4px;-webkit-border-radius:4px}.highlight>table:hover::-webkit-scrollbar-thumb{background:rgba(68,68,68,.5)}.highlight>table:hover::-webkit-scrollbar-thumb:hover{background:#ff5722}.highlight>table td,.highlight>table th{padding:0;border:none;line-height:1.5}.highlight>table tr,.highlight>table tr:hover{background-color:transparent}.highlight>table .gutter{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;padding:0 12px;text-align:right;border-width:0;margin-left:0;position:sticky;left:0;z-index:1;background:#e9e9e9}.highlight>table pre{overflow-y:hidden;background:0 0;margin:0;padding:0;border:none}.highlight>table pre .code:before{display:-webkit-box;display:-moz-box;display:none}.highlight>table .code{padding:20px 16px;vertical-align:top;background-color:transparent}.highlight>table .code:before{content:"";position:absolute;top:0;right:0;font-size:13px;padding:4px 8px}.iziToast-texts{max-width:300px!important;min-width:200px!important}.iziToast-title{margin-bottom:6px!important;font-size:1rem!important}.iziToast-message{word-break:break-all!important}@media screen and (max-width:500px){.sites-wrap .group-body{grid-template-columns:repeat(auto-fill,calc((100% - 1 * 1rem)/ 2))}.iziToast-texts{max-width:unset!important;min-width:unset!important}.l_header .list-v .aplayer,.l_header .list-v .aplayer-pic{border-radius:4px;-webkit-border-radius:4px;width:64px;height:64px}}.aplayer-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;min-height:100px}.aplayer-container meting-js{max-width:100%}.aplayer{max-width:500px;border-radius:4px;-webkit-border-radius:4px;color:var(--color-text);font-family:MiSans,Menlo,Monaco,monospace,sans-serif}.aplayer .aplayer-list{text-align:left}@media screen and (max-width:500px){.aplayer{border-radius:8px;-webkit-border-radius:8px}}.l_header .aplayer-volume-wrap{display:-webkit-box;display:-moz-box;display:none!important}.tianliGPT-suggestions,.tianliGPT-title{display:-ms-flexbox;display:-webkit-flex}.aplayer.aplayer-fixed.aplayer-narrow .aplayer-body{left:-66px!important}.aplayer.aplayer-fixed.aplayer-narrow .aplayer-body:hover,.common_read_bkg{left:0!important}.post-TianliGPT{background:#f1f3f8;border-radius:12px;-webkit-border-radius:12px;padding:12px;line-height:1.3;border:1px solid #e3e8f7;margin-top:16px}@media screen and (max-width:768px){.post-TianliGPT{margin-top:22px}}.tianliGPT-title{display:-webkit-box;display:-moz-box;display:flex;color:#425aef;border-radius:8px;-webkit-border-radius:8px;align-items:center;padding:0 12px;cursor:default;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.tianliGPT-title-text{font-weight:700;margin-left:8px;line-height:1}.tianliGPT-explanation{margin-top:12px;padding:8px 12px;background:#fff;border-radius:8px;-webkit-border-radius:8px;border:1px solid #e3e8f7;font-size:15px;line-height:1.4;display:-webkit-box;display:-moz-box;display:block}.tianliGPT-suggestions{display:-webkit-box;display:-moz-box;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap}.tianliGPT-suggestions .tianliGPT-suggestions-item{margin-top:12px;padding:8px 12px;background:#fff;border-radius:8px 8px 8px 0;-webkit-border-radius:8px 8px 8px 0;border:1px solid #e3e8f7;font-size:15px;line-height:1.4;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;width:fit-content;margin-right:12px;cursor:pointer;transition:.3s;-webkit-transition:.3s;-khtml-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s}#tianliGPT-Toggle,.tianliGPT-tag{font-size:12px;padding:4px;cursor:pointer;color:#fff;-khtml-transition:.3s;font-weight:700}.tianliGPT-suggestions .tianliGPT-suggestions-item:hover{background:#425aef;color:#fff}.blinking-cursor{background-color:#425aef;width:10px;height:16px;display:-webkit-box;display:-moz-box;display:inline-block;vertical-align:middle;animation:blinking-cursor .5s infinite;-khtml-animation:blinking-cursor .5s infinite;-moz-animation:blinking-cursor .5s infinite;-o-animation:blinking-cursor .5s infinite;-ms-animation:blinking-cursor .5s infinite;-webkit-animation:blinking-cursor .5s infinite;margin-left:4px}.tianliGPT-tag{background-color:#425aef;border-radius:4px;-webkit-border-radius:4px;margin-left:auto;line-height:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:center;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;transition:.3s;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s}.tianliGPT-tag:hover{background:#363636;color:#fff}ins.adsbygoogle{margin:16px 0;background:#fff;border-radius:12px;-webkit-border-radius:12px;overflow:hidden;border:1px solid #e3e8f7}.common_read,.post_read{overflow:visible!important}#tianliGPT-Toggle{background:#425aef;border-radius:4px;-webkit-border-radius:4px;margin-left:6px;transform:scale(.8);-webkit-transform:scale(.8);-khtml-transform:scale(.8);-moz-transform:scale(.8);-o-transform:scale(.8);-ms-transform:scale(.8);transition:.3s;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s}#tianliGPT-Toggle:hover{background:#363636;color:#fff}.tianliGPT-title-icon{width:20px;height:20px}.tianliGPT-title-icon svg{width:20px;height:20px;fill:#425aef}.tianliGPT-title-icon svg path{fill:#425aef}input,p,pre>span,textarea{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/text.png),text}.fancybox-container .fancybox-stage,.fancybox__carousel .is-draggable{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/zoom-out.png),zoom-out}.fancybox a,.fancybox-can-zoomIn .fancybox-content,.fancybox__carousel .fancybox__slide.can-zoom_in .fancybox__content{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/zoom-in.png),zoom-in}.fancybox-button[disabled],.fancybox-button[disabled]:hover,.gt-container .gt-btn.is--disable,span.btn>a:not([href]):hover,span.not-select{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/circle.png),not-allowed}#l_body .post section.meta .new-meta-box .new-meta-item .notlink,.a>p,.aplayer .aplayer-info .aplayer-music,.article .widget,.embed-show,.fix-cursor-default,.gt-container a.is--active,.iframe,.iziToast,.iziToast p,.not-select,.not-select p,a:not([href]),a:not([href]) p,button[disabled],div.tabs ul.nav-tabs li.tab.active a,html,html input[disabled],kbd,p>img,p>svg,span.btn a:not([href]),ul.list-v.rightmenu a{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/left_ptr.png),default}#scroll-down,#u-search .modal .modal-footer .nav,#u-search .modal .modal-header .btn-close,.aplayer .aplayer-info .aplayer-controller .aplayer-bar-wrap,.aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon,.aplayer .aplayer-list ol li,.aplayer .aplayer-list ol li .aplayer-list-author,.aplayer .aplayer-list ol li .aplayer-list-index,.aplayer .aplayer-pic,.article a.link-card,.author>p,.btn-copy,.category>a>p,.fancybox,.fancybox-button,.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content,.fix-cursor-pointer,.friend-right p,.gt-container .gt-avatar-github,.gt-container .gt-btn,.gt-container .gt-comment-edit:hover,.gt-container .gt-comment-like:hover,.gt-container .gt-comment-reply:hover,.gt-container .gt-popup .gt-action,.gt-container .gt-user-inner,.list-h>a>p,.next>p,.prev>p,.tag>p,.tk-action-icon,.tk-avatar img,.tk-icon,.tk-meta a,.v[data-class=v] .vbtn,.v[data-class=v] .vcards .vcard .vcontent.expand,.v[data-class=v] .vcards .vcard .vh .vmeta .vat,.v[data-class=v] .vcards .vcard .vhead .vnick,.v[data-class=v] .vicon,.v[data-class=v] .vwrap .vemojis i,.v[data-class=v] a,.waves-button,.waves-button-input,.waves-button:hover,.waves-button:visited,.waves-effect,a,a.result.search-result-fix,article .checkbox input,button,details summary,div.tabs ul.nav-tabs li.tab a,html input[type=button],input[type=reset],input[type=submit],psw,scrollbar::-webkit-scrollbar-thumb,table::-webkit-scrollbar-thumb,ul.list-v.rightmenu li.music a.nav.volume .aplayer-volume-bar{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/pointer.png),pointer}.cur-default{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/left_ptr.png),default!important}.carousel__button,.cur-pointer,.fancybox__slide{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/pointer.png),pointer!important}.cur-not-allowed{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/circle.png),not-allowed!important}.cur-zoom-in,.fancybox__carousel .fancybox__slide.can-zoom_in .fancybox__content,.has-image[data-image-fit=contain].can-zoom_in .fancybox__image{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/zoom-in.png),zoom-in!important}.cur-zoom-out,.fancybox__carousel .is-draggable,.has-image[data-image-fit=contain].is-draggable .fancybox__image{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/zoom-out.png),zoom-out!important}.cur-text{cursor:url(https://unpkg.com/volantis-static@0.0.1660614606622/media/cursor/text.png),text!important}.common_read{z-index:auto!important;opacity:1!important;-webkit-opacity:1!important;-moz-opacity:1!important;transform:none!important;-webkit-transform:none!important;-khtml-transform:none!important;-moz-transform:none!important;-o-transform:none!important;-ms-transform:none!important;animation:none!important;-webkit-animation:none!important;-khtml-animation:none!important;-moz-animation:none!important;-o-animation:none!important;-ms-animation:none!important;position:relative!important}.body-wrapper.common_read{display:-webkit-box;display:-moz-box;display:block}#safearea.common_read{padding-bottom:16px}#l_body.common_read{z-index:2147483646!important}.read_cover{min-height:10px!important}@media screen and (max-width:900px){#safearea.common_read{padding:0;margin:0}.read_cover{min-height:0!important}}.common_read_bkg{background-color:var(--color-read-bkg)!important;opacity:1!important;-webkit-opacity:1!important;-moz-opacity:1!important;display:-webkit-box;display:-moz-box;display:block!important;position:fixed!important;top:0!important;right:0!important;bottom:0!important;z-index:2147483645!important;transition:opacity 1s cubic-bezier(.23,1,.32,1) 0s!important;-webkit-transition:opacity 1s cubic-bezier(.23,1,.32,1) 0s!important;-khtml-transition:opacity 1s cubic-bezier(.23,1,.32,1) 0s!important;-moz-transition:opacity 1s cubic-bezier(.23,1,.32,1) 0s!important;-o-transition:opacity 1s cubic-bezier(.23,1,.32,1) 0s!important;-ms-transition:opacity 1s cubic-bezier(.23,1,.32,1) 0s!important}ul.list-v.rightmenu li.music .nav.volume .aplayer-volume-bar i.right,ul.list-v.rightmenu.left{right:0}.common_read_hide{opacity:0!important;-webkit-opacity:0!important;-moz-opacity:0!important;z-index:-2147483645!important}.common_read_main{width:840px!important;padding:0!important;margin:0 auto;float:initial!important}@media screen and (max-width:900px){.common_read_main{width:auto!important}}.post_read{background-color:var(--color-read-post)!important;z-index:2147483646!important;font-size:1.15rem!important;border-radius:0!important;-webkit-border-radius:0!important;box-shadow:0 6px 12px 3px rgba(0,0,0,.2);-webkit-box-shadow:0 6px 12px 3px rgba(0,0,0,.2)}div#rightmenu-wrapper{display:-webkit-box;display:-moz-box;display:none;position:fixed;z-index:2147483648;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}ul.list-v.rightmenu{display:-webkit-box;display:-moz-box;display:block;max-width:240px;overflow:hidden}ul.list-v.rightmenu.top{bottom:0}ul.list-v.rightmenu a{cursor:default}ul.list-v.rightmenu a.vlts-menu{text-overflow:ellipsis;overflow:hidden;line-height:32px;font-weight:400}ul.list-v.rightmenu>li>span{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;display:-webkit-box;display:-moz-box;display:block;color:var(--color-list);font-size:.875rem;line-height:36px;padding:0 20px 0 16px;text-overflow:ellipsis;margin:0 4px;border-radius:4px;-webkit-border-radius:4px}@media screen and (max-width:1024px){ul.list-v.rightmenu>li>span{line-height:40px}}ul.list-v.rightmenu>li>span>i{margin-right:8px}ul.list-v.rightmenu>li>span.active,ul.list-v.rightmenu>li>span:active{color:var(--color-list-hl)}ul.list-v.rightmenu>li>span:hover{color:var(--color-list-hl);background:var(--color-site-bg)}ul.list-v.rightmenu li.music .nav.volume:hover,ul.list-v.rightmenu li.music.name p.nav.music-title:hover{background:0 0}ul.list-v.rightmenu li.music,ul.list-v.rightmenu li.navigation{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between}ul.list-v.rightmenu li.music a.icon-only,ul.list-v.rightmenu li.navigation a.icon-only{line-height:0;margin:0;padding:0;border-radius:32px;-webkit-border-radius:32px;overflow:hidden;width:32px;height:32px}ul.list-v.rightmenu li.music a.nav i,ul.list-v.rightmenu li.navigation a.nav i{margin:0;width:32px;line-height:32px}ul.list-v.rightmenu li.music a.nav:first-child,ul.list-v.rightmenu li.navigation a.nav:first-child{margin-left:10px}ul.list-v.rightmenu li.music a.nav:last-child,ul.list-v.rightmenu li.navigation a.nav:last-child{margin-right:10px}ul.list-v.rightmenu li.music.name{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center}ul.list-v.rightmenu li.music.name p.nav.music-title{color:#696969;font-size:.875rem;max-width:128px;margin:0 20px;overflow:hidden}ul.list-v.rightmenu li.music .nav.volume{width:100%;padding:0 8px}ul.list-v.rightmenu li.music .nav.volume .aplayer-volume-bar{margin:4px 0 8px;position:relative;height:8px;width:100%;background:#ededed;border-radius:32px;-webkit-border-radius:32px;overflow:hidden;cursor:pointer;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}ul.list-v.rightmenu li.music .nav.volume .aplayer-volume-bar i.left,ul.list-v.rightmenu li.music .nav.volume .aplayer-volume-bar i.right{color:#696969;position:absolute;top:0;width:28px;line-height:28px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all .28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;opacity:0;-webkit-opacity:0;-moz-opacity:0;transform:scale(.5) translateY(-18px);-webkit-transform:scale(.5) translateY(-18px);-khtml-transform:scale(.5) translateY(-18px);-moz-transform:scale(.5) translateY(-18px);-o-transform:scale(.5) translateY(-18px);-ms-transform:scale(.5) translateY(-18px)}ul.list-v.rightmenu li.music .nav.volume .aplayer-volume-bar i.left{left:0}ul.list-v.rightmenu li.music .nav.volume .aplayer-volume-bar:hover{height:28px}ul.list-v.rightmenu li.music .nav.volume .aplayer-volume-bar:hover i{opacity:1;-webkit-opacity:1;-moz-opacity:1;transform:scale(1) translateY(0);-webkit-transform:scale(1) translateY(0);-khtml-transform:scale(1) translateY(0);-moz-transform:scale(1) translateY(0);-o-transform:scale(1) translateY(0);-ms-transform:scale(1) translateY(0)}ul.list-v.rightmenu li.music .nav.volume .aplayer-volume-bar .aplayer-volume{background:#3dd9b6;height:100%;width:100%}@media (prefers-color-scheme:dark){:root{--color-mode:'dark'}:root:not([color-scheme]){--block-hover:#1c1c1c;--text-p1:#fff;--text-p3:#777;--card:#fff}:root:not([color-scheme]) .lazyload,:root:not([color-scheme]) fa,:root:not([color-scheme]) fa-duotone,:root:not([color-scheme]) fa-light,:root:not([color-scheme]) fa-regular,:root:not([color-scheme]) fa-solid,:root:not([color-scheme]) fa-thin,:root:not([color-scheme]) fad,:root:not([color-scheme]) fal,:root:not([color-scheme]) img,:root:not([color-scheme]) svg.iconfont{filter:brightness(70%)!important}:root:not([color-scheme]) .widget.blogger .content .social-wrapper a.social:hover{background:var(--color-card)}:root:not([color-scheme]) .widget>.content ul.entry a .badge,:root:not([color-scheme]) .widget>.content ul.popular-posts a .badge{color:unset!important}:root:not([color-scheme]) .content{color:var(--color-p)}:root:not([color-scheme]) .widget>.content a{color:var(--color-p)!important}:root:not([color-scheme]) .widget>.content a:hover{color:var(--color-list-hl)!important}:root:not([color-scheme]) .note{background:var(--color-block)!important}:root:not([color-scheme]) div.tabs ul.nav-tabs li.tab.active a{color:var(--color-p);background:var(--color-card)}:root:not([color-scheme]) kbd{background:var(--color-block)!important}:root:not([color-scheme]) .cover-wrapper.dock .menu .list-h a:hover,:root:not([color-scheme]) .cover-wrapper.featured .menu .list-h a:hover,:root:not([color-scheme]) .cover-wrapper.focus .menu .list-h a:hover{color:var(--color-text)!important}:root:not([color-scheme]) .gutter{background:var(--color-card)!important;background-color:var(--color-card)!important}:root:not([color-scheme]) .highlight figcaption{background-color:#14161a}:root:not([color-scheme]) .highlight pre .line,:root:not([color-scheme]) .highlight pre .params{color:rgba(158,142,142,.9)}:root:not([color-scheme]) :not(.highlight)>table tr{background-color:var(--color-card)}:root:not([color-scheme]) :not(.highlight)>table th{background:var(--color-site-bg)}:root:not([color-scheme]) :not(.highlight) table td,:root:not([color-scheme]) :not(.highlight) table th{border-color:var(--color-site-bg)}:root:not([color-scheme]) :not(.highlight)>table tr:hover{background:var(--color-codeblock)}:root:not([color-scheme]) .timenode .highlight{border-color:var(--color-site-bg)!important}:root:not([color-scheme]) blockquote p{color:var(--color-p)}:root:not([color-scheme]) #archive-page .archive .all-tags ul li span{color:var(--color-text);background:#6f6f72}:root:not([color-scheme]) .btn-copy:hover{background:var(--color-site-body)}:root:not([color-scheme]) .aplayer{background:var(--color-site-bg)}:root:not([color-scheme]) .aplayer .aplayer-list ol li:hover{background:rgba(61,217,182,.2)}:root:not([color-scheme]) .aplayer .aplayer-list ol li.aplayer-list-light{background:var(--color-block)}:root:not([color-scheme]) .aplayer-info{background:var(--color-site-bg)!important}:root:not([color-scheme]) .aplayer .aplayer-lrc:before{background:linear-gradient(180deg,#282c34 0,rgba(255,255,255,0))}:root:not([color-scheme]) .aplayer .aplayer-lrc:after{background:linear-gradient(180deg,rgba(0,0,0,0) 0,rgba(33,33,33,.8))}:root:not([color-scheme]) .aplayer-pic{filter:brightness(70%)}:root:not([color-scheme]) .aplayer .aplayer-list ol li{border-top:1px solid var(--color-card)}:root:not([color-scheme]) .aplayer.aplayer-withlist .aplayer-info{border-bottom:1px solid var(--color-block)}:root:not([color-scheme]) .aplayer .aplayer-notice{background-color:var(--color-site-bg)!important}:root:not([color-scheme]) .OwO .OwO-body{color:silver!important;background-color:#252627!important;border-color:#4a4b50!important}:root:not([color-scheme]) .OwO .OwO-body .OwO-bar{border-top:1px solid #4a4b50!important;background:#4a4b50!important;color:#ccc!important}:root:not([color-scheme]) .OwO .OwO-body .OwO-bar .OwO-packages li:hover{background-color:#252627!important}:root:not([color-scheme]) .OwO .OwO-body .OwO-bar .OwO-packages .OwO-package-active{background-color:#252627!important}:root:not([color-scheme]) .OwO .OwO-body .OwO-items .OwO-item{background:#4a4b50!important;color:#ccc!important}:root:not([color-scheme]) .OwO .OwO-body .OwO-items-image .OwO-item:hover{background-color:#252627!important}:root:not([color-scheme]) .post-TianliGPT{background:#30343f;border-radius:12px;-webkit-border-radius:12px;padding:12px;line-height:1.3;border:1px solid #3d3d3f;margin-top:16px}:root:not([color-scheme]) .tianliGPT-title{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;color:#f2b94b;border-radius:8px;-webkit-border-radius:8px;align-items:center;padding:0 12px;cursor:default;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}:root:not([color-scheme]) .tianliGPT-title-text{font-weight:700;margin-left:8px;line-height:1}:root:not([color-scheme]) .tianliGPT-explanation{margin-top:12px;padding:8px 12px;background:#1d1e22;border-radius:8px;-webkit-border-radius:8px;border:1px solid #3d3d3f;font-size:15px;line-height:1.4;display:-webkit-box;display:-moz-box;display:block}:root:not([color-scheme]) .tianliGPT-suggestions{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap}:root:not([color-scheme]) .tianliGPT-suggestions .tianliGPT-suggestions-item{margin-top:12px;padding:8px 12px;background:#1d1e22;border-radius:8px 8px 8px 0;-webkit-border-radius:8px 8px 8px 0;border:1px solid #3d3d3f;font-size:15px;line-height:1.4;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;width:fit-content;margin-right:12px;cursor:pointer;transition:.3s;-webkit-transition:.3s;-khtml-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s}:root:not([color-scheme]) .tianliGPT-suggestions .tianliGPT-suggestions-item:hover{background:#f2b94b;color:#fff}:root:not([color-scheme]) .blinking-cursor{background-color:#f2b94b;width:10px;height:16px;display:-webkit-box;display:-moz-box;display:inline-block;vertical-align:middle;animation:blinking-cursor .5s infinite;-khtml-animation:blinking-cursor .5s infinite;-moz-animation:blinking-cursor .5s infinite;-o-animation:blinking-cursor .5s infinite;-ms-animation:blinking-cursor .5s infinite;-webkit-animation:blinking-cursor .5s infinite;margin-left:4px}:root:not([color-scheme]) .tianliGPT-tag{font-size:12px;background-color:#f2b94b;color:#1d1e22;font-weight:700;border-radius:4px;-webkit-border-radius:4px;margin-left:auto;line-height:1;padding:4px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:center;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;cursor:pointer;transition:.3s;-webkit-transition:.3s;-khtml-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s}:root:not([color-scheme]) .tianliGPT-tag:hover{background:#f7f7fa;color:#1d1e22}:root:not([color-scheme]) ins.adsbygoogle{margin:16px 0;background:#1d1e22;border-radius:12px;-webkit-border-radius:12px;overflow:hidden;border:1px solid #3d3d3f}:root:not([color-scheme]) #tianliGPT-Toggle{font-size:12px;background:#f2b94b;color:#1d1e22;padding:4px;border-radius:4px;-webkit-border-radius:4px;margin-left:6px;transform:scale(.8);-webkit-transform:scale(.8);-khtml-transform:scale(.8);-moz-transform:scale(.8);-o-transform:scale(.8);-ms-transform:scale(.8);cursor:pointer;transition:.3s;-webkit-transition:.3s;-khtml-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s;font-weight:700}:root:not([color-scheme]) #tianliGPT-Toggle:hover{background:#f7f7fa;color:#1d1e22}:root:not([color-scheme]) .tianliGPT-title-icon{width:20px;height:20px}:root:not([color-scheme]) .tianliGPT-title-icon svg{width:20px;height:20px;fill:#f2b94b}:root:not([color-scheme]) .tianliGPT-title-icon svg path{fill:#f2b94b}@-moz-keyframes blinking-cursor{0%,100%,40%{opacity:1;-webkit-opacity:1;-moz-opacity:1}50%,90%{opacity:0;-webkit-opacity:0;-moz-opacity:0}}@-webkit-keyframes blinking-cursor{0%,100%,40%{opacity:1;-webkit-opacity:1;-moz-opacity:1}50%,90%{opacity:0;-webkit-opacity:0;-moz-opacity:0}}@-o-keyframes blinking-cursor{0%,100%,40%{opacity:1;-webkit-opacity:1;-moz-opacity:1}50%,90%{opacity:0;-webkit-opacity:0;-moz-opacity:0}}@keyframes blinking-cursor{0%,100%,40%{opacity:1;-webkit-opacity:1;-moz-opacity:1}50%,90%{opacity:0;-webkit-opacity:0;-moz-opacity:0}}}[color-scheme=dark]{--block-hover:#1c1c1c;--text-p1:#fff;--text-p3:#777;--card:#fff}[color-scheme=dark] .lazyload,[color-scheme=dark] fa,[color-scheme=dark] fa-duotone,[color-scheme=dark] fa-light,[color-scheme=dark] fa-regular,[color-scheme=dark] fa-solid,[color-scheme=dark] fa-thin,[color-scheme=dark] fad,[color-scheme=dark] fal,[color-scheme=dark] img,[color-scheme=dark] svg.iconfont{filter:brightness(70%)!important}[color-scheme=dark] .widget.blogger .content .social-wrapper a.social:hover{background:var(--color-card)}[color-scheme=dark] .widget>.content ul.entry a .badge,[color-scheme=dark] .widget>.content ul.popular-posts a .badge{color:unset!important}[color-scheme=dark] .content{color:var(--color-p)}[color-scheme=dark] .widget>.content a{color:var(--color-p)!important}[color-scheme=dark] .widget>.content a:hover{color:var(--color-list-hl)!important}[color-scheme=dark] .note{background:var(--color-block)!important}[color-scheme=dark] div.tabs ul.nav-tabs li.tab.active a{color:var(--color-p);background:var(--color-card)}[color-scheme=dark] kbd{background:var(--color-block)!important}[color-scheme=dark] .cover-wrapper.dock .menu .list-h a:hover,[color-scheme=dark] .cover-wrapper.featured .menu .list-h a:hover,[color-scheme=dark] .cover-wrapper.focus .menu .list-h a:hover{color:var(--color-text)!important}[color-scheme=dark] .gutter{background:var(--color-card)!important;background-color:var(--color-card)!important}[color-scheme=dark] .highlight figcaption{background-color:#14161a}[color-scheme=dark] .highlight pre .line,[color-scheme=dark] .highlight pre .params{color:rgba(158,142,142,.9)}[color-scheme=dark] :not(.highlight)>table tr{background-color:var(--color-card)}[color-scheme=dark] :not(.highlight)>table th{background:var(--color-site-bg)}[color-scheme=dark] :not(.highlight) table td,[color-scheme=dark] :not(.highlight) table th{border-color:var(--color-site-bg)}[color-scheme=dark] :not(.highlight)>table tr:hover{background:var(--color-codeblock)}[color-scheme=dark] .timenode .highlight{border-color:var(--color-site-bg)!important}[color-scheme=dark] blockquote p{color:var(--color-p)}[color-scheme=dark] #archive-page .archive .all-tags ul li span{color:var(--color-text);background:#6f6f72}[color-scheme=dark] .btn-copy:hover{background:var(--color-site-body)}[color-scheme=dark] .aplayer{background:var(--color-site-bg)}[color-scheme=dark] .aplayer .aplayer-list ol li:hover{background:rgba(61,217,182,.2)}[color-scheme=dark] .aplayer .aplayer-list ol li.aplayer-list-light{background:var(--color-block)}[color-scheme=dark] .aplayer-info{background:var(--color-site-bg)!important}[color-scheme=dark] .aplayer .aplayer-lrc:before{background:linear-gradient(180deg,#282c34 0,rgba(255,255,255,0))}[color-scheme=dark] .aplayer .aplayer-lrc:after{background:linear-gradient(180deg,rgba(0,0,0,0) 0,rgba(33,33,33,.8))}[color-scheme=dark] .aplayer-pic{filter:brightness(70%)}[color-scheme=dark] .aplayer .aplayer-list ol li{border-top:1px solid var(--color-card)}[color-scheme=dark] .aplayer.aplayer-withlist .aplayer-info{border-bottom:1px solid var(--color-block)}[color-scheme=dark] .aplayer .aplayer-notice{background-color:var(--color-site-bg)!important}[color-scheme=dark] .OwO .OwO-body{color:silver!important;background-color:#252627!important;border-color:#4a4b50!important}[color-scheme=dark] .OwO .OwO-body .OwO-bar{border-top:1px solid #4a4b50!important;background:#4a4b50!important;color:#ccc!important}[color-scheme=dark] .OwO .OwO-body .OwO-bar .OwO-packages .OwO-package-active,[color-scheme=dark] .OwO .OwO-body .OwO-bar .OwO-packages li:hover{background-color:#252627!important}[color-scheme=dark] .OwO .OwO-body .OwO-items .OwO-item{background:#4a4b50!important;color:#ccc!important}[color-scheme=dark] .OwO .OwO-body .OwO-items-image .OwO-item:hover{background-color:#252627!important}[color-scheme=dark] .post-TianliGPT{background:#30343f;border-radius:12px;-webkit-border-radius:12px;padding:12px;line-height:1.3;border:1px solid #3d3d3f;margin-top:16px}@media screen and (max-width:768px){[color-scheme=dark] .post-TianliGPT{margin-top:22px}}[color-scheme=dark] .tianliGPT-title{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;color:#f2b94b;border-radius:8px;-webkit-border-radius:8px;align-items:center;padding:0 12px;cursor:default;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}[color-scheme=dark] .tianliGPT-title-text{font-weight:700;margin-left:8px;line-height:1}[color-scheme=dark] .tianliGPT-explanation{margin-top:12px;padding:8px 12px;background:#1d1e22;border-radius:8px;-webkit-border-radius:8px;border:1px solid #3d3d3f;font-size:15px;line-height:1.4;display:-webkit-box;display:-moz-box;display:block}[color-scheme=dark] .tianliGPT-suggestions{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap}[color-scheme=dark] .tianliGPT-suggestions .tianliGPT-suggestions-item{margin-top:12px;padding:8px 12px;background:#1d1e22;border-radius:8px 8px 8px 0;-webkit-border-radius:8px 8px 8px 0;border:1px solid #3d3d3f;font-size:15px;line-height:1.4;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;width:fit-content;margin-right:12px;cursor:pointer;transition:.3s;-webkit-transition:.3s;-khtml-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s}[color-scheme=dark] .tianliGPT-suggestions .tianliGPT-suggestions-item:hover{background:#f2b94b;color:#fff}[color-scheme=dark] .blinking-cursor{background-color:#f2b94b;width:10px;height:16px;display:-webkit-box;display:-moz-box;display:inline-block;vertical-align:middle;animation:blinking-cursor .5s infinite;-khtml-animation:blinking-cursor .5s infinite;-moz-animation:blinking-cursor .5s infinite;-o-animation:blinking-cursor .5s infinite;-ms-animation:blinking-cursor .5s infinite;-webkit-animation:blinking-cursor .5s infinite;margin-left:4px}[color-scheme=dark] .tianliGPT-tag{font-size:12px;background-color:#f2b94b;color:#1d1e22;font-weight:700;border-radius:4px;-webkit-border-radius:4px;margin-left:auto;line-height:1;padding:4px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:center;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;cursor:pointer;transition:.3s;-webkit-transition:.3s;-khtml-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s}[color-scheme=dark] .tianliGPT-tag:hover{background:#f7f7fa;color:#1d1e22}[color-scheme=dark] ins.adsbygoogle{margin:16px 0;background:#1d1e22;border-radius:12px;-webkit-border-radius:12px;overflow:hidden;border:1px solid #3d3d3f}[color-scheme=dark] #tianliGPT-Toggle{font-size:12px;background:#f2b94b;color:#1d1e22;padding:4px;border-radius:4px;-webkit-border-radius:4px;margin-left:6px;transform:scale(.8);-webkit-transform:scale(.8);-khtml-transform:scale(.8);-moz-transform:scale(.8);-o-transform:scale(.8);-ms-transform:scale(.8);cursor:pointer;transition:.3s;-webkit-transition:.3s;-khtml-transition:.3s;-moz-transition:.3s;-o-transition:.3s;-ms-transition:.3s;font-weight:700}[color-scheme=dark] #tianliGPT-Toggle:hover{background:#f7f7fa;color:#1d1e22}[color-scheme=dark] .tianliGPT-title-icon{width:20px;height:20px}[color-scheme=dark] .tianliGPT-title-icon svg{width:20px;height:20px;fill:#f2b94b}[color-scheme=dark] .tianliGPT-title-icon svg path{fill:#f2b94b}@-moz-keyframes blinking-cursor{0%,100%,40%{opacity:1;-webkit-opacity:1;-moz-opacity:1}50%,90%{opacity:0;-webkit-opacity:0;-moz-opacity:0}}@-webkit-keyframes blinking-cursor{0%,100%,40%{opacity:1;-webkit-opacity:1;-moz-opacity:1}50%,90%{opacity:0;-webkit-opacity:0;-moz-opacity:0}}@-o-keyframes blinking-cursor{0%,100%,40%{opacity:1;-webkit-opacity:1;-moz-opacity:1}50%,90%{opacity:0;-webkit-opacity:0;-moz-opacity:0}}@keyframes blinking-cursor{0%,100%,40%{opacity:1;-webkit-opacity:1;-moz-opacity:1}50%,90%{opacity:0;-webkit-opacity:0;-moz-opacity:0}}@media screen and (prefers-color-scheme:dark) and (max-width:768px){.post-TianliGPT{margin-top:22px}}
\ No newline at end of file
diff --git a/fcircle/index.html b/fcircle/index.html
new file mode 100644
index 000000000..aeb346855
--- /dev/null
+++ b/fcircle/index.html
@@ -0,0 +1,4798 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 朋友圈 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/friends/index.html b/friends/index.html
new file mode 100644
index 000000000..882d3044f
--- /dev/null
+++ b/friends/index.html
@@ -0,0 +1,4721 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我的朋友们 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 欢迎来访,无限进步!
+
+
+访问地址:https://blog.sakurasep.site/
+站点名称:上杉九月的博客
+头像地址:https://cdn.sakurasep.site/Website/new_avatar_512.png
+网站缩略图:https://cdn.sakurasep.site/Article/IndexImg/Hexo.png
+描述信息:分享生活,探索未来!
+
+
+
注意,本站资源开启防盗链,博主在审核通过您的友链申请后会将你的友链网站加入白名单,敬请谅解!
本站有两种友链展示格式,如果你想要展示你网站的首页缩略图,请填写screenshot选项
+
本站采用的是动态issue申请,请访问Github Issue,按照模板添加友链申请。
+
如果不方便打开Github,请在评论区按照本站信息模板留言,谢谢。
+
+
暂无
+
以上内容的最后更新日期:2023年09月03日
+
+
+上杉九月的其他站点
+
+团队成员
+
+我的朋友们
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..0867a4050
--- /dev/null
+++ b/index.html
@@ -0,0 +1,5413 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章实现了单链表的基本增删操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本次更新内容 - 恢复更新,主题版本更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Win11独占的WSA,如今Win10也能够使用,对于不想使用Bug11的AMD的用户来说,又有一个不更新系统的理由。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在上次教程已经完成了基本搭建,本次教程来将主题应用到博客。因为目前很多Hexo主题都处于停更状态,我推荐使用Volantis主题或Butterfly主题。本教程仅介绍Volantis的使用方法。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章讲述了`_config.yml`的内容配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章,将会从Hexo博客的基本搭建,以及如何将你的博客部署到网络进行访问。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2021
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CTF还是挺有趣的,每天都做一做当作放松吧
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 安卓系统的根目录,本不应该如此混乱。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 / 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/info/index.html b/info/index.html
new file mode 100644
index 000000000..2b9b4149c
--- /dev/null
+++ b/info/index.html
@@ -0,0 +1,4783 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 留言板 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/js/app.js b/js/app.js
new file mode 100644
index 000000000..0defeb374
--- /dev/null
+++ b/js/app.js
@@ -0,0 +1,1152 @@
+document.addEventListener("DOMContentLoaded", function () {
+ volantis.requestAnimationFrame(() => {
+ VolantisApp.init();
+ VolantisApp.subscribe();
+ VolantisFancyBox.init();
+ highlightKeyWords.startFromURL();
+ locationHash();
+ });
+});
+
+/* 锚点定位 */
+const locationHash = () => {
+ if (window.location.hash) {
+ let locationID = decodeURI(window.location.hash.split('#')[1]).replace(/\ /g, '-');
+ let target = document.getElementById(locationID);
+ if (target) {
+ setTimeout(() => {
+ if (window.location.hash.startsWith('#fn')) { // hexo-reference https://github.com/volantis-x/hexo-theme-volantis/issues/647
+ volantis.scroll.to(target, { addTop: - volantis.dom.header.offsetHeight - 5, behavior: 'instant', observer: true })
+ } else {
+ // 锚点中上半部有大片空白 高度大概是 volantis.dom.header.offsetHeight
+ volantis.scroll.to(target, { addTop: 5, behavior: 'instant', observer: true })
+ }
+ }, 1000)
+ }
+ }
+}
+Object.freeze(locationHash);
+
+/* Main */
+const VolantisApp = (() => {
+ const fn = {},
+ COPYHTML = '';
+ let scrollCorrection = 80;
+
+ fn.init = () => {
+ if (volantis.dom.header) {
+ scrollCorrection = volantis.dom.header.clientHeight + 16;
+ }
+
+ window.onresize = () => {
+ if (document.documentElement.clientWidth < 500) {
+ volantis.isMobile = 1;
+ } else {
+ volantis.isMobile = 0;
+ }
+ if (volantis.isMobile != volantis.isMobileOld) {
+ fn.setGlobalHeaderMenuEvent();
+ fn.setHeader();
+ fn.setHeaderSearch();
+ }
+ }
+ volantis.scroll.push(fn.scrollEventCallBack, "scrollEventCallBack")
+ }
+
+ fn.event = () => {
+ volantis.dom.$(document.getElementById("scroll-down"))?.on('click', function () {
+ fn.scrolltoElement(volantis.dom.bodyAnchor);
+ });
+
+ // 如果 sidebar 为空,隐藏 sidebar。
+ const sidebar = document.querySelector("#l_side")
+ if (sidebar) {
+ const sectionList = sidebar.querySelectorAll("section")
+ if (!sectionList.length) {
+ document.querySelector("#l_main").classList.add("no_sidebar")
+ }
+ }
+
+ // 站点信息 最后活动日期
+ if (volantis.GLOBAL_CONFIG.sidebar.for_page.includes('webinfo') || volantis.GLOBAL_CONFIG.sidebar.for_post.includes('webinfo')) {
+ const lastupd = volantis.GLOBAL_CONFIG.sidebar.webinfo.lastupd;
+ if (!!document.getElementById('last-update-show') && lastupd.enable && lastupd.friendlyShow) {
+ document.getElementById('last-update-show').innerHTML = fn.utilTimeAgo(volantis.GLOBAL_CONFIG.lastupdate);
+ }
+ }
+
+ // 站点信息 运行时间
+ if (!!document.getElementById('webinfo-runtime-count')) {
+ let BirthDay = new Date(volantis.GLOBAL_CONFIG.sidebar.webinfo.runtime.data);
+ let timeold = (new Date().getTime() - BirthDay.getTime());
+ let daysold = Math.floor(timeold / (24 * 60 * 60 * 1000));
+ document.getElementById('webinfo-runtime-count').innerHTML = `${daysold} ${volantis.GLOBAL_CONFIG.sidebar.webinfo.runtime.unit}`;
+ }
+
+ // 消息提示 复制时弹出
+ document.body.oncopy = function () {
+ fn.messageCopyright()
+ };
+ }
+
+ fn.restData = () => {
+ scrollCorrection = volantis.dom.header ? volantis.dom.header.clientHeight + 16 : 80;
+ }
+
+ fn.setIsMobile = () => {
+ if (document.documentElement.clientWidth < 500) {
+ volantis.isMobile = 1;
+ volantis.isMobileOld = 1;
+ } else {
+ volantis.isMobile = 0;
+ volantis.isMobileOld = 0;
+ }
+ }
+
+ // 校正页面定位(被导航栏挡住的区域)
+ fn.scrolltoElement = (elem, correction = scrollCorrection) => {
+ volantis.scroll.to(elem, {
+ top: elem.getBoundingClientRect().top + document.documentElement.scrollTop - correction
+ })
+ }
+
+ // 滚动事件回调们
+ fn.scrollEventCallBack = () => {
+ // 【移动端 PC】//////////////////////////////////////////////////////////////////////
+
+ // 显示/隐藏 Header导航 topBtn 【移动端 PC】
+ const showHeaderPoint = volantis.dom.bodyAnchor.offsetTop - scrollCorrection;
+ const scrollTop = volantis.scroll.getScrollTop(); // 滚动条距离顶部的距离
+
+ // topBtn
+ if (volantis.dom.topBtn) {
+ if (scrollTop > volantis.dom.bodyAnchor.offsetTop) {
+ volantis.dom.topBtn.addClass('show');
+ // 向上滚动高亮 topBtn
+ if (volantis.scroll.del > 0) {
+ volantis.dom.topBtn.removeClass('hl');
+ } else {
+ volantis.dom.topBtn.addClass('hl');
+ }
+ } else {
+ volantis.dom.topBtn.removeClass('show').removeClass('hl');
+ }
+ }
+
+ // Header导航
+ if (volantis.dom.header) {
+ if (scrollTop - showHeaderPoint > -1) {
+ volantis.dom.header.addClass('show');
+ } else {
+ volantis.dom.header.removeClass('show');
+ }
+ }
+
+ // 决定一二级导航栏的切换 【向上滚动切换为一级导航栏;向下滚动切换为二级导航栏】 【移动端 PC】
+ if (pdata.ispage && volantis.dom.wrapper) {
+ if (volantis.scroll.del > 0 && scrollTop > 100) { // 向下滚动
+ volantis.dom.wrapper.addClass('sub'); // <---- 二级导航显示
+ } else if (volantis.scroll.del < 0) { // 向上滚动
+ volantis.dom.wrapper.removeClass('sub'); // <---- 取消二级导航显示 一级导航显示
+ }
+ }
+
+ // 【移动端】//////////////////////////////////////////////////////////////////////
+ if (volantis.isMobile) {
+ // 【移动端】 页面滚动 隐藏 移动端toc目录按钮
+ if (pdata.ispage && volantis.dom.tocTarget && volantis.dom.toc) {
+ volantis.dom.tocTarget.removeClass('active');
+ volantis.dom.toc.removeClass('active');
+ }
+ // 【移动端】 滚动时隐藏子菜单
+ if (volantis.dom.mPhoneList) {
+ volantis.dom.mPhoneList.forEach(function (e) {
+ volantis.dom.$(e).hide();
+ })
+ }
+ }
+ }
+
+ // 设置滚动锚点
+ fn.setScrollAnchor = () => {
+ // click topBtn 滚动至bodyAnchor 【移动端 PC】
+ if (volantis.dom.topBtn && volantis.dom.bodyAnchor) {
+ volantis.dom.topBtn.click(e => {
+ e.preventDefault();
+ e.stopPropagation();
+ fn.scrolltoElement(volantis.dom.bodyAnchor);
+ e.stopImmediatePropagation();
+ });
+ }
+
+ }
+
+ // 设置导航栏
+ fn.setHeader = () => {
+ // !!! 此处的Dom对象需要重载 !!!
+ if (!pdata.ispage) return;
+
+ // 填充二级导航文章标题 【移动端 PC】
+ volantis.dom.wrapper.find('.nav-sub .title').html(document.title.split(" - ")[0]);
+
+ // ====== bind events to every btn =========
+ // 评论按钮 【移动端 PC】
+ volantis.dom.comment = volantis.dom.$(document.getElementById("s-comment")); // 评论按钮 桌面端 移动端
+ volantis.dom.commentTarget = volantis.dom.$(document.querySelector('#l_main article#comments')); // 评论区域
+ if (volantis.dom.commentTarget) {
+ volantis.dom.comment.click(e => { // 评论按钮点击后 跳转到评论区域
+ e.preventDefault();
+ e.stopPropagation();
+ volantis.cleanContentVisibility();
+ fn.scrolltoElement(volantis.dom.commentTarget);
+ e.stopImmediatePropagation();
+ });
+ } else volantis.dom.comment.style.display = 'none'; // 关闭了评论,则隐藏评论按钮
+
+ // 移动端toc目录按钮 【移动端】
+ if (volantis.isMobile) {
+ volantis.dom.toc = volantis.dom.$(document.getElementById("s-toc")); // 目录按钮 仅移动端
+ volantis.dom.tocTarget = volantis.dom.$(document.querySelector('#l_side .toc-wrapper')); // 侧边栏的目录列表
+ if (volantis.dom.tocTarget) {
+ // 点击移动端目录按钮 激活目录按钮 显示侧边栏的目录列表
+ volantis.dom.toc.click((e) => {
+ e.stopPropagation();
+ volantis.dom.tocTarget.toggleClass('active');
+ volantis.dom.toc.toggleClass('active');
+ });
+ // 点击空白 隐藏
+ volantis.dom.$(document).click(function (e) {
+ e.stopPropagation();
+ if (volantis.dom.tocTarget) {
+ volantis.dom.tocTarget.removeClass('active');
+ }
+ volantis.dom.toc.removeClass('active');
+ });
+ } else if (volantis.dom.toc) volantis.dom.toc.style.display = 'none'; // 隐藏toc目录按钮
+ }
+ }
+
+ // 设置导航栏菜单选中状态 【移动端 PC】
+ fn.setHeaderMenuSelection = () => {
+ // !!! 此处的Dom对象需要重载 !!!
+ volantis.dom.headerMenu = volantis.dom.$(document.querySelectorAll('#l_header .navigation,#l_cover .navigation,#l_side .navigation')); // 导航列表
+
+ // 先把已经激活的取消激活
+ volantis.dom.headerMenu.forEach(element => {
+ let li = volantis.dom.$(element).find('li a.active')
+ if (li)
+ li.removeClass('active')
+ let div = volantis.dom.$(element).find('div a.active')
+ if (div)
+ div.removeClass('active')
+ });
+
+ // replace '%' '/' '.'
+ var idname = location.pathname.replace(/\/|%|\./g, '');
+ if (idname.length == 0) {
+ idname = 'home';
+ }
+ var page = idname.match(/page\d{0,}$/g);
+ if (page) {
+ page = page[0];
+ idname = idname.split(page)[0];
+ }
+ var index = idname.match(/index.html/);
+ if (index) {
+ index = index[0];
+ idname = idname.split(index)[0];
+ }
+ // 转义字符如 [, ], ~, #, @
+ idname = idname.replace(/(\[|\]|~|#|@)/g, '\\$1');
+ if (idname && volantis.dom.headerMenu) {
+ volantis.dom.headerMenu.forEach(element => {
+ // idname 不能为数字开头, 加一个 action- 前缀
+ let id = element.querySelector("[active-action=action-" + idname + "]")
+ if (id) {
+ volantis.dom.$(id).addClass('active')
+ }
+ });
+ }
+ }
+
+ // 设置全局事件
+ fn.setGlobalHeaderMenuEvent = () => {
+ if (volantis.isMobile) {
+ // 【移动端】 关闭已经展开的子菜单 点击展开子菜单
+ document.querySelectorAll('#l_header .m-phone li').forEach(function (e) {
+ if (e.querySelector(".list-v")) {
+ // 点击菜单
+ volantis.dom.$(e).click(function (e) {
+ e.stopPropagation();
+ // 关闭已经展开的子菜单
+ e.currentTarget.parentElement.childNodes.forEach(function (e) {
+ if (Object.prototype.toString.call(e) == '[object HTMLLIElement]') {
+ e.childNodes.forEach(function (e) {
+ if (Object.prototype.toString.call(e) == '[object HTMLUListElement]') {
+ volantis.dom.$(e).hide()
+ }
+ })
+ }
+ })
+ // 点击展开子菜单
+ let array = e.currentTarget.children
+ for (let index = 0; index < array.length; index++) {
+ const element = array[index];
+ if (volantis.dom.$(element).title === 'menu') { // 移动端菜单栏异常
+ volantis.dom.$(element).display = "flex" // https://github.com/volantis-x/hexo-theme-volantis/issues/706
+ } else {
+ volantis.dom.$(element).show()
+ }
+ }
+ }, 0);
+ }
+ })
+ } else {
+ // 【PC端】 hover时展开子菜单,点击时[target.baseURI==origin时]隐藏子菜单? 现有逻辑大部分情况不隐藏子菜单
+ document.querySelectorAll('#wrapper .m-pc li > a[href]').forEach(function (e) {
+ volantis.dom.$(e.parentElement).click(function (e) {
+ e.stopPropagation();
+ if (e.target.origin == e.target.baseURI) {
+ document.querySelectorAll('#wrapper .m-pc .list-v').forEach(function (e) {
+ volantis.dom.$(e).hide(); // 大概率不会执行
+ })
+ }
+ }, 0);
+ })
+ }
+ fn.setPageHeaderMenuEvent();
+ }
+
+ // 【移动端】隐藏子菜单
+ fn.setPageHeaderMenuEvent = () => {
+ if (!volantis.isMobile) return
+ // 【移动端】 点击空白处隐藏子菜单
+ volantis.dom.$(document).click(function (e) {
+ volantis.dom.mPhoneList.forEach(function (e) {
+ volantis.dom.$(e).hide();
+ })
+ });
+ }
+
+ // 设置导航栏搜索框 【移动端】
+ fn.setHeaderSearch = () => {
+ if (!volantis.isMobile) return;
+ if (!volantis.dom.switcher) return;
+ // 点击移动端搜索按钮
+ volantis.dom.switcher.click(function (e) {
+ e.stopPropagation();
+ volantis.dom.header.toggleClass('z_search-open'); // 激活移动端搜索框
+ volantis.dom.switcher.toggleClass('active'); // 移动端搜索按钮
+ });
+ // 点击空白取消激活
+ volantis.dom.$(document).click(function (e) {
+ volantis.dom.header.removeClass('z_search-open');
+ volantis.dom.switcher.removeClass('active');
+ });
+ // 移动端点击搜索框 停止事件传播
+ volantis.dom.search.click(function (e) {
+ e.stopPropagation();
+ });
+ }
+
+ // 设置 tabs 标签 【移动端 PC】
+ fn.setTabs = () => {
+ let tabs = document.querySelectorAll('#l_main .tabs .nav-tabs')
+ if (!tabs) return
+ tabs.forEach(function (e) {
+ e.querySelectorAll('a').forEach(function (e) {
+ volantis.dom.$(e).on('click', (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ const $tab = volantis.dom.$(e.target.parentElement.parentElement.parentElement);
+ $tab.find('.nav-tabs .active').removeClass('active');
+ volantis.dom.$(e.target.parentElement).addClass('active');
+ $tab.find('.tab-content .active').removeClass('active');
+ $tab.find(e.target.className).addClass('active');
+ return false;
+ });
+ })
+ })
+ }
+
+ // hexo-reference 页脚跳转 https://github.com/volantis-x/hexo-theme-volantis/issues/647
+ fn.footnotes = () => {
+ let ref = document.querySelectorAll('#l_main .footnote-backref, #l_main .footnote-ref > a');
+ ref.forEach(function (e, i) {
+ ref[i].click = () => { }; // 强制清空原 click 事件
+ volantis.dom.$(e).on('click', (e) => {
+ e.stopPropagation();
+ e.preventDefault();
+ let targetID = decodeURI(e.target.hash.split('#')[1]).replace(/\ /g, '-');
+ let target = document.getElementById(targetID);
+ if (target) {
+ volantis.scroll.to(target, { addTop: - volantis.dom.header.offsetHeight - 5, behavior: 'instant' })
+ }
+ });
+ })
+ }
+
+ // 工具类:代码块复制
+ fn.utilCopyCode = (Selector) => {
+ document.querySelectorAll(Selector).forEach(node => {
+ const test = node.insertAdjacentHTML("beforebegin", COPYHTML);
+ const _BtnCopy = node.previousSibling;
+ _BtnCopy.onclick = e => {
+ e.stopPropagation();
+ const _icon = _BtnCopy.querySelector('i');
+ const _span = _BtnCopy.querySelector('span');
+
+ node.focus();
+ const range = new Range();
+ range.selectNodeContents(node);
+ document.getSelection().removeAllRanges();
+ document.getSelection().addRange(range);
+
+ const str = document.getSelection().toString();
+ fn.utilWriteClipText(str).then(() => {
+ fn.messageCopyright();
+ _BtnCopy.classList.add('copied');
+ _icon.classList.remove('fa-copy');
+ _icon.classList.add('fa-check-circle');
+ _span.innerText = "COPIED";
+ setTimeout(() => {
+ _icon.classList.remove('fa-check-circle');
+ _icon.classList.add('fa-copy');
+ _span.innerText = "COPY";
+ }, 2000)
+ }).catch(e => {
+ VolantisApp.message('系统提示', e, {
+ icon: 'fa fa-exclamation-circle red'
+ });
+ _BtnCopy.classList.add('copied-failed');
+ _icon.classList.remove('fa-copy');
+ _icon.classList.add('fa-exclamation-circle');
+ _span.innerText = "COPY FAILED";
+ setTimeout(() => {
+ _icon.classList.remove('fa-exclamation-circle');
+ _icon.classList.add('fa-copy');
+ _span.innerText = "COPY";
+ })
+ })
+ }
+ });
+ }
+
+ // 工具类:复制字符串到剪切板
+ fn.utilWriteClipText = (str) => {
+ return navigator.clipboard
+ .writeText(str)
+ .then(() => {
+ return Promise.resolve()
+ })
+ .catch(e => {
+ const input = document.createElement('textarea');
+ input.setAttribute('readonly', 'readonly');
+ document.body.appendChild(input);
+ input.innerHTML = str;
+ input.select();
+ try {
+ let result = document.execCommand('copy')
+ document.body.removeChild(input);
+ if (!result || result === 'unsuccessful') {
+ return Promise.reject('复制文本失败!')
+ } else {
+ return Promise.resolve()
+ }
+ } catch (e) {
+ document.body.removeChild(input);
+ return Promise.reject(
+ '当前浏览器不支持复制功能,请检查更新或更换其他浏览器操作!'
+ )
+ }
+ })
+ }
+
+ // 工具类:返回时间间隔
+ fn.utilTimeAgo = (dateTimeStamp) => {
+ const minute = 1e3 * 60, hour = minute * 60, day = hour * 24, week = day * 7, month = day * 30;
+ const now = new Date().getTime();
+ const diffValue = now - dateTimeStamp;
+ const minC = diffValue / minute,
+ hourC = diffValue / hour,
+ dayC = diffValue / day,
+ weekC = diffValue / week,
+ monthC = diffValue / month;
+ if (diffValue < 0) {
+ result = ""
+ } else if (monthC >= 1 && monthC < 7) {
+ result = " " + parseInt(monthC) + " 月前"
+ } else if (weekC >= 1 && weekC < 4) {
+ result = " " + parseInt(weekC) + " 周前"
+ } else if (dayC >= 1 && dayC < 7) {
+ result = " " + parseInt(dayC) + " 天前"
+ } else if (hourC >= 1 && hourC < 24) {
+ result = " " + parseInt(hourC) + " 小时前"
+ } else if (minC >= 1 && minC < 60) {
+ result = " " + parseInt(minC) + " 分钟前"
+ } else if (diffValue >= 0 && diffValue <= minute) {
+ result = "刚刚"
+ } else {
+ const datetime = new Date();
+ datetime.setTime(dateTimeStamp);
+ const Nyear = datetime.getFullYear();
+ const Nmonth = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime.getMonth() + 1;
+ const Ndate = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate();
+ const Nhour = datetime.getHours() < 10 ? "0" + datetime.getHours() : datetime.getHours();
+ const Nminute = datetime.getMinutes() < 10 ? "0" + datetime.getMinutes() : datetime.getMinutes();
+ const Nsecond = datetime.getSeconds() < 10 ? "0" + datetime.getSeconds() : datetime.getSeconds();
+ result = Nyear + "-" + Nmonth + "-" + Ndate
+ }
+ return result;
+ }
+
+ // 消息提示:标准
+ fn.message = (title, message, option = {}, done = null) => {
+ if (typeof iziToast === "undefined") {
+ volantis.css(volantis.GLOBAL_CONFIG.cdn.izitoast_css)
+ volantis.js(volantis.GLOBAL_CONFIG.cdn.izitoast_js, () => {
+ tozashMessage(title, message, option, done);
+ });
+ } else {
+ tozashMessage(title, message, option, done);
+ }
+ function tozashMessage(title, message, option, done) {
+ const {
+ icon,
+ time,
+ position,
+ transitionIn,
+ transitionOut,
+ messageColor,
+ titleColor,
+ backgroundColor,
+ zindex,
+ displayMode
+ } = option;
+ iziToast.show({
+ layout: '2',
+ icon: 'Fontawesome',
+ closeOnEscape: 'true',
+ displayMode: displayMode || 'replace',
+ transitionIn: transitionIn || volantis.GLOBAL_CONFIG.plugins.message.transitionIn,
+ transitionOut: transitionOut || volantis.GLOBAL_CONFIG.plugins.message.transitionOut,
+ messageColor: messageColor || volantis.GLOBAL_CONFIG.plugins.message.messageColor,
+ titleColor: titleColor || volantis.GLOBAL_CONFIG.plugins.message.titleColor,
+ backgroundColor: backgroundColor || volantis.GLOBAL_CONFIG.plugins.message.backgroundColor,
+ zindex: zindex || volantis.GLOBAL_CONFIG.plugins.message.zindex,
+ icon: icon || volantis.GLOBAL_CONFIG.plugins.message.icon.default,
+ timeout: time || volantis.GLOBAL_CONFIG.plugins.message.time.default,
+ position: position || volantis.GLOBAL_CONFIG.plugins.message.position,
+ title: title,
+ message: message,
+ onClosed: () => {
+ if (done) done();
+ },
+ });
+ }
+ }
+
+ // 消息提示:询问
+ fn.question = (title, message, option = {}, success = null, cancel = null, done = null) => {
+ if (typeof iziToast === "undefined") {
+ volantis.css(volantis.GLOBAL_CONFIG.cdn.izitoast_css)
+ volantis.js(volantis.GLOBAL_CONFIG.cdn.izitoast_js, () => {
+ tozashQuestion(title, message, option, success, cancel, done);
+ });
+ } else {
+ tozashQuestion(title, message, option, success, cancel, done);
+ }
+
+ function tozashQuestion(title, message, option, success, cancel, done) {
+ const {
+ icon,
+ time,
+ position,
+ transitionIn,
+ transitionOut,
+ messageColor,
+ titleColor,
+ backgroundColor,
+ zindex
+ } = option;
+ iziToast.question({
+ id: 'question',
+ icon: 'Fontawesome',
+ close: false,
+ overlay: true,
+ displayMode: 'once',
+ position: 'center',
+ messageColor: messageColor || volantis.GLOBAL_CONFIG.plugins.message.messageColor,
+ titleColor: titleColor || volantis.GLOBAL_CONFIG.plugins.message.titleColor,
+ backgroundColor: backgroundColor || volantis.GLOBAL_CONFIG.plugins.message.backgroundColor,
+ zindex: zindex || volantis.GLOBAL_CONFIG.plugins.message.zindex,
+ icon: icon || volantis.GLOBAL_CONFIG.plugins.message.icon.quection,
+ timeout: time || volantis.GLOBAL_CONFIG.plugins.message.time.quection,
+ title: title,
+ message: message,
+ buttons: [
+ ['', (instance, toast) => {
+ instance.hide({ transitionOut: transitionOut || 'fadeOut' }, toast, 'button');
+ if (success) success(instance, toast)
+ }],
+ ['', (instance, toast) => {
+ instance.hide({ transitionOut: transitionOut || 'fadeOut' }, toast, 'button');
+ if (cancel) cancel(instance, toast)
+ }]
+ ],
+ onClosed: (instance, toast, closedBy) => {
+ if (done) done(instance, toast, closedBy);
+ }
+ });
+ }
+ }
+
+ // 消息提示:隐藏
+ fn.hideMessage = (done = null) => {
+ const toast = document.querySelector('.iziToast');
+ if (!toast) {
+ if (done) done()
+ return;
+ }
+
+ if (typeof iziToast === "undefined") {
+ volantis.css(volantis.GLOBAL_CONFIG.cdn.izitoast_css)
+ volantis.js(volantis.GLOBAL_CONFIG.cdn.izitoast_js, () => {
+ hideMessage(done);
+ });
+ } else {
+ hideMessage(done);
+ }
+
+ function hideMessage(done) {
+ iziToast.hide({}, toast);
+ if (done) done();
+ }
+ }
+
+ // 消息提示:复制
+ let messageCopyrightShow = 0;
+ fn.messageCopyright = () => {
+ // 消息提示 复制时弹出
+ if (volantis.GLOBAL_CONFIG.plugins.message.enable
+ && volantis.GLOBAL_CONFIG.plugins.message.copyright.enable
+ && messageCopyrightShow < 1) {
+ messageCopyrightShow++;
+ VolantisApp.message(volantis.GLOBAL_CONFIG.plugins.message.copyright.title,
+ volantis.GLOBAL_CONFIG.plugins.message.copyright.message, {
+ icon: volantis.GLOBAL_CONFIG.plugins.message.copyright.icon,
+ transitionIn: 'flipInX',
+ transitionOut: 'flipOutX',
+ displayMode: 1
+ });
+ }
+ }
+
+ return {
+ init: () => {
+ fn.init();
+ fn.event();
+ },
+ subscribe: () => {
+ fn.setIsMobile();
+ fn.setHeader();
+ fn.setHeaderMenuSelection();
+ fn.setGlobalHeaderMenuEvent();
+ fn.setHeaderSearch();
+ fn.setScrollAnchor();
+ fn.setTabs();
+ fn.footnotes();
+ },
+ utilCopyCode: fn.utilCopyCode,
+ utilWriteClipText: fn.utilWriteClipText,
+ utilTimeAgo: fn.utilTimeAgo,
+ message: fn.message,
+ question: fn.question,
+ hideMessage: fn.hideMessage,
+ messageCopyright: fn.messageCopyright,
+ scrolltoElement: fn.scrolltoElement
+ }
+})()
+Object.freeze(VolantisApp);
+
+/* FancyBox */
+const VolantisFancyBox = (() => {
+ const fn = {};
+
+ fn.loadFancyBox = (done) => {
+ volantis.css(volantis.GLOBAL_CONFIG.cdn.fancybox_css);
+ volantis.js(volantis.GLOBAL_CONFIG.cdn.fancybox_js).then(() => {
+ if (done) done();
+ })
+ }
+
+ /**
+ * 加载及处理
+ *
+ * @param {*} checkMain 是否只处理文章区域的文章
+ * @param {*} done FancyBox 加载完成后的动作,默认执行分组绑定
+ * @returns
+ */
+ fn.init = (checkMain = true, done = fn.groupBind) => {
+ if (!document.querySelector(".md .gallery img, .fancybox") && checkMain) return;
+ if (typeof Fancybox === "undefined") {
+ fn.loadFancyBox(done);
+ } else {
+ done();
+ }
+ }
+
+ /**
+ * 图片元素预处理
+ *
+ * @param {*} selectors 选择器
+ * @param {*} name 分组
+ */
+ fn.elementHandling = (selectors, name) => {
+ const nodeList = document.querySelectorAll(selectors);
+ nodeList.forEach($item => {
+ if ($item.hasAttribute('fancybox')) return;
+ $item.setAttribute('fancybox', '');
+ const $link = document.createElement('a');
+ $link.setAttribute('href', $item.src);
+ $link.setAttribute('data-caption', $item.alt);
+ $link.setAttribute('data-fancybox', name);
+ $link.classList.add('fancybox');
+ $link.append($item.cloneNode());
+ $item.replaceWith($link);
+ })
+ }
+
+ /**
+ * 原生绑定
+ *
+ * @param {*} selectors 选择器
+ */
+ fn.bind = (selectors) => {
+ fn.init(false, () => {
+ Fancybox.bind(selectors, {
+ groupAll: true,
+ Hash: false,
+ hideScrollbar: false,
+ Thumbs: {
+ autoStart: false,
+ },
+ caption: function (fancybox, carousel, slide) {
+ return slide.$trigger.alt || null
+ }
+ });
+ });
+ }
+
+ /**
+ * 分组绑定
+ *
+ * @param {*} groupName 分组名称
+ */
+ fn.groupBind = (groupName = null) => {
+ const group = new Set();
+
+ document.querySelectorAll(".gallery").forEach(ele => {
+ if (ele.querySelector("img")) {
+ group.add(ele.getAttribute('data-group') || 'default');
+ }
+ })
+
+ if (!!groupName) group.add(groupName);
+
+ for (const iterator of group) {
+ Fancybox.unbind('[data-fancybox="' + iterator + '"]');
+ Fancybox.bind('[data-fancybox="' + iterator + '"]', {
+ Hash: false,
+ hideScrollbar: false,
+ Thumbs: {
+ autoStart: false,
+ }
+ });
+ }
+ }
+
+ return {
+ init: fn.init,
+ bind: fn.bind,
+ groupBind: (selectors, groupName = 'default') => {
+ try {
+ fn.elementHandling(selectors, groupName);
+ fn.init(false, () => {
+ fn.groupBind(groupName)
+ });
+ } catch (error) {
+ console.error(error)
+ }
+ }
+ }
+})()
+Object.freeze(VolantisFancyBox);
+
+// highlightKeyWords 与 搜索功能搭配 https://github.com/next-theme/hexo-theme-next/blob/eb194a7258058302baf59f02d4b80b6655338b01/source/js/third-party/search/local-search.js
+// Question: 锚点稳定性未知
+// ToDo: 查找模式
+// 0. (/////////要知道浏览器自带全页面查找功能 CTRL + F)
+// 1. 右键开启查找模式 / 导航栏菜单开启?? / CTRL + F ???
+// 2. 查找模式面板 (可拖动? or 固定?)
+// 3. keyword mark id 从 0 开始编号 查找下一处 highlightKeyWords.scrollToNextHighlightKeywordMark() 查找上一处 scrollToPrevHighlightKeywordMark() 循环查找(取模%)
+// 4. 可输入修改 查找关键词 keywords(type:list)
+// 5. 区分大小写 caseSensitive (/ 全字匹配?? / 正则匹配??)
+// 6. 在选定区域中查找 querySelector ??
+// 7. 关闭查找模式
+// 8. 搜索跳转 (URL 入口) 自动开启查找模式 调用 scrollToNextHighlightKeywordMark()
+const highlightKeyWords = (() => {
+ let fn = {}
+ fn.markNum = 0
+ fn.markNextId = -1
+ fn.startFromURL = () => {
+ const params = decodeURI(new URL(location.href).searchParams.get('keyword'));
+ const keywords = params ? params.split(' ') : [];
+ const post = document.querySelector('#l_main');
+ if (keywords.length == 1 && keywords[0] == "null") {
+ return;
+ }
+ fn.start(keywords, post); // 渲染耗时较长
+ fn.scrollToFirstHighlightKeywordMark()
+ }
+ fn.scrollToFirstHighlightKeywordMark = () => {
+ volantis.cleanContentVisibility();
+ let target = fn.scrollToNextHighlightKeywordMark("0");
+ if (!target) {
+ volantis.requestAnimationFrame(fn.scrollToFirstHighlightKeywordMark)
+ }
+ }
+ fn.scrollToNextHighlightKeywordMark = (id) => {
+ // Next Id
+ let input = id || (fn.markNextId + 1) % fn.markNum;
+ fn.markNextId = parseInt(input)
+ let target = document.getElementById("keyword-mark-" + fn.markNextId);
+ if (!target) {
+ fn.markNextId = (fn.markNextId + 1) % fn.markNum;
+ target = document.getElementById("keyword-mark-" + fn.markNextId);
+ }
+ if (target) {
+ volantis.scroll.to(target, { addTop: - volantis.dom.header.offsetHeight - 5, behavior: 'instant' })
+ }
+ // Current target
+ return target
+ }
+ fn.scrollToPrevHighlightKeywordMark = (id) => {
+ // Prev Id
+ let input = id || (fn.markNextId - 1 + fn.markNum) % fn.markNum;
+ fn.markNextId = parseInt(input)
+ let target = document.getElementById("keyword-mark-" + fn.markNextId);
+ if (!target) {
+ fn.markNextId = (fn.markNextId - 1 + fn.markNum) % fn.markNum;
+ target = document.getElementById("keyword-mark-" + fn.markNextId);
+ }
+ if (target) {
+ volantis.scroll.to(target, { addTop: - volantis.dom.header.offsetHeight - 5, behavior: 'instant' })
+ }
+ // Current target
+ return target
+ }
+ fn.start = (keywords, querySelector) => {
+ fn.markNum = 0
+ if (!keywords.length || !querySelector || (keywords.length == 1 && keywords[0] == "null")) return;
+ console.log(keywords);
+ const walk = document.createTreeWalker(querySelector, NodeFilter.SHOW_TEXT, null);
+ const allNodes = [];
+ while (walk.nextNode()) {
+ if (!walk.currentNode.parentNode.matches('button, select, textarea')) allNodes.push(walk.currentNode);
+ }
+ allNodes.forEach(node => {
+ const [indexOfNode] = fn.getIndexByWord(keywords, node.nodeValue);
+ if (!indexOfNode.length) return;
+ const slice = fn.mergeIntoSlice(0, node.nodeValue.length, indexOfNode);
+ fn.highlightText(node, slice, 'keyword');
+ fn.highlightStyle()
+ });
+ }
+ fn.getIndexByWord = (words, text, caseSensitive = false) => {
+ const index = [];
+ const included = new Set();
+ words.forEach(word => {
+ const div = document.createElement('div');
+ div.innerText = word;
+ word = div.innerHTML;
+
+ const wordLen = word.length;
+ if (wordLen === 0) return;
+ let startPosition = 0;
+ let position = -1;
+ if (!caseSensitive) {
+ text = text.toLowerCase();
+ word = word.toLowerCase();
+ }
+ while ((position = text.indexOf(word, startPosition)) > -1) {
+ index.push({ position, word });
+ included.add(word);
+ startPosition = position + wordLen;
+ }
+ });
+ index.sort((left, right) => {
+ if (left.position !== right.position) {
+ return left.position - right.position;
+ }
+ return right.word.length - left.word.length;
+ });
+ return [index, included];
+ };
+ fn.mergeIntoSlice = (start, end, index) => {
+ let item = index[0];
+ let { position, word } = item;
+ const hits = [];
+ const count = new Set();
+ while (position + word.length <= end && index.length !== 0) {
+ count.add(word);
+ hits.push({
+ position,
+ length: word.length
+ });
+ const wordEnd = position + word.length;
+
+ index.shift();
+ while (index.length !== 0) {
+ item = index[0];
+ position = item.position;
+ word = item.word;
+ if (wordEnd > position) {
+ index.shift();
+ } else {
+ break;
+ }
+ }
+ }
+ return {
+ hits,
+ start,
+ end,
+ count: count.size
+ };
+ };
+ fn.highlightText = (node, slice, className) => {
+ const val = node.nodeValue;
+ let index = slice.start;
+ const children = [];
+ for (const { position, length } of slice.hits) {
+ const text = document.createTextNode(val.substring(index, position));
+ index = position + length;
+ let mark = document.createElement('mark');
+ mark.className = className;
+ mark = fn.highlightStyle(mark)
+ mark.appendChild(document.createTextNode(val.substr(position, length)));
+ children.push(text, mark);
+ }
+ node.nodeValue = val.substring(index, slice.end);
+ children.forEach(element => {
+ node.parentNode.insertBefore(element, node);
+ });
+ }
+ fn.highlightStyle = (mark) => {
+ if (!mark) return;
+ mark.id = "keyword-mark-" + fn.markNum;
+ fn.markNum++;
+ mark.style.background = "transparent";
+ mark.style["border-bottom"] = "1px dashed #ff2a2a";
+ mark.style["color"] = "#ff2a2a";
+ mark.style["font-weight"] = "bold";
+ return mark
+ }
+ fn.cleanHighlightStyle = () => {
+ document.querySelectorAll(".keyword").forEach(mark => {
+ mark.style.background = "transparent";
+ mark.style["border-bottom"] = null;
+ mark.style["color"] = null;
+ mark.style["font-weight"] = null;
+ })
+ }
+ return {
+ start: (keywords, querySelector) => {
+ fn.start(keywords, querySelector)
+ },
+ startFromURL: () => {
+ fn.startFromURL()
+ },
+ scrollToNextHighlightKeywordMark: (id) => {
+ fn.scrollToNextHighlightKeywordMark(id)
+ },
+ scrollToPrevHighlightKeywordMark: (id) => {
+ fn.scrollToPrevHighlightKeywordMark(id)
+ },
+ cleanHighlightStyle: () => {
+ fn.cleanHighlightStyle()
+ },
+ }
+})()
+Object.freeze(highlightKeyWords);
+
+/* DOM 控制 */
+const DOMController = {
+ /**
+ * 控制元素显隐
+ */
+ visible: (ele, type = true) => {
+ if (ele) ele.style.display = type === true ? 'block' : 'none';
+ },
+
+ /**
+ * 移除元素
+ */
+ remove: (param) => {
+ const node = document.querySelectorAll(param);
+ node.forEach(ele => {
+ ele.remove();
+ })
+ },
+
+ removeList: (list) => {
+ list.forEach(param => {
+ DOMController.remove(param)
+ })
+ },
+
+ /**
+ * 设置属性
+ */
+ setAttribute: (param, attrName, attrValue) => {
+ const node = document.querySelectorAll(param);
+ node.forEach(ele => {
+ ele.setAttribute(attrName, attrValue)
+ })
+ },
+
+ setAttributeList: (list) => {
+ list.forEach(item => {
+ DOMController.setAttribute(item[0], item[1], item[2])
+ })
+ },
+
+ /**
+ * 设置样式
+ */
+ setStyle: (param, styleName, styleValue) => {
+ const node = document.querySelectorAll(param);
+ node.forEach(ele => {
+ ele.style[styleName] = styleValue;
+ })
+ },
+
+ setStyleList: (list) => {
+ list.forEach(item => {
+ DOMController.setStyle(item[0], item[1], item[2])
+ })
+ },
+
+ fadeIn: (e) => {
+ if (!e) return;
+ e.style.visibility = "visible";
+ e.style.opacity = 1;
+ e.style.display = "block";
+ e.style.transition = "all 0.5s linear";
+ return e
+ },
+
+ fadeOut: (e) => {
+ if (!e) return;
+ e.style.visibility = "hidden";
+ e.style.opacity = 0;
+ e.style.display = "none";
+ e.style.transition = "all 0.5s linear";
+ return e
+ },
+
+ fadeToggle: (e) => {
+ if (!e) return;
+ if (e.style.visibility == "hidden") {
+ e = DOMController.fadeIn(e)
+ } else {
+ e = DOMController.fadeOut(e)
+ }
+ return e
+ },
+
+ fadeToggleList: (list) => {
+ list.forEach(param => {
+ DOMController.fadeToggle(param)
+ })
+ },
+
+ hasClass: (e, c) => {
+ if (!e) return;
+ return e.className.match(new RegExp('(\\s|^)' + c + '(\\s|$)'));
+ },
+
+ addClass: (e, c) => {
+ if (!e) return;
+ e.classList.add(c);
+ return e
+ },
+
+ removeClass: (e, c) => {
+ if (!e) return;
+ e.classList.remove(c);
+ return e
+ },
+
+ toggleClass: (e, c) => {
+ if (!e) return;
+ if (DOMController.hasClass(e, c)) {
+ DOMController.removeClass(e, c)
+ } else {
+ DOMController.addClass(e, c)
+ }
+ return e
+ },
+
+ toggleClassList: (list) => {
+ list.forEach(item => {
+ DOMController.toggleClass(item[0], item[1])
+ })
+ }
+}
+Object.freeze(DOMController);
+
+const VolantisRequest = {
+ timeoutFetch: (url, ms, requestInit) => {
+ const controller = new AbortController()
+ requestInit.signal?.addEventListener('abort', () => controller.abort())
+ let promise = fetch(url, { ...requestInit, signal: controller.signal })
+ if (ms > 0) {
+ const timer = setTimeout(() => controller.abort(), ms)
+ promise.finally(() => { clearTimeout(timer) })
+ }
+ promise = promise.catch((err) => {
+ throw ((err || {}).name === 'AbortError') ? new Error(`Fetch timeout: ${url}`) : err
+ })
+ return promise
+ },
+
+ Fetch: async (url, requestInit, timeout = 15000) => {
+ const resp = await VolantisRequest.timeoutFetch(url, timeout, requestInit);
+ if (!resp.ok) throw new Error(`Fetch error: ${url} | ${resp.status}`);
+ let json = await resp.json()
+ if (!json.success) throw json
+ return json
+ },
+
+ POST: async (url, data) => {
+ const requestInit = {
+ method: 'POST',
+ }
+ if (data) {
+ const formData = new FormData();
+ Object.keys(data).forEach(key => formData.append(key, String(data[key])))
+ requestInit.body = formData;
+ }
+ const json = await VolantisRequest.Fetch(url, requestInit)
+ return json.data;
+ },
+
+ Get: async (url, data) => {
+ const json = await VolantisRequest.Fetch(url + (data ? (`?${new URLSearchParams(data)}`) : ''), {
+ method: 'GET'
+ })
+ }
+}
+Object.freeze(VolantisRequest);
diff --git a/js/plugins/aplayer.js b/js/plugins/aplayer.js
new file mode 100644
index 000000000..36f6d7da2
--- /dev/null
+++ b/js/plugins/aplayer.js
@@ -0,0 +1,186 @@
+/**
+ * 右键音乐
+ * */
+const RightMenuAplayer = (() => {
+ let playStatus; // 播放器状态
+ const APlayer = {}; // 右键音乐所控制的播放器
+ const fn = {};
+
+ fn.checkAPlayer = () => {
+ if (playStatus === undefined || APlayer.player === undefined) {
+ fn.setAPlayerObject();
+ } else if (APlayer.observer === undefined) {
+ fn.setAPlayerObserver();
+ }
+ }
+
+ // 设置全局播放器所对应的 aplyer 对象
+ fn.setAPlayerObject = () => {
+ let meting = document.querySelectorAll('.footer meting-js');
+ if (meting.length == 0) {
+ meting = document.querySelectorAll('meting-js');
+ }
+ APlayer.player = undefined;
+ meting.forEach((item, index) => {
+ if (item.meta.id == volantis.GLOBAL_CONFIG.plugins.aplayer.id && item.aplayer && APlayer.player === undefined) {
+ APlayer.player = item.aplayer;
+ fn.setAPlayerObserver();
+ fn.updateTitle();
+ }
+ });
+ }
+
+ // 事件监听
+ fn.setAPlayerObserver = () => {
+ try {
+ APlayer.player.on('play', function (e) {
+ fn.updateAPlayerControllerStatus(e);
+ APlayer.status = 'play';
+ });
+ APlayer.player.on('pause', function (e) {
+ fn.updateAPlayerControllerStatus(e);
+ APlayer.status = 'pause';
+ });
+ APlayer.player.on('volumechange', function (e) {
+ fn.onUpdateAPlayerVolume(e);
+ });
+ APlayer.player.on('loadstart', function (e) {
+ fn.updateTitle(e);
+ });
+
+ // 监听音量手势
+ APlayer.volumeBarWrap = document.getElementsByClassName('nav volume')[0].children[0];
+ APlayer.volumeBar = APlayer.volumeBarWrap.children[0];
+
+ const thumbMove = (e) => {
+ fn.updateAPlayerVolume(e);
+ };
+
+ const thumbUp = (e) => {
+ APlayer.volumeBarWrap.classList.remove('aplayer-volume-bar-wrap-active');
+ document.removeEventListener('mouseup', thumbUp);
+ document.removeEventListener('mousemove', thumbMove);
+ fn.updateAPlayerVolume(e);
+ };
+
+ APlayer.volumeBarWrap.addEventListener('mousedown', (event) => {
+ event.stopPropagation();
+ APlayer.volumeBarWrap.classList.add('aplayer-volume-bar-wrap-active');
+ document.addEventListener('mousemove', thumbMove);
+ document.addEventListener('mouseup', thumbUp);
+ });
+
+ APlayer.volumeBarWrap.addEventListener('click', (event) => {
+ event.stopPropagation();
+ });
+
+ fn.updateAPlayerControllerStatus();
+ fn.onUpdateAPlayerVolume();
+ APlayer.observer = true;
+ } catch (error) {
+ console.log(error);
+ APlayer.observer = undefined;
+ }
+ }
+
+ fn.updateAPlayerVolume = (e) => {
+ let percentage = ((e.clientX || e.changedTouches[0].clientX) -
+ APlayer.volumeBar.getBoundingClientRect().left) / APlayer.volumeBar.clientWidth;
+ percentage = Math.max(percentage, 0);
+ percentage = Math.min(percentage, 1);
+ APlayer.player.volume(percentage);
+ }
+
+ fn.onUpdateAPlayerVolume = () => {
+ try {
+ APlayer.volumeBar.children[0].style.width = APlayer.player.audio.volume * 100 + '%';
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ // 更新控制器状态
+ fn.updateAPlayerControllerStatus = () => {
+ try {
+ if (APlayer.player.audio.paused) {
+ playStatus = 'pause';
+ document.getElementsByClassName('nav toggle')[0].children[0].classList.add('fa-play');
+ document.getElementsByClassName('nav toggle')[0].children[0].classList.remove('fa-pause');
+ } else {
+ playStatus = 'play';
+ document.getElementsByClassName('nav toggle')[0].children[0].classList.remove('fa-play');
+ document.getElementsByClassName('nav toggle')[0].children[0].classList.add('fa-pause');
+ }
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ // 播放/暂停
+ fn.aplayerToggle = () => {
+ fn.checkAPlayer();
+ try {
+ APlayer.player.toggle();
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ // 上一曲
+ fn.aplayerBackward = () => {
+ fn.checkAPlayer();
+ try {
+ APlayer.player.skipBack();
+ APlayer.player.play();
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ // 下一曲
+ fn.aplayerForward = () => {
+ fn.checkAPlayer();
+ try {
+ APlayer.player.skipForward();
+ APlayer.player.play();
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ // 调节音量
+ fn.aplayerVolume = (percent) => {
+ fn.checkAPlayer();
+ try {
+ APlayer.player.volume(percent);
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ // 更新音乐标题
+ fn.updateTitle = () => {
+ fn.checkAPlayer();
+ try {
+ const index = APlayer.player.list.index;
+ const obj = APlayer.player.list.audios[index];
+ document.getElementsByClassName('nav music-title')[0].innerHTML = obj.title;
+ } catch (error) {
+ //console.log(error);
+ }
+ }
+
+ return {
+ checkAPlayer: fn.checkAPlayer,
+ aplayerBackward: fn.aplayerBackward,
+ aplayerToggle: fn.aplayerToggle,
+ aplayerForward: fn.aplayerForward,
+ APlayer: APlayer
+ }
+})()
+
+Object.freeze(RightMenuAplayer);
+
+volantis.requestAnimationFrame(() => {
+ RightMenuAplayer.checkAPlayer();
+});
diff --git a/js/plugins/parallax.js b/js/plugins/parallax.js
new file mode 100644
index 000000000..c170b1961
--- /dev/null
+++ b/js/plugins/parallax.js
@@ -0,0 +1,191 @@
+let Parallax = {};
+Parallax.options = {};
+Parallax.options.speed = 0.25;
+Parallax.options.zIndex = -100;
+Parallax.options.fade = 1500;
+Parallax.slidein = () => {
+ let slider = Parallax.mirrors[0].slider;
+ if (Parallax.mirrors.length >= 2) {
+ slider = Parallax.mirrors[1].slider;
+ }
+ var opac = parseFloat(slider.style.opacity);
+ if (opac !== 1) {
+ if (Parallax.mirrors.length >= 2) {
+ opac = opac + 0.1;
+ slider.style.opacity = opac;
+ setTimeout(Parallax.slidein, Parallax.options.fade / 10);
+ }else{
+ slider.style.opacity = 1;
+ }
+ } else {
+ if (Parallax.mirrors.length >= 2) {
+ Parallax.mirrors[0].mirror.remove();
+ Parallax.mirrors.shift();
+ }
+ }
+};
+Parallax.start = () => {
+ let mirror = document.createElement("div");
+ mirror.classList.add("parallax-mirror");
+ mirror.style.visibility = "hidden";
+ mirror.style.zIndex = Parallax.options.zIndex;
+ mirror.style.position = "fixed";
+ mirror.style.top = 0;
+ mirror.style.left = 0;
+ mirror.style.overflow = "hidden";
+ Parallax.window.appendChild(mirror);
+ let slider = document.createElement("img");
+ slider.src = Parallax.options.src;
+ slider.alt = "parallax";
+ slider.classList.add("parallax-slider");
+ slider.style.opacity = 0;
+ mirror.appendChild(slider);
+ if (!Parallax.mirrors) {
+ Parallax.mirrors = [];
+ }
+ let mirrorItem = {};
+ mirrorItem.mirror = mirror;
+ mirrorItem.slider = slider;
+ Parallax.mirrors.push(mirrorItem);
+ Parallax.slidein();
+ slider.addEventListener(
+ "load",
+ function () {
+ Parallax.update();
+ },
+ false
+ );
+};
+Parallax.init = () => {
+ function loadDimensions() {
+ Parallax.wH = document.documentElement.clientHeight;
+ Parallax.wW = document.documentElement.clientWidth;
+ }
+ function getScrollTop() {
+ var scrollPos;
+ if (window.pageYOffset) {
+ scrollPos = window.pageYOffset;
+ } else if (document.compatMode && document.compatMode != "BackCompat") {
+ scrollPos = document.documentElement.scrollTop;
+ } else if (document.body) {
+ scrollPos = document.body.scrollTop;
+ }
+ return scrollPos;
+ }
+ function loadScrollPosition() {
+ const winScrollTop = getScrollTop();
+ Parallax.sT = Math.max(0, winScrollTop);
+ Parallax.sL = Math.max(0, document.body.scrollLeft);
+ Parallax.overScroll = Math.min(winScrollTop, 0);
+ }
+ window.addEventListener(
+ "resize",
+ function () {
+ loadDimensions();
+ Parallax.update();
+ },
+ false
+ );
+ loadDimensions();
+ let lastPosition = -1;
+ (function loop() {
+ const yoffset = getScrollTop();
+ if (lastPosition !== yoffset) {
+ lastPosition = yoffset;
+ loadScrollPosition();
+ Parallax.update();
+ }
+ window.requestAnimationFrame =
+ window.requestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.webkitRequestAnimationFrame;
+ window.requestAnimationFrame(loop);
+ })();
+};
+
+Parallax.refreshItem = (slider) => {
+ Parallax.options.aspectRatio =
+ slider.naturalWidth / (slider.naturalHeight || 1);
+ const aspect = Parallax.options.aspectRatio || 1;
+ Parallax.options.boxWidth = Parallax.window.clientWidth;
+ Parallax.options.boxHeight = Parallax.window.clientHeight;
+ Parallax.options.boxOffsetTop = Parallax.window.scrollTop;
+ Parallax.options.boxOffsetLeft = Parallax.window.scrollLeft;
+ Parallax.options.boxOffsetBottom =
+ Parallax.options.boxOffsetTop + Parallax.options.boxHeight;
+ const winHeight = Parallax.wH;
+ const maxOffset = Parallax.options.boxOffsetTop;
+ const minOffset = Math.max(
+ Parallax.options.boxOffsetTop + Parallax.options.boxHeight - winHeight,
+ 0
+ );
+ const imageHeightMin =
+ (Parallax.options.boxHeight +
+ (maxOffset - minOffset) * (1 - Parallax.options.speed)) |
+ 0;
+ const imageOffsetMin =
+ ((Parallax.options.boxOffsetTop - maxOffset) *
+ (1 - Parallax.options.speed)) |
+ 0;
+ let margin;
+ if (Parallax.options.boxWidth < imageHeightMin * aspect) {
+ Parallax.options.imageWidth = (imageHeightMin * aspect) | 0;
+ Parallax.options.imageHeight = imageHeightMin;
+ Parallax.options.offsetBaseTop = imageOffsetMin;
+ margin = Parallax.options.imageWidth - Parallax.options.boxWidth;
+ Parallax.options.offsetLeft = (-margin / 2) | 0;
+ } else {
+ Parallax.options.imageWidth = Parallax.options.boxWidth;
+ Parallax.options.imageHeight = (Parallax.options.boxWidth / aspect) | 0;
+ Parallax.options.offsetLeft = 0;
+ margin = Parallax.options.imageHeight - imageHeightMin;
+ Parallax.options.offsetBaseTop = (imageOffsetMin - margin / 2) | 0;
+ }
+};
+Parallax.renderItem = (mirror, slider) => {
+ const scrollTop = Parallax.sT;
+ const scrollLeft = Parallax.sL;
+ const scrollBottom = scrollTop + Parallax.wH;
+ if (
+ Parallax.options.boxOffsetBottom > scrollTop &&
+ Parallax.options.boxOffsetTop <= scrollBottom
+ ) {
+ Parallax.options.visibility = "visible";
+ Parallax.options.mirrorTop = Parallax.options.boxOffsetTop - scrollTop;
+ Parallax.options.mirrorLeft = Parallax.options.boxOffsetLeft - scrollLeft;
+ Parallax.options.offsetTop =
+ Parallax.options.offsetBaseTop -
+ Parallax.options.mirrorTop * (1 - Parallax.options.speed);
+ } else {
+ Parallax.options.visibility = "hidden";
+ }
+ mirror.style.transform =
+ "translate3d(" +
+ Parallax.options.mirrorLeft +
+ "px, " +
+ Parallax.options.mirrorTop +
+ "px, 0px)";
+ mirror.style.visibility = Parallax.options.visibility;
+ mirror.style.height = Parallax.options.boxHeight + "px";
+ mirror.style.width = Parallax.options.boxWidth + "px";
+
+ slider.style.transform =
+ "translate3d(" +
+ Parallax.options.offsetLeft +
+ "px, " +
+ Parallax.options.offsetTop +
+ "px, 0px)";
+ slider.style.position = "absolute";
+ slider.style.height = Parallax.options.imageHeight + "px";
+ slider.style.width = Parallax.options.imageWidth + "px";
+ slider.style.maxWidth = "none";
+};
+Parallax.update = () => {
+ if (!Parallax.mirrors) {
+ return
+ }
+ Parallax.mirrors.forEach((e) => {
+ Parallax.refreshItem(e.slider);
+ Parallax.renderItem(e.mirror, e.slider);
+ });
+};
diff --git a/js/plugins/rightMenus.js b/js/plugins/rightMenus.js
new file mode 100644
index 000000000..980b12172
--- /dev/null
+++ b/js/plugins/rightMenus.js
@@ -0,0 +1,618 @@
+
+const RightMenus = {
+ defaultEvent: ['copyText', 'copyLink', 'copyPaste', 'copyAll', 'copyCut', 'copyImg', 'printMode', 'readMode'],
+ defaultGroup: ['navigation', 'inputBox', 'seletctText', 'elementCheck', 'elementImage', 'articlePage'],
+ messageRightMenu: volantis.GLOBAL_CONFIG.plugins.message.enable && volantis.GLOBAL_CONFIG.plugins.message.rightmenu.enable,
+ corsAnywhere: volantis.GLOBAL_CONFIG.plugins.rightmenus.options.corsAnywhere,
+ urlRegx: /^((https|http)?:\/\/)+[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
+ imgRegx: /\.(jpe?g|png|webp|svg|gif|jifi)(-|_|!|\?|\/)?.*$/,
+
+ /**
+ * 加载右键菜单
+ */
+ initialMenu: () => {
+ RightMenus.fun.init();
+ },
+
+ /**
+ * 读取剪切板
+ * @returns text
+ */
+ readClipboard: async () => {
+ let clipboardText;
+ const result = await navigator.permissions.query({ name: 'clipboard-read' });
+ switch (result.state) {
+ case 'granted':
+ case 'prompt':
+ clipboardText = await navigator.clipboard.readText()
+ break;
+ default:
+ window.clipboardRead = false;
+ break;
+ }
+ return clipboardText;
+ },
+
+ /**
+ * 写入文本到剪切板
+ * @param {String} text
+ */
+ writeClipText: text => {
+ return navigator.clipboard
+ .writeText(text)
+ .then(() => {
+ return Promise.resolve()
+ })
+ .catch(err => {
+ return Promise.reject(err)
+ })
+ },
+
+ /**
+ * 写入图片到剪切板
+ * @param {*} link
+ * @param {*} success
+ * @param {*} error
+ */
+ writeClipImg: async (link, success, error) => {
+ const image = new Image;
+ image.crossOrigin = "Anonymous";
+ image.addEventListener('load', () => {
+ let canvas = document.createElement("canvas");
+ let context = canvas.getContext("2d");
+ canvas.width = image.width;
+ canvas.height = image.height;
+ context.drawImage(image, 0, 0);
+ canvas.toBlob(blob => {
+ navigator.clipboard.write([
+ new ClipboardItem({ 'image/png': blob })
+ ]).then(e => {
+ success(e)
+ }).catch(e => {
+ error(e)
+ })
+ }, 'image/png')
+ }, false)
+ image.src = `${link}?(lll¬ω¬)`;
+ },
+
+ /**
+ * 粘贴文本到剪切板
+ * @param {*} elemt
+ * @param {*} value
+ */
+ insertAtCaret: (elemt, value) => {
+ const startPos = elemt.selectionStart,
+ endPos = elemt.selectionEnd;
+ if (document.selection) {
+ elemt.focus();
+ var sel = document.selection.createRange();
+ sel.text = value;
+ elemt.focus();
+ } else {
+ if (startPos || startPos == '0') {
+ var scrollTop = elemt.scrollTop;
+ elemt.value = elemt.value.substring(0, startPos) + value + elemt.value.substring(endPos, elemt.value.length);
+ elemt.focus();
+ elemt.selectionStart = startPos + value.length;
+ elemt.selectionEnd = startPos + value.length;
+ elemt.scrollTop = scrollTop;
+ } else {
+ elemt.value += value;
+ elemt.focus();
+ }
+ }
+ }
+}
+
+/**
+ * 事件处理区域
+ */
+RightMenus.fun = (() => {
+ const rightMenuConfig = volantis.GLOBAL_CONFIG.plugins.rightmenus;
+
+ const
+ fn = {},
+ _rightMenuWrapper = document.getElementById('rightmenu-wrapper'),
+ _rightMenuContent = document.getElementById('rightmenu-content'),
+ _rightMenuList = document.querySelectorAll('#rightmenu-content li.menuLoad-Content'),
+ _rightMenuListWithHr = document.querySelectorAll('#rightmenu-content li, #rightmenu-content hr, #menuMusic'),
+ _readBkg = document.getElementById('read_bkg'),
+ _menuMusic = document.getElementById('menuMusic'),
+ _backward = document.querySelector('#menuMusic .backward'),
+ _toggle = document.querySelector('#menuMusic .toggle'),
+ _forward = document.querySelector('#menuMusic .forward');
+
+ // 公共数据
+ let globalData = {
+ mouseEvent: null,
+ isInputBox: false,
+ selectText: '',
+ inputValue: '',
+ isLink: false,
+ linkUrl: '',
+ isMediaLink: false,
+ mediaLinkUrl: '',
+ isImage: false,
+ isArticle: false,
+ pathName: '',
+ isReadClipboard: true,
+ isShowMusic: false,
+ statusCheck: false
+ }
+ const globalDataBackup = Object.assign({}, globalData);
+
+ /**
+ * 初始化监听事件处理
+ */
+ fn.initEvent = () => {
+ fn.elementAppend();
+ fn.contextmenu();
+ fn.menuEvent();
+ }
+
+ /**
+ * 预置元素设定
+ */
+ fn.elementAppend = () => {
+ // 阅读模式
+ if (_readBkg) _readBkg.parentNode.removeChild(_readBkg);
+ const readBkg = document.createElement("div");
+ readBkg.className = "common_read_bkg common_read_hide";
+ readBkg.id = "read_bkg";
+ window.document.body.appendChild(readBkg);
+ }
+
+ /**
+ * 右键菜单位置设定
+ * @param {*} event
+ */
+ fn.menuPosition = (event) => {
+ try {
+ let mouseClientX = event.clientX;
+ let mouseClientY = event.clientY;
+ let screenWidth = document.documentElement.clientWidth || document.body.clientWidth;
+ let screenHeight = document.documentElement.clientHeight || document.body.clientHeight;
+
+ _rightMenuWrapper.style.display = 'block';
+ fn.menuControl(event);
+
+ let menuWidth = _rightMenuContent.offsetWidth;
+ let menuHeight = _rightMenuContent.offsetHeight;
+ let showLeft = mouseClientX + menuWidth > screenWidth ? mouseClientX - menuWidth + 10 : mouseClientX;
+ let showTop = mouseClientY + menuHeight > screenHeight ? mouseClientY - menuHeight + 10 : mouseClientY;
+ showTop = mouseClientY + menuHeight > screenHeight && showTop < menuHeight && mouseClientY < menuHeight ?
+ showTop + (screenHeight - menuHeight - showTop - 10) : showTop;
+ _rightMenuWrapper.style.left = `${showLeft}px`;
+ _rightMenuWrapper.style.top = `${showTop}px`;
+ if (volantis.GLOBAL_CONFIG.plugins.message.rightmenu.notice) fn.menuNotic();
+ } catch (error) {
+ console.error(error);
+ fn.hideMenu();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 菜单项控制
+ * @param {*} event
+ */
+ fn.menuControl = (event) => {
+ fn.globalDataSet(event);
+ if (!!_menuMusic) _menuMusic.style.display = globalData.isShowMusic ? 'block' : 'none';
+ _rightMenuList.forEach(item => {
+ item.style.display = 'none';
+ const nodeName = item.firstElementChild.nodeName;
+ const groupName = item.firstElementChild.getAttribute('data-group');
+ const itemEvent = item.firstElementChild.getAttribute('data-event');
+ if (globalData.statusCheck || globalData.isArticle) {
+ switch (groupName) {
+ case 'inputBox':
+ if (globalData.isInputBox) {
+ item.style.display = 'block';
+ if (itemEvent === 'copyCut' && !globalData.selectText) item.style.display = 'none';
+ if (itemEvent === 'copyAll' && !globalData.inputValue) item.style.display = 'none';
+ if (itemEvent === 'copyPaste' && !globalData.isReadClipboard) item.style.display = 'none';
+ }
+ break;
+ case 'seletctText':
+ if (!!globalData.selectText) item.style.display = 'block';
+ break;
+ case 'elementCheck':
+ if (globalData.isLink || globalData.isMediaLink) item.style.display = 'block';
+ break;
+ case 'elementImage':
+ if (globalData.isImage) item.style.display = 'block';
+ break;
+ case 'articlePage':
+ if (globalData.isArticle) item.style.display = 'block';
+ break;
+ default:
+ item.style.display = nodeName === 'A'
+ ? globalData.isArticle && !globalData.statusCheck && rightMenuConfig.options.articleShowLink
+ ? 'block'
+ : 'none'
+ : 'block';
+ break;
+ }
+ } else if (nodeName === 'A' || RightMenus.defaultGroup.every(item => { return groupName !== item })) {
+ item.style.display = 'block';
+ }
+ })
+
+ // 执行外部事件
+ volantis.mouseEvent = event;
+ volantis.rightmenu.method.handle.start()
+
+ // 过滤 HR 元素
+ let elementHrItem = { item: null, hide: true };
+ _rightMenuListWithHr.forEach((item) => {
+ if (item.nodeName === "HR") {
+ item.style.display = 'block';
+ if (!elementHrItem.item) {
+ elementHrItem.item = item;
+ return;
+ }
+ if (elementHrItem.hide || elementHrItem.item.nextElementSibling.nodeName === "hr") {
+ elementHrItem.item.style.display = 'none';
+ }
+ elementHrItem.item = item;
+ elementHrItem.hide = true;
+ } else {
+ if (item.style.display === 'block' && elementHrItem.hide) {
+ elementHrItem.hide = false;
+ }
+ }
+ })
+ if (!!elementHrItem.item && elementHrItem.hide) elementHrItem.item.style.display = 'none';
+ }
+
+ /**
+ * 元素状态判断/全局数据设置
+ * @param {*} event
+ */
+ fn.globalDataSet = (event) => {
+ globalData = Object.assign({}, globalDataBackup);
+ globalData.mouseEvent = event;
+ globalData.selectText = window.getSelection().toString();
+
+ // 判断是否为输入框
+ if (event.target.tagName.toLowerCase() === 'input' || event.target.tagName.toLowerCase() === 'textarea') {
+ globalData.isInputBox = true;
+ globalData.inputValue = event.target.value;
+ }
+
+ // 判断是否允许读取剪切板
+ if (globalData.isInputBox && window.clipboardRead === false) {
+ globalData.isReadClipboard = false;
+ }
+
+ // 判断是否包含链接
+ if (!!event.target.href && RightMenus.urlRegx.test(event.target.href)) {
+ globalData.isLink = true;
+ globalData.linkUrl = event.target.href;
+ }
+
+ // 判断是否包含媒体链接
+ if (!!event.target.currentSrc && RightMenus.urlRegx.test(event.target.currentSrc)) {
+ globalData.isMediaLink = true;
+ globalData.mediaLinkUrl = event.target.currentSrc;
+ }
+
+ // 判断是否为图片地址
+ if (globalData.isMediaLink && RightMenus.imgRegx.test(globalData.mediaLinkUrl)) {
+ globalData.isImage = true;
+ }
+
+ // 判断是否为文章页面
+ if (!!(document.querySelector('#post.article') || null)) {
+ globalData.isArticle = true;
+ globalData.pathName = window.location.pathname;
+ }
+
+ // 判断是否显示音乐控制器
+ if (volantis.GLOBAL_CONFIG.plugins.aplayer?.enable
+ && typeof RightMenuAplayer !== 'undefined'
+ && RightMenuAplayer.APlayer.player !== undefined) {
+ if (rightMenuConfig.options.musicAlwaysShow
+ || RightMenuAplayer.APlayer.status === 'play'
+ || RightMenuAplayer.APlayer.status === 'undefined') {
+ globalData.isShowMusic = true;
+ }
+ }
+
+ // 设定校验状态
+ if (!!globalData.selectText || globalData.isInputBox || globalData.isLink || globalData.isMediaLink) {
+ globalData.statusCheck = true;
+ }
+ }
+
+ /**
+ * 全局右键监听函数
+ */
+ fn.contextmenu = () => {
+ window.document.oncontextmenu = (event) => {
+ if (event.ctrlKey || document.body.offsetWidth <= 500) {
+ fn.hideMenu();
+ return true;
+ }
+ return fn.menuPosition(event);
+ }
+
+ _rightMenuWrapper.oncontextmenu = (event) => {
+ event.stopPropagation();
+ event.preventDefault();
+ return false;
+ }
+
+ window.removeEventListener('blur', fn.hideMenu);
+ window.addEventListener('blur', fn.hideMenu);
+ document.body.removeEventListener('click', fn.hideMenu);
+ document.body.addEventListener('click', fn.hideMenu);
+ }
+
+ /**
+ * 菜单项事件处理函数
+ */
+ fn.menuEvent = () => {
+ _rightMenuList.forEach(item => {
+ let eventName = item.firstElementChild.getAttribute('data-event');
+ const id = item.firstElementChild.getAttribute('id');
+ const groupName = item.firstElementChild.getAttribute('data-group');
+ if (item.firstElementChild.nodeName === "A") return;
+ item.addEventListener('click', () => {
+ try {
+ if (RightMenus.defaultEvent.every(item => { return eventName !== item })) {
+ if (groupName === 'seletctText') {
+ RightMenusFunction[id](globalData.selectText)
+ } else if (groupName === 'elementCheck') {
+ RightMenusFunction[id](globalData.isLink ? globalData.linkUrl : globalData.mediaLinkUrl)
+ } else if (groupName === 'elementImage') {
+ RightMenusFunction[id](globalData.mediaLinkUrl)
+ } else {
+ RightMenusFunction[id]()
+ }
+ } else {
+ fn[eventName]()
+ }
+ } catch (error) {
+ if (volantis.GLOBAL_CONFIG.debug === "rightMenus") {
+ console.error({
+ id: id,
+ error: error,
+ globalData: globalData,
+ groupName: groupName,
+ eventName: eventName
+ });
+ }
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.message('错误提示', error, {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ time: '15000'
+ });
+ }
+ }
+ })
+ })
+
+ if (_forward && _toggle && _forward) {
+ _backward.onclick = (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ RightMenuAplayer.aplayerBackward();
+ }
+ _toggle.onclick = (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ RightMenuAplayer.aplayerToggle();
+ }
+ _forward.onclick = (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ RightMenuAplayer.aplayerForward();
+ }
+ }
+ }
+
+ /**
+ * 隐藏菜单显示
+ */
+ fn.hideMenu = () => {
+ _rightMenuWrapper.style.display = null;
+ _rightMenuWrapper.style.left = null;
+ _rightMenuWrapper.style.top = null;
+ }
+
+ /**
+ * 右键菜单覆盖提示
+ */
+ fn.menuNotic = () => {
+ const NoticeRightMenu = localStorage.getItem('NoticeRightMenu') === 'true';
+ if (RightMenus.messageRightMenu && !NoticeRightMenu)
+ VolantisApp.message('右键菜单', '唤醒原系统菜单请使用:Ctrl + 右键', {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ displayMode: 1,
+ time: 9000
+ }, () => {
+ localStorage.setItem('NoticeRightMenu', 'true')
+ });
+ }
+
+ fn.copyText = () => {
+ VolantisApp.utilWriteClipText(globalData.selectText)
+ .then(() => {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.messageCopyright();
+ }
+ }).catch(e => {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.message('系统提示', e, {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ displayMode: 1,
+ time: 9000
+ });
+ }
+ })
+ }
+
+ fn.copyLink = () => {
+ VolantisApp.utilWriteClipText(globalData.linkUrl || globalData.mediaLinkUrl)
+ .then(() => {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.messageCopyright();
+ }
+ }).catch(e => {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.message('系统提示', e, {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ displayMode: 1,
+ time: 9000
+ });
+ }
+ })
+ }
+
+ fn.copyAll = () => {
+ globalData.mouseEvent.target.select();
+ }
+
+ fn.copyPaste = async () => {
+ const result = await RightMenus.readClipboard() || '';
+ if (RightMenus.messageRightMenu && window.clipboardRead === false) {
+ VolantisApp.message('系统提示', '未授予剪切板读取权限!');
+ } else if (RightMenus.messageRightMenu && result === '') {
+ VolantisApp.message('系统提示', '仅支持复制文本内容!');
+ } else {
+ RightMenus.insertAtCaret(globalData.mouseEvent.target, result);
+ }
+ }
+
+ fn.copyCut = () => {
+ const statrPos = globalData.mouseEvent.target.selectionStart;
+ const endPos = globalData.mouseEvent.target.selectionEnd;
+ const inputStr = globalData.inputValue;
+ fn.copyText(globalData.selectText);
+ globalData.mouseEvent.target.value = inputStr.substring(0, statrPos) + inputStr.substring(endPos, inputStr.length);
+ globalData.mouseEvent.target.selectionStart = statrPos;
+ globalData.mouseEvent.target.selectionEnd = statrPos;
+ globalData.mouseEvent.target.focus();
+ }
+
+ fn.copyImg = () => {
+ if (volantis.GLOBAL_CONFIG.plugins.message.rightmenu.notice) {
+ VolantisApp.message('系统提示', '复制中,请等待。', {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-images'
+ })
+ }
+ RightMenus.writeClipImg(globalData.mediaLinkUrl, e => {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.hideMessage();
+ VolantisApp.message('系统提示', '图片复制成功!', {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-images'
+ });
+ }
+ }, (e) => {
+ console.error(e);
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.hideMessage();
+ VolantisApp.message('系统提示', '复制失败:' + e, {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ time: 9000
+ });
+ }
+ })
+ }
+
+ fn.printMode = () => {
+ if (window.location.pathname === globalData.pathName) {
+ if (RightMenus.messageRightMenu) {
+ const message = '是否打印当前页面?
建议打印时勾选背景图形
'
+ VolantisApp.question('', message, { time: 9000 }, () => { fn.printHtml() })
+ } else {
+ fn.printHtml()
+ }
+ }
+ }
+
+ fn.printHtml = () => {
+ if (volantis.isReadModel) fn.readMode();
+ DOMController.setAttribute('details', 'open', 'true');
+ DOMController.removeList([
+ '.cus-article-bkg', '.iziToast-overlay', '.iziToast-wrapper', '.prev-next',
+ 'footer', '#l_header', '#l_cover', '#l_side', '#comments', '#s-top', '#BKG',
+ '#rightmenu-wrapper', '.nav-tabs', '.parallax-mirror', '.new-meta-item.share',
+ '.new-meta-box', 'button.btn-copy', 'iframe'
+ ]);
+ DOMController.setStyleList([
+ ['body', 'backgroundColor', 'unset'], ['#l_main, .copyright.license', 'width', '100%'],
+ ['#post', 'boxShadow', 'none'], ['#post', 'background', 'none'], ['#post', 'padding', '0'],
+ ['h1', 'textAlign', 'center'], ['h1', 'fontWeight', '600'], ['h1', 'fontSize', '2rem'], ['h1', 'marginBottom', '20px'],
+ ['.tab-pane', 'display', 'block'], ['.tab-content', 'borderTop', 'none'], ['.highlight>table pre', 'whiteSpace', 'pre-wrap'],
+ ['.highlight>table pre', 'wordBreak', 'break-all'], ['.fancybox img', 'height', 'auto'], ['.fancybox img', 'weight', 'auto'],
+ ['.copyright.license', 'margin', '0'], ['.copyright.license', 'padding', '1.25em 20px'],
+ ['figure.highlight, .copyright.license', 'display', 'inline-block'],
+ ]);
+ setTimeout(() => {
+ window.print();
+ document.body.innerHTML = '';
+ window.location.reload();
+ }, 50);
+ }
+
+ fn.readMode = () => {
+ if (typeof ScrollReveal === 'function') ScrollReveal().clean('#comments');
+ DOMController.setStyle('#l_header', 'opacity', 0);
+ DOMController.fadeToggleList([
+ document.querySelector('#l_cover'), document.querySelector('footer'),
+ document.querySelector('#s-top'), document.querySelector('.article-meta#bottom'),
+ document.querySelector('.prev-next'), document.querySelector('#l_side'),
+ document.querySelector('#comments'),
+ ]);
+ DOMController.toggleClassList([
+ [document.querySelector('#l_main'), 'common_read'], [document.querySelector('#l_main'), 'common_read_main'],
+ [document.querySelector('#l_body'), 'common_read'], [document.querySelector('#safearea'), 'common_read'],
+ [document.querySelector('#read_bkg'), 'common_read_hide'],
+ [document.querySelector('h1'), 'common_read_h1'], [document.querySelector('#post'), 'post_read'],
+ [document.querySelector('#l_cover'), 'read_cover'], [document.querySelector('.widget.toc-wrapper'), 'post_read']
+ ]);
+ DOMController.setStyle('.copyright.license', 'margin', '15px 0');
+ volantis.isReadModel = volantis.isReadModel === undefined ? true : !volantis.isReadModel;
+ if (volantis.isReadModel) {
+ if (RightMenus.messageRightMenu) VolantisApp.message('系统提示', '阅读模式已开启,您可以点击屏幕空白处退出。', {
+ backgroundColor: 'var(--color-read-post)',
+ icon: rightMenuConfig.options.iconPrefix + ' fa-book-reader',
+ displayMode: 1,
+ time: 5000
+ });
+ document.querySelector('#l_body').removeEventListener('click', fn.readMode);
+ document.querySelector('#l_body').addEventListener('click', (event) => {
+ if (DOMController.hasClass(event.target, 'common_read')) {
+ fn.readMode();
+ }
+ });
+ } else {
+ document.querySelector('#l_body').removeEventListener('click', fn.readMode);
+ document.querySelector('#post').removeEventListener('click', fn.readMode);
+ DOMController.setStyle('.prev-next', 'display', 'flex');
+ DOMController.setStyle('.copyright.license', 'margin', '15px -40px');
+ }
+ }
+
+ return {
+ init: fn.initEvent,
+ hideMenu: fn.hideMenu,
+ readMode: fn.readMode
+ }
+})()
+
+Object.freeze(RightMenus);
+volantis.requestAnimationFrame(() => {
+ if (document.readyState !== 'loading') {
+ RightMenus.initialMenu();
+ } else {
+ document.addEventListener("DOMContentLoaded", function () {
+ RightMenus.initialMenu();
+ })
+ }
+});
diff --git a/js/plugins/tags/contributors.js b/js/plugins/tags/contributors.js
new file mode 100644
index 000000000..6a273f9d4
--- /dev/null
+++ b/js/plugins/tags/contributors.js
@@ -0,0 +1,89 @@
+const ContributorsJS = {
+ requestAPI: (url, callback, timeout) => {
+ let retryTimes = 5;
+
+ function request() {
+ return new Promise((resolve, reject) => {
+ let status = 0; // 0 等待 1 完成 2 超时
+ let timer = setTimeout(() => {
+ if (status === 0) {
+ status = 2;
+ timer = null;
+ reject('请求超时');
+ if (retryTimes == 0) {
+ timeout();
+ }
+ }
+ }, 5000);
+ fetch(url).then(function (response) {
+ if (status !== 2) {
+ clearTimeout(timer);
+ resolve(response);
+ timer = null;
+ status = 1;
+ }
+ if (response.ok) {
+ return response.json();
+ }
+ throw new Error('Network response was not ok.');
+ }).then(function (data) {
+ retryTimes = 0;
+ callback(data);
+ }).catch(function (error) {
+ if (retryTimes > 0) {
+ retryTimes -= 1;
+ setTimeout(() => {
+ request();
+ }, 5000);
+ } else {
+ timeout();
+ }
+ });
+ });
+ }
+ request();
+ },
+ layout: (cfg) => {
+ const el = cfg.el;
+ ContributorsJS.requestAPI(cfg.api, function (data) {
+ el.querySelector('.loading-wrap').remove();
+ var cellALL = "";
+ (data || []).forEach((item, i) => {
+ var user = '';
+ cellALL += user;
+ });
+ el.querySelector('.group-body').innerHTML = cellALL;
+ }, function () {
+ try {
+ el.querySelector('.loading-wrap svg').remove();
+ el.querySelector('.loading-wrap p').innerText('加载失败,请稍后重试。');
+ } catch (e) { }
+ });
+ },
+ start: () => {
+ const els = document.getElementsByClassName('contributorsjs-wrap');
+ for (var i = 0; i < els.length; i++) {
+ const el = els[i];
+ const api = el.getAttribute('api');
+ if (api == null) {
+ continue;
+ }
+ var cfg = new Object();
+ cfg.el = el;
+ cfg.api = api;
+ cfg.class = el.getAttribute('class');
+ cfg.avatar = volantis.GLOBAL_CONFIG.default.avatar;
+ ContributorsJS.layout(cfg);
+ }
+ }
+}
+
+
+
+ContributorsJS.start();
\ No newline at end of file
diff --git a/js/plugins/tags/friends.js b/js/plugins/tags/friends.js
new file mode 100644
index 000000000..8a0201c57
--- /dev/null
+++ b/js/plugins/tags/friends.js
@@ -0,0 +1,90 @@
+const FriendsJS = {
+ requestAPI: (url, callback, timeout) => {
+ let retryTimes = 5;
+
+ function request() {
+ return new Promise((resolve, reject) => {
+ let status = 0; // 0 等待 1 完成 2 超时
+ let timer = setTimeout(() => {
+ if (status === 0) {
+ status = 2;
+ timer = null;
+ reject('请求超时');
+ if (retryTimes == 0) {
+ timeout();
+ }
+ }
+ }, 5000);
+ fetch(url).then(function (response) {
+ if (status !== 2) {
+ clearTimeout(timer);
+ resolve(response);
+ timer = null;
+ status = 1;
+ }
+ if (response.ok) {
+ return response.json();
+ }
+ throw new Error('Network response was not ok.');
+ }).then(function (data) {
+ retryTimes = 0;
+ callback(data);
+ }).catch(function (error) {
+ if (retryTimes > 0) {
+ retryTimes -= 1;
+ setTimeout(() => {
+ request();
+ }, 5000);
+ } else {
+ timeout();
+ }
+ });
+ });
+ }
+ request();
+ },
+ layout: (cfg) => {
+ const el = cfg.el;
+ FriendsJS.requestAPI(cfg.api, function (data) {
+ el.querySelector('.loading-wrap').remove();
+ const arr = data.content;
+ var cellALL = "";
+ arr.forEach((item, i) => {
+ var user = '';
+ cellALL += user;
+ });
+ el.querySelector('.group-body').innerHTML = cellALL;
+ }, function () {
+ try {
+ el.querySelector('.loading-wrap svg').remove();
+ el.querySelector('.loading-wrap p').innerText('加载失败,请稍后重试。');
+ } catch (e) { }
+ });
+ },
+ start: () => {
+ const els = document.getElementsByClassName('friendsjs-wrap');
+ for (var i = 0; i < els.length; i++) {
+ const el = els[i];
+ const api = el.getAttribute('api');
+ if (api == null) {
+ continue;
+ }
+ var cfg = new Object();
+ cfg.el = el;
+ cfg.api = api;
+ cfg.class = el.getAttribute('class');
+ cfg.avatar = volantis.GLOBAL_CONFIG.default.avatar;
+ FriendsJS.layout(cfg);
+ }
+ }
+}
+
+
+
+FriendsJS.start();
\ No newline at end of file
diff --git a/js/plugins/tags/sites.js b/js/plugins/tags/sites.js
new file mode 100644
index 000000000..d85907f74
--- /dev/null
+++ b/js/plugins/tags/sites.js
@@ -0,0 +1,93 @@
+const SitesJS = {
+ requestAPI: (url, callback, timeout) => {
+ let retryTimes = 5;
+
+ function request() {
+ return new Promise((resolve, reject) => {
+ let status = 0; // 0 等待 1 完成 2 超时
+ let timer = setTimeout(() => {
+ if (status === 0) {
+ status = 2;
+ timer = null;
+ reject('请求超时');
+ if (retryTimes == 0) {
+ timeout();
+ }
+ }
+ }, 5000);
+ fetch(url).then(function (response) {
+ if (status !== 2) {
+ clearTimeout(timer);
+ resolve(response);
+ timer = null;
+ status = 1;
+ }
+ if (response.ok) {
+ return response.json();
+ }
+ throw new Error('Network response was not ok.');
+ }).then(function (data) {
+ retryTimes = 0;
+ callback(data);
+ }).catch(function (error) {
+ if (retryTimes > 0) {
+ retryTimes -= 1;
+ setTimeout(() => {
+ request();
+ }, 5000);
+ } else {
+ timeout();
+ }
+ });
+ });
+ }
+ request();
+ },
+ layout: (cfg) => {
+ const el = cfg.el;
+ SitesJS.requestAPI(cfg.api, function (data) {
+ el.querySelector('.loading-wrap').remove();
+ const arr = data.content;
+ var cellALL = "";
+ arr.forEach((item, i) => {
+ var cell = '';
+ cellALL += cell;
+ });
+ el.querySelector('.group-body').innerHTML = cellALL;
+ }, function () {
+ try {
+ el.querySelector('.loading-wrap svg').remove();
+ el.querySelector('.loading-wrap p').innerText('加载失败,请稍后重试。');
+ } catch (e) { }
+ });
+ },
+ start: (cfg) => {
+ const els = document.getElementsByClassName('sitesjs-wrap');
+ for (var i = 0; i < els.length; i++) {
+ const el = els[i];
+ const api = el.getAttribute('api');
+ if (api == null) {
+ continue;
+ }
+ var cfg = new Object();
+ cfg.class = el.getAttribute('class');
+ cfg.el = el;
+ cfg.api = api;
+ cfg.avatar = volantis.GLOBAL_CONFIG.default.link;
+ cfg.screenshot = volantis.GLOBAL_CONFIG.default.cover;
+ SitesJS.layout(cfg);
+ }
+ }
+}
+
+
+SitesJS.start();
\ No newline at end of file
diff --git a/js/search/algolia.js b/js/search/algolia.js
new file mode 100644
index 000000000..513472a51
--- /dev/null
+++ b/js/search/algolia.js
@@ -0,0 +1,235 @@
+let SearchService = (() => {
+ const fn = {};
+ let search, algolia, timerId;
+ fn.queryText = null;
+ fn.template = `
+ `;
+
+ fn.init = () => {
+ let div = document.createElement("div");
+ div.innerHTML += fn.template;
+ document.body.append(div);
+
+ algolia = volantis.GLOBAL_CONFIG.search;
+ if (algolia.appId && algolia.apiKey && algolia.indexName) {
+ fn.event();
+ fn.setAlgolia();
+ } else {
+ document.querySelector('#u-search main.modal-body').innerHTML = 'Algolia setting is invalid!';
+ document.querySelector('#u-search main.modal-body').style.textAlign = 'center';
+ document.querySelector('#u-search .modal').style.maxHeight = '128px';
+ }
+ }
+
+ fn.event = () => {
+ document
+ .querySelector("#u-search-btn-close")
+ .addEventListener("click", fn.close, false);
+ document
+ .querySelector("#modal-overlay")
+ .addEventListener("click", fn.close, false);
+ document.querySelectorAll(".u-search-form").forEach((e) => {
+ e.addEventListener("submit", fn.onSubmit, false);
+ });
+ document.querySelector("#algolia-search-input").addEventListener("input", event => {
+ let input = event.target.querySelector(".ais-SearchBox-input");
+ if (input) {
+ fn.queryText = input.value;
+ } else {
+ fn.queryText = event.target.value;
+ }
+ })
+ }
+
+ fn.setAlgolia = () => {
+ search = instantsearch({
+ indexName: algolia.indexName,
+ searchClient: algoliasearch(algolia.appId, algolia.apiKey),
+ searchFunction(helper) {
+ helper.state.query && helper.search()
+ },
+ })
+
+ const configure = instantsearch.widgets.configure({
+ hitsPerPage: algolia.hitsPerPage
+ })
+
+ const searchBox = instantsearch.widgets.searchBox({
+ container: '#algolia-search-input',
+ autofocus: true,
+ showReset: false,
+ showSubmit: false,
+ showLoadingIndicator: false,
+ searchAsYouType: algolia.searchAsYouType,
+ placeholder: algolia.placeholder,
+ templates: {
+ input: 'algolia-input'
+ },
+ queryHook(query, refine) {
+ clearTimeout(timerId)
+ timerId = setTimeout(() => refine(query), 500)
+ }
+ })
+
+ const hits = instantsearch.widgets.hits({
+ container: '#algolia-hits',
+ templates: {
+ item(data) {
+ const keyword = !!fn.queryText ? `?keyword=${fn.queryText}` : ''
+ const link = data.permalink ? data.permalink : `${volantis.GLOBAL_CONFIG.root}${data.path}`
+ const result = data._highlightResult
+ const content = result.contentStripTruncate
+ ? fn.cutContent(result.contentStripTruncate.value)
+ : result.contentStrip
+ ? fn.cutContent(result.contentStrip.value)
+ : result.content
+ ? fn.cutContent(result.content.value)
+ : ''
+ return `
+
+ ${result.title.value || 'no-title'}
+ ${content}
+ `
+ },
+ empty: function (data) {
+ return (
+ `${volantis.GLOBAL_CONFIG.languages.search.hits_empty.replace(/\$\{query}/, data.query)}
`
+ )
+ }
+ }
+ })
+
+ const stats = instantsearch.widgets.stats({
+ container: '#algolia-info > .algolia-stats',
+ templates: {
+ text: function (data) {
+ const stats = volantis.GLOBAL_CONFIG.languages.search.hits_stats
+ .replace(/\$\{hits}/, data.nbHits)
+ .replace(/\$\{time}/, data.processingTimeMS)
+ return (
+ `${stats}`
+ )
+ }
+ }
+ })
+
+ const powerBy = instantsearch.widgets.poweredBy({
+ container: '#algolia-info > .algolia-poweredBy',
+ theme: volantis.dark?.mode === 'dark' ? 'dark' : 'light'
+ })
+
+ const pagination = instantsearch.widgets.pagination({
+ container: '#algolia-pagination',
+ totalPages: 5,
+ templates: {
+ first: '',
+ last: '',
+ previous: '',
+ next: ''
+ }
+ })
+
+ search.addWidgets([configure, searchBox, hits, stats, powerBy, pagination])
+
+ search.start()
+
+ }
+
+ fn.setQueryText = queryText => {
+ fn.queryText = queryText;
+ if (!search) {
+ fn.init()
+ }
+ search?.setUiState({
+ [algolia.indexName]: {
+ query: queryText
+ }
+ })
+ }
+
+ fn.search = () => {
+ document.querySelector("#u-search").style.display = "block";
+ document.addEventListener("keydown", event => {
+ if (event.code === "Escape") {
+ fn.close();
+ }
+ }, { once: true })
+ }
+
+ fn.onSubmit = (event) => {
+ event.preventDefault();
+ let input = event.target.querySelector(".u-search-input");
+ fn.setQueryText(input?.value ? input.value : event.target.value)
+ fn.search();
+ };
+
+ fn.cutContent = content => {
+ if (content === '') return ''
+
+ const firstOccur = content.indexOf('')
+
+ let start = firstOccur - 30
+ let end = firstOccur + 120
+ let pre = ''
+ let post = ''
+
+ if (start <= 0) {
+ start = 0
+ end = 140
+ } else {
+ pre = '...'
+ }
+
+ if (end > content.length) {
+ end = content.length
+ } else {
+ post = '...'
+ }
+
+ let matchContent = pre + content.substring(start, end) + post
+ return matchContent
+ }
+
+ fn.close = () => {
+ document.querySelector("#u-search").style.display = "none";
+ };
+
+ return {
+ init: fn.init,
+ setQueryText: queryText => {
+ fn.setQueryText(queryText);
+ },
+ search: fn.search,
+ close: fn.close
+ }
+})()
+
+Object.freeze(SearchService);
+
+SearchService.init();
diff --git a/js/search/hexo.js b/js/search/hexo.js
new file mode 100644
index 000000000..20936d9b3
--- /dev/null
+++ b/js/search/hexo.js
@@ -0,0 +1,193 @@
+let SearchService = (() => {
+ const fn = {};
+ fn.queryText = null;
+ fn.data = null;
+ fn.template = `
+`;
+ fn.init = async () => {
+ let div = document.createElement("div");
+ div.innerHTML += fn.template;
+ document.body.append(div);
+ document.querySelectorAll(".u-search-form").forEach((e) => {
+ e.addEventListener("submit", fn.onSubmit, false);
+ });
+ let uSearchModalInput = document.querySelector("#u-search-modal-input");
+ uSearchModalInput.addEventListener("input", fn.onSubmit);
+ document
+ .querySelector("#u-search-btn-close")
+ .addEventListener("click", fn.close, false);
+ document
+ .querySelector("#modal-overlay")
+ .addEventListener("click", fn.close, false);
+ if (!fn.data) {
+ fn.data = await fn.fetchData();
+ }
+ };
+ fn.onSubmit = (event) => {
+ event.preventDefault();
+ let input = event.target.querySelector(".u-search-input");
+ if (input) {
+ fn.queryText = input.value;
+ } else {
+ fn.queryText = event.target.value;
+ }
+
+ if (fn.queryText) {
+ fn.search();
+ }
+ };
+ fn.search = async () => {
+ document.querySelectorAll(".u-search-input").forEach((e) => {
+ e.value = fn.queryText;
+ });
+ document.querySelector("#u-search").style.display = "block";
+ if (!fn.data) {
+ fn.data = await fn.fetchData();
+ }
+ let results = "";
+ results += fn.buildResultList(fn.data.pages);
+ results += fn.buildResultList(fn.data.posts);
+ if (results === "") {
+ results = `${volantis.GLOBAL_CONFIG.languages.search.hits_empty.replace(/\$\{query}/, fn.queryText)}
`
+ }
+ document.querySelector("#u-search .modal-results").innerHTML = results;
+ document.addEventListener("keydown", function f(event) {
+ if (event.code === "Escape") {
+ fn.close();
+ document.removeEventListener("keydown", f);
+ }
+ });
+ };
+ fn.close = () => {
+ document.querySelector("#u-search").style.display = "none";
+ };
+ fn.fetchData = () => {
+ return fetch(volantis.GLOBAL_CONFIG.search.dataPath)
+ .then((response) => response.text())
+ .then((res) => {
+ const data = JSON.parse(res);
+ // console.log(data);
+ return data;
+ });
+ };
+ fn.buildResultList = (data) => {
+ let html = "";
+ data.forEach((post) => {
+ if (post.text) {
+ post.text = post.text.replace(/12345\d*/g, "") // 简易移除代码行号
+ }
+ if (!post.title && post.text) {
+ post.title = post.text.trim().slice(0, 15)
+ }
+ if (fn.contentSearch(post)) {
+ html += fn.buildResult(post.permalink, post.title, post.digest);
+ }
+ });
+ return html;
+ };
+ fn.contentSearch = (post) => {
+ let post_title = post.title.trim().toLowerCase();
+ let post_content = post.text.trim().toLowerCase();
+ let keywords = fn.queryText
+ .trim()
+ .toLowerCase()
+ .split(/[-\s]+/);
+ let foundMatch = false;
+ let index_title = -1;
+ let index_content = -1;
+ let first_occur = -1;
+ if (post_title && post_content) {
+ keywords.forEach((word, index) => {
+ index_title = post_title.indexOf(word);
+ index_content = post_content.indexOf(word);
+ if (index_title < 0 && index_content < 0) {
+ foundMatch = false;
+ } else {
+ foundMatch = true;
+ if (index_content < 0) {
+ index_content = 0;
+ }
+ if (index === 0) {
+ first_occur = index_content;
+ }
+ }
+ if (foundMatch) {
+ post_content = post.text.trim();
+ let start = 0;
+ let end = 0;
+ if (first_occur >= 0) {
+ start = Math.max(first_occur - 40, 0);
+ end =
+ start === 0
+ ? Math.min(200, post_content.length)
+ : Math.min(first_occur + 120, post_content.length);
+ let match_content = post_content.substring(start, end);
+ keywords.forEach(function (keyword) {
+ let regS = new RegExp(keyword, "gi");
+ match_content = match_content.replace(
+ regS,
+ "" + keyword + ""
+ );
+ });
+ post.digest = match_content + "......";
+ } else {
+ end = Math.min(200, post_content.length);
+ post.digest = post_content.trim().substring(0, end);
+ }
+ }
+ });
+ }
+ return foundMatch;
+ };
+ fn.buildResult = (url, title, digest) => {
+ let result = fn.getUrlRelativePath(url);
+ let html = "";
+ html += "";
+ html +=
+ "";
+ html += "" + title + "";
+ if (digest !== "") html += "" + digest + "";
+ html += "";
+ html += "";
+ return html;
+ };
+ fn.getUrlRelativePath = function (url) {
+ let arrUrl = url.split("//");
+ let start = arrUrl[1].indexOf("/");
+ let relUrl = arrUrl[1].substring(start);
+ if (relUrl.indexOf("?") != -1) {
+ relUrl = relUrl.split("?")[0];
+ }
+ return relUrl;
+ };
+ return {
+ init: () => {
+ fn.init();
+ },
+ setQueryText: (queryText) => {
+ fn.queryText = queryText;
+ },
+ search: () => {
+ fn.search();
+ },
+ };
+})();
+Object.freeze(SearchService);
+
+SearchService.init();
diff --git a/js/search/meilisearch.js b/js/search/meilisearch.js
new file mode 100644
index 000000000..1e5aaa737
--- /dev/null
+++ b/js/search/meilisearch.js
@@ -0,0 +1,216 @@
+let SearchService = (() => {
+ const fn = {};
+ let search, meilisearch, timerId;
+ fn.queryText = null;
+ fn.template = `
+ `;
+
+ fn.init = () => {
+ let div = document.createElement("div");
+ div.innerHTML += fn.template;
+ document.body.append(div);
+
+ meilisearch = volantis.GLOBAL_CONFIG.search;
+ if (meilisearch.appId && meilisearch.apiKey && meilisearch.indexName) {
+ fn.event();
+ fn.setAlgolia();
+ } else {
+ document.querySelector('#u-search main.modal-body').innerHTML = 'Algolia setting is invalid!';
+ document.querySelector('#u-search main.modal-body').style.textAlign = 'center';
+ document.querySelector('#u-search .modal').style.maxHeight = '128px';
+ }
+ }
+
+ fn.event = () => {
+ document
+ .querySelector("#u-search-btn-close")
+ .addEventListener("click", fn.close, false);
+ document
+ .querySelector("#modal-overlay")
+ .addEventListener("click", fn.close, false);
+ document.querySelectorAll(".u-search-form").forEach((e) => {
+ e.addEventListener("submit", fn.onSubmit, false);
+ });
+ document.querySelector("#meilisearch-search-input").addEventListener("input", event => {
+ let input = event.target.querySelector(".ais-SearchBox-input");
+ if (input) {
+ fn.queryText = input.value;
+ } else {
+ fn.queryText = event.target.value;
+ }
+ })
+ }
+
+ fn.setAlgolia = () => {
+ search = instantsearch({
+ indexName: meilisearch.indexName,
+ searchClient: instantMeiliSearch(meilisearch.appId, meilisearch.apiKey),
+ searchFunction(helper) {
+ helper.state.query && helper.search()
+ },
+ })
+
+ const configure = instantsearch.widgets.configure({
+ hitsPerPage: meilisearch.hitsPerPage
+ })
+
+ const searchBox = instantsearch.widgets.searchBox({
+ container: '#meilisearch-search-input',
+ autofocus: true,
+ showReset: false,
+ showSubmit: false,
+ showLoadingIndicator: false,
+ searchAsYouType: meilisearch.searchAsYouType,
+ placeholder: meilisearch.placeholder,
+ templates: {
+ input: 'meilisearch-input'
+ },
+ queryHook(query, refine) {
+ clearTimeout(timerId)
+ timerId = setTimeout(() => refine(query), 500)
+ }
+ })
+
+ const hits = instantsearch.widgets.hits({
+ container: '#meilisearch-hits',
+ templates: {
+ item(data) {
+ const keyword = !!fn.queryText ? `?keyword=${fn.queryText}` : ''
+ const link = data.permalink ? data.permalink : `${volantis.GLOBAL_CONFIG.root}${data.path}`
+ const result = data._highlightResult
+ const content = fn.cutContent(result.text.value)
+ return `
+
+ ${result.title.value || 'no-title'}
+ ${content}
+ `
+ },
+ empty: function (data) {
+ return (
+ `${volantis.GLOBAL_CONFIG.languages.search.hits_empty.replace(/\$\{query}/, data.query)}
`
+ )
+ }
+ }
+ })
+
+ const stats = instantsearch.widgets.stats({
+ container: '#meilisearch-info > .meilisearch-stats',
+ templates: {
+ text: function (data) {
+ const stats = volantis.GLOBAL_CONFIG.languages.search.hits_stats
+ .replace(/\$\{hits}/, data.nbHits)
+ .replace(/\$\{time}/, data.processingTimeMS)
+ return (
+ `${stats}`
+ )
+ }
+ }
+ })
+
+ search.addWidgets([searchBox, hits, stats])
+
+ search.start()
+
+ }
+
+ fn.setQueryText = queryText => {
+ fn.queryText = queryText;
+ if (!search) {
+ fn.init()
+ }
+ search?.setUiState({
+ [meilisearch.indexName]: {
+ query: queryText
+ }
+ })
+ }
+
+ fn.search = () => {
+ document.querySelector("#u-search").style.display = "block";
+ document.addEventListener("keydown", event => {
+ if (event.code === "Escape") {
+ fn.close();
+ }
+ }, { once: true })
+ }
+
+ fn.onSubmit = (event) => {
+ event.preventDefault();
+ let input = event.target.querySelector(".u-search-input");
+ fn.setQueryText(input?.value ? input.value : event.target.value)
+ fn.search();
+ };
+
+ fn.cutContent = content => {
+ if (content === '') return ''
+
+ const firstOccur = content.indexOf('')
+
+ let start = firstOccur - 30
+ let end = firstOccur + 120
+ let pre = ''
+ let post = ''
+
+ if (start <= 0) {
+ start = 0
+ end = 140
+ } else {
+ pre = '...'
+ }
+
+ if (end > content.length) {
+ end = content.length
+ } else {
+ post = '...'
+ }
+
+ let matchContent = pre + content.substring(start, end) + post
+ return matchContent
+ }
+
+ fn.close = () => {
+ document.querySelector("#u-search").style.display = "none";
+ };
+
+ return {
+ init: fn.init,
+ setQueryText: queryText => {
+ fn.setQueryText(queryText);
+ },
+ search: fn.search,
+ close: fn.close
+ }
+})()
+
+Object.freeze(SearchService);
+
+SearchService.init();
diff --git a/lib/hbe.js b/lib/hbe.js
new file mode 100644
index 000000000..71205dd75
--- /dev/null
+++ b/lib/hbe.js
@@ -0,0 +1,297 @@
+(() => {
+ 'use strict';
+
+ const cryptoObj = window.crypto || window.msCrypto;
+ const storage = window.localStorage;
+
+ const storageName = 'hexo-blog-encrypt:#' + window.location.pathname;
+ const keySalt = textToArray('hexo-blog-encrypt的作者们都是大帅比!');
+ const ivSalt = textToArray('hexo-blog-encrypt是地表最强Hexo加密插件!');
+
+// As we can't detect the wrong password with AES-CBC,
+// so adding an empty div and check it when decrption.
+const knownPrefix = "";
+
+ const mainElement = document.getElementById('hexo-blog-encrypt');
+ const wrongPassMessage = mainElement.dataset['wpm'];
+ const wrongHashMessage = mainElement.dataset['whm'];
+ const dataElement = mainElement.getElementsByTagName('script')['hbeData'];
+ const encryptedData = dataElement.innerText;
+ const HmacDigist = dataElement.dataset['hmacdigest'];
+
+ function hexToArray(s) {
+ return new Uint8Array(s.match(/[\da-f]{2}/gi).map((h => {
+ return parseInt(h, 16);
+ })));
+ }
+
+ function textToArray(s) {
+ var i = s.length;
+ var n = 0;
+ var ba = new Array()
+
+ for (var j = 0; j < i;) {
+ var c = s.codePointAt(j);
+ if (c < 128) {
+ ba[n++] = c;
+ j++;
+ } else if ((c > 127) && (c < 2048)) {
+ ba[n++] = (c >> 6) | 192;
+ ba[n++] = (c & 63) | 128;
+ j++;
+ } else if ((c > 2047) && (c < 65536)) {
+ ba[n++] = (c >> 12) | 224;
+ ba[n++] = ((c >> 6) & 63) | 128;
+ ba[n++] = (c & 63) | 128;
+ j++;
+ } else {
+ ba[n++] = (c >> 18) | 240;
+ ba[n++] = ((c >> 12) & 63) | 128;
+ ba[n++] = ((c >> 6) & 63) | 128;
+ ba[n++] = (c & 63) | 128;
+ j += 2;
+ }
+ }
+ return new Uint8Array(ba);
+ }
+
+ function arrayBufferToHex(arrayBuffer) {
+ if (typeof arrayBuffer !== 'object' || arrayBuffer === null || typeof arrayBuffer.byteLength !== 'number') {
+ throw new TypeError('Expected input to be an ArrayBuffer')
+ }
+
+ var view = new Uint8Array(arrayBuffer)
+ var result = ''
+ var value
+
+ for (var i = 0; i < view.length; i++) {
+ value = view[i].toString(16)
+ result += (value.length === 1 ? '0' + value : value)
+ }
+
+ return result
+ }
+
+ async function getExecutableScript(oldElem) {
+ let out = document.createElement('script');
+ const attList = ['type', 'text', 'src', 'crossorigin', 'defer', 'referrerpolicy'];
+ attList.forEach((att) => {
+ if (oldElem[att])
+ out[att] = oldElem[att];
+ })
+
+ return out;
+ }
+
+ async function convertHTMLToElement(content) {
+ let out = document.createElement('div');
+ out.innerHTML = content;
+ out.querySelectorAll('script').forEach(async (elem) => {
+ elem.replaceWith(await getExecutableScript(elem));
+ });
+
+ return out;
+ }
+
+ function getKeyMaterial(password) {
+ let encoder = new TextEncoder();
+ return cryptoObj.subtle.importKey(
+ 'raw',
+ encoder.encode(password),
+ {
+ 'name': 'PBKDF2',
+ },
+ false,
+ [
+ 'deriveKey',
+ 'deriveBits',
+ ]
+ );
+ }
+
+ function getHmacKey(keyMaterial) {
+ return cryptoObj.subtle.deriveKey({
+ 'name': 'PBKDF2',
+ 'hash': 'SHA-256',
+ 'salt': keySalt.buffer,
+ 'iterations': 1024
+ }, keyMaterial, {
+ 'name': 'HMAC',
+ 'hash': 'SHA-256',
+ 'length': 256,
+ }, true, [
+ 'verify',
+ ]);
+ }
+
+ function getDecryptKey(keyMaterial) {
+ return cryptoObj.subtle.deriveKey({
+ 'name': 'PBKDF2',
+ 'hash': 'SHA-256',
+ 'salt': keySalt.buffer,
+ 'iterations': 1024,
+ }, keyMaterial, {
+ 'name': 'AES-CBC',
+ 'length': 256,
+ }, true, [
+ 'decrypt',
+ ]);
+ }
+
+ function getIv(keyMaterial) {
+ return cryptoObj.subtle.deriveBits({
+ 'name': 'PBKDF2',
+ 'hash': 'SHA-256',
+ 'salt': ivSalt.buffer,
+ 'iterations': 512,
+ }, keyMaterial, 16 * 8);
+ }
+
+ async function verifyContent(key, content) {
+ const encoder = new TextEncoder();
+ const encoded = encoder.encode(content);
+
+ let signature = hexToArray(HmacDigist);
+
+ const result = await cryptoObj.subtle.verify({
+ 'name': 'HMAC',
+ 'hash': 'SHA-256',
+ }, key, signature, encoded);
+ console.log(`Verification result: ${result}`);
+ if (!result) {
+ alert(wrongHashMessage);
+ console.log(`${wrongHashMessage}, got `, signature, ` but proved wrong.`);
+ }
+ return result;
+ }
+
+ async function decrypt(decryptKey, iv, hmacKey) {
+ let typedArray = hexToArray(encryptedData);
+
+ const result = await cryptoObj.subtle.decrypt({
+ 'name': 'AES-CBC',
+ 'iv': iv,
+ }, decryptKey, typedArray.buffer).then(async (result) => {
+ const decoder = new TextDecoder();
+ const decoded = decoder.decode(result);
+
+ // check the prefix, if not then we can sure here is wrong password.
+ if (!decoded.startsWith(knownPrefix)) {
+ throw "Decode successfully but not start with KnownPrefix.";
+ }
+
+ const hideButton = document.createElement('button');
+ hideButton.textContent = 'Encrypt again';
+ hideButton.type = 'button';
+ hideButton.classList.add("hbe-button");
+ hideButton.addEventListener('click', () => {
+ window.localStorage.removeItem(storageName);
+ window.location.reload();
+ });
+
+ document.getElementById('hexo-blog-encrypt').style.display = 'inline';
+ document.getElementById('hexo-blog-encrypt').innerHTML = '';
+ document.getElementById('hexo-blog-encrypt').appendChild(await convertHTMLToElement(decoded));
+ document.getElementById('hexo-blog-encrypt').appendChild(hideButton);
+
+ // support html5 lazyload functionality.
+ document.querySelectorAll('img').forEach((elem) => {
+ if (elem.getAttribute("data-src") && !elem.src) {
+ elem.src = elem.getAttribute('data-src');
+ }
+ });
+
+ // support theme-next refresh
+ window.NexT && NexT.boot && typeof NexT.boot.refresh === 'function' && NexT.boot.refresh();
+
+ // TOC part
+ var tocDiv = document.getElementById("toc-div");
+ if (tocDiv) {
+ tocDiv.style.display = 'inline';
+ }
+
+ var tocDivs = document.getElementsByClassName('toc-div-class');
+ if (tocDivs && tocDivs.length > 0) {
+ for (var idx = 0; idx < tocDivs.length; idx++) {
+ tocDivs[idx].style.display = 'inline';
+ }
+ }
+
+ // trigger event
+ var event = new Event('hexo-blog-decrypt');
+ window.dispatchEvent(event);
+
+ return await verifyContent(hmacKey, decoded);
+ }).catch((e) => {
+ alert(wrongPassMessage);
+ console.log(e);
+ return false;
+ });
+
+ return result;
+
+ }
+
+ function hbeLoader() {
+
+ const oldStorageData = JSON.parse(storage.getItem(storageName));
+
+ if (oldStorageData) {
+ console.log(`Password got from localStorage(${storageName}): `, oldStorageData);
+
+ const sIv = hexToArray(oldStorageData.iv).buffer;
+ const sDk = oldStorageData.dk;
+ const sHmk = oldStorageData.hmk;
+
+ cryptoObj.subtle.importKey('jwk', sDk, {
+ 'name': 'AES-CBC',
+ 'length': 256,
+ }, true, [
+ 'decrypt',
+ ]).then((dkCK) => {
+ cryptoObj.subtle.importKey('jwk', sHmk, {
+ 'name': 'HMAC',
+ 'hash': 'SHA-256',
+ 'length': 256,
+ }, true, [
+ 'verify',
+ ]).then((hmkCK) => {
+ decrypt(dkCK, sIv, hmkCK).then((result) => {
+ if (!result) {
+ storage.removeItem(storageName);
+ }
+ });
+ });
+ });
+ }
+
+ mainElement.addEventListener('keydown', async (event) => {
+ if (event.isComposing || event.keyCode === 13) {
+ const password = document.getElementById('hbePass').value;
+ const keyMaterial = await getKeyMaterial(password);
+ const hmacKey = await getHmacKey(keyMaterial);
+ const decryptKey = await getDecryptKey(keyMaterial);
+ const iv = await getIv(keyMaterial);
+
+ decrypt(decryptKey, iv, hmacKey).then((result) => {
+ console.log(`Decrypt result: ${result}`);
+ if (result) {
+ cryptoObj.subtle.exportKey('jwk', decryptKey).then((dk) => {
+ cryptoObj.subtle.exportKey('jwk', hmacKey).then((hmk) => {
+ const newStorageData = {
+ 'dk': dk,
+ 'iv': arrayBufferToHex(iv),
+ 'hmk': hmk,
+ };
+ storage.setItem(storageName, JSON.stringify(newStorageData));
+ });
+ });
+ }
+ });
+ }
+ });
+ }
+
+ hbeLoader();
+
+})();
diff --git a/page/2/index.html b/page/2/index.html
new file mode 100644
index 000000000..c402ed5fe
--- /dev/null
+++ b/page/2/index.html
@@ -0,0 +1,5052 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 使用Python脚本自动打卡智慧曲园
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2020
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto算是一个集图床功能与图片展示为一体的项目,同时还提供了注册功能,如果你的服务器带宽允许,你可以邀请小伙伴为你的图片站扩充资源!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PerfDog已经收费,本教程不再更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2 / 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/placeholder b/placeholder
deleted file mode 100644
index e69de29bb..000000000
diff --git a/plugins/aplayer.js b/plugins/aplayer.js
new file mode 100644
index 000000000..a4641ccff
--- /dev/null
+++ b/plugins/aplayer.js
@@ -0,0 +1,176 @@
+"use strict";
+
+/**
+ * 右键音乐
+ * */
+var RightMenuAplayer = function () {
+ var playStatus; // 播放器状态
+ var APlayer = {}; // 右键音乐所控制的播放器
+ var fn = {};
+ fn.checkAPlayer = function () {
+ if (playStatus === undefined || APlayer.player === undefined) {
+ fn.setAPlayerObject();
+ } else if (APlayer.observer === undefined) {
+ fn.setAPlayerObserver();
+ }
+ };
+
+ // 设置全局播放器所对应的 aplyer 对象
+ fn.setAPlayerObject = function () {
+ var meting = document.querySelectorAll('.footer meting-js');
+ if (meting.length == 0) {
+ meting = document.querySelectorAll('meting-js');
+ }
+ APlayer.player = undefined;
+ meting.forEach(function (item, index) {
+ if (item.meta.id == volantis.GLOBAL_CONFIG.plugins.aplayer.id && item.aplayer && APlayer.player === undefined) {
+ APlayer.player = item.aplayer;
+ fn.setAPlayerObserver();
+ fn.updateTitle();
+ }
+ });
+ };
+
+ // 事件监听
+ fn.setAPlayerObserver = function () {
+ try {
+ APlayer.player.on('play', function (e) {
+ fn.updateAPlayerControllerStatus(e);
+ APlayer.status = 'play';
+ });
+ APlayer.player.on('pause', function (e) {
+ fn.updateAPlayerControllerStatus(e);
+ APlayer.status = 'pause';
+ });
+ APlayer.player.on('volumechange', function (e) {
+ fn.onUpdateAPlayerVolume(e);
+ });
+ APlayer.player.on('loadstart', function (e) {
+ fn.updateTitle(e);
+ });
+
+ // 监听音量手势
+ APlayer.volumeBarWrap = document.getElementsByClassName('nav volume')[0].children[0];
+ APlayer.volumeBar = APlayer.volumeBarWrap.children[0];
+ var thumbMove = function thumbMove(e) {
+ fn.updateAPlayerVolume(e);
+ };
+ var thumbUp = function thumbUp(e) {
+ APlayer.volumeBarWrap.classList.remove('aplayer-volume-bar-wrap-active');
+ document.removeEventListener('mouseup', thumbUp);
+ document.removeEventListener('mousemove', thumbMove);
+ fn.updateAPlayerVolume(e);
+ };
+ APlayer.volumeBarWrap.addEventListener('mousedown', function (event) {
+ event.stopPropagation();
+ APlayer.volumeBarWrap.classList.add('aplayer-volume-bar-wrap-active');
+ document.addEventListener('mousemove', thumbMove);
+ document.addEventListener('mouseup', thumbUp);
+ });
+ APlayer.volumeBarWrap.addEventListener('click', function (event) {
+ event.stopPropagation();
+ });
+ fn.updateAPlayerControllerStatus();
+ fn.onUpdateAPlayerVolume();
+ APlayer.observer = true;
+ } catch (error) {
+ console.log(error);
+ APlayer.observer = undefined;
+ }
+ };
+ fn.updateAPlayerVolume = function (e) {
+ var percentage = ((e.clientX || e.changedTouches[0].clientX) - APlayer.volumeBar.getBoundingClientRect().left) / APlayer.volumeBar.clientWidth;
+ percentage = Math.max(percentage, 0);
+ percentage = Math.min(percentage, 1);
+ APlayer.player.volume(percentage);
+ };
+ fn.onUpdateAPlayerVolume = function () {
+ try {
+ APlayer.volumeBar.children[0].style.width = APlayer.player.audio.volume * 100 + '%';
+ } catch (error) {
+ console.log(error);
+ }
+ };
+
+ // 更新控制器状态
+ fn.updateAPlayerControllerStatus = function () {
+ try {
+ if (APlayer.player.audio.paused) {
+ playStatus = 'pause';
+ document.getElementsByClassName('nav toggle')[0].children[0].classList.add('fa-play');
+ document.getElementsByClassName('nav toggle')[0].children[0].classList.remove('fa-pause');
+ } else {
+ playStatus = 'play';
+ document.getElementsByClassName('nav toggle')[0].children[0].classList.remove('fa-play');
+ document.getElementsByClassName('nav toggle')[0].children[0].classList.add('fa-pause');
+ }
+ } catch (error) {
+ console.log(error);
+ }
+ };
+
+ // 播放/暂停
+ fn.aplayerToggle = function () {
+ fn.checkAPlayer();
+ try {
+ APlayer.player.toggle();
+ } catch (error) {
+ console.log(error);
+ }
+ };
+
+ // 上一曲
+ fn.aplayerBackward = function () {
+ fn.checkAPlayer();
+ try {
+ APlayer.player.skipBack();
+ APlayer.player.play();
+ } catch (error) {
+ console.log(error);
+ }
+ };
+
+ // 下一曲
+ fn.aplayerForward = function () {
+ fn.checkAPlayer();
+ try {
+ APlayer.player.skipForward();
+ APlayer.player.play();
+ } catch (error) {
+ console.log(error);
+ }
+ };
+
+ // 调节音量
+ fn.aplayerVolume = function (percent) {
+ fn.checkAPlayer();
+ try {
+ APlayer.player.volume(percent);
+ } catch (error) {
+ console.log(error);
+ }
+ };
+
+ // 更新音乐标题
+ fn.updateTitle = function () {
+ fn.checkAPlayer();
+ try {
+ var index = APlayer.player.list.index;
+ var obj = APlayer.player.list.audios[index];
+ document.getElementsByClassName('nav music-title')[0].innerHTML = obj.title;
+ } catch (error) {
+ //console.log(error);
+ }
+ };
+ return {
+ checkAPlayer: fn.checkAPlayer,
+ aplayerBackward: fn.aplayerBackward,
+ aplayerToggle: fn.aplayerToggle,
+ aplayerForward: fn.aplayerForward,
+ APlayer: APlayer
+ };
+}();
+Object.freeze(RightMenuAplayer);
+volantis.requestAnimationFrame(function () {
+ RightMenuAplayer.checkAPlayer();
+});
\ No newline at end of file
diff --git a/plugins/parallax.js b/plugins/parallax.js
new file mode 100644
index 000000000..02a9d54ba
--- /dev/null
+++ b/plugins/parallax.js
@@ -0,0 +1,154 @@
+"use strict";
+
+var Parallax = {};
+Parallax.options = {};
+Parallax.options.speed = 0.25;
+Parallax.options.zIndex = -100;
+Parallax.options.fade = 1500;
+Parallax.slidein = function () {
+ var slider = Parallax.mirrors[0].slider;
+ if (Parallax.mirrors.length >= 2) {
+ slider = Parallax.mirrors[1].slider;
+ }
+ var opac = parseFloat(slider.style.opacity);
+ if (opac !== 1) {
+ if (Parallax.mirrors.length >= 2) {
+ opac = opac + 0.1;
+ slider.style.opacity = opac;
+ setTimeout(Parallax.slidein, Parallax.options.fade / 10);
+ } else {
+ slider.style.opacity = 1;
+ }
+ } else {
+ if (Parallax.mirrors.length >= 2) {
+ Parallax.mirrors[0].mirror.remove();
+ Parallax.mirrors.shift();
+ }
+ }
+};
+Parallax.start = function () {
+ var mirror = document.createElement("div");
+ mirror.classList.add("parallax-mirror");
+ mirror.style.visibility = "hidden";
+ mirror.style.zIndex = Parallax.options.zIndex;
+ mirror.style.position = "fixed";
+ mirror.style.top = 0;
+ mirror.style.left = 0;
+ mirror.style.overflow = "hidden";
+ Parallax.window.appendChild(mirror);
+ var slider = document.createElement("img");
+ slider.src = Parallax.options.src;
+ slider.alt = "parallax";
+ slider.classList.add("parallax-slider");
+ slider.style.opacity = 0;
+ mirror.appendChild(slider);
+ if (!Parallax.mirrors) {
+ Parallax.mirrors = [];
+ }
+ var mirrorItem = {};
+ mirrorItem.mirror = mirror;
+ mirrorItem.slider = slider;
+ Parallax.mirrors.push(mirrorItem);
+ Parallax.slidein();
+ slider.addEventListener("load", function () {
+ Parallax.update();
+ }, false);
+};
+Parallax.init = function () {
+ function loadDimensions() {
+ Parallax.wH = document.documentElement.clientHeight;
+ Parallax.wW = document.documentElement.clientWidth;
+ }
+ function getScrollTop() {
+ var scrollPos;
+ if (window.pageYOffset) {
+ scrollPos = window.pageYOffset;
+ } else if (document.compatMode && document.compatMode != "BackCompat") {
+ scrollPos = document.documentElement.scrollTop;
+ } else if (document.body) {
+ scrollPos = document.body.scrollTop;
+ }
+ return scrollPos;
+ }
+ function loadScrollPosition() {
+ var winScrollTop = getScrollTop();
+ Parallax.sT = Math.max(0, winScrollTop);
+ Parallax.sL = Math.max(0, document.body.scrollLeft);
+ Parallax.overScroll = Math.min(winScrollTop, 0);
+ }
+ window.addEventListener("resize", function () {
+ loadDimensions();
+ Parallax.update();
+ }, false);
+ loadDimensions();
+ var lastPosition = -1;
+ (function loop() {
+ var yoffset = getScrollTop();
+ if (lastPosition !== yoffset) {
+ lastPosition = yoffset;
+ loadScrollPosition();
+ Parallax.update();
+ }
+ window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame;
+ window.requestAnimationFrame(loop);
+ })();
+};
+Parallax.refreshItem = function (slider) {
+ Parallax.options.aspectRatio = slider.naturalWidth / (slider.naturalHeight || 1);
+ var aspect = Parallax.options.aspectRatio || 1;
+ Parallax.options.boxWidth = Parallax.window.clientWidth;
+ Parallax.options.boxHeight = Parallax.window.clientHeight;
+ Parallax.options.boxOffsetTop = Parallax.window.scrollTop;
+ Parallax.options.boxOffsetLeft = Parallax.window.scrollLeft;
+ Parallax.options.boxOffsetBottom = Parallax.options.boxOffsetTop + Parallax.options.boxHeight;
+ var winHeight = Parallax.wH;
+ var maxOffset = Parallax.options.boxOffsetTop;
+ var minOffset = Math.max(Parallax.options.boxOffsetTop + Parallax.options.boxHeight - winHeight, 0);
+ var imageHeightMin = Parallax.options.boxHeight + (maxOffset - minOffset) * (1 - Parallax.options.speed) | 0;
+ var imageOffsetMin = (Parallax.options.boxOffsetTop - maxOffset) * (1 - Parallax.options.speed) | 0;
+ var margin;
+ if (Parallax.options.boxWidth < imageHeightMin * aspect) {
+ Parallax.options.imageWidth = imageHeightMin * aspect | 0;
+ Parallax.options.imageHeight = imageHeightMin;
+ Parallax.options.offsetBaseTop = imageOffsetMin;
+ margin = Parallax.options.imageWidth - Parallax.options.boxWidth;
+ Parallax.options.offsetLeft = -margin / 2 | 0;
+ } else {
+ Parallax.options.imageWidth = Parallax.options.boxWidth;
+ Parallax.options.imageHeight = Parallax.options.boxWidth / aspect | 0;
+ Parallax.options.offsetLeft = 0;
+ margin = Parallax.options.imageHeight - imageHeightMin;
+ Parallax.options.offsetBaseTop = imageOffsetMin - margin / 2 | 0;
+ }
+};
+Parallax.renderItem = function (mirror, slider) {
+ var scrollTop = Parallax.sT;
+ var scrollLeft = Parallax.sL;
+ var scrollBottom = scrollTop + Parallax.wH;
+ if (Parallax.options.boxOffsetBottom > scrollTop && Parallax.options.boxOffsetTop <= scrollBottom) {
+ Parallax.options.visibility = "visible";
+ Parallax.options.mirrorTop = Parallax.options.boxOffsetTop - scrollTop;
+ Parallax.options.mirrorLeft = Parallax.options.boxOffsetLeft - scrollLeft;
+ Parallax.options.offsetTop = Parallax.options.offsetBaseTop - Parallax.options.mirrorTop * (1 - Parallax.options.speed);
+ } else {
+ Parallax.options.visibility = "hidden";
+ }
+ mirror.style.transform = "translate3d(" + Parallax.options.mirrorLeft + "px, " + Parallax.options.mirrorTop + "px, 0px)";
+ mirror.style.visibility = Parallax.options.visibility;
+ mirror.style.height = Parallax.options.boxHeight + "px";
+ mirror.style.width = Parallax.options.boxWidth + "px";
+ slider.style.transform = "translate3d(" + Parallax.options.offsetLeft + "px, " + Parallax.options.offsetTop + "px, 0px)";
+ slider.style.position = "absolute";
+ slider.style.height = Parallax.options.imageHeight + "px";
+ slider.style.width = Parallax.options.imageWidth + "px";
+ slider.style.maxWidth = "none";
+};
+Parallax.update = function () {
+ if (!Parallax.mirrors) {
+ return;
+ }
+ Parallax.mirrors.forEach(function (e) {
+ Parallax.refreshItem(e.slider);
+ Parallax.renderItem(e.mirror, e.slider);
+ });
+};
\ No newline at end of file
diff --git a/plugins/rightMenus.js b/plugins/rightMenus.js
new file mode 100644
index 000000000..7d7d7e483
--- /dev/null
+++ b/plugins/rightMenus.js
@@ -0,0 +1,630 @@
+"use strict";
+
+function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
+function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+var RightMenus = {
+ defaultEvent: ['copyText', 'copyLink', 'copyPaste', 'copyAll', 'copyCut', 'copyImg', 'printMode', 'readMode'],
+ defaultGroup: ['navigation', 'inputBox', 'seletctText', 'elementCheck', 'elementImage', 'articlePage'],
+ messageRightMenu: volantis.GLOBAL_CONFIG.plugins.message.enable && volantis.GLOBAL_CONFIG.plugins.message.rightmenu.enable,
+ corsAnywhere: volantis.GLOBAL_CONFIG.plugins.rightmenus.options.corsAnywhere,
+ urlRegx: /^((https|http)?:\/\/)+[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
+ imgRegx: /\.(jpe?g|png|webp|svg|gif|jifi)(-|_|!|\?|\/)?.*$/,
+ /**
+ * 加载右键菜单
+ */
+ initialMenu: function initialMenu() {
+ RightMenus.fun.init();
+ },
+ /**
+ * 读取剪切板
+ * @returns text
+ */
+ readClipboard: function () {
+ var _readClipboard = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
+ var clipboardText, result;
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
+ while (1) switch (_context.prev = _context.next) {
+ case 0:
+ _context.next = 2;
+ return navigator.permissions.query({
+ name: 'clipboard-read'
+ });
+ case 2:
+ result = _context.sent;
+ _context.t0 = result.state;
+ _context.next = _context.t0 === 'granted' ? 6 : _context.t0 === 'prompt' ? 6 : 10;
+ break;
+ case 6:
+ _context.next = 8;
+ return navigator.clipboard.readText();
+ case 8:
+ clipboardText = _context.sent;
+ return _context.abrupt("break", 12);
+ case 10:
+ window.clipboardRead = false;
+ return _context.abrupt("break", 12);
+ case 12:
+ return _context.abrupt("return", clipboardText);
+ case 13:
+ case "end":
+ return _context.stop();
+ }
+ }, _callee);
+ }));
+ function readClipboard() {
+ return _readClipboard.apply(this, arguments);
+ }
+ return readClipboard;
+ }(),
+ /**
+ * 写入文本到剪切板
+ * @param {String} text
+ */
+ writeClipText: function writeClipText(text) {
+ return navigator.clipboard.writeText(text).then(function () {
+ return Promise.resolve();
+ })["catch"](function (err) {
+ return Promise.reject(err);
+ });
+ },
+ /**
+ * 写入图片到剪切板
+ * @param {*} link
+ * @param {*} success
+ * @param {*} error
+ */
+ writeClipImg: function () {
+ var _writeClipImg = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(link, success, error) {
+ var image;
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
+ while (1) switch (_context2.prev = _context2.next) {
+ case 0:
+ image = new Image();
+ image.crossOrigin = "Anonymous";
+ image.addEventListener('load', function () {
+ var canvas = document.createElement("canvas");
+ var context = canvas.getContext("2d");
+ canvas.width = image.width;
+ canvas.height = image.height;
+ context.drawImage(image, 0, 0);
+ canvas.toBlob(function (blob) {
+ navigator.clipboard.write([new ClipboardItem({
+ 'image/png': blob
+ })]).then(function (e) {
+ success(e);
+ })["catch"](function (e) {
+ error(e);
+ });
+ }, 'image/png');
+ }, false);
+ image.src = "".concat(link, "?(lll\uFFE2\u03C9\uFFE2)");
+ case 4:
+ case "end":
+ return _context2.stop();
+ }
+ }, _callee2);
+ }));
+ function writeClipImg(_x, _x2, _x3) {
+ return _writeClipImg.apply(this, arguments);
+ }
+ return writeClipImg;
+ }(),
+ /**
+ * 粘贴文本到剪切板
+ * @param {*} elemt
+ * @param {*} value
+ */
+ insertAtCaret: function insertAtCaret(elemt, value) {
+ var startPos = elemt.selectionStart,
+ endPos = elemt.selectionEnd;
+ if (document.selection) {
+ elemt.focus();
+ var sel = document.selection.createRange();
+ sel.text = value;
+ elemt.focus();
+ } else {
+ if (startPos || startPos == '0') {
+ var scrollTop = elemt.scrollTop;
+ elemt.value = elemt.value.substring(0, startPos) + value + elemt.value.substring(endPos, elemt.value.length);
+ elemt.focus();
+ elemt.selectionStart = startPos + value.length;
+ elemt.selectionEnd = startPos + value.length;
+ elemt.scrollTop = scrollTop;
+ } else {
+ elemt.value += value;
+ elemt.focus();
+ }
+ }
+ }
+};
+
+/**
+ * 事件处理区域
+ */
+RightMenus.fun = function () {
+ var rightMenuConfig = volantis.GLOBAL_CONFIG.plugins.rightmenus;
+ var fn = {},
+ _rightMenuWrapper = document.getElementById('rightmenu-wrapper'),
+ _rightMenuContent = document.getElementById('rightmenu-content'),
+ _rightMenuList = document.querySelectorAll('#rightmenu-content li.menuLoad-Content'),
+ _rightMenuListWithHr = document.querySelectorAll('#rightmenu-content li, #rightmenu-content hr, #menuMusic'),
+ _readBkg = document.getElementById('read_bkg'),
+ _menuMusic = document.getElementById('menuMusic'),
+ _backward = document.querySelector('#menuMusic .backward'),
+ _toggle = document.querySelector('#menuMusic .toggle'),
+ _forward = document.querySelector('#menuMusic .forward');
+
+ // 公共数据
+ var globalData = {
+ mouseEvent: null,
+ isInputBox: false,
+ selectText: '',
+ inputValue: '',
+ isLink: false,
+ linkUrl: '',
+ isMediaLink: false,
+ mediaLinkUrl: '',
+ isImage: false,
+ isArticle: false,
+ pathName: '',
+ isReadClipboard: true,
+ isShowMusic: false,
+ statusCheck: false
+ };
+ var globalDataBackup = Object.assign({}, globalData);
+
+ /**
+ * 初始化监听事件处理
+ */
+ fn.initEvent = function () {
+ fn.elementAppend();
+ fn.contextmenu();
+ fn.menuEvent();
+ };
+
+ /**
+ * 预置元素设定
+ */
+ fn.elementAppend = function () {
+ // 阅读模式
+ if (_readBkg) _readBkg.parentNode.removeChild(_readBkg);
+ var readBkg = document.createElement("div");
+ readBkg.className = "common_read_bkg common_read_hide";
+ readBkg.id = "read_bkg";
+ window.document.body.appendChild(readBkg);
+ };
+
+ /**
+ * 右键菜单位置设定
+ * @param {*} event
+ */
+ fn.menuPosition = function (event) {
+ try {
+ var mouseClientX = event.clientX;
+ var mouseClientY = event.clientY;
+ var screenWidth = document.documentElement.clientWidth || document.body.clientWidth;
+ var screenHeight = document.documentElement.clientHeight || document.body.clientHeight;
+ _rightMenuWrapper.style.display = 'block';
+ fn.menuControl(event);
+ var menuWidth = _rightMenuContent.offsetWidth;
+ var menuHeight = _rightMenuContent.offsetHeight;
+ var showLeft = mouseClientX + menuWidth > screenWidth ? mouseClientX - menuWidth + 10 : mouseClientX;
+ var showTop = mouseClientY + menuHeight > screenHeight ? mouseClientY - menuHeight + 10 : mouseClientY;
+ showTop = mouseClientY + menuHeight > screenHeight && showTop < menuHeight && mouseClientY < menuHeight ? showTop + (screenHeight - menuHeight - showTop - 10) : showTop;
+ _rightMenuWrapper.style.left = "".concat(showLeft, "px");
+ _rightMenuWrapper.style.top = "".concat(showTop, "px");
+ if (volantis.GLOBAL_CONFIG.plugins.message.rightmenu.notice) fn.menuNotic();
+ } catch (error) {
+ console.error(error);
+ fn.hideMenu();
+ return true;
+ }
+ return false;
+ };
+
+ /**
+ * 菜单项控制
+ * @param {*} event
+ */
+ fn.menuControl = function (event) {
+ fn.globalDataSet(event);
+ if (!!_menuMusic) _menuMusic.style.display = globalData.isShowMusic ? 'block' : 'none';
+ _rightMenuList.forEach(function (item) {
+ item.style.display = 'none';
+ var nodeName = item.firstElementChild.nodeName;
+ var groupName = item.firstElementChild.getAttribute('data-group');
+ var itemEvent = item.firstElementChild.getAttribute('data-event');
+ if (globalData.statusCheck || globalData.isArticle) {
+ switch (groupName) {
+ case 'inputBox':
+ if (globalData.isInputBox) {
+ item.style.display = 'block';
+ if (itemEvent === 'copyCut' && !globalData.selectText) item.style.display = 'none';
+ if (itemEvent === 'copyAll' && !globalData.inputValue) item.style.display = 'none';
+ if (itemEvent === 'copyPaste' && !globalData.isReadClipboard) item.style.display = 'none';
+ }
+ break;
+ case 'seletctText':
+ if (!!globalData.selectText) item.style.display = 'block';
+ break;
+ case 'elementCheck':
+ if (globalData.isLink || globalData.isMediaLink) item.style.display = 'block';
+ break;
+ case 'elementImage':
+ if (globalData.isImage) item.style.display = 'block';
+ break;
+ case 'articlePage':
+ if (globalData.isArticle) item.style.display = 'block';
+ break;
+ default:
+ item.style.display = nodeName === 'A' ? globalData.isArticle && !globalData.statusCheck && rightMenuConfig.options.articleShowLink ? 'block' : 'none' : 'block';
+ break;
+ }
+ } else if (nodeName === 'A' || RightMenus.defaultGroup.every(function (item) {
+ return groupName !== item;
+ })) {
+ item.style.display = 'block';
+ }
+ });
+
+ // 执行外部事件
+ volantis.mouseEvent = event;
+ volantis.rightmenu.method.handle.start();
+
+ // 过滤 HR 元素
+ var elementHrItem = {
+ item: null,
+ hide: true
+ };
+ _rightMenuListWithHr.forEach(function (item) {
+ if (item.nodeName === "HR") {
+ item.style.display = 'block';
+ if (!elementHrItem.item) {
+ elementHrItem.item = item;
+ return;
+ }
+ if (elementHrItem.hide || elementHrItem.item.nextElementSibling.nodeName === "hr") {
+ elementHrItem.item.style.display = 'none';
+ }
+ elementHrItem.item = item;
+ elementHrItem.hide = true;
+ } else {
+ if (item.style.display === 'block' && elementHrItem.hide) {
+ elementHrItem.hide = false;
+ }
+ }
+ });
+ if (!!elementHrItem.item && elementHrItem.hide) elementHrItem.item.style.display = 'none';
+ };
+
+ /**
+ * 元素状态判断/全局数据设置
+ * @param {*} event
+ */
+ fn.globalDataSet = function (event) {
+ var _volantis$GLOBAL_CONF;
+ globalData = Object.assign({}, globalDataBackup);
+ globalData.mouseEvent = event;
+ globalData.selectText = window.getSelection().toString();
+
+ // 判断是否为输入框
+ if (event.target.tagName.toLowerCase() === 'input' || event.target.tagName.toLowerCase() === 'textarea') {
+ globalData.isInputBox = true;
+ globalData.inputValue = event.target.value;
+ }
+
+ // 判断是否允许读取剪切板
+ if (globalData.isInputBox && window.clipboardRead === false) {
+ globalData.isReadClipboard = false;
+ }
+
+ // 判断是否包含链接
+ if (!!event.target.href && RightMenus.urlRegx.test(event.target.href)) {
+ globalData.isLink = true;
+ globalData.linkUrl = event.target.href;
+ }
+
+ // 判断是否包含媒体链接
+ if (!!event.target.currentSrc && RightMenus.urlRegx.test(event.target.currentSrc)) {
+ globalData.isMediaLink = true;
+ globalData.mediaLinkUrl = event.target.currentSrc;
+ }
+
+ // 判断是否为图片地址
+ if (globalData.isMediaLink && RightMenus.imgRegx.test(globalData.mediaLinkUrl)) {
+ globalData.isImage = true;
+ }
+
+ // 判断是否为文章页面
+ if (!!(document.querySelector('#post.article') || null)) {
+ globalData.isArticle = true;
+ globalData.pathName = window.location.pathname;
+ }
+
+ // 判断是否显示音乐控制器
+ if ((_volantis$GLOBAL_CONF = volantis.GLOBAL_CONFIG.plugins.aplayer) !== null && _volantis$GLOBAL_CONF !== void 0 && _volantis$GLOBAL_CONF.enable && typeof RightMenuAplayer !== 'undefined' && RightMenuAplayer.APlayer.player !== undefined) {
+ if (rightMenuConfig.options.musicAlwaysShow || RightMenuAplayer.APlayer.status === 'play' || RightMenuAplayer.APlayer.status === 'undefined') {
+ globalData.isShowMusic = true;
+ }
+ }
+
+ // 设定校验状态
+ if (!!globalData.selectText || globalData.isInputBox || globalData.isLink || globalData.isMediaLink) {
+ globalData.statusCheck = true;
+ }
+ };
+
+ /**
+ * 全局右键监听函数
+ */
+ fn.contextmenu = function () {
+ window.document.oncontextmenu = function (event) {
+ if (event.ctrlKey || document.body.offsetWidth <= 500) {
+ fn.hideMenu();
+ return true;
+ }
+ return fn.menuPosition(event);
+ };
+ _rightMenuWrapper.oncontextmenu = function (event) {
+ event.stopPropagation();
+ event.preventDefault();
+ return false;
+ };
+ window.removeEventListener('blur', fn.hideMenu);
+ window.addEventListener('blur', fn.hideMenu);
+ document.body.removeEventListener('click', fn.hideMenu);
+ document.body.addEventListener('click', fn.hideMenu);
+ };
+
+ /**
+ * 菜单项事件处理函数
+ */
+ fn.menuEvent = function () {
+ _rightMenuList.forEach(function (item) {
+ var eventName = item.firstElementChild.getAttribute('data-event');
+ var id = item.firstElementChild.getAttribute('id');
+ var groupName = item.firstElementChild.getAttribute('data-group');
+ if (item.firstElementChild.nodeName === "A") return;
+ item.addEventListener('click', function () {
+ try {
+ if (RightMenus.defaultEvent.every(function (item) {
+ return eventName !== item;
+ })) {
+ if (groupName === 'seletctText') {
+ RightMenusFunction[id](globalData.selectText);
+ } else if (groupName === 'elementCheck') {
+ RightMenusFunction[id](globalData.isLink ? globalData.linkUrl : globalData.mediaLinkUrl);
+ } else if (groupName === 'elementImage') {
+ RightMenusFunction[id](globalData.mediaLinkUrl);
+ } else {
+ RightMenusFunction[id]();
+ }
+ } else {
+ fn[eventName]();
+ }
+ } catch (error) {
+ if (volantis.GLOBAL_CONFIG.debug === "rightMenus") {
+ console.error({
+ id: id,
+ error: error,
+ globalData: globalData,
+ groupName: groupName,
+ eventName: eventName
+ });
+ }
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.message('错误提示', error, {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ time: '15000'
+ });
+ }
+ }
+ });
+ });
+ if (_forward && _toggle && _forward) {
+ _backward.onclick = function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ RightMenuAplayer.aplayerBackward();
+ };
+ _toggle.onclick = function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ RightMenuAplayer.aplayerToggle();
+ };
+ _forward.onclick = function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ RightMenuAplayer.aplayerForward();
+ };
+ }
+ };
+
+ /**
+ * 隐藏菜单显示
+ */
+ fn.hideMenu = function () {
+ _rightMenuWrapper.style.display = null;
+ _rightMenuWrapper.style.left = null;
+ _rightMenuWrapper.style.top = null;
+ };
+
+ /**
+ * 右键菜单覆盖提示
+ */
+ fn.menuNotic = function () {
+ var NoticeRightMenu = localStorage.getItem('NoticeRightMenu') === 'true';
+ if (RightMenus.messageRightMenu && !NoticeRightMenu) VolantisApp.message('右键菜单', '唤醒原系统菜单请使用:Ctrl + 右键', {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ displayMode: 1,
+ time: 9000
+ }, function () {
+ localStorage.setItem('NoticeRightMenu', 'true');
+ });
+ };
+ fn.copyText = function () {
+ VolantisApp.utilWriteClipText(globalData.selectText).then(function () {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.messageCopyright();
+ }
+ })["catch"](function (e) {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.message('系统提示', e, {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ displayMode: 1,
+ time: 9000
+ });
+ }
+ });
+ };
+ fn.copyLink = function () {
+ VolantisApp.utilWriteClipText(globalData.linkUrl || globalData.mediaLinkUrl).then(function () {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.messageCopyright();
+ }
+ })["catch"](function (e) {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.message('系统提示', e, {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ displayMode: 1,
+ time: 9000
+ });
+ }
+ });
+ };
+ fn.copyAll = function () {
+ globalData.mouseEvent.target.select();
+ };
+ fn.copyPaste = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
+ var result;
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
+ while (1) switch (_context3.prev = _context3.next) {
+ case 0:
+ _context3.next = 2;
+ return RightMenus.readClipboard();
+ case 2:
+ _context3.t0 = _context3.sent;
+ if (_context3.t0) {
+ _context3.next = 5;
+ break;
+ }
+ _context3.t0 = '';
+ case 5:
+ result = _context3.t0;
+ if (RightMenus.messageRightMenu && window.clipboardRead === false) {
+ VolantisApp.message('系统提示', '未授予剪切板读取权限!');
+ } else if (RightMenus.messageRightMenu && result === '') {
+ VolantisApp.message('系统提示', '仅支持复制文本内容!');
+ } else {
+ RightMenus.insertAtCaret(globalData.mouseEvent.target, result);
+ }
+ case 7:
+ case "end":
+ return _context3.stop();
+ }
+ }, _callee3);
+ }));
+ fn.copyCut = function () {
+ var statrPos = globalData.mouseEvent.target.selectionStart;
+ var endPos = globalData.mouseEvent.target.selectionEnd;
+ var inputStr = globalData.inputValue;
+ fn.copyText(globalData.selectText);
+ globalData.mouseEvent.target.value = inputStr.substring(0, statrPos) + inputStr.substring(endPos, inputStr.length);
+ globalData.mouseEvent.target.selectionStart = statrPos;
+ globalData.mouseEvent.target.selectionEnd = statrPos;
+ globalData.mouseEvent.target.focus();
+ };
+ fn.copyImg = function () {
+ if (volantis.GLOBAL_CONFIG.plugins.message.rightmenu.notice) {
+ VolantisApp.message('系统提示', '复制中,请等待。', {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-images'
+ });
+ }
+ RightMenus.writeClipImg(globalData.mediaLinkUrl, function (e) {
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.hideMessage();
+ VolantisApp.message('系统提示', '图片复制成功!', {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-images'
+ });
+ }
+ }, function (e) {
+ console.error(e);
+ if (RightMenus.messageRightMenu) {
+ VolantisApp.hideMessage();
+ VolantisApp.message('系统提示', '复制失败:' + e, {
+ icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red',
+ time: 9000
+ });
+ }
+ });
+ };
+ fn.printMode = function () {
+ if (window.location.pathname === globalData.pathName) {
+ if (RightMenus.messageRightMenu) {
+ var message = '是否打印当前页面?
建议打印时勾选背景图形
';
+ VolantisApp.question('', message, {
+ time: 9000
+ }, function () {
+ fn.printHtml();
+ });
+ } else {
+ fn.printHtml();
+ }
+ }
+ };
+ fn.printHtml = function () {
+ if (volantis.isReadModel) fn.readMode();
+ DOMController.setAttribute('details', 'open', 'true');
+ DOMController.removeList(['.cus-article-bkg', '.iziToast-overlay', '.iziToast-wrapper', '.prev-next', 'footer', '#l_header', '#l_cover', '#l_side', '#comments', '#s-top', '#BKG', '#rightmenu-wrapper', '.nav-tabs', '.parallax-mirror', '.new-meta-item.share', '.new-meta-box', 'button.btn-copy', 'iframe']);
+ DOMController.setStyleList([['body', 'backgroundColor', 'unset'], ['#l_main, .copyright.license', 'width', '100%'], ['#post', 'boxShadow', 'none'], ['#post', 'background', 'none'], ['#post', 'padding', '0'], ['h1', 'textAlign', 'center'], ['h1', 'fontWeight', '600'], ['h1', 'fontSize', '2rem'], ['h1', 'marginBottom', '20px'], ['.tab-pane', 'display', 'block'], ['.tab-content', 'borderTop', 'none'], ['.highlight>table pre', 'whiteSpace', 'pre-wrap'], ['.highlight>table pre', 'wordBreak', 'break-all'], ['.fancybox img', 'height', 'auto'], ['.fancybox img', 'weight', 'auto'], ['.copyright.license', 'margin', '0'], ['.copyright.license', 'padding', '1.25em 20px'], ['figure.highlight, .copyright.license', 'display', 'inline-block']]);
+ setTimeout(function () {
+ window.print();
+ document.body.innerHTML = '';
+ window.location.reload();
+ }, 50);
+ };
+ fn.readMode = function () {
+ if (typeof ScrollReveal === 'function') ScrollReveal().clean('#comments');
+ DOMController.setStyle('#l_header', 'opacity', 0);
+ DOMController.fadeToggleList([document.querySelector('#l_cover'), document.querySelector('footer'), document.querySelector('#s-top'), document.querySelector('.article-meta#bottom'), document.querySelector('.prev-next'), document.querySelector('#l_side'), document.querySelector('#comments')]);
+ DOMController.toggleClassList([[document.querySelector('#l_main'), 'common_read'], [document.querySelector('#l_main'), 'common_read_main'], [document.querySelector('#l_body'), 'common_read'], [document.querySelector('#safearea'), 'common_read'], [document.querySelector('#read_bkg'), 'common_read_hide'], [document.querySelector('h1'), 'common_read_h1'], [document.querySelector('#post'), 'post_read'], [document.querySelector('#l_cover'), 'read_cover'], [document.querySelector('.widget.toc-wrapper'), 'post_read']]);
+ DOMController.setStyle('.copyright.license', 'margin', '15px 0');
+ volantis.isReadModel = volantis.isReadModel === undefined ? true : !volantis.isReadModel;
+ if (volantis.isReadModel) {
+ if (RightMenus.messageRightMenu) VolantisApp.message('系统提示', '阅读模式已开启,您可以点击屏幕空白处退出。', {
+ backgroundColor: 'var(--color-read-post)',
+ icon: rightMenuConfig.options.iconPrefix + ' fa-book-reader',
+ displayMode: 1,
+ time: 5000
+ });
+ document.querySelector('#l_body').removeEventListener('click', fn.readMode);
+ document.querySelector('#l_body').addEventListener('click', function (event) {
+ if (DOMController.hasClass(event.target, 'common_read')) {
+ fn.readMode();
+ }
+ });
+ } else {
+ document.querySelector('#l_body').removeEventListener('click', fn.readMode);
+ document.querySelector('#post').removeEventListener('click', fn.readMode);
+ DOMController.setStyle('.prev-next', 'display', 'flex');
+ DOMController.setStyle('.copyright.license', 'margin', '15px -40px');
+ }
+ };
+ return {
+ init: fn.initEvent,
+ hideMenu: fn.hideMenu,
+ readMode: fn.readMode
+ };
+}();
+Object.freeze(RightMenus);
+volantis.requestAnimationFrame(function () {
+ if (document.readyState !== 'loading') {
+ RightMenus.initialMenu();
+ } else {
+ document.addEventListener("DOMContentLoaded", function () {
+ RightMenus.initialMenu();
+ });
+ }
+});
\ No newline at end of file
diff --git a/plugins/tags/contributors.js b/plugins/tags/contributors.js
new file mode 100644
index 000000000..28f69a739
--- /dev/null
+++ b/plugins/tags/contributors.js
@@ -0,0 +1,87 @@
+"use strict";
+
+var ContributorsJS = {
+ requestAPI: function requestAPI(url, callback, timeout) {
+ var retryTimes = 5;
+ function request() {
+ return new Promise(function (resolve, reject) {
+ var status = 0; // 0 等待 1 完成 2 超时
+ var timer = setTimeout(function () {
+ if (status === 0) {
+ status = 2;
+ timer = null;
+ reject('请求超时');
+ if (retryTimes == 0) {
+ timeout();
+ }
+ }
+ }, 5000);
+ fetch(url).then(function (response) {
+ if (status !== 2) {
+ clearTimeout(timer);
+ resolve(response);
+ timer = null;
+ status = 1;
+ }
+ if (response.ok) {
+ return response.json();
+ }
+ throw new Error('Network response was not ok.');
+ }).then(function (data) {
+ retryTimes = 0;
+ callback(data);
+ })["catch"](function (error) {
+ if (retryTimes > 0) {
+ retryTimes -= 1;
+ setTimeout(function () {
+ request();
+ }, 5000);
+ } else {
+ timeout();
+ }
+ });
+ });
+ }
+ request();
+ },
+ layout: function layout(cfg) {
+ var el = cfg.el;
+ ContributorsJS.requestAPI(cfg.api, function (data) {
+ el.querySelector('.loading-wrap').remove();
+ var cellALL = "";
+ (data || []).forEach(function (item, i) {
+ var user = '';
+ cellALL += user;
+ });
+ el.querySelector('.group-body').innerHTML = cellALL;
+ }, function () {
+ try {
+ el.querySelector('.loading-wrap svg').remove();
+ el.querySelector('.loading-wrap p').innerText('加载失败,请稍后重试。');
+ } catch (e) {}
+ });
+ },
+ start: function start() {
+ var els = document.getElementsByClassName('contributorsjs-wrap');
+ for (var i = 0; i < els.length; i++) {
+ var el = els[i];
+ var api = el.getAttribute('api');
+ if (api == null) {
+ continue;
+ }
+ var cfg = new Object();
+ cfg.el = el;
+ cfg.api = api;
+ cfg["class"] = el.getAttribute('class');
+ cfg.avatar = volantis.GLOBAL_CONFIG["default"].avatar;
+ ContributorsJS.layout(cfg);
+ }
+ }
+};
+ContributorsJS.start();
\ No newline at end of file
diff --git a/plugins/tags/friends.js b/plugins/tags/friends.js
new file mode 100644
index 000000000..9ec2e42e7
--- /dev/null
+++ b/plugins/tags/friends.js
@@ -0,0 +1,88 @@
+"use strict";
+
+var FriendsJS = {
+ requestAPI: function requestAPI(url, callback, timeout) {
+ var retryTimes = 5;
+ function request() {
+ return new Promise(function (resolve, reject) {
+ var status = 0; // 0 等待 1 完成 2 超时
+ var timer = setTimeout(function () {
+ if (status === 0) {
+ status = 2;
+ timer = null;
+ reject('请求超时');
+ if (retryTimes == 0) {
+ timeout();
+ }
+ }
+ }, 5000);
+ fetch(url).then(function (response) {
+ if (status !== 2) {
+ clearTimeout(timer);
+ resolve(response);
+ timer = null;
+ status = 1;
+ }
+ if (response.ok) {
+ return response.json();
+ }
+ throw new Error('Network response was not ok.');
+ }).then(function (data) {
+ retryTimes = 0;
+ callback(data);
+ })["catch"](function (error) {
+ if (retryTimes > 0) {
+ retryTimes -= 1;
+ setTimeout(function () {
+ request();
+ }, 5000);
+ } else {
+ timeout();
+ }
+ });
+ });
+ }
+ request();
+ },
+ layout: function layout(cfg) {
+ var el = cfg.el;
+ FriendsJS.requestAPI(cfg.api, function (data) {
+ el.querySelector('.loading-wrap').remove();
+ var arr = data.content;
+ var cellALL = "";
+ arr.forEach(function (item, i) {
+ var user = '';
+ cellALL += user;
+ });
+ el.querySelector('.group-body').innerHTML = cellALL;
+ }, function () {
+ try {
+ el.querySelector('.loading-wrap svg').remove();
+ el.querySelector('.loading-wrap p').innerText('加载失败,请稍后重试。');
+ } catch (e) {}
+ });
+ },
+ start: function start() {
+ var els = document.getElementsByClassName('friendsjs-wrap');
+ for (var i = 0; i < els.length; i++) {
+ var el = els[i];
+ var api = el.getAttribute('api');
+ if (api == null) {
+ continue;
+ }
+ var cfg = new Object();
+ cfg.el = el;
+ cfg.api = api;
+ cfg["class"] = el.getAttribute('class');
+ cfg.avatar = volantis.GLOBAL_CONFIG["default"].avatar;
+ FriendsJS.layout(cfg);
+ }
+ }
+};
+FriendsJS.start();
\ No newline at end of file
diff --git a/plugins/tags/sites.js b/plugins/tags/sites.js
new file mode 100644
index 000000000..810d60b75
--- /dev/null
+++ b/plugins/tags/sites.js
@@ -0,0 +1,92 @@
+"use strict";
+
+var SitesJS = {
+ requestAPI: function requestAPI(url, callback, timeout) {
+ var retryTimes = 5;
+ function request() {
+ return new Promise(function (resolve, reject) {
+ var status = 0; // 0 等待 1 完成 2 超时
+ var timer = setTimeout(function () {
+ if (status === 0) {
+ status = 2;
+ timer = null;
+ reject('请求超时');
+ if (retryTimes == 0) {
+ timeout();
+ }
+ }
+ }, 5000);
+ fetch(url).then(function (response) {
+ if (status !== 2) {
+ clearTimeout(timer);
+ resolve(response);
+ timer = null;
+ status = 1;
+ }
+ if (response.ok) {
+ return response.json();
+ }
+ throw new Error('Network response was not ok.');
+ }).then(function (data) {
+ retryTimes = 0;
+ callback(data);
+ })["catch"](function (error) {
+ if (retryTimes > 0) {
+ retryTimes -= 1;
+ setTimeout(function () {
+ request();
+ }, 5000);
+ } else {
+ timeout();
+ }
+ });
+ });
+ }
+ request();
+ },
+ layout: function layout(cfg) {
+ var el = cfg.el;
+ SitesJS.requestAPI(cfg.api, function (data) {
+ el.querySelector('.loading-wrap').remove();
+ var arr = data.content;
+ var cellALL = "";
+ arr.forEach(function (item, i) {
+ var cell = '';
+ cellALL += cell;
+ });
+ el.querySelector('.group-body').innerHTML = cellALL;
+ }, function () {
+ try {
+ el.querySelector('.loading-wrap svg').remove();
+ el.querySelector('.loading-wrap p').innerText('加载失败,请稍后重试。');
+ } catch (e) {}
+ });
+ },
+ start: function start(cfg) {
+ var els = document.getElementsByClassName('sitesjs-wrap');
+ for (var i = 0; i < els.length; i++) {
+ var el = els[i];
+ var api = el.getAttribute('api');
+ if (api == null) {
+ continue;
+ }
+ var cfg = new Object();
+ cfg["class"] = el.getAttribute('class');
+ cfg.el = el;
+ cfg.api = api;
+ cfg.avatar = volantis.GLOBAL_CONFIG["default"].link;
+ cfg.screenshot = volantis.GLOBAL_CONFIG["default"].cover;
+ SitesJS.layout(cfg);
+ }
+ }
+};
+SitesJS.start();
\ No newline at end of file
diff --git a/posts/WSA_On_Win10/index.html b/posts/WSA_On_Win10/index.html
new file mode 100644
index 000000000..83089d35d
--- /dev/null
+++ b/posts/WSA_On_Win10/index.html
@@ -0,0 +1,5164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 适用于Win10的安卓子系统 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 适用于Win10的安卓子系统
+
+
+
+
+
+
+
+
+
观前摘要
本篇文章灵感来源酷安用户@Earth_Online,感谢这位大佬发现如此宝藏的Github项目,并给出了详细的实现教程.
+
+
+
本篇文章的整体思路参考LSPosed/MagiskOnWSALocal 和 cinit/WSAPatch 的说明文件,并根据我自己的实践理解进行更为详细简要的说明,方便小白或者有兴趣的发烧友进行学习.
+
+
+
本文作者 & 头图设计
+
+
+
发布平台 - 博客类(首发)
+
+
+
+
+
发布平台 - 社交平台
+
+
+
前言
对于我这台R7000P 2020, AMD 4800H
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/Yupi-Day1-01/index.html b/posts/Yupi-Day1-01/index.html
new file mode 100644
index 000000000..bff930ca9
--- /dev/null
+++ b/posts/Yupi-Day1-01/index.html
@@ -0,0 +1,5289 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 算法通关村第一关-链表青铜挑战笔记 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 算法通关村第一关-链表青铜挑战笔记
+
+
+
+
+
+
+
+
+
前言
本章节是关于单链表的增加和删除操作,根据题目要求把需要用到的函数都进行了自定义,方便重复调用
+
大部分的思路都以注释的方式展现,因为比较忙,就不放图了,效率第一!
+
希望各位可以指出我文章中的错误,因为个人的理解难免会出现差错,感谢!
+
更新日志
暂无
+
通关要求
+1.理解C语言里是如何构造出链表的
+
+
+2.链表增加元素,首部、中间和尾部分别会有什么问题,该如何处理?
+
+
+3.链表删除元素,首部、中间和尾部分别会有什么问题,该如何处理?
+
+
代码思路
链表的定义
+在链表的每一个结点都是由数据域和指针域构成,数据域可以有不同的数据类型
+
+
+这种依靠指针的数据结构优点就是添加和删除操作比较简单,缺点也显而易见,由于数据是分散存储,导致访问其中某一个数据必须对链表进行遍历
+
+
struct ListNode{ int num; struct ListNode *next; };
|
+
+
链表的初始化
+当我们对链表进行初始化的时候,首先应该新建一个头指针,并将指针初始化为NULL
+
+
+然后创建头结点s,初始化它的指针为NULL.此时让头指针指向s,此时,一个最基础的链表诞生了
+
+
+接下来就是不断创建新的结点,每一个新的结点都会成为链表的尾部,然后将头结点s的指针指向新创建的结点,将结点加入链表.
+
+
+最后就是将头结点的位置向后移动,以便于下一次将新结点加入链表
+
+
struct ListNode* initList() { struct ListNode *p = NULL; struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = NULL; p = s; for(int i = 1; i < 5; i++) { struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->num = i; a->next = NULL; s->next = a; s = s->next; } return p; }
|
+
+
链表的遍历
+链表的不便就在于获取链表的长度或是访问链表某一位置的数据,都需要对链表进行遍历,最佳情况肯定是数据在表头,最糟糕的情况就是数据在表尾
+
+
+对于遍历链表,最重要的是知道什么时候停止遍历.单链表的表尾永远指向NULL,所以我们当我们从头开始遍历,直到结点指针指向NULL就停止,此时停留在表尾结点
+
+
int getListLength(struct ListNode *p) { int length = 0; struct ListNode *s = p; while (s->next != NULL) { length++; s = s->next; } return length; }
|
+
+
链表结点的增加
+表头插入元素
+
+这里我们首先要获取到头指针,先将新结点的指针指向头指针的指向的结点,然后将头指针指向新结点,此时就完成了表头插入元素的操作,当然不要忘了数值域
+
+
+表尾插入元素
+
+这里我们先要遍历链表获取到表尾结点,然后将表尾结点的指针指向新结点,此时就完成了表尾元素的插入
+
+
+插入中间位置
+
+举个例子,如果我要在2这个位置插入元素,那么先遍历到结点1,然后新建一个结点,将新结点的指针指向结点1所指向的结点2,然后将结点1的指针指向新结点,此时新结点变成了结点2,之前的结点2变成了结点3
+
+
+
+
bool addNode(struct ListNode *p, int op, int number) { if(p == NULL) { return false; } if(op == 1) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->num = number; s->next = p->next; p->next = s; } if(op == 2) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = p->next; while (s->next != NULL) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = a; a->num = number; a->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要插入的位置,只可以插入1-%d:\n", getListLength(p)-1); scanf("%d", &position); if(position < 1 || position >= getListLength(p)) { return false; } for (int i = 1; i <= position; i++) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->next = s->next; a->num = number; s->next = a; } return true; }
|
+
+
链表结点的删除
+删除头部元素
+
+因为我们知道头指针,所以很简单,只需要让头指针指向当前结点的下一个结点即可,此时表头将会变成结点2,结点1并没有被删除,而是被隐藏
+
+
+删除尾部元素
+
+首先要遍历整个链表,使得找到指向表尾元素的指针,也就是找到倒数第二个结点,将该结点的指针指向NULL,此时表尾结点被隐藏
+
+
+删除中间元素
+
+举个例子,我要删除位置2的结点,那么我找到位置1的结点,然后将该结点的指针指向位置3,也就是位置2结点的指针,此时结点2就不会有结点指向,相当于被隐藏
+
+
+
+
bool deleteNode(struct ListNode *p, int op) { if(p == NULL) { return false; } if(op == 1) { p->next = p->next->next; } if(op == 2) { struct ListNode *s = p; while(s->next->next != NULL) { s = s->next; } s->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要删除结点的位置,当前链表总长度为%d:\n", getListLength(p)); scanf("%d", &position); if(position < 1 || position > getListLength(p)) { return false; } for(int i = 1; i < position; i++) { s = s->next; } s->next = s->next->next; } return true; }
|
+
+
运行截图
+
完整运行代码
#include <iostream> using namespace std;
struct ListNode{ int num; struct ListNode *next; };
struct ListNode* initList() { struct ListNode *p = NULL; struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = NULL; p = s; for(int i = 1; i < 5; i++) { struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->num = i; a->next = NULL; s->next = a; s = s->next; } return p; }
int getListLength(struct ListNode *p) { int length = 0; struct ListNode *s = p; while (s->next != NULL) { length++; s = s->next; } return length; }
bool addNode(struct ListNode *p, int op, int number) { if(p == NULL) { return false; } if(op == 1) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->num = number; s->next = p->next; p->next = s; } if(op == 2) { struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = p->next; while (s->next != NULL) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); s->next = a; a->num = number; a->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要插入的位置,只可以插入1-%d:\n", getListLength(p)-1); scanf("%d", &position); if(position < 1 || position >= getListLength(p)) { return false; } for (int i = 1; i <= position; i++) { s = s->next; } struct ListNode *a = (struct ListNode *)malloc(sizeof(struct ListNode)); a->next = s->next; a->num = number; s->next = a; } return true; }
bool deleteNode(struct ListNode *p, int op) { if(p == NULL) { return false; } if(op == 1) { p->next = p->next->next; } if(op == 2) { struct ListNode *s = p; while(s->next->next != NULL) { s = s->next; } s->next = NULL; } if(op == 3) { struct ListNode *s = p; int position = 0; printf("请输入要删除结点的位置,当前链表总长度为%d:\n", getListLength(p)); scanf("%d", &position); if(position < 1 || position > getListLength(p)) { return false; } for(int i = 1; i < position; i++) { s = s->next; } s->next = s->next->next; } return true; }
void printList(struct ListNode *p) { struct ListNode *s = p; printf("链表长度为:%d\n链表数据为:\n", getListLength(p)); while (s->next != NULL) { s = s->next; printf("%d ", s->num); } printf("\n"); } int main() { struct ListNode *p = NULL; p = initList();
int number = 0, op = 0; printf("输入操作数,1为表头插入,2为表尾插入,3为表内插入:\n"); scanf("%d", &op); printf("输入插入的数据:\n"); scanf("%d", &number); if(addNode(p, op, number)) { printf("插入成功\n"); } else { printf("插入失败\n"); } printList(p);
printf("输入操作数,1为表头删除,2为表尾删除,3为表内删除:\n"); scanf("%d", &op); if(deleteNode(p, op)) { printf("删除成功\n"); } else { printf("删除失败\n"); } printList(p);
return 0; }
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/about-blog/index.html b/posts/about-blog/index.html
new file mode 100644
index 000000000..c37fad23f
--- /dev/null
+++ b/posts/about-blog/index.html
@@ -0,0 +1,5204 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客日记 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 博客日志-记录博客最新动态
+
+
+
+
+
+
+
+
+
网站日志
+
- 升级Volantis主题至6.0
- 由于BBtalk公众号处于停止运营的状态,暂时隐藏BBtalk功能
- 尝试修复twikoo的问题
- 对多篇文章进行归档隐藏
- 开始记录LeetCode学习记录
- 开始缓慢修复博客的问题,并且缓慢恢复更新(找工作,考研)
+
+
+
公告
你好,欢迎访问我的Hexo博客,博客现在处于正常运营状态,如果在某个地方出现使用问题或是加载缓慢的情况,请在本项目的Github Issues中进行反馈
+
+
+
这里我想要感谢
+
+
+
+
+
关于主站
网站基本信息
+
主站使用的是Github + Hexo + 腾讯云CDN
的部署模式,最大程度保证访问速度。
+
分享文件全部采用依靠Onedrive API的Cloudreve,毕竟没有限速,文件大小限制也少。
+
目前的加载速度已经经过很多优化,如果有加载缓慢的情况请联系站长。
+
网站内容
+
主要是分享知识。我个人认为知识应当没有门槛,做好知识分级,给不同阶段的朋友们都能带来收获。
+
目前个人技术有限,仅仅会写一些入门知识分享。
+
希望自己能够慢慢变强吧。
+
欢迎各位朋友能在思考之后积极的和我探讨交流。
+
关于分站
注意事项
+
分站没有去进行深度优化,仅仅作为一个基本的,保证能够阅读和互动的不同主题。
注意,分站仅仅是同步主站点的文章更新,有些信息可能没有及时更新
+
此外,本站所有文章都使用了Volantis独有的标签,分站没有进行优化,使用的默认标签类型
+
如何使用
+
本站将以往的配置的主题作为分站部署https://blog.sakurasep.site/主题名称
下,通过导航栏可以直接访问,当然你也可以在下方直接跳转。
+
你可以选择你所喜欢的博客主题进行文章阅读,希望带给你最好的阅读体验。
+
+
关于评论
+- 本站在主站的评论系统已经更换为Twikoo,更棒的评论系统,欢迎大家使用!
+- 本站的评论邮件提醒已经恢复,你在主站的评论收到回复后将可以接收邮件提醒。
+
+
关于更新
首先可以确定的是,我会首先保证质量,目前我的技术水平不足,很多地方做的不是很好,还希望各位能提出修改建议,我也会积极进行修改。
+
目前将学业与更新做个平衡的话,基本确定是月更,一篇or两篇,得看我的空闲时间。
+
目前的规划是
+
+
更新平台
首发更新
+
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
更新预告
应用使用指南系列-老文章修改
+
+
Redirect Perfdog
+
+
Hexo系列-新系列
+
+
+
+
+
新文章
+
FilterBox
+
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/chevereto/index.html b/posts/chevereto/index.html
new file mode 100644
index 000000000..8143825e8
--- /dev/null
+++ b/posts/chevereto/index.html
@@ -0,0 +1,5357 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto-属于你自己的图片站 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto-属于你自己的图片站
+
+
+
+
+
+
+
+
+
前言
前几天用hexo搭建博客首页的时候,想给网站来一张高清的壁纸。然后用picgo把一张比较大的图片上传到gitee。
+
Picgo
+
+
这时出现了第一个问题,picgo不显示该图片的缩略图
+
无法显示缩略图
+
+
本来以为是picgo的bug(beta3版本),便用手机上的图床软件上传
+
上传完成
+
+
显示上传成功,打开gitee的仓库也可以正常访问
+
在感到很疑惑的同时,我将该图片的URL发到了群里,让朋友看看能不能访问
+
然后我收到了朋友的截图
+
Gitee限制图片大小
+
+
Gitee图床存在的问题
- 不能上传超过1M大小的图片,否则不能显示
- Gitee有段时间开启了防盗链,第三方引用全部失效
+
+
这时候我在图床APP的其他图床中看到了一段对于chevereto图床的描述
+
试试?
+
+
粗略的看了一下教程,实现效果还不错。
+
+
+
+
一. 方案总结
- 方案一:神枫云 + FTP外部存储
- 方案二:域名 + 轻量应用服务器
- 方案三:备案域名 + ECS服务器
+
+
我个人最推荐方案二
+
学生优惠或者新用户购买腾讯云或者阿里云的服务器挺便宜的,大概是一年60左右。
+
腾讯云
+
+
当然我之前介绍的神枫云也可以,而且可以省去配置宝塔面板的步骤
+
二. 方案实施
2.1 方案一:神枫云 + FTP外部存储
+
+
2.1.1 神枫云服务器配置
建议购买这个3RMB/月的服务器
+
相比于1RMB/月的,月流量变为无限是很重要的
+
服务器
+
+
稍微配置一下,进入主机的管理界面,进入在线文件管理
+
管理面板
+
+
2.1.2 安装前的准备
上传chevereto底包到根目录
+
chevereto
+
+
这里chevereto有免费版和付费版,我们使用付费版来进行搭建,因为付费版才可以使用外部存储,神枫云只提供了300M的数据库,存不了几张图片
+
+
+
+
然后解压底包到wwwroot文件夹
+
此时wwwroot文件夹内应该是下图所示的目录结构
+
目录结构
+
+
解压完成之后,进入域名绑定选项,这里有一个赠送的域名
+
默认域名
+
+
+
2.1.3 开始安装
访问该域名进入安装进程,只修改三项
+
如果忘记了可以在面板首页-虚拟主机信息找到
+
连接数据库
+
+
然后是注册管理员的界面
+
填写信息
+
+
顺利安装完成
+
安装完成
+
+
如果一切顺利的话现在网站已经跳转到了chevereto图床的首页
+
首页展示
+
+
点击右上角的登录,把刚刚注册的管理员账号输入进去,然后进入仪表盘,到这里整个安装过程基本结束了。
+
不过因为神枫云的数据库空间很小,只有300M,根本存不了几张图片,所以下文的外部存储功能便十分重要。
+
2.2 域名 + 腾讯云轻量服务器
2.2.1 安装宝塔镜像
首先去腾讯云购买一个轻量应用服务器,并且选择香港地区来免去备案,镜像选择宝塔面板
+
选择宝塔镜像
+
+
然后来到服务器的控制台,在防火墙里添加8888端口来允许宝塔面板的访问,后续可以更改默认访问端口,并添加安全入口提高安全性。
+
放行端口
+
+
在应用管理里面可以获取默认宝塔面板的登录密码
+
访问密码
+
+
后期记得修改宝塔面板的登录端口以及默认用户名和密码
+
登录实例,可以选择网页直接登录,上图右下角,先复制命令,然后点击登录
+
远程登录
+
+
2.2.2 软件环境
进入宝塔面板,在软件商店里安装(仅搭建图床)
+
+
+
+
+
+
软件列表
+
+
2.2.3 创建站点
然后在侧边栏找到网站,添加站点
+
填入你购买的域名,创建数据库
+
基本信息
+
+
然后在站点的设置里添加伪静态代码
+
伪静态代码
+
+
location / { index index.php; try_files $uri $uri/ /index.php?$query_string; }
|
+
+
+
+
伪静态
+
+
2.2.4 DNS解析
然后在你申请域名的服务商添加DNS解析
+
DNS解析
+
+
主机记录@ 记录类型A 解析线路默认 记录值是IP地址 TTL 10分钟
+
+
稍微等上一段时间,就可以用域名访问你的chevereto图床进行安装了
+
2.2.5 安装过程
访问该域名进入安装进程
+
连接数据库
+
+
然后是注册管理员的界面
+
填写信息
+
+
顺利安装完成
+
安装完成
+
+
如果一切顺利的话现在网站已经跳转到了chevereto图床的首页
+
首页展示
+
+
点击右上角的登录,把刚刚注册的管理员账号输入进去,然后进入仪表盘,到这里整个安装过程基本结束了。
+
如果你使用的是这种方式,那么一般来说数据库就有了一定的存储空间,例如我个人使用的就有约45G的数据空间
+
存储空间
+
+
这样的话存一些个人的图片还是没有问题的
+
2.3 备案域名 + 阿里云ECS服务器
这里ECS服务器我购买的是学生优惠版本
+
这里虽然显示最少购买6个月,其实可以在调整配置的时候可以买一个月先试试
+
价格
+
+
这里仅需要修改购买时长,操作系统等会去更换
+
购买界面
+
+
购买完成后去阿里云ECS控制台,将实例停止运行以更换操作系统和购买云盘容量
+
注意:云盘容量按需购买,因为服务器的云盘是按月付费
+
2.3.1 更换镜像
在镜像市场将操作系统更换为宝塔linux面板
+
更换镜像
+
+
自定义实例登录密码,一会要用到
+
修改登录密码
+
+
+
2.3.2 登录服务器
在实例管理界面,进行远程登录
+
远程登录
+
+
选择第一项网页登录
+
远程登录
+
+
输入”bt default”来获取宝塔面板的默认登录密码
+
获取默认密码
+
+
记得放行安全组端口8888,然后用公网IP:8888
访问宝塔面板
+
2.3.3 软件环境
进入宝塔面板,在软件商店里安装(仅搭建图床)
+
+
+
+
+
+
软件列表
+
+
2.3.4 创建站点
然后在侧边栏找到网站,添加站点
+
填入你购买的域名,创建数据库
+
基本信息
+
+
然后在站点的设置里添加伪静态代码
+
伪静态代码
+
+
location / { index index.php; try_files $uri $uri/ /index.php?$query_string; }
|
+
+
+
+
伪静态
+
+
2.3.5 DNS解析
然后在你申请域名的服务商添加DNS解析
+
DNS解析
+
+
主机记录@ 记录类型A 解析线路默认 记录值是IP地址 TTL 10分钟
+
+
稍微等上一段时间,就可以用域名访问你的chevereto图床进行安装了
+
2.3.6 安装过程
访问该域名进入安装进程
+
连接数据库
+
+
然后是注册管理员的界面
+
填写信息
+
+
顺利安装完成
+
安装完成
+
+
如果一切顺利的话现在网站已经跳转到了chevereto图床的首页
+
首页展示
+
+
点击右上角的登录,把刚刚注册的管理员账号输入进去,然后进入仪表盘,到这里整个安装过程基本结束了。
+
三. 为域名添加Https访问
打开你所购买域名服务商的控制台(这里以阿里云为例子)
+
在域名控制台-基本信息-SSL证书
+
用免费版就可以
+
填写一些必要的信息,审核通过后下载证书
+
获取证书
+
+
这里因为我们云服务器安装的是Nginx,所以下载该类型
+
下载证书
+
+
然后解压缩得到两个文件,一个key,一个pem,现在登录宝塔面板,复制证书密钥和内容到网站-设置-SSL-其他证书
+
设置证书
+
+
保存后你的域名就可以使用https访问了
+
四. chevereto图床基本设置
4.1 网站
推荐修改
- 网站名称
- 网站标题
- 网站描述
- 默认时区
- 网站运营模式
- 网站隐私模式
+
4.2 用户
+
+
4.3 图片上传
+
+
4.4 主页
+
+
4.5 电子邮件
+
+
4.6 防洪保护
推荐修改
- 防洪保护
- 以电子邮件通知
- 每分钟限额
- 每小时限额
- 每日限额
+
+
五. 总结
chevereto图床作为一个图片站来说还是很不错的,用来存放一些高清图片(壁纸,美图)等还是很不错的。不过搭建chevereto是需要一定的成本的,如果预算不是很多建议去找一些其他的公益图床。
+
如果平时只是写写文章的话,我还是推荐使用gitee图床,上传之前记得用格式工厂压缩一下图片,压缩成JPG格式,可以极大程度避免图片过大的问题
+
Gitee图床审查变得严格起来,出现了很多误封现象,这里建议使用Github仓库 + jsDelivr
。
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/ctf/index.html b/posts/ctf/index.html
new file mode 100644
index 000000000..b19dd455f
--- /dev/null
+++ b/posts/ctf/index.html
@@ -0,0 +1,5163 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 《CTF学习笔记》 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 《CTF学习笔记》
+
+
+
+
+
+
+
+
+
前言
最近一位朋友入坑CTF,想起来开学还加了一个相关社团参加了几场比赛。还是挺有趣的。
+
每天做上一两个,就当是放松了。
+
正文
题目
+
+
题目
e00cf25ad42683b3df678c61f42c6bda
+
解法
题目写的很清楚 MD5,然后给出的这一端字符串(用多了能看出来很像MD5)
+
扔到**MD5解密网站**得到flag{admin1}
+
解密网站 PASS
+
+
+
+
题目
+
+
题目
flag:ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=
+
解法
Base64编码有个特点,编码末尾会出现=
+
特点
+
+
所以说仍然是放到**Base64解密网站**
+
解密得到
+
+
PASS
+
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/hexo01/index.html b/posts/hexo01/index.html
new file mode 100644
index 000000000..a333ce01b
--- /dev/null
+++ b/posts/hexo01/index.html
@@ -0,0 +1,5422 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hexo_01-博客的安装与部署 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hexo_01-博客的安装与部署
+
+
+
+
+
+
+
+
+
本篇文章最后更新于2022.06.25 更改了一些遗留问题,更换了下载链接
+
最近在尝试新的markdown语法格式排版,试试效果如何
+
一. 软件环境
+
+
Clash for Windows(任意加速器,保证能连接到Github)
+
+
我们会将搭建好的Hexo上传到Github,所以需要Git命令行支持。
+
Git官网页面 根据系统选择64/32位
+
+
选择下载LTS版本
+
+
如果你的网络无法进行下载,请访问以下链接进行下载:
+
+
+
+
+
+
+
1.3 检查安装是否成功
打开cmd命令行,输入node -v
后显示下图所示,即为安装成功
+
显示版本号
+
+
在电脑的任意目录点击右键,能够显示Git Bash Here
使用这个功能可以更方便的在当前目录启动命令行,当然你也可以使用cmd的cd命令到当前目录
+
右键菜单出现选项
+
+
二. 博客本地化部署
2.1 更改npm为cnpm源
国内某些网络环境访问npm会出现问题,建议使用taobao镜像源,能有效减少故障的发生
+
切换npm源
+
+
npm install -g cnpm --registry=https://registry.npm.taobao.org
|
+
+
+
+
cnpm切换过程
+
+
使用cnpm -v
后正常输出版本号,即为安装成功
+
显示版本号
+
+
2.2 安装hexo命令行
-g
是对全局安装hexo命令行
+
安装Hexo命令行
+
+
+
+
hexo-cli安装过程
+
+
2.3 Hexo博客初始化
选取一个想要安装Hexo的目录,路径中最好不要含有中文,后续会更好处理
+
Hexo初始化命令
+
+
+
+
初始化过程
+
+
此时文件夹内应有初始化文件,不过只要接下来能够成功运行,上述过程没有报错,就没问题。
+
hexo文件夹结构
+
+
如果初始化出现问题,即在运行hexo init
的时候报错(通常是由于网络而出现问题)
+
如果出现网络问题导致无法下载,请访问以下链接获取基础包:
+
+
+
+
+
2.4 运行博客
在博客根目录右键打开Git Bash Here
+
输入以下指令
+
Hexo初始化命令
+
+
hexo clean && hexo g && hexo s
|
+
+
+
+
+
+
+
+
本地部署过程
+
+
出现Hexo is running at http://localhost:4000/ . Press Ctrl+C to stop.
,并且没有后续的警告语句,说明部署成功,在浏览器中输入localhost:4000
查看部署效果。
+
运行成功
+
+
如果你的端口4000被占用,可以使用hexo s -p 端口号。然后访问http://localhost:端口号
+
+
以上,博客的最基本的本地化部署已经完成,接下来的内容是将博客部署到网络进行在线访问。
+
三. 博客部署到网络
基本介绍一下目前不同部署方式的差别。
+
Github:微软旗下的开源代码托管平台,国内某些运营商可能无法访问,一般来说还是推荐部署在Github Pages,这也是我本人目前主要用的服务。
+
Gitee:虽然是国内的代码托管平台,访问速度可以保证,但是它的Pages页面需要手动更新,并且不能够绑定自定义的域名(如果你想和别的博主交换友链,最好还是要有一个域名。因为一般有域名的博客更有动力维护下去)。
+
Coding:部署方式很复杂,新版的Coding Pages貌似是和腾讯云挂钩,按量付费,感觉没必要了。
+
Vercel:是一个静态网页部署平台,好像访问速度要比Github稍微快一些,并且提供修改自定义域名。
+
云服务器:访问速度很大程度上取决于你的服务器的带宽,而且现在服务器的价格也不便宜,以后部署其他需要服务器的项目时再使用比较好。
+
全球最大同性社交平台
+
+
3.1.1 创建Github仓库
注册完成Github账号,新建仓库用于保存上传博客代码。
+
Github账号注册时尽量不要使用国内邮箱,尤其是QQ邮箱
+
+
新建仓库
+
+
+
Tips:试试新建一个仓库名为你Github用户名的仓库
+
+
按照图示修改好仓库名后,确保仓库为公开(Public),其他设置按需更改,创建仓库。
+
3.1.2 获取与Github的连接
在任意位置打开Git Bash Here
,输入以下指令
+
建立与Github的连接
+
+
git config --global user.name "你的GitHub用户名" git config --global user.email "你的GitHub注册邮箱" ssh-keygen -t rsa -C "你的GitHub注册邮箱"
|
+
+
+
+
生成密钥
+
+
输入第三个命令后只需要连续按下三次回车,就会在C:\Users\用户名\.ssh
中生成密钥文件
+
打开id_rsa.pub
,复制文件内容,添加到
+
添加SSH公钥 添加SSH公钥
+
+
然后在Git Bash
中输入以下命令测试是否连通Github
+
测试与Github的连接
+
+
+
+
成功连通
+
+
3.1.3 上传博客到Github
首先在Git Bash
中输入以下命令安装部署插件
+
安装hexo-deployer-git
+
+
cnpm install hexo-deployer-git --save
|
+
+
+
+
安装成功
+
+
打开根目录下的_config.yml
文件
+
deploy配置
+
+
config文件配置
+
+
deploy: type: git repo: 填入仓库连接 branch: master
|
+
+
+
+
repo 可以复制此处的链接
+
复制仓库链接
+
+
填好后在Git Bash
中输入下列命令部署到Github仓库
+
部署到Github
+
+
hexo clean && hexo g && hexo d
|
+
+
+
+
Github同理(此为部署到Gitee)
+
+
此时访问https://Github用户名.github.io
即可访问
+
Github显示效果相同
+
+
3.1.4 绑定自定义域名
你可以自行选择域名提供商,购买完域名后,在域名解析里设置以下解析记录
+
标准解析设置
+
+
+
+
+
然后在_config.yml
中设置url为你解析的域名
+
url设置
+
+
最后再博客根目录/source
下新建CNAME文件
+
注意,没有拓展名!
+
+
文件内容为自定义的域名
+
用于Github识别项目的自定义地址
+
+
Gitee官网
+
+
3.2.1 创建Gitee仓库
部署到Gitee与部署到Github的流程相差很小,看一个就行。
+
新建Gitee仓库
+
+
3.2.2 获取与Gitee的连接
在任意位置打开Git Bash Here
,输入以下指令
+
连接到Gitee
+
+
git config --global user.name "你的Gitee用户名" git config --global user.email "你的Gitee注册邮箱" ssh-keygen -t rsa -C "你的Gitee注册邮箱"
|
+
+
+
+
获取SSH公钥
+
+
输入第三个命令后只需要连续按下三次回车,就会在C:\Users\用户名\.ssh
中生成密钥文件
+
打开id_rsa.pub
,复制文件内容,添加到
+
添加SSH公钥
+
+
然后在Git Bash
中输入以下命令测试是否连通Gitee
+
测试连接
+
+
+
+
连接成功
+
+
3.2.3 上传博客到Gitee
首先在Git Bash
中输入以下命令安装部署插件
+
安装hexo-deployer-git
+
+
cnpm install hexo-deployer-git --save
|
+
+
+
+
安装过程
+
+
打开根目录下的_config.yml
文件
+
Gitee配置
+
+
config文件配置
+
+
deploy: type: git repo: 填入仓库连接 branch: master
|
+
+
+
+
repo 可以复制此处的链接
+
复制仓库链接
+
+
填好后在Git Bash
中输入下列命令部署到Gitee仓库
+
部署到Gitee
+
+
hexo clean && hexo g && hexo d
|
+
+
+
+
上传成功
+
+
在仓库的服务-Gitee Pages
进行手动部署
+
Github Pages会自动使用你仓库的代码进行部署,而Gitee需要你手动更新。
+
+
手动更新Pages
+
+
打开强制使用Https
,更新部署
+
更新
+
+
等待部署结束后,访问Https://Gitee用户名.gitee.io
查看部署结果
+
部署完成
+
+
+
请在看过3.1部署到Github后再观看本部分教程。
+
官网
+
+
3.3.1 连接Github仓库
连接仓库
+
+
+
基本设置
+
+
稍等一段时间后,Vercel便部署完成了你的博客
+
部署完成
+
+
Vercel默认提供了域名,你也可以更改。
到Settings-Domains
中进行更改
+
更改域名
+
+
写在最后
本篇文章基本讲述了Hexo博客的基本部署,包括了本地化部署测试和上传到Github,Gitee或是Vercel等平台,使用托管平台提供的Page服务进行远程访问。
+
本篇教程属于面向与小白的零基础教程系列,如果在安装过程中出现任何问题,你可以在评论区提问,你的提问也是我充实文章的助力!
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/hexo02/index.html b/posts/hexo02/index.html
new file mode 100644
index 000000000..94c6f4915
--- /dev/null
+++ b/posts/hexo02/index.html
@@ -0,0 +1,5238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hexo_02-博客的配置文件解析 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hexo_02-博客的配置文件解析
+
+
+
+
+
+
+
+
+
config文件介绍
此文件是对于Hexo最基本的修改,在使用主题后,由于主题作者设计的不同,某些设置将不会生效,你只需要填写必要设置,并且按照主题作者的文档进行修改即可。
+
Site
Site部分
+
+
title: 九月的生活
subtitle: New Dream New Start
description: 希望在这里分享我的经验与生活!
keywords:
author: 上杉九月
language: - zh-CN - en - zh-TW
timezone: ''
|
+
+
+
+
Url
Url部分
+
+
url: https://sakurasep.gitee.io
permalink: :year/:title/
permalink_defaults: pretty_urls: trailing_index: true trailing_html: true
|
+
+
+
+
Directory
Directory部分
+
+
source_dir: source public_dir: public tag_dir: tags archive_dir: archives category_dir: categories code_dir: downloads/code i18n_dir: :lang
skip_render:
|
+
+
+
+
Writing
Writing部分
+
+
new_post_name: :title.md
default_layout: post
titlecase: false
external_link: enable: true field: site exclude: ''
filename_case: 0
render_drafts: false
post_asset_folder: false
relative_link: false
future: false
highlight: enable: true line_number: true auto_detect: false tab_replace: '' wrap: true hljs: false prismjs: enable: false preprocess: true line_number: true tab_replace: ''
|
+
+
+
+
Home page setting
Home page setting部分
+
+
index_generator: path: '' per_page: 7 order_by: -date
|
+
+
+
+
Category & Tag
Category & Tag部分
+
+
default_category: uncategorized
category_map:
tag_map:
|
+
+
+
+
Metadata elements部分
+
+
+
+
Date / Time format部分
+
+
date_format: YYYY-MM-DD time_format: HH:mm:ss
updated_option: 'mtime'
|
+
+
+
+
Pagination部分
+
+
per_page: 7 pagination_dir: page
|
+
+
+
+
Include / Exclude file(s)
Include / Exclude file(s)部分
+
+
+
+
Extensions
Extensions部分
+
+
+
+
Deployment
Deployment部分
+
+
deploy: type: git repo: https://gitee.com/sakurasep/sakurasep.git branch: master
|
+
+
+
+
+
关于我
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/hexo03/index.html b/posts/hexo03/index.html
new file mode 100644
index 000000000..63a4d96b2
--- /dev/null
+++ b/posts/hexo03/index.html
@@ -0,0 +1,5163 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hexo_03-Volantis主题的使用指南(一) - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hexo_03-Volantis主题的使用指南(一)
+
+
+
+
+
+
+
+
+
更新中
+
+
关于我
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/perfdog/index.html b/posts/perfdog/index.html
new file mode 100644
index 000000000..fab79ee25
--- /dev/null
+++ b/posts/perfdog/index.html
@@ -0,0 +1,5256 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Perfdog-简单直观的性能测试工具 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Perfdog-简单直观的性能测试工具
+
+
+
+
+
+
+
+
+
一. 基本介绍
当我们作为一位消费者购买电子产品时,我们获取第一手信息的方式大多是从各大视频平台的自媒体的首发测评。当我们拿到电子产品之后,如何对它的性能进行测试呢?
+
有的朋友首先会想到娱乐兔,HappyMatser等跑分软件。毕竟跑分很直观,高就是强,低就是弱。但是当跑分论成为大众的标准,厂商便会想出各种各样的方法来获取更高的跑分。例如前几天被曝光的Realme GT跑分作弊,还有各大厂商的跑分白名单(MIUI检测到跑分软件运行,会将CPU锁在最高频率)。这样的测试只能算是极限性能,可是真正的去游戏里测试,散热设计的不同,调度优化的不同便会产生巨大的差距。
+
很早之前我也对手里的电子产品进行测试,当时用的是GameBench,不过经常出问题,正版的价格更是无法接受。第二个使用的软件是快否,虽然偶尔会出现一些bug,但是使用体验还是很不错的。不过因为这软件最后一次更新时间是2019年6月,emmm,基本是凉凉了。
+
去年的时候,把手里的米9换成了米10,因为听说865的性能与功耗都平衡的很好,便产生了测试的想法。这一款由腾讯旗下WeTest开发的软件Perfdog吸引了我。支持Windows
,Mac OS X
两个PC平台,可以对安卓和iOS设备进行测试。
+
二. 软件测试环境
小米10 12G RAM MIUI12.5 21.3.12 官方包
+
iPad 2020 第八代 A12 iPad OS 14
+
+
+
+
三. 软件基本安装操作
+Perfdog官方网站
+
+
在Perfdog的官网下载对应平台的软件压缩包后,将压缩包解压到电脑的目录中。
+
在目录找到Perfdog.exe可执行文件,打开后显示登陆界面,这里可以注册账号或使用QQ扫码登陆。
+
登录界面
+
+
登录后便会进入到软件的UI界面
+
软件UI
+
+
此时便可以将你的测试设备与电脑进行链接。初始化之后,在左侧的两个选项中选择测试方式(无线or有线 无线可以测试电池相关内容,有线可以同步显示并记录手机画面)和测试应用(支持应用名称搜索)
+
选择模式和设备(Windows平台可以多开Perfdog并同时对多部设备测试)
+
右下角的加号是添加和减少测试项目。勾选左边的对号便是对此项目进行测试,点击右边的方框选择是否在软件中显示该项目的数据。
+
安卓设备与iOS设备的测试项目稍有出入
+
安卓设备 iOS设备
+
+
选择好测试应用,调整好测试项目,拿起你的设备,准备开始吧。
+
3.1 软件数据解释与详细使用步骤
建议有能力的朋友前往官网去详细了解测试项目的具体作用。以下内容是我个人的解读,可能会有一些不准确的地方,还请多多指教。
+
3.2 概览
基本数据
+
+
性能基本指标
- 平均帧率 - Avg(FPS)
这一个数据对应的是整个测试过程的平均帧率,可以粗略的反应游戏的流畅程度。 - 卡顿次数/每10分钟 - Jank(/10min)
- 严重卡顿次数/每10分钟 - BigJank(/10min)
+
+
这里放出perfdog官方给出的计算思路和计算方式
+
3.2.1 PerfDog Jank 计算思路:
+考虑视觉惯性,假设以前三帧的平均帧耗时为参考,作为vsync时间间隔,连续两次vsync没有新渲染画面刷新,则认为是一次潜在卡顿,也就是说下一帧耗时大于前三帧平均帧耗时2倍,则认为一次潜在卡顿。同时单帧耗时满足大于两倍电影帧耗时1000ms/24x2(由于人眼低于24帧才能辨别画面不连续性),则认为是一次真正卡顿。同时若单帧耗时大于3倍电影帧耗时,则认为是一次严重卡顿。
+
+
3.2.2 PerfDog Jank计算方法:
+同时满足两条件,则认为是一次卡顿Jank.
①Display FrameTime>前三帧平均耗时2倍。
②Display FrameTime>两帧电影帧耗时 (1000ms/24x2≈83.33ms)。
同时满足两条件,则认为是一次严重卡顿BigJank.
①Display FrameTime >前三帧平均耗时2倍。
②Display FrameTime >三帧电影帧耗时(1000ms/24x3=125ms)。
+
+
其他内容
- 未规范化应用CPU利用率 - Avg(AppCPU)[%]
这里未规范化CPU利用率的计算方式 = CPU执行时间/CPU总时间。如果使用这一项利用率计算APP的性能消耗,会出现在低频运行时和高频运行时CPU利用率相同的情况。
所以Perfdog官方建议使用规范化CPU利用率。 - CPU平均温度 - Avg(CTemp)[°C]
- 规范化应用CPU利用率 - Avg(AppCPU)[%]Normalized
这种CPU利用率的计算方法将CPU的频率考虑进去。
CPU Usage(Normalized)= (CPU执行时间/CPU总时间) * (当前时刻所有CPU频率之和/所有CPU频率最大值之和)
这种计算方法可以更真实的反映出APP的性能消耗。 - 最大内存占用 - Peak(Memory)[MB]
- 平均上传速度 - Avg(Send)[KB/s]
- 平均下载速度 - Avg(Recv)[KB/s]
- 平均功耗 - Avg(Power)[mW]
+
+
3.3 FPS
+
+
测试项目解释
平均帧率 - Avg(FPS)
这一个数据对应的是整个测试过程的平均帧率,可以粗略的反应游戏的流畅程度
帧率方差 - Var(FPS)
这一个数据反映的是帧率的波动大小
大于等于某一帧率的测试数据百分比 - FPS>=30[%] FPS>=45[%]
这一数据显示可以修改,在右下角,可以看数据的大致分布
降帧次数 - Drop(FPS)[/h]
平均每小时两个相邻的FPS点相差大于8帧的次数,反映的是画面的流畅程度
卡顿次数/每10分钟 - Jank(/10min)
严重卡顿次数/每10分钟 - BigJank(/10min)
卡顿率 - Stutter[%]
计算方式 卡顿率 = 卡顿时长 / 总时长
平均单帧渲染时间 - Avg(FTime)[ms]
这一个数据可以结合第三张图 Frame Time分析
如果Frame Time时长在某一个点很大幅度超过平均单帧渲染时间,那么大概率是一次卡顿
单帧渲染时间超过100ms - FTime>=100ms[%]
单帧渲染时间过长,很有可能导致屏幕没有内容可以刷新,所以画面不动,即为卡顿
增量耗时 - Delta(FTime)>100ms[/h]
+
+
3.4 CPU
CPU测试数据 CPU总体使用率 CPU核心使用率 CPU时钟频率 CPU温度
+
+
测试项目解释
- 未规范化应用CPU利用率 - Avg(AppCPU)[%]
这里未规范化CPU利用率的计算方式 = CPU执行时间/CPU总时间。如果使用这一项利用率计算APP的性能消耗,会出现在低频运行时和高频运行时CPU利用率相同的情况。
所以Perfdog官方建议使用规范化CPU利用率。
未规范化应用CPU利用率小于等于50%/70% - AppCPU<=50%[%] AppCPU<=70%[%]
未规范化总的CPU利用率 - Avg(TotalCPU)[%]
未规范化总的CPU利用率小于等于50%/70% - TotalCPU<=50%[%] TotalCPU<=70%[%]
CPU平均温度 - Avg(CTemp)[°C]
下面一排都是规范化的CPU指标,不多赘述
CPU时钟频率 - CPU Clock
反映的是当前时间CPU各个核心的频率
+
+
3.5 Memory
这部分对于性能测试的参考性不是很高。
+
这里Perfdog提醒:在极限测试情况下,例如开启游戏超高帧率,建议不要勾选收集Memory Usage和Memory Detail,因为部分机型会有性能损耗。
+
内存测试数据 内存使用率
+
+
3.6 GPU
GPU测试数据 GPU使用率
+
+
+
+
3.7 Network
这一部分对于非实时对战游戏参考性不是很高。测试王者荣耀等对网络要求较高的游戏可以进行关注。
+
网络测试数据 网络收发数据
+
+
3.8 Battery
电池测试数据 电池测试图表
+
+
+
+
3.9 Energy Usage
能耗数据
+
+
监控应用使用的能耗情况,可以监控CPU,GPU,网络模块,定位模块等等
+
3.10 需要关注的数据
对于芯片的性能测试,我认为主要应该关注的数据项目为
+
+
反映的是设备的游戏运行稳定性,越接近设定的游戏帧率越好。
+
+
反映的是设备掉帧的严重程度,越小越好。
+
+
反映的是设备的掉帧次数(掉帧次数不等于卡顿次数),越少越好。
+
卡顿次数/每10分钟 - Jank(/10min)
+
反映的是人所能感知的小卡顿次数,越少越好。
+
严重卡顿次数/每10分钟 - BigJank(/10min)
+
反映的是人所能感知的严重卡顿次数,越少越好。
+
平均单帧渲染时间 - Avg(FTime)[ms]
+
反映的是设备对画面单一帧的渲染平均时间,若某一时刻对画面渲染的时间远远超过平均值,说明此时屏幕内容没有刷新,会觉得明显卡顿,单帧渲染时间越贴近平均值越好。
+
规范化的应用CPU利用率 - Avg(AppCPU)[%]Normalized
+
反映的是排除其他影响因素后应用对于CPU性能的消耗。
+
+
反映的是应用长时间运行使CPU升高的温度,作为温控降频的参考数据。
+
+
反映的是应用运行时CPU的调度情况,作为卡顿分析和功耗分析的参考数据。
+
平均GPU利用率 - Avg(GUsage)[%]
+
反映的是应用对于GPU的使用情况。
+
平均CPU时钟频率 - Avg(GClock)[MHz]
+
反映的是应用运行时GPU的调度情况,作为卡顿分析和功耗分析的参考数据。
+
+
反映的是应用运行时的平均功耗,高中低负载在功耗这一测试项目差距较大,例如骁龙888在高负载可以跑到11w的功耗,在低负载只有4w,续航和发热因此不同。
+
四. 云端页面功能介绍
4.1 我的数据
存放着测试结束后上传的测试结果,当测试结果较多时可以设置条件筛选数据。
+
测试记录
+
+
4.2 任务数据
Perfdog支持创建测试任务,你可以邀请小伙伴一起进行测试,并将数据归档到任务中进行分享。
+
类似是一个组织
+
+
+
4.3 项目
在这里可以针对不同应用数据进行分类显示
+
筛选条件
+
+
4.4 具体数据
4.4.1 图表基本操作(数据统计范围修改,图标曲线显示)
图表数据修改
+
+
4.4.2 图表拖选操作(查看某一时间段的测试数据)
区域数据查看
+
+
4.4.3 点选查看卡顿具体场景
具体场景分析
+
+
卡顿画面
+
+
4.5 不同测试范例对比
4.5.1 可以添加5条测试用例
用例数据对比
+
+
4.5.2 对比不同的测试用例
用例数据对比
+
+
五. 写在最后
PerfDog收费了,贵的离谱,面向的用户是各类数码KOL,我们自己想测试,需要找别的软件了。
+
听说华为的测试软件不错,有时间看看,写篇文章。
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/qfnu/index.html b/posts/qfnu/index.html
new file mode 100644
index 000000000..1a5ddfeda
--- /dev/null
+++ b/posts/qfnu/index.html
@@ -0,0 +1,5193 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 智慧曲园云端自动打卡 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 智慧曲园云端自动打卡
+
+
+
+
+
+
+
+
+
前言
班群没事就@全体成员
,用FilterBox过滤通知 + 自动签到,总算把这烦人的东西解决了。
+
正文
+
+
一. 软件环境
+
+
+
二. 开始配置
2.1 保存脚本文件
在合适的位置保存脚本文件
+
保存文件
+
+
2.2.1 对python脚本进行单独配置
如图所示是我们宿舍四人的python脚本
+
脚本文件 详细配置
+
+
执行命令
+
+
python3 /www/wwwroot/qfnuAutoTemperatureSubmit/xxx.py
|
python3命令是你没有设置系统变量时使用的,如果你将python3作为系统环境,这里只需要改成python
+
+
+
+
使用宝塔计划任务创建定时任务
+
当时不太懂云服务器的目录结构,放在了wwwroot网站目录
+
定时执行
+
2.2.2 使用原python文件
直接将脚本文件放在文件夹内
+
执行命令
+
+
python3 /www/wwwroot/qfnuAutoTemperatureSubmit/demo1.py 学号 密码
|
+
+
+
+
2.3 注意事项
执行python脚本报错的话
+
作者回复
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/redirect/index.html b/posts/redirect/index.html
new file mode 100644
index 000000000..1a3f0ea7a
--- /dev/null
+++ b/posts/redirect/index.html
@@ -0,0 +1,5311 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 存储空间隔离-还你一个干净整洁的根目录 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 存储空间隔离-还你一个干净整洁的根目录
+
+
+
+
+
+
+
+
+
一. 前言
1.1 安卓根目录的混乱现象
每一次打开文件管理去寻找你所想要的文件,或是在聊天软件给朋友发送文件,总会看到目录里有着大量莫名奇妙的文件夹。一是不方便找到目标文件所在,二是对于强迫症挺不舒服的。
+
+
+
造成这种现象,主要是国内软件厂商不遵守开发规范导致。根据安卓规范,在 Android/data/包名
路径应该保存对应应用的数据文件,Android/obb/包名
路径应该保存对应应用的数据包文件。这两个文件夹是用户不应该去访问的,因此安卓11的新规范禁止系统(仅对于定制UI)的文件管理直接访问。如果介意(例如MIUI的默认文件管理)访问受限,可以安装相应的旧版本。
+
1.2 安卓11的新限制
如图所示,MIUI的文件管理在一次升级中已经不在允许访问,点击前往查看将会跳转安卓原生的文件管理。
+
+
不能访问Android/data
+
+
应用应该将自身数据保存在Android文件夹内部,将用户数据按照分类保存在标准文件夹,但是国内应用大部分不会遵循开发规范,便造成了安卓根目录混乱的现状。
+
1.3 某些应用开发者的错误理解
很多应用开发者为了适配安卓11的要求,做出了很多令人迷惑的行为。这里以腾讯的令人迷惑的操作举例。在QQ 8.2.8版本之后,将用户的下载文件位置从根目录更改到了Android文件夹内部,同时也是自身的数据文件夹。这让用户去查看自己下载的文件时十分麻烦。而且QQ在根目录仍然有着许多未知用途的文件夹。
+
1.4 标准文件夹的示例(MIUI)
- DCIM 保存相机拍摄的照片和视频(MIUI在该文件夹还存储了截图和屏幕录制)
- Documents 保存文档
- Download 保存下载文件
- Fonts 保存字体文件(MIUI系统字体文件保存在主题文件夹中)
- Movie 保存视频文件
- Music 保存音频文件
- Pictures 保存图片文件
- 等等
+
+
对于不同的定制系统同时也有自己存放关键系统文件的文件夹,例如MIUI会在根目录建立一个MIUI文件夹,用来存放各种系统软件的缓存文件和数据。
+
1.5 解决方案
- 依靠安卓大版本更新更严格的文件访问策略,强制应用使用更高的targetAPI。
- 依靠定制系统完善文件访问限制功能,感觉最近Flyme和MIUI的沙盒已经有了雏形了。
- 依靠Rikka开发的存储空间隔离(原名存储重定向),这也是我写本文的目的。
+
+
+
二. 安装与配置
这款软件在酷安上即有下载,原名存储重定向,现名存储空间隔离。
在使用这款软件之前,你需要接受以下的要求
+
- 手机已经获取了root权限
- 愿意为这款软件支付一定的费用
- 有耐心
- 可以接受某些奇奇怪怪的问题
- 可以主动寻找问题的解决方法
+
+
2.1 本机的使用环境为
小米10 MIUI12.5 21.2.3 Simplicity官改
+
+
+
2.2 模块介绍
在满足root的环境下,在Magsik模块安装页面,搜索riru关键字便可以看到riru系列模块
+
搜索模块
+
+
我们这里只安装两个模块
+
+
+
Riru核心
+
+
Riru - Enhanced mode for Storage Isolation V23.6
+
+
存储空间隔离
+
+
这里提醒一下,如果不安装Riru,而先去安装Riru - Enhanced mode for Storage Isolation,将会无法安装。所以请按照顺序安装模块。
+
2.3 下载软件
在酷安搜索存储空间隔离并下载
+
酷安
+
+
+
非Play平台
+
+
在Google Play搜索存储空间隔离并下载
+
Play平台
+
+
这里我推荐从Google Play下载,在Play商店购买的该软件,使用同一个谷歌账号可以多设备使用。
+
+
Play平台
+
+
目前软件的内购验证做的很完善,如果你是在Google Play下载,无需登录外网,直接点击恢复购买即可。
+
2.4 安装过程
下载完成后打开软件,便显示了软件的基本介绍
+
软件介绍
+
+
允许存储空间隔离获取Root权限,当出现提示成功时便可以进行下一步了。
+
获取Root权限 正常运行
+
+
如果出现问题,请按照以上步骤重新安装环境。
+
不过有的机型的确是有兼容问题。
+
+
+
主界面
+
+
2.5 备份文件
在这里,我会提供一份自己使用,基本没有错误的配置文件,你只需要在备份与还原里还原备份文件即可开始使用。
+
+
+
本配置文件的应用可能无法包含你所使用的应用,如果你想达到近乎完美的效果,请继续看下去。
+
+
+
+
三. 原理解释以及详细配置
3.1 原理
在存储空间隔离的官网,我们可以找到一些我们所需要的内容
+
+
+
以下内容是对官网指南的部分摘录以及我自己的理解
+
+
+
DCIM,Pictures,Download 等公共文件夹,用来保存用户的文件,允许应用在此根据需求新建文件夹来保存对应的文件。例如QQ应该将用户下载的文件保存在 Download/QQ
,而不是Android/data/包名
。
+
但是应用对于公共文件夹的访问应该是一次性的,有目的的。例如在QQ发送图片给好友,QQ在获取用户的允许后访问DCIM和Pictures文件夹,发送结束后系统应该收回访问权限。
+
+
+
Android文件夹内部对于用户来说是不应该进行访问的,对于应用来说则是无需授权就能够访问,在此保存应用的数据和缓存。
+
遗憾的是,目前原生安卓对于存储权限的选项只有允许和拒绝,此外,国内存在的大量“坏应用”如果被拒绝授权将不会运行。
+
存储空间隔离便是为了解决这一乱象而开发,这里感谢Rikka大佬开发了这款应用,在一定程度上很好解决了以上问题。
+
一般来说,不规范的应用会在根目录创建各种各样的文件夹。在启用存储空间隔离之后,应用将会在Android/data/包名/sdcard
内保存文件。
+
优点如下
+
+因为卸载应用时只会清理应用的数据文件夹,在对应用进行隔离后,卸载时下载文件和应用数据一并删除
系统统计应用占用空间大小仅会统计数据文件夹,在对应用进行隔离后,系统统计大小功能将会正常工作
+
+
3.2 使用教程
3.2.1 软件权限
对于MIUI用户,因为MIUI魔改了很多对于应用的控制权限,这里需要手动为存储空间隔离打开部分权限
+
+
+
+
+
+
3.2.2 默认存储空间位置
在软件的设置 - 行为 - 默认隔离存储空间位置中,你有两种选择
+
+- 保存在数据文件夹
+- 保存在缓存文件夹
+
+
缓存文件夹有着和数据文件夹一样的特性,但是缓存文件夹可能被清理软件所清理。这里根据自己的需求吧。一般来说保存在数据文件夹即可。
+
两种选择
+
+
3.2.3 可访问文件夹模板
然后回到上一级,在可访问文件夹模板中进行设置
在这里所设置的文件夹就是允许应用访问的公共文件夹
+
我在默认的基础上添加了对于Movie文件夹的访问
+
访问模板
+
+
现在回到主页面,点击应用管理,就可以对应用进行单独设置
+
为了避免重定向系统应用带来各种各样的bug,我们先对第三方应用进行配置
+
不显示系统应用
+
+
3.3 根据需求配置
白描是一款特别好用的OCR识别和PDF导出应用,这里我们拿它来讲解如何对一款应用重定向。
+
3.3.1 需求考虑
我们应该考虑,这款应用会获取什么信息,因为我常常用它将图片转成PDF格式,所以DCIM(拍摄的图片)和Pictures(下载的图片)是可访问的文件夹。所以说我们对白描设置可访问文件夹为DCIM和Pictures。
+
白描的配置界面
+
+
3.3.2 模拟正常使用过程
使用白描正常导出一次PDF,在查看文件历史里可以看到PDF保存在Download/Baimiao中。因为我希望保存在Document/白描,所以我们打开白描的Download访问权限(刚才是白描试图访问Download,但是被定向到了数据文件夹内部的Download),重新保存一次PDF,这时白描就会创建此文件夹。
+
导出路径
+
+
3.3.3 将隔离的文件同步到标准文件夹
在导出被隔离的文件中添加同步文件夹规则,来源路径选择Download(新版存储空间隔离导出时会将该应用在目录内的全部文件进行同步)
+
编写规则
+
+
+
3.3.4 检查结果
可以看到PDF文件成功保存到指定位置
+
同步成功
+
+
这里很多使用者都会有一个误区-既然我要把文件保存到Documents目录,那么为什么不把Documents设置为可访问的文件夹呢?其实很好解释,你把可访问的文件夹当做读取权限,把导出被隔离的文件当作写入权限,这样就明白了吧。
+
但是有些应用是很规范的,他们保存在标准文件夹,所以你应该允许该应用访问。
+
3.4 应用之间互相访问
用过存储重定向的老用户都应该遇到过哔哩哔哩的视频分享到QQ,会出现系统繁忙的提示,就算偶尔可能分享成功,视频的封面也不见了。
+
这是因为哔哩哔哩老版本在根目录的tv.danmuku.bili存放自己的图片缓存,而对哔哩哔哩和QQ进行隔离后,QQ是访问不到这个文件夹的,就造成了分享失败的问题。
+
目前这个问题貌似得到了解决,哔哩哔哩在某一个版本对缓存文件的位置做了更改,移动到了数据文件夹,这是一个可能的原因。此外还可能因为哔哩哔哩的分享在QQ上被改为了小程序分享,分享短链接包含了封面地址,所以分享成功进行。
+
因为目前我并没有遇到该问题,所以希望各位可以在评论区反馈你们的使用情况,我会抽时间测试一下对应的软件版本。
+
好了,最近遇到了这一问题。同时也讲一下解决方案。同类问题都可以按照此思路解决。
+
哔哩哔哩的视频想要分享到QQ(空间,联系人等),QQ需要读取哔哩哔哩的封面缓存信息,而因为存储重定向的缘故,QQ无法对你允许访问文件夹之外的内容进行读取和写入操作,这就导致了分享的失败。所以为了解决这一问题,首先通过文件历史找到正常情况下哔哩哔哩的缓存保存位置。最新版缓存保存位置在 Android/data/tv.danmaku.bili/files/Images
。然后在QQ可访问的文件夹,在其他应用的文件夹中创建新的规则。
+
如下图所示。
+
解决隔离应用无法分享的问题
+
+
四. 最终的清理
按照以上的例子,对用户应用一一设置。设置完成之后,删除除了标准文件夹的所有冗余文件,正常使用一段时间,你会发现根目录仍然会有一些文件夹,这时候就需要精准定位。
+
手动删除文件
+
+
如上图所示,比如说我们想知道com.miui.voiceassist
其实很明显,是小爱同学,但请假装不知道是由哪一个应用创建。
+
我们将文件夹名复制,在文件监视中粘贴。
+
文件监视
+
+
然后就会显示有那些应用对该文件夹进行读取或者是写入。
+
不过我们要清楚读取和写入的区别,比如说这里显示了媒体存储设备对该文件夹的访问,而我们了解一点相关内容便可以知道个该软件是在扫描各个文件夹来查找媒体文件,并没有进行写入,所以文件夹不是由它创建。
+
向下拉便可以找到小爱同学的文件访问记录。
+
访问记录
+
+
现在点击小爱同学,对其进行隔离。
+
应用配置
+
+
五. 或许会更完美
5.1 解决下载文件被某些应用存储在Android目录的问题
QQ这类将用户下载的文件保存在数据文件夹的应用
+
+
+
我采用的是Rikka开发的另一款应用-保存副本
+
酷安 应用介绍
+
+
当你在QQ下载文件之后,只需要在打开方式里选择保存副本,软件就可以在Download目录复制一份相同的文件。
+
操作方法 复制成功
+
+
六. 效果展示
这里我自己把Malody的谱面文件存在了Map文件夹。
+
miad这一个空文件是为了防止MIUI的应用开屏广告产生(直接卸载掉智能服务com.miui.systemAdSolution
即可。可以使用搞机助手进行卸载。一直用官改,不知道MIUI将广告服务集成在此应用里,感谢酷安@水水水淼的建议)
+
mm是Magsik的MM管理器
+
如果和文章开头对比一下,可以说是强迫症狂喜。
+
最终的效果
+
+
七. 写在最后
个人情况
我在寒假里策划了很多内容,从这一篇文章开始,我会逐渐向给各位展示我策划的优质内容。
+
新的开始
这算是一个新坑,目的就是向各位推荐一些优质的应用,他们真的可以方便你的生活。目前我的更新频率(如果没有什么意外的话基本就是一个月更新两次,一次是安卓上的应用,一次是PC上的应用),毕竟我刚进入大学,自己安排了很多学习的内容,时间并不是很充裕,保证质量是第一位(还有要填坑)。
+
欢迎交流
这些应用对于各位来说有的可能没用过,有的可能早就熟练上手。我希望我写的图文可以帮助小白零基础上手优质应用,从而提高效率。同时期待和各路大佬交流使用心得,不断完善文章内容和呈现形式。
+
在这里我也会虚心听取意见,无论是对图文内容的建议,或是对某些优质应用的推荐等等。
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/year2020/index.html b/posts/year2020/index.html
new file mode 100644
index 000000000..aaf81a312
--- /dev/null
+++ b/posts/year2020/index.html
@@ -0,0 +1,5213 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我的2020年度总结 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我的2020年度总结
+
+
+
+
+
+
+
+
+
前言
咕咕咕了好久的2020年度总结终于来啦!
+
~~才不是因为我懒~~
+
本文中所有内容截止于2021.1.1日
+
未来,一定更精彩!
+
第一阶段 高三下学期–高考
紧张的学习生活,每天基本都是两点一线的路线。
+
枯燥的学习生活,在最后的高考100天尤为如此,从周考到天天做不完的卷子。
+
温暖的学习生活,在向着理想的大学奋斗的路上,感谢每一位同学的陪伴,感谢老班的悉心辅导,感谢每一位老师的辛苦付出,满满的回忆。
+
终究有一个好结果。
+
下一个人生阶段,在曲师大度过。
+
第二阶段 暑假
放下了高三的压力,暑假便成为了我尽情发挥的舞台。
+
1. 第一台自己组装的主机
个人算是一个果粉吧。于是在进行配件选购的时候,并没有选择热门的AMD + N卡的组合,而是为了方便黑苹果的安装,选择了Intel + A卡的组合。
+
配置如下
+
CPU:Intel i5-9600K GPU:AMD RX5700 XT 内存:Kingston 骇客神条 3200MHz 8G x 2 固态:Western Digital SN750 500GB x 2 机械:TOSHIBA P300 3T 主板:MSI Z390 Gaming Puls 电源:Segotep 600W 散热:玄冰400 机箱:SAHARA 逆行者606 显示器:AOC 23.8英寸 24G2 1080P144 无线网卡:BCM943602CS
|
+
+
总体感觉还行吧,组装完成之后做了一个用OC引导的win10和macOS的双系统,这台电脑便是我暑假的主力机器。
+
电脑配置
+
+
关于macOS Catalina 10.15.6的EFI文件,我是参考Xjn´s Blog进行自己配置和调试,截止到文章书写的2021.1.18日,一切运行正常
+
关于macOS与其他苹果设备的联动,我个人用的是iPad mini2(网课专用板)。为了当前稳定的Wi-Fi链接和蓝牙功能(最初我是用的是USB网卡,不稳定,需要驱动支持),我入手了BCM943602CS这一款PCIE网卡。
+
从同学那里借来iPad Pro 2020做了一下测试,随航,接力,隔空投送都很完美。
+
+
+
这里建议对于macOS或是苹果全家桶生态有着需求的,不要考虑黑苹果主机,黑苹果在稳定性和方便程度都不如白苹果,而且,M1的MacBook好香!
+
2. 第一台个人笔记本
去上大学,当然不可以搬着一个MATX机箱去。
所以入手了一台R7000P(首发价格)
+
用了两年,看到当年的我说AMD YES,我真想穿越回去,告诉当年的我,Intel YES。
+
+
电脑配置
+
+
桌面如图
+
我的桌面
+
+
用了仿macOS的软件,还不错,基本的动画实现了,UI设计也挺不错的,但是经常出现崩溃。
+
正版macOS
+
正版macOS桌面
+
因为大学是软件工程专业,笔记本上搭建了python2,,python3,java,c等众多环境
+
3. 小米9 – 小米10
+2022年了 865还是顶,4750的电池还是比较大,90Hz的屏幕还是舒服,完全没有换手机的欲望。而且手机对我个人来说就是休闲小游戏加联系工具,下一次换手机估计换个Redmi Note了。
+
+
我的手机
+
+
4. Sony ZV-1
+2022年了,还在吃灰。。。。
+
+
第三阶段 初步迈入大学生活
1. Chevereto图片站
通过自己搭建图床,学到了不少关于云服务器的知识(之前搭建Wordpress博客接触过)。
+
+上杉九月的图片站
+
+
+
图片站
+
+
搭建教程已经出了
+
+
+
2. Hexo
+上杉九月的博客
+
+
+
博客首页
+
+
3. 云服务器
云服务器定时执行python脚本
+
+python脚本原地址
+
+
4. 初接触CTF
想作为一个兴趣爱好,寒假继续学习。
+
总结
2020年经历了人生大考,虽然有很多波折,但也是顺利的度过了。
+
在2020年我个人多是在实践应用投入了精力,2021年我将会在原理以及应用的代码实现付出。
+
目标就是有事情做,写写教程,平平安安就是理想啦。
+
2020年真的是魔幻的一年,疫情迅速席卷全球,中国顶着巨大压力成功遏制,没想到(应该是意料之中),自由的西方资本主义国家没能遏制疫情传播,天灾人祸,诸如此类。
+
2021年一定会好起来的,提前在这祝福各位新年快乐,事事顺利,一切安好。
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/posts/year2021/index.html b/posts/year2021/index.html
new file mode 100644
index 000000000..48d1d167f
--- /dev/null
+++ b/posts/year2021/index.html
@@ -0,0 +1,5264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我的2021年度总结 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 我的2021年度总结
+
+
+
+
+
+
+
+
+
前言
2021年,我对自己算是一半满意,一半不满意吧,有些事情不尽如人意,有些事情自己做的很好,希望在2022年我能够有所进步。
+
本文中所有内容截止于2022.1.1
+
New Dream New Start
+
这次的年终总结并不是按阶段划分的,而是分成了两个部分。
+
第一部分是对2021年全年的回顾,自己做了什么,还有什么需要改进的地方。
+
第二部分是对2022年的一个总体的规划,新的一年我应该向什么方向努力。
+
第一部分 我的2021
对于我来说,2021年研究了很多网站搭建的内容,熟练的掌握云服务器的各种应用方式,接下来就让我一一给各位梳理一下。
+
Hexo博客
+
+
图片介绍
+首页图
+
+
首页图
+
+
+主页信息流
+
+
主页
+
+
+文章阅读
+
+
文章内容
+
+
简介
+使用Hexo博客框架 + Github Pages
+
+
Hexo作为目前活跃度较高的博客框架,主题丰富,功能齐全,个人是十分喜欢由Hexo框架生成的静态博客,Github Pages的访问速度还是可以的,而且如果担心访问速度的话也可以将博客部署到Gitee。
+
+主题使用了Volantis 5.0 Beta 美化思路参考枋柚梓的猫会发光 (inkss.cn)
+
+
Volantis算是一个不错的博客主题,属于是上限高,下限也高,新手通过Volantis官方文档也能配置完成一个不错的页面,而如果想更进一步,Volantis官方还收录了很多大佬的美化教程,可以进行参考。
+
+该博客内容主攻计算机相关内容
+
+
由于是静态博客,写作相比于其他博客框架稍微有些繁琐,不适合日常更新。(不过有大佬写的HPP组件看起来还不错,等完善)。我在新的一年保证文章更新的情况下也会记录一下自己的其他方面的内容,放到博客分站吧。
+
+还有些正在调试的内容
+
+
Hexo是支持分站的,即可以将其他Hexo主题作为主站点的其他访问风格,目前还在做主站的调试,等主站稳定了把分站会恢复的。
+
Halo博客
+
+
图片介绍
+首页图
+
+
首页
+
+
+主页信息流
+
+
主页
+
+
+文章阅读
+
+
内容
+
+
简介
网站还处于调试期,打算把其他内容放在这里更新。
+
+网站是由Halo博客框架搭建
+
+
Halo博客框架属于是动态部署的博客类型,需要依托于Java环境。我把该博客部署在腾讯云上。
+
主题使用的是GitHub - LIlGG/halo-theme-sakura: Halo 版本的樱花🌸主题
+
Typecho博客
+
+
图片介绍
+首页图
+
+
首页
+
+
+文章阅读
+
+
内容
+
简介
Typecho是我最喜欢的博客框架之一,响应速度快,写作方便。
+
不过Typecho也有它的缺点,就是很多插件已经不更新了。
+
Typecho的主题很多是需要付费的,当然也有免费的主题。这里我使用的是秦枫鸢梦 - 🌸花有重开日,人无再少年🏃♂️ (zwying.com)
+
Chevereto图片站
+
+
图片介绍
+首页
+
+
首页
+
+
+图片浏览
+
+
图片展示
+
+
简介
图片站在去年年底就进入测试阶段,年初开始稳定运行。属于我这些网站中运行最为稳定的一个。。。
+
图片站可以注册(目前仅为邀请码开放,如果想上传图片的话,可以评论区留言邮箱,私发邀请码)
+
小服务器,空间不大,带宽不大,没法做到开放注册。
+
当然如果只是浏览和下载还是完全开放的。
+
图片链接是无法进行引用的,网站开启了防盗链
+
第二部分 我的2022
去年对于我来说,其实是荒废了很多时间。
+
直到年底的几个月才认清了方向,明确了自己的未来的道路。
+
第一件事:健康的身体
185cm的高个子 87KG的体重,BMI是稍微超标的。
+
对于我来说,身体长时间处于一个亚健康状态,精神支撑不了我去干一些事情,容易累,嗜睡。
+
+
2022 :第一件事 BMI回归正常水平,适当的增加肌肉
+
+
+
第二件事:英语
+
2022 :第二件事 2022年的两场考试,争取一遍过四级和六级
+
+
+
+
第三件事:考研
+
2022 :第三件事 2022年的两场考试,准备考研相关内容
+
+
+
第四件事:专业水平
+
2022 :第四件事 2022年的两场考试,全面提高自己的代码能力
+
+
+
第五件事:文章更新
+
2022 :第五件事 2022年的两场考试,持续产出高质量文章
+
+
+
+
关注上杉九月,关注上杉九月谢谢喵!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 评论
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/search/algolia.js b/search/algolia.js
new file mode 100644
index 000000000..2426c0d8d
--- /dev/null
+++ b/search/algolia.js
@@ -0,0 +1,172 @@
+"use strict";
+
+function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
+function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
+function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
+var SearchService = function () {
+ var fn = {};
+ var search, algolia, timerId;
+ fn.queryText = null;
+ fn.template = "\n ";
+ fn.init = function () {
+ var div = document.createElement("div");
+ div.innerHTML += fn.template;
+ document.body.append(div);
+ algolia = volantis.GLOBAL_CONFIG.search;
+ if (algolia.appId && algolia.apiKey && algolia.indexName) {
+ fn.event();
+ fn.setAlgolia();
+ } else {
+ document.querySelector('#u-search main.modal-body').innerHTML = 'Algolia setting is invalid!';
+ document.querySelector('#u-search main.modal-body').style.textAlign = 'center';
+ document.querySelector('#u-search .modal').style.maxHeight = '128px';
+ }
+ };
+ fn.event = function () {
+ document.querySelector("#u-search-btn-close").addEventListener("click", fn.close, false);
+ document.querySelector("#modal-overlay").addEventListener("click", fn.close, false);
+ document.querySelectorAll(".u-search-form").forEach(function (e) {
+ e.addEventListener("submit", fn.onSubmit, false);
+ });
+ document.querySelector("#algolia-search-input").addEventListener("input", function (event) {
+ var input = event.target.querySelector(".ais-SearchBox-input");
+ if (input) {
+ fn.queryText = input.value;
+ } else {
+ fn.queryText = event.target.value;
+ }
+ });
+ };
+ fn.setAlgolia = function () {
+ var _volantis$dark;
+ search = instantsearch({
+ indexName: algolia.indexName,
+ searchClient: algoliasearch(algolia.appId, algolia.apiKey),
+ searchFunction: function searchFunction(helper) {
+ helper.state.query && helper.search();
+ }
+ });
+ var configure = instantsearch.widgets.configure({
+ hitsPerPage: algolia.hitsPerPage
+ });
+ var searchBox = instantsearch.widgets.searchBox({
+ container: '#algolia-search-input',
+ autofocus: true,
+ showReset: false,
+ showSubmit: false,
+ showLoadingIndicator: false,
+ searchAsYouType: algolia.searchAsYouType,
+ placeholder: algolia.placeholder,
+ templates: {
+ input: 'algolia-input'
+ },
+ queryHook: function queryHook(query, refine) {
+ clearTimeout(timerId);
+ timerId = setTimeout(function () {
+ return refine(query);
+ }, 500);
+ }
+ });
+ var hits = instantsearch.widgets.hits({
+ container: '#algolia-hits',
+ templates: {
+ item: function item(data) {
+ var keyword = !!fn.queryText ? "?keyword=".concat(fn.queryText) : '';
+ var link = data.permalink ? data.permalink : "".concat(volantis.GLOBAL_CONFIG.root).concat(data.path);
+ var result = data._highlightResult;
+ var content = result.contentStripTruncate ? fn.cutContent(result.contentStripTruncate.value) : result.contentStrip ? fn.cutContent(result.contentStrip.value) : result.content ? fn.cutContent(result.content.value) : '';
+ return "\n \n ").concat(result.title.value || 'no-title', "\n ").concat(content, "\n ");
+ },
+ empty: function empty(data) {
+ return "".concat(volantis.GLOBAL_CONFIG.languages.search.hits_empty.replace(/\$\{query}/, data.query), "
");
+ }
+ }
+ });
+ var stats = instantsearch.widgets.stats({
+ container: '#algolia-info > .algolia-stats',
+ templates: {
+ text: function text(data) {
+ var stats = volantis.GLOBAL_CONFIG.languages.search.hits_stats.replace(/\$\{hits}/, data.nbHits).replace(/\$\{time}/, data.processingTimeMS);
+ return "".concat(stats);
+ }
+ }
+ });
+ var powerBy = instantsearch.widgets.poweredBy({
+ container: '#algolia-info > .algolia-poweredBy',
+ theme: ((_volantis$dark = volantis.dark) === null || _volantis$dark === void 0 ? void 0 : _volantis$dark.mode) === 'dark' ? 'dark' : 'light'
+ });
+ var pagination = instantsearch.widgets.pagination({
+ container: '#algolia-pagination',
+ totalPages: 5,
+ templates: {
+ first: '',
+ last: '',
+ previous: '',
+ next: ''
+ }
+ });
+ search.addWidgets([configure, searchBox, hits, stats, powerBy, pagination]);
+ search.start();
+ };
+ fn.setQueryText = function (queryText) {
+ var _search;
+ fn.queryText = queryText;
+ if (!search) {
+ fn.init();
+ }
+ (_search = search) === null || _search === void 0 ? void 0 : _search.setUiState(_defineProperty({}, algolia.indexName, {
+ query: queryText
+ }));
+ };
+ fn.search = function () {
+ document.querySelector("#u-search").style.display = "block";
+ document.addEventListener("keydown", function (event) {
+ if (event.code === "Escape") {
+ fn.close();
+ }
+ }, {
+ once: true
+ });
+ };
+ fn.onSubmit = function (event) {
+ event.preventDefault();
+ var input = event.target.querySelector(".u-search-input");
+ fn.setQueryText(input !== null && input !== void 0 && input.value ? input.value : event.target.value);
+ fn.search();
+ };
+ fn.cutContent = function (content) {
+ if (content === '') return '';
+ var firstOccur = content.indexOf('');
+ var start = firstOccur - 30;
+ var end = firstOccur + 120;
+ var pre = '';
+ var post = '';
+ if (start <= 0) {
+ start = 0;
+ end = 140;
+ } else {
+ pre = '...';
+ }
+ if (end > content.length) {
+ end = content.length;
+ } else {
+ post = '...';
+ }
+ var matchContent = pre + content.substring(start, end) + post;
+ return matchContent;
+ };
+ fn.close = function () {
+ document.querySelector("#u-search").style.display = "none";
+ };
+ return {
+ init: fn.init,
+ setQueryText: function setQueryText(queryText) {
+ fn.setQueryText(queryText);
+ },
+ search: fn.search,
+ close: fn.close
+ };
+}();
+Object.freeze(SearchService);
+SearchService.init();
\ No newline at end of file
diff --git a/search/hexo.js b/search/hexo.js
new file mode 100644
index 000000000..e5cafa229
--- /dev/null
+++ b/search/hexo.js
@@ -0,0 +1,196 @@
+"use strict";
+
+function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
+function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+var SearchService = function () {
+ var fn = {};
+ fn.queryText = null;
+ fn.data = null;
+ fn.template = "\n";
+ fn.init = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
+ var div, uSearchModalInput;
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
+ while (1) switch (_context.prev = _context.next) {
+ case 0:
+ div = document.createElement("div");
+ div.innerHTML += fn.template;
+ document.body.append(div);
+ document.querySelectorAll(".u-search-form").forEach(function (e) {
+ e.addEventListener("submit", fn.onSubmit, false);
+ });
+ uSearchModalInput = document.querySelector("#u-search-modal-input");
+ uSearchModalInput.addEventListener("input", fn.onSubmit);
+ document.querySelector("#u-search-btn-close").addEventListener("click", fn.close, false);
+ document.querySelector("#modal-overlay").addEventListener("click", fn.close, false);
+ if (fn.data) {
+ _context.next = 12;
+ break;
+ }
+ _context.next = 11;
+ return fn.fetchData();
+ case 11:
+ fn.data = _context.sent;
+ case 12:
+ case "end":
+ return _context.stop();
+ }
+ }, _callee);
+ }));
+ fn.onSubmit = function (event) {
+ event.preventDefault();
+ var input = event.target.querySelector(".u-search-input");
+ if (input) {
+ fn.queryText = input.value;
+ } else {
+ fn.queryText = event.target.value;
+ }
+ if (fn.queryText) {
+ fn.search();
+ }
+ };
+ fn.search = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
+ var results;
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
+ while (1) switch (_context2.prev = _context2.next) {
+ case 0:
+ document.querySelectorAll(".u-search-input").forEach(function (e) {
+ e.value = fn.queryText;
+ });
+ document.querySelector("#u-search").style.display = "block";
+ if (fn.data) {
+ _context2.next = 6;
+ break;
+ }
+ _context2.next = 5;
+ return fn.fetchData();
+ case 5:
+ fn.data = _context2.sent;
+ case 6:
+ results = "";
+ results += fn.buildResultList(fn.data.pages);
+ results += fn.buildResultList(fn.data.posts);
+ if (results === "") {
+ results = "".concat(volantis.GLOBAL_CONFIG.languages.search.hits_empty.replace(/\$\{query}/, fn.queryText), "
");
+ }
+ document.querySelector("#u-search .modal-results").innerHTML = results;
+ document.addEventListener("keydown", function f(event) {
+ if (event.code === "Escape") {
+ fn.close();
+ document.removeEventListener("keydown", f);
+ }
+ });
+ case 12:
+ case "end":
+ return _context2.stop();
+ }
+ }, _callee2);
+ }));
+ fn.close = function () {
+ document.querySelector("#u-search").style.display = "none";
+ };
+ fn.fetchData = function () {
+ return fetch(volantis.GLOBAL_CONFIG.search.dataPath).then(function (response) {
+ return response.text();
+ }).then(function (res) {
+ var data = JSON.parse(res);
+ // console.log(data);
+ return data;
+ });
+ };
+ fn.buildResultList = function (data) {
+ var html = "";
+ data.forEach(function (post) {
+ if (post.text) {
+ post.text = post.text.replace(/12345\d*/g, ""); // 简易移除代码行号
+ }
+
+ if (!post.title && post.text) {
+ post.title = post.text.trim().slice(0, 15);
+ }
+ if (fn.contentSearch(post)) {
+ html += fn.buildResult(post.permalink, post.title, post.digest);
+ }
+ });
+ return html;
+ };
+ fn.contentSearch = function (post) {
+ var post_title = post.title.trim().toLowerCase();
+ var post_content = post.text.trim().toLowerCase();
+ var keywords = fn.queryText.trim().toLowerCase().split(/[-\s]+/);
+ var foundMatch = false;
+ var index_title = -1;
+ var index_content = -1;
+ var first_occur = -1;
+ if (post_title && post_content) {
+ keywords.forEach(function (word, index) {
+ index_title = post_title.indexOf(word);
+ index_content = post_content.indexOf(word);
+ if (index_title < 0 && index_content < 0) {
+ foundMatch = false;
+ } else {
+ foundMatch = true;
+ if (index_content < 0) {
+ index_content = 0;
+ }
+ if (index === 0) {
+ first_occur = index_content;
+ }
+ }
+ if (foundMatch) {
+ post_content = post.text.trim();
+ var start = 0;
+ var end = 0;
+ if (first_occur >= 0) {
+ start = Math.max(first_occur - 40, 0);
+ end = start === 0 ? Math.min(200, post_content.length) : Math.min(first_occur + 120, post_content.length);
+ var match_content = post_content.substring(start, end);
+ keywords.forEach(function (keyword) {
+ var regS = new RegExp(keyword, "gi");
+ match_content = match_content.replace(regS, "" + keyword + "");
+ });
+ post.digest = match_content + "......";
+ } else {
+ end = Math.min(200, post_content.length);
+ post.digest = post_content.trim().substring(0, end);
+ }
+ }
+ });
+ }
+ return foundMatch;
+ };
+ fn.buildResult = function (url, title, digest) {
+ var result = fn.getUrlRelativePath(url);
+ var html = "";
+ html += "";
+ html += "";
+ html += "" + title + "";
+ if (digest !== "") html += "" + digest + "";
+ html += "";
+ html += "";
+ return html;
+ };
+ fn.getUrlRelativePath = function (url) {
+ var arrUrl = url.split("//");
+ var start = arrUrl[1].indexOf("/");
+ var relUrl = arrUrl[1].substring(start);
+ if (relUrl.indexOf("?") != -1) {
+ relUrl = relUrl.split("?")[0];
+ }
+ return relUrl;
+ };
+ return {
+ init: function init() {
+ fn.init();
+ },
+ setQueryText: function setQueryText(queryText) {
+ fn.queryText = queryText;
+ },
+ search: function search() {
+ fn.search();
+ }
+ };
+}();
+Object.freeze(SearchService);
+SearchService.init();
\ No newline at end of file
diff --git a/search/meilisearch.js b/search/meilisearch.js
new file mode 100644
index 000000000..b58c8a3c2
--- /dev/null
+++ b/search/meilisearch.js
@@ -0,0 +1,157 @@
+"use strict";
+
+function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
+function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
+function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
+var SearchService = function () {
+ var fn = {};
+ var search, meilisearch, timerId;
+ fn.queryText = null;
+ fn.template = "\n ";
+ fn.init = function () {
+ var div = document.createElement("div");
+ div.innerHTML += fn.template;
+ document.body.append(div);
+ meilisearch = volantis.GLOBAL_CONFIG.search;
+ if (meilisearch.appId && meilisearch.apiKey && meilisearch.indexName) {
+ fn.event();
+ fn.setAlgolia();
+ } else {
+ document.querySelector('#u-search main.modal-body').innerHTML = 'Algolia setting is invalid!';
+ document.querySelector('#u-search main.modal-body').style.textAlign = 'center';
+ document.querySelector('#u-search .modal').style.maxHeight = '128px';
+ }
+ };
+ fn.event = function () {
+ document.querySelector("#u-search-btn-close").addEventListener("click", fn.close, false);
+ document.querySelector("#modal-overlay").addEventListener("click", fn.close, false);
+ document.querySelectorAll(".u-search-form").forEach(function (e) {
+ e.addEventListener("submit", fn.onSubmit, false);
+ });
+ document.querySelector("#meilisearch-search-input").addEventListener("input", function (event) {
+ var input = event.target.querySelector(".ais-SearchBox-input");
+ if (input) {
+ fn.queryText = input.value;
+ } else {
+ fn.queryText = event.target.value;
+ }
+ });
+ };
+ fn.setAlgolia = function () {
+ search = instantsearch({
+ indexName: meilisearch.indexName,
+ searchClient: instantMeiliSearch(meilisearch.appId, meilisearch.apiKey),
+ searchFunction: function searchFunction(helper) {
+ helper.state.query && helper.search();
+ }
+ });
+ var configure = instantsearch.widgets.configure({
+ hitsPerPage: meilisearch.hitsPerPage
+ });
+ var searchBox = instantsearch.widgets.searchBox({
+ container: '#meilisearch-search-input',
+ autofocus: true,
+ showReset: false,
+ showSubmit: false,
+ showLoadingIndicator: false,
+ searchAsYouType: meilisearch.searchAsYouType,
+ placeholder: meilisearch.placeholder,
+ templates: {
+ input: 'meilisearch-input'
+ },
+ queryHook: function queryHook(query, refine) {
+ clearTimeout(timerId);
+ timerId = setTimeout(function () {
+ return refine(query);
+ }, 500);
+ }
+ });
+ var hits = instantsearch.widgets.hits({
+ container: '#meilisearch-hits',
+ templates: {
+ item: function item(data) {
+ var keyword = !!fn.queryText ? "?keyword=".concat(fn.queryText) : '';
+ var link = data.permalink ? data.permalink : "".concat(volantis.GLOBAL_CONFIG.root).concat(data.path);
+ var result = data._highlightResult;
+ var content = fn.cutContent(result.text.value);
+ return "\n \n ").concat(result.title.value || 'no-title', "\n ").concat(content, "\n ");
+ },
+ empty: function empty(data) {
+ return "".concat(volantis.GLOBAL_CONFIG.languages.search.hits_empty.replace(/\$\{query}/, data.query), "
");
+ }
+ }
+ });
+ var stats = instantsearch.widgets.stats({
+ container: '#meilisearch-info > .meilisearch-stats',
+ templates: {
+ text: function text(data) {
+ var stats = volantis.GLOBAL_CONFIG.languages.search.hits_stats.replace(/\$\{hits}/, data.nbHits).replace(/\$\{time}/, data.processingTimeMS);
+ return "".concat(stats);
+ }
+ }
+ });
+ search.addWidgets([searchBox, hits, stats]);
+ search.start();
+ };
+ fn.setQueryText = function (queryText) {
+ var _search;
+ fn.queryText = queryText;
+ if (!search) {
+ fn.init();
+ }
+ (_search = search) === null || _search === void 0 ? void 0 : _search.setUiState(_defineProperty({}, meilisearch.indexName, {
+ query: queryText
+ }));
+ };
+ fn.search = function () {
+ document.querySelector("#u-search").style.display = "block";
+ document.addEventListener("keydown", function (event) {
+ if (event.code === "Escape") {
+ fn.close();
+ }
+ }, {
+ once: true
+ });
+ };
+ fn.onSubmit = function (event) {
+ event.preventDefault();
+ var input = event.target.querySelector(".u-search-input");
+ fn.setQueryText(input !== null && input !== void 0 && input.value ? input.value : event.target.value);
+ fn.search();
+ };
+ fn.cutContent = function (content) {
+ if (content === '') return '';
+ var firstOccur = content.indexOf('');
+ var start = firstOccur - 30;
+ var end = firstOccur + 120;
+ var pre = '';
+ var post = '';
+ if (start <= 0) {
+ start = 0;
+ end = 140;
+ } else {
+ pre = '...';
+ }
+ if (end > content.length) {
+ end = content.length;
+ } else {
+ post = '...';
+ }
+ var matchContent = pre + content.substring(start, end) + post;
+ return matchContent;
+ };
+ fn.close = function () {
+ document.querySelector("#u-search").style.display = "none";
+ };
+ return {
+ init: fn.init,
+ setQueryText: function setQueryText(queryText) {
+ fn.setQueryText(queryText);
+ },
+ search: fn.search,
+ close: fn.close
+ };
+}();
+Object.freeze(SearchService);
+SearchService.init();
\ No newline at end of file
diff --git a/tags/CTF/index.html b/tags/CTF/index.html
new file mode 100644
index 000000000..54da08876
--- /dev/null
+++ b/tags/CTF/index.html
@@ -0,0 +1,4854 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:CTF - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CTF还是挺有趣的,每天都做一做当作放松吧
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tags/Hexo/index.html b/tags/Hexo/index.html
new file mode 100644
index 000000000..4c2e2fae1
--- /dev/null
+++ b/tags/Hexo/index.html
@@ -0,0 +1,4984 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:Hexo - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在上次教程已经完成了基本搭建,本次教程来将主题应用到博客。因为目前很多Hexo主题都处于停更状态,我推荐使用Volantis主题或Butterfly主题。本教程仅介绍Volantis的使用方法。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章讲述了`_config.yml`的内容配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章,将会从Hexo博客的基本搭建,以及如何将你的博客部署到网络进行访问。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tags/PC/index.html b/tags/PC/index.html
new file mode 100644
index 000000000..ee60a8fa0
--- /dev/null
+++ b/tags/PC/index.html
@@ -0,0 +1,4854 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:PC - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PerfDog已经收费,本教程不再更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tags/Python/index.html b/tags/Python/index.html
new file mode 100644
index 000000000..205a3099c
--- /dev/null
+++ b/tags/Python/index.html
@@ -0,0 +1,4854 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:Python - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 使用Python脚本自动打卡智慧曲园
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tags/WSA/index.html b/tags/WSA/index.html
new file mode 100644
index 000000000..a77cc111b
--- /dev/null
+++ b/tags/WSA/index.html
@@ -0,0 +1,4854 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:WSA - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Win11独占的WSA,如今Win10也能够使用,对于不想使用Bug11的AMD的用户来说,又有一个不更新系统的理由。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tags/Windows/index.html b/tags/Windows/index.html
new file mode 100644
index 000000000..e36f3dd89
--- /dev/null
+++ b/tags/Windows/index.html
@@ -0,0 +1,4854 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:Windows - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Win11独占的WSA,如今Win10也能够使用,对于不想使用Bug11的AMD的用户来说,又有一个不更新系统的理由。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tags/index.html b/tags/index.html
new file mode 100644
index 000000000..bc0c9186a
--- /dev/null
+++ b/tags/index.html
@@ -0,0 +1,4553 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 所有标签 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\344\272\221\346\234\215\345\212\241\345\231\250/index.html" "b/tags/\344\272\221\346\234\215\345\212\241\345\231\250/index.html"
new file mode 100644
index 000000000..46a3c9e97
--- /dev/null
+++ "b/tags/\344\272\221\346\234\215\345\212\241\345\231\250/index.html"
@@ -0,0 +1,4919 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:云服务器 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 使用Python脚本自动打卡智慧曲园
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto算是一个集图床功能与图片展示为一体的项目,同时还提供了注册功能,如果你的服务器带宽允许,你可以邀请小伙伴为你的图片站扩充资源!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\205\254\345\221\212/index.html" "b/tags/\345\205\254\345\221\212/index.html"
new file mode 100644
index 000000000..c96842b0e
--- /dev/null
+++ "b/tags/\345\205\254\345\221\212/index.html"
@@ -0,0 +1,4858 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:公告 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本次更新内容 - 恢复更新,主题版本更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\215\232\345\256\242/index.html" "b/tags/\345\215\232\345\256\242/index.html"
new file mode 100644
index 000000000..1eb0caca4
--- /dev/null
+++ "b/tags/\345\215\232\345\256\242/index.html"
@@ -0,0 +1,4858 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:博客 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本次更新内容 - 恢复更新,主题版本更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\233\276\345\272\212/index.html" "b/tags/\345\233\276\345\272\212/index.html"
new file mode 100644
index 000000000..6e825f59e
--- /dev/null
+++ "b/tags/\345\233\276\345\272\212/index.html"
@@ -0,0 +1,4854 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:图床 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto算是一个集图床功能与图片展示为一体的项目,同时还提供了注册功能,如果你的服务器带宽允许,你可以邀请小伙伴为你的图片站扩充资源!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\255\246\344\271\240\347\254\224\350\256\260/index.html" "b/tags/\345\255\246\344\271\240\347\254\224\350\256\260/index.html"
new file mode 100644
index 000000000..eec353966
--- /dev/null
+++ "b/tags/\345\255\246\344\271\240\347\254\224\350\256\260/index.html"
@@ -0,0 +1,4856 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:学习笔记 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章实现了单链表的基本增删操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\256\211\345\215\223/index.html" "b/tags/\345\256\211\345\215\223/index.html"
new file mode 100644
index 000000000..e02de8c5d
--- /dev/null
+++ "b/tags/\345\256\211\345\215\223/index.html"
@@ -0,0 +1,4854 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:安卓 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 安卓系统的根目录,本不应该如此混乱。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\271\264\345\272\246\346\200\273\347\273\223/index.html" "b/tags/\345\271\264\345\272\246\346\200\273\347\273\223/index.html"
new file mode 100644
index 000000000..6033aa963
--- /dev/null
+++ "b/tags/\345\271\264\345\272\246\346\200\273\347\273\223/index.html"
@@ -0,0 +1,4919 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:年度总结 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2021
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 回顾一下我的2020
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\345\272\224\347\224\250\344\275\277\347\224\250\346\214\207\345\215\227/index.html" "b/tags/\345\272\224\347\224\250\344\275\277\347\224\250\346\214\207\345\215\227/index.html"
new file mode 100644
index 000000000..a43553ddf
--- /dev/null
+++ "b/tags/\345\272\224\347\224\250\344\275\277\347\224\250\346\214\207\345\215\227/index.html"
@@ -0,0 +1,4919 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:应用使用指南 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PerfDog已经收费,本教程不再更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 安卓系统的根目录,本不应该如此混乱。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\346\227\245\345\277\227/index.html" "b/tags/\346\227\245\345\277\227/index.html"
new file mode 100644
index 000000000..bd8e6e082
--- /dev/null
+++ "b/tags/\346\227\245\345\277\227/index.html"
@@ -0,0 +1,4858 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:日志 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本次更新内容 - 恢复更新,主题版本更新
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\351\233\266\345\237\272\347\241\200/index.html" "b/tags/\351\233\266\345\237\272\347\241\200/index.html"
new file mode 100644
index 000000000..8e6045f8b
--- /dev/null
+++ "b/tags/\351\233\266\345\237\272\347\241\200/index.html"
@@ -0,0 +1,5179 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:零基础 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Win11独占的WSA,如今Win10也能够使用,对于不想使用Bug11的AMD的用户来说,又有一个不更新系统的理由。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在上次教程已经完成了基本搭建,本次教程来将主题应用到博客。因为目前很多Hexo主题都处于停更状态,我推荐使用Volantis主题或Butterfly主题。本教程仅介绍Volantis的使用方法。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章讲述了`_config.yml`的内容配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章,将会从Hexo博客的基本搭建,以及如何将你的博客部署到网络进行访问。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 使用Python脚本自动打卡智慧曲园
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chevereto算是一个集图床功能与图片展示为一体的项目,同时还提供了注册功能,如果你的服务器带宽允许,你可以邀请小伙伴为你的图片站扩充资源!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/tags/\351\261\274\347\232\256\347\232\204\347\256\227\346\263\225\351\200\232\345\205\263\346\235\221/index.html" "b/tags/\351\261\274\347\232\256\347\232\204\347\256\227\346\263\225\351\200\232\345\205\263\346\235\221/index.html"
new file mode 100644
index 000000000..c1475f79f
--- /dev/null
+++ "b/tags/\351\261\274\347\232\256\347\232\204\347\256\227\346\263\225\351\200\232\345\205\263\346\235\221/index.html"
@@ -0,0 +1,4856 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标签:鱼皮的算法通关村 - 九月的生活
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
上杉九月的博客
+
+
+
每天醒来,都会充满活力!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本篇文章实现了单链表的基本增删操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
简介:主角工藤新一原本是一位颇具名声的高中生侦探,在目击黑暗组织的地下交易后,正准备追踪时却被突袭击昏,并被灌下代号为“APTX4869”的不明药物。后来虽然幸免于死,但身体就此缩小为小学时期的模样。之后他...