Light App Engine - 一个轻量应用引擎 由 sakurapuare.com

让更多怀抱梦想的人们以低廉的价格轻松上云

——来自LAE官方页面

介绍

Light App Engine,简称 LAE。是一个由 iVampireSP 大佬发起的项目,目前开发人员有 iVampireSP 大佬、冰砚炽 大佬,基于 PHP Laravel 编写,目前处于公测中。

项目地址:https://lightart.top

LAE 有个用户 QQ 群,旨在更方便的与用户们交流与提供更加实时的技术支持,群号:769779712。

开始

打开 LAE 主页,注册一个 LoliArt 账号,往账户里充值一定的金额,创建一个项目,再创建一个Linux容器,选一个模板,只需要简单的创建一条端口映射,你就拥有了一个即开即用的罐头容器。

目前支持的容器类型:

  • Ubuntu 20.04
  • CentOS 7
  • MCSManager 8
  • Arch Linux
  • 宝塔 7.7.0 (基于 Ubuntu 20.04)
  • BDS 1.17.11 (带 LiteXLoader)

至于容器的价格,比起各大云服务商的服务器来说,应该是相当实惠了。(1 CNY = 100 积分)

名称CPU内存硬盘积分/分钟折合每月
Mini 256 MB1 Core256 M5 G0.00120.5184
Small 512 MB1 Core512 M5 G0.00230.9936
Standard 1024 MB 2 Core1024 M10 G0.0166.912
Standard++ 2048 MB 2 Core 2048 M15 G0.04720.304
Medium 4096 MB4 Core4096 M 20 G0.0938.88
Large 8192 MB8 Core8192 M35 G0.1877.76
Large 8192 MB++8 Core8192 M40 G0.2190.72

就书樱来看的话,这个价格是很实惠的,不妨可以试试。

最后附上一些教程(排名不分先后):

  1. 搭建一个Minecraft服务器带面板有多方便? – iVampireSP的物语
  2. LAE论坛
  3. 快速入门指南 – LAE论坛
  4. 官方QQ群769779712

悄悄告诉你一个秘密,目前 LAE 使用了负载均衡技术,已经接入了书樱的节点,说不定你能刷到我的服务器哦~

https://sakurapuare.com/wp-content/uploads/2021/10/image-1.png
主页截图

该文章来自https://sakurapuare.com/2021/10/01/light-app-engine/

原作者同意后,MemoryArt将会拉取文章,但是请不要刻意的爬取本站。

PHP在MySql查表踩坑记录 由 imcys.com

问题

我正在对数据库进行一个查表,但是对查询结果循环输出时,却出现了两个表里的内容,并且我认为查表的代码没问题,它的确只查一个表,这就非常离谱。

查询代码
输出结果

思考原因

  1. 查表命令写错了(MySql可视化管理工具执行命令后发现是正常的)
  2. 有其他代码混入,导致中间出了问题。(仔细阅读后并没有)
  3. 表里存在2个数据(查表后只有一个,并且问题是来自两个表)
  4. 变量名冲突,导致查表异常(找了很久才发现问题)

问题原因

在我仔细查看变量后我发现了下面的奇葩问题。

<?php
            $sql = "SELECT * FROM `xxxx`.`xxxxx` WHERE `Email` LIKE '$Email'";
            $result = $conn->query($sql);
            if ($result->num_rows > 0) {
                while ($row = $result->fetch_assoc()) {
                    if ($row['Verification'] == $_POST['verification']) {
                        $sql = "SELECT * FROM `misaka_api`.`app_bilibilias_user` WHERE `Email` LIKE '$Email'";
                        $result = $conn->query($sql);
                        if ($resul->num_rows > 0) {
                            //邮箱重复
                            //改变用户的密码
                            $sql = "update `xxxx`.`xxxx` set `PassWord`='$PassWord' where `Email` LIKE '$Email'";
                            if ($conn->query($sql) === TRUE) {
                                $array = [
                                    'code' => 0,
                                    'msg' => "更改成功,快去登录吧"
                                ];
                                echo json_encode($array, JSON_UNESCAPED_UNICODE);
                            } else {
                                echo  Url500();
                            }
                        } else {
                            echo Url403("该邮箱未被注册");
                        }
                    } else {
                        echo Url403("邮箱验证码错误啦");
                    }
                }
            } else {
                echo Url403("请先完成邮箱验证");
            }

首先在第一个判断后就是 while 循环,循环里判断了 Verification ,一个来自用户,另一个来自数据库

一样的时候则向下进行,也就是输出 更改成功,快去登录吧 ,反之则 该邮箱未被注册

输出结果

从这里看出,的确是更改成功了,但是下面它又执行了一次代码,这次则没有修改密码,而是因为压根没有 Verification ,导致输出了这个查询结果。

很离谱,即使是他们来自同一个语句,也不可能分开输出结果,第一个结果是来自判断正确,而第二次则是来自判断错误,我表里只有一个数据,不可能会这样。

后来我发现 while ($row = $result->fetch_assoc()) 里面有 $result 我仔细一看代码,我 while 循环下面也有数据库执行的代码,并且,正好是第二次错误输出的结果的表,那么我认为可能是下面的代码有问题。

仔细查看,发现里面也有用 $sql $result 这导致覆盖了 while 循环前的查询命令

解决

当我尝试改变 while 循环里的变量名称,果不其然,这个问题被解决了

图片来源

最后送大家几个好看的图片,来自loibus森萝财团,我之前爬虫爬的,可以在GitHub看到项目

该文章来自https://imcys.com/2021/09/20/php%e5%9c%a8mysql%e6%9f%a5%e8%a1%a8%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95.html

原作者同意后,MemoryArt将会拉取文章,但是请不要刻意的爬取本站。

搭建一个Minecraft服务器带面板有多方便? 由 ivampiresp.com

当然是 Light App Engine最方便!

过程全在视频里了,大家直接抄作业就行

该文章来自https://ivampiresp.com/2021/09/20/how-convenient-is-it-to-build-a-minecraft-server-with-a

原作者同意后,MemoryArt将会拉取文章,但是请不要刻意的爬取本站。

为响应国家号召,防止未成年人沉迷 由 ivampiresp.com

纯属娱乐,图个开心就好

  1. 为响应国家号召,防止未成年人沉迷网课。未成年在节假日20-21点,向未成年人提供1小时上网课服务
  2. 为响应国家号召,防止未成年人沉迷睡觉。未成年在节假日20-21点,向未成年人提供1小时睡觉的自由
  3. 为响应国家号召,防止未成年人沉迷吃饭。未成年在节假日20-21点,向未成年人提供1小时的吃饭时间
  4. 为响应国家号召,防止未成年人沉迷交流。未成年在节假日20-21点,向未成年人提供1小时的交流时间
  5. 为响应国家号召,防止未成年人沉迷行走。未成年在节假日20-21点,向未成年人提供1小时的行走时间
  6. 为响应国家号召,防止未成年人沉迷学习。未成年在节假日20-21点,向未成年人提供1小时的学习时间
  7. 为响应国家号召,防止未成年人沉迷钉钉。未成年在节假日20-21点,向未成年人提供1小时的使用时间
  8. 为响应国家号召,防止未成年人沉迷生活。未成年在节假日20-21点,向未成年人提供1小时的生存时间
  9. 欢迎补充…

纯属娱乐,图个开心就好

该文章来自https://ivampiresp.com/2021/08/31/in-response-to-the-national-call-to-prevent-minors-from

原作者同意后,MemoryArt将会拉取文章,但是请不要刻意的爬取本站。

LXD 容器学习笔记 由 ivampiresp.com

LXD

  1. 创建容器并运行

    lxc launch {image}:{version} {name}

    eg: lxc launch ubuntu u1

  2. 创建容器但是不运行

    lxc init {image}:{version} {name}

  3. 停止容器

    lxc stop {name}

  4. 启动

    lxc start {name}

  5. 删除容器

    lxc delete {name}

  6. 列出容器

    显示网络(慢):lxc list

    不显示网络(快): lxc list --fast

  7. 运行命令

    lxc exec {name} {command}

  8. 限制CPU

    lxc config set {name} limits.cpu {cores}

  9. 限制内存

    lxc config set {name} limits.memory {memory}

  10. 关闭内存交换(默认启用)

    lxc config set {name} limits.memory.swap false

  11. 限制硬盘

    lxc config device set {name} root size={size}GB

    eg: lxc config device set u1 root size=2GB

  12. 限制IO速度

    lxc config device set {name} root limits.read 30MB
    lxc config device set {name} root.limits.write 10MB
  13. 限制IO频率

    lxc config device set {name} root limits.read 20Iops
    lxc config device set {name} root limits.write 10Iops
  14. 限制网络IO

    "只要机制可用,网络 I/O 基本等同于块 I/O。"

    https://linux.cn/article-8072-1.html

    lxc profile device set default eth0 limits.ingress 100Mbit
    lxc profile device set default eth0 limits.egress 100Mbit
  15. 从镜像服务器复制

    lxc image copy ubuntu:14.04 local:
  16. 端口转发(代理)

    • 添加端口

      lxc config device add mycontainer myport80 proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80
      lxc config device add mycontainer myport443 proxy listen=tcp:0.0.0.0:443 connect=tcp:127.0.0.1:443
      
    • 移除端口
      lxc config device remove mycontainer myport80

LXD REST API

https://stgraber.org/2016/04/18/lxd-api-direct-interaction/

  1. 打开远程访问

    lxc config set core.https_address "[::]:8443"

    设置密码以信任客户端

    lxc config set core.trust_password 
  2. 本地 或者 远程访问

    • 使用CURL通过Unix Socket访问

      curl -s --unix-socket /var/lib/lxd/unix.socket s/ | jq .
      • 输出
      {
      "type": "sync",
      "status": "Success",
      "status_code": 200,
      "metadata": [
       "/1.0"
      ]
      }
    • 使用远程访问(客户端验证)

      curl -s -k --cert ~/.config/lxc/client.crt --key ~/.config/lxc/client.key https://127.0.0.1:8443/1.0/certificates -X POST -d '{"type": "client", "password": "some-password"}' | jq .
      • 输出
      {
      "type": "sync",
      "status": "Success",
      "status_code": 200,
      "metadata": {}
      }
      • 确认我们已经验证
      curl -s -k --cert ~/.config/lxc/client.crt --key ~/.config/lxc/client.key https://127.0.0.1:8443/1.0 | jq .metadata.auth
      "trusted"

该文章来自https://ivampiresp.com/2021/08/28/lxd-container-learning-notes

原作者同意后,MemoryArt将会拉取文章,但是请不要刻意的爬取本站。

解决Pterodactyl加载头像过慢的问题(替换Gravatar源) 由 ivampiresp.com

近期在折腾面板的时候发现的这个问题

Pterodactyl是从Gravatar读取用户头像的,并且你还没有办法直接修改。

所以这次直接上命令。

登录服务器,切换到Pterodactyl目录下,然后执行

sed -i 's/www.gravatar.com/gravatar.loli.net/g' `grep www.gravatar.com -rl *`

这句话的意思是替换所有www.gravatar.com为gravatar.loli.net,文件来自grep的结果

这句话对服务器没有任何危害,仅仅是替换了Pterodactyl代码的字符串而已。

其实还有一个’gravatar.com/avatar’的没有替换(于app/Transformers/Api/Client/UserTransformer.php),应该没什么大问题

替换成功后

如果还没有生效,你可以尝试清除视图缓存

php artisan view:clear

附:其他Gravatar源

这里还有其他Gravatar源https://zhuanlan.zhihu.com/p/115248957

该文章来自https://ivampiresp.com/2021/08/15/solve-the-problem-that-pterodactyl-loads-avatars-too-slowly

原作者同意后,MemoryArt将会拉取文章,但是请不要刻意的爬取本站。

Showerthought 开始公测 由 ivampiresp.com

过去一个月了,我带着被我砍了无数刀的Showerthought来了。移除了项目功能,直接为管理服务器

主要功能

目前实现了以下功能

  1. 服务器管理(包括查看服务器在线情况)
  2. 脚本管理
  3. 脚本一键保存到服务器(不运行脚本)
  4. Frp 隧道管理(添加服务器时需要打开Frp支持,也需要安装Frp)
  5. 社区支持(正在建设)

先写这么多,以后慢慢补(打暑假工了,处理事情只能晚上处理了)

该文章来自https://ivampiresp.com/2021/06/30/showerthought-begins-public-beta

原作者同意后,MemoryArt将会拉取文章,但是请不要刻意的爬取本站。

Android 整数数字格式化 由 imcys.com

数字格式化,提高你的数字可读性

前言

数字格式化,在最近开发中,常常因为数字太长而无法显示,或者说数字太大,读起来吃力,为了解决这些问题,我写了一个数字格式化的方法。这样极大的缩小了数字长度,同时提高了数字可读性,接着看下去吧!!!

实现过程

举个栗子

1000 -> 1000
10000 -> 1万
17900 -> 1.7万

可以看到,当数字大于等于1万时,会进行格式化。这样主要是为了提高数字可读性,和减少占地,但这样也减低了精度,具体数字无法展现。当然,这里使用的转换方法有点蠢,下面我们简单看看代码。

/**
     * 整数数字转整数加汉字 | 整数数字格式化
     * 10000 -> 1万
     *目前最高精确到千万,再大自行添加
     * @param num
     * @return
     */

    public static String DigitalConversion(int num) {
        String OriginallyNum = num + "";
        String result = "";
        if (num >= 10000) {
            int count = LengthNum(num);
            switch (count) {
                case 5:
                    result = OriginallyNum.substring(0, 1) + "." + OriginallyNum.substring(1, 2) + "万";
                    return result;
                case 6:
                    result = OriginallyNum.substring(0, 2) + "." + OriginallyNum.substring(2, 3) + "万";
                    return result;
                case 7:
                    result = OriginallyNum.substring(0, 3) + "." + OriginallyNum.substring(3, 4) + "万";
                    return result;
                default:
                    result = OriginallyNum.substring(0, 4) + "." + OriginallyNum.substring(4, 5) + "万";
                    return result;
            }
        } else {
            return num + "";
        }
    }


    public static int LengthNum(int num) {
        int count = 0; //计数
        while (num >= 1) {
            num /= 10;
            count++;
        }
        return count;
    }

首先,我们传入整数数字,因为最后要输出的是字符串,所以我们先给他化为字符串。

为了提高可读性,但又不对过小数字转换,我们先判断是否大于等于10000,如果小于则直接输出。

下面我们来使用LengthNum(int 待测量数字)这个方法来判断一下有几位数字,因为后面我们需要按照位数来一一对应这个小数点位置。

接下来,按位来匹配,比如匹配到了6位,则代表这是个十万位数字,则先使用字符串数字.substring(0, 2)代表获取前两位数字,也就是拿到十万位和万位数字,接下面加小数点,取千位数字,连接。

输出,大功告成!!!

文末

当然,这将在 BILIBILI AS 被体现出来

算是对之前思路的一个整理,写的蠢,如果对你有帮助,那再好不过了。

该文章来自https://imcys.com/2021/06/07/%e6%95%b0%e5%ad%97%e6%a0%bc%e5%bc%8f%e5%8c%96.html

原作者同意后,MemoryArt将会拉取文章,但是请不要刻意的爬取本站。