Q1: 介绍一下我自己

我呢就是一个苦逼的又穷苦的学生党,目前在华科读物理博士,喜欢在苦逼的科研生活中倒腾一些科技玩意儿。

Q2:你目前正在主力使用的设备有哪些?

丐中丐256+16G M1 Mac mini,1T+64G M1 Max MBP,再加上一块亏出翔的18年的iPad Pro。最近把我的mini变成了一个mini的服务器,拉满了,插了3块硬盘,一块1T SSD、一块2T、一块4THDD。

Q3:哪些 App 对你的工作 / 学习 / 生活最重要?

  1. 工作:Python,Matlab,VSCode,iTerm2,NeoVim
  2. 学习:Zotero,MarginNote3,GoodNotes3,Notability
  3. 生活:微信,Infuse,天气App

Q4:在你订阅的付费服务当中哪一些是不可或缺的?

机场


接下来让我们进入正题!

在这篇文章中我想简要介绍一下如何0成本的打造一个能够随时随地访问的云上NAS,直接秒杀爱优腾,没有高昂的费用,无需购买任何东西,简直就是穷苦学生的福星。

网盘神器AList

接下来讲讲我们的主角AList,他其实本身是一个网盘管理工具,方便人们把众多的网盘整合起来一起管理。AList 的安装和使用可谓是有手就行了,并且支持多平台,macOS,Windows 和 Linux 都能流畅运行,具体的安装和教程官网都记载的很详细了,我就不在这里多做介绍了。

AList最牛的是他能够让你批量的管理你的网盘,并且,别人通过你搭建的AList访问这些资源时,并不占用你的带宽,而是他们和网盘直接链接,你的AList只是作为一个转发。

AList官方文档

内网穿透CPolar

那么在安装好AList并且挂载了满满的网盘资源之后,如何能够让自己的小伙伴们也能访问呢,我们不需要购买昂贵的服务器,也不需要公网IP,只需要做一个内网穿透即可,把AList监听的端口暴露给公网以供访问就OK了。

cpolar是一个易用的内网穿透工具,我们这里就主要是通过它来把我们的 AList 暴露在公网上,来实现随地访问。

CPolar官网

cpolar的安装也是有手就行,直接照着官方文档来就行。

在安装并启用了cpolar之后,到浏览器输入127.0.0.1:9200访问cpolar的web-ui

cpolar web-ui

用你注册的账号密码登陆后,按照下图操作创建一个http隧道来暴露AList端口,5244为AList的默认监听端口,如果你自定义了就把他换成你自定义的端口。

创建好之后就能够在状态里的在线隧道列表中看到刚刚创建的隧道了,接下来只用记录下公网地址就能随地的登陆和享受了😎

在线隧道列表

WebDAV

AList的在线播放器能够播放绝大部分的视频,但是对于一些4K,杜比或者HDR的视频,在线播放器还是难以满足,这时就需要一个支持WebDAV的播放器,例如Mac端的Infuse,Win的PotPlayer,iOS和Android的nPlayer。挂载也很简单,以infuse为例

Infuse WebDAV

之后就可以随处随地安心享受了,enjoy!

放几张我自己搭的

网站
Infuse

AList的美化代码也贴一下,主要是参考的B站安稳大神的视频

放在AList管理中设置的全局选项内

header

h<!-- 改自B站美化教程https://www.bilibili.com/video/BV1Wg41187Bf/?spm_id_from=333.788&vd_source=056118101dc003c0df303e05a9e6a3e2 -->
<!--Alist V3建议添加的,已经默认添加了,如果你的没有建议加上-->
<script src="https://polyfill.io/v3/polyfill.min.js?features=String.prototype.replaceAll"></script>

<!--引入字体,全局字体使用-->
<link
  rel="stylesheet"
  href="https://npm.elemecdn.com/lxgw-wenkai-webfont@1.1.0/lxgwwenkai-regular.css"
/>

<!-- Font6,自定义底部使用和看板娘使用的图标和字体文件-->
<link
  type="text/css"
  rel="stylesheet"
  href="https://npm.elemecdn.com/font6pro@6.0.1/css/fontawesome.min.css"
  media="all"
/>
<link
  href="https://npm.elemecdn.com/font6pro@6.0.1/css/all.min.css"
  rel="stylesheet"
/>

<!--音乐播放器所用的文件-->
<!-- require APlayer -->
<link
  rel="stylesheet"
  href="https://npm.elemecdn.com/aplayer@1.10.1/dist/APlayer.min.css"
/>
<script src="https://npm.elemecdn.com/aplayer@1.10.1/dist/APlayer.min.js"></script>
<!-- require MetingJS -->
<script src="https://npm.elemecdn.com/meting@2.0.1/dist/Meting.min.js"></script>

<style>
  /* 去除通知栏 右上角 X */
  .notify-render .hope-close-button {
    display: none;
  }

  /* 
            樱花:https://www.dmoe.cc
            夏沫:https://cdn.seovx.com
            搏天:https://api.btstu.cn/doc/sjbz.php
            姬长信:https://github.com/insoxin/API
            小歪:https://api.ixiaowai.cn/
            保罗:https://api.paugram.com
            墨天逸:https://api.mtyqx.cn
            岁月小筑:https://img.xjh.me
            东方Project:https://img.paulzzh.com
        */
  /*白天背景图*/
  .hope-ui-light {
    background-image: url("https://api.ixiaowai.cn/api/api.php") !important;
    background-repeat: no-repeat;
    background-size: cover;
    background-attachment: fixed;
    background-position-x: center;
  }

  /*夜间背景图*/
  .hope-ui-dark {
    background-image: url(https://api.ixiaowai.cn/api/api.php) !important;
    background-repeat: no-repeat;
    background-size: cover;
    background-attachment: fixed;
    background-position-x: center;
  }

  /*主列表夜间模式透明,50%这数值是控制透明度大小的*/
  .obj-box.hope-stack.hope-c-dhzjXW.hope-c-PJLV.hope-c-PJLV-iigjoxS-css {
    background-color: rgb(0 0 0 / 50%) !important;
  }

  /*readme夜间模式透明,50%这数值是控制透明度大小的*/
  .hope-c-PJLV.hope-c-PJLV-iiuDLME-css {
    background-color: rgb(0 0 0 / 50%) !important;
  }

  /*主列表透明*/
  .obj-box.hope-stack.hope-c-dhzjXW.hope-c-PJLV.hope-c-PJLV-igScBhH-css {
    background-color: rgba(255, 255, 255, 0.5) !important;
  }

  /*readme透明*/
  .hope-c-PJLV.hope-c-PJLV-ikSuVsl-css {
    background-color: rgba(255, 255, 255, 0.5) !important;
  }

  /*顶部右上角切换按钮透明*/
  .hope-c-ivMHWx-hZistB-cv.hope-icon-button {
    background-color: rgba(255, 255, 255, 0.3) !important;
  }

  /*右下角侧边栏按钮透明*/
  .hope-c-PJLV-ijgzmFG-css {
    background-color: rgba(255, 255, 255, 0.5) !important;
  }

  /*白天模式代码块透明*/
  .hope-ui-light pre {
    background-color: rgba(255, 255, 255, 0.1) !important;
  }

  /*夜间模式代码块透明*/
  .hope-ui-dark pre {
    background-color: rgba(255, 255, 255, 0) !important;
  }

  /*底部CSS,.APP .tanle这三个一起的*/
  dibu {
    border-top: 0px;
    position: absolute;
    bottom: 0;
    width: 100%;
    margin: 0px;
    padding: 0px;
  }

  .App {
    min-height: 85vh;
  }

  .table {
    margin: auto;
  }

  /*去掉底部*/
  .footer {
    display: none !important;
  }

  /*全局字体*/
  * {
    font-family: LXGW WenKai;
  }

  * {
    font-weight: bold;
  }

  body {
    font-family: LXGW WenKai;
  }

  /*渐变背景CSS*/
  #canvas-basic {
    position: fixed;
    display: block;
    width: 100%;
    height: 100%;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: -999;
  }
</style>

<!--看板娘 -自定义大小,隐藏对话框和对话框高度-->
<style type="text/css">
  #waifu #live2d {
    height: 350px !important;
    width: 350px !important;
  }

  #waifu-tips {
    top: -60px;
    /*display:none !important;隐藏对话框*/
  }
</style>
<!--看板娘加载指定模型-->
<script>
  localStorage.setItem("modelId", "17");
  localStorage.setItem("modelTexturesId", "2");
</script>

<!--自己选左右-->
<script src="https://api.itggg.cn/live2dnew/left/index.js"></script>

Body

<!-- 来自B站美化教程 https://www.bilibili.com/video/BV1Wg41187Bf/?spm_id_from=333.788&vd_source=056118101dc003c0df303e05a9e6a3e2 -->
<!--延迟加载-->
<!--如果要写自定义内容建议都加到这个延迟加载的范围内-->
<div id="customize" style="display: none">
  <div>
    <!--音乐播放器-->
    <!--  <meting-js fixed="true" autoplay="true" theme="#409EFF" list-folded="true" auto="https://music.163.com/#/playlist?id=7289498727"></meting-js> -->
    <!-- <br /> -->
    <center class="dibu">
      <div style="line-height: 20px; font-size: 9pt; font-weight: bold">
        <span>
          "
          <span
            style="color: rgb(13, 109, 252); font-weight: bold"
            id="hitokoto"
          >
            <a href="#" id="hitokoto_text">
              "人生最大的遗憾,就是在最无能为力的时候遇到一个想要保护一生的人."
            </a>
          </span>
          "
        </span>
        <p style="margin-left: 10rem; font-size: 8pt">
          <small> —— Dr.QYQ </small>
        </p>
      </div>

      <div style="font-size: 13px; font-weight: bold">
        <span class="nav-item">
          <a class="nav-link" href="qyqstc@gmail.com" target="_blank">
            <i
              class="fa-duotone fa-envelope-open"
              style="color: #409eff"
              aria-hidden="true"
            >
            </i>
            邮箱 |
          </a>
        </span>
        <span class="nav-item">
          <a class="nav-link" href="qyqsdtc.github.io" target="_blank">
            <i class="fas fa-edit" style="color: #409eff" aria-hidden="true">
            </i>
            博客 |
          </a>
        </span>
        <!--后台入口-->
        <span class="nav-item">
          <a class="nav-link" href="/@manage" target="_blank">
            <i
              class="fa-solid fa-folder-gear"
              style="color: #409eff"
              aria-hidden="true"
            >
            </i>
            管理 |
          </a>
        </span>
        <span class="nav-item">
          <a class="nav-link" href="/@login" target="_blank">
            <i
              class="fa-solid fa-folder-gear"
              style="color: #409eff"
              aria-hidden="true"
            >
            </i>
            登陆 |
          </a>
        </span>
        <!--版权,请尊重作者-->
        <span class="nav-item">
          <a
            class="nav-link"
            href="https://github.com/Xhofe/alist"
            target="_blank"
          >
            <i
              class="fa-solid fa-copyright"
              style="color: #409eff"
              aria-hidden="true"
            >
            </i>
            Alist
          </a>
        </span>
        <br />
      </div>
    </center>
    <br />
    <br />
  </div>

  <!--一言API-->
  <script
    src="https://v1.hitokoto.cn/?encode=js&select=%23hitokoto"
    defer
  ></script>
  <!--延迟加载范围到这里结束-->
</div>
<!--延迟加载配套使用JS-->
<script>
  let interval = setInterval(() => {
    if (document.querySelector(".footer")) {
      document.querySelector("#customize").style.display = "";
      clearInterval(interval);
    }
  }, 200);
</script>

<!-- 渐变背景初始化,如果要使用渐变背景把下面的那一行注释去掉即可-->
<!-- 下面的几行都是渐变的一套,自定义头部内还有一个关联的自定义CSS -->
<!--<canvas id="canvas-basic"></canvas> -->
<script src="https://npm.elemecdn.com/granim@2.0.0/dist/granim.min.js"></script>
<script>
  var granimInstance = new Granim({
    element: "#canvas-basic",
    direction: "left-right",
    isPausedWhenNotInView: true,
    states: {
      "default-state": {
        gradients: [
          ["#a18cd1", "#fbc2eb"],
          ["#fff1eb", "#ace0f9"],
          ["#d4fc79", "#96e6a1"],
          ["#a1c4fd", "#c2e9fb"],
          ["#a8edea", "#fed6e3"],
          ["#9890e3", "#b1f4cf"],
          ["#a1c4fd", "#c2e9fb"],
          ["#fff1eb", "#ace0f9"],
        ],
      },
    },
  });
</script>

<!-- 网页鼠标点击特效 - 爱心 -->
<script type="text/javascript">
  !(function (e, t, a) {
    function r() {
      for (var e = 0; e < s.length; e++)
        s[e].alpha <= 0
          ? (t.body.removeChild(s[e].el), s.splice(e, 1))
          : (s[e].y--,
            (s[e].scale += 0.004),
            (s[e].alpha -= 0.013),
            (s[e].el.style.cssText =
              "left:" +
              s[e].x +
              "px;top:" +
              s[e].y +
              "px;opacity:" +
              s[e].alpha +
              ";transform:scale(" +
              s[e].scale +
              "," +
              s[e].scale +
              ") rotate(45deg);background:" +
              s[e].color +
              ";z-index:99999"));
      requestAnimationFrame(r);
    }
    function n() {
      var t = "function" == typeof e.onclick && e.onclick;
      e.onclick = function (e) {
        t && t(), o(e);
      };
    }

    function o(e) {
      var a = t.createElement("div");
      (a.className = "heart"),
        s.push({
          el: a,
          x: e.clientX - 5,
          y: e.clientY - 5,
          scale: 1,
          alpha: 1,
          color: c(),
        }),
        t.body.appendChild(a);
    }

    function i(e) {
      var a = t.createElement("style");
      a.type = "text/css";
      try {
        a.appendChild(t.createTextNode(e));
      } catch (t) {
        a.styleSheet.cssText = e;
      }
      t.getElementsByTagName("head")[0].appendChild(a);
    }

    function c() {
      return (
        "rgb(" +
        ~~(255 * Math.random()) +
        "," +
        ~~(255 * Math.random()) +
        "," +
        ~~(255 * Math.random()) +
        ")"
      );
    }
    var s = [];
    (e.requestAnimationFrame =
      e.requestAnimationFrame ||
      e.webkitRequestAnimationFrame ||
      e.mozRequestAnimationFrame ||
      e.oRequestAnimationFrame ||
      e.msRequestAnimationFrame ||
      function (e) {
        setTimeout(e, 1e3 / 60);
      }),
      i(
        ".heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}"
      ),
      n(),
      r();
  })(window, document);
</script>

 

5
2