阿里云Linux服务器初探

  1. 云栖社区>
  2. 博客>
  3. 正文

阿里云Linux服务器初探

ykmimi.com 2018-01-11 13:54:00 浏览1481
展开阅读全文

阿里云Linux服务器初探

阿里云Linux服务器初探

因为钱包的关系,本人买了一个660元2年的1核1GB的小服务器(centos是Linux的发行版),在当初是用2核4GB(内存)的时候使用的是windows服务器,而…那段时间看阿里云说1core1gb的并不支持windows系统.
抱着学习Linux系统的决心,打算使用Command line来操作系统.预装的是Tomcat8与JDK8.
首先看到登录服务器后,输入help:

Alt text

这里写解释

解释.1234…
看起来很迷茫的我,顿时百度Linux,然后发现阿里云有Linux的图形化支持程序.

Linux图像化界面(知道有这个东西就好了,不要安)
鸟哥的Linux 私房菜 基础学习篇
Linux常用基本命令
在Windows上通过putty远程登录CentOS
Linux文件系统
Linux命令简写和全称
Linux命令简写和全称-2
Linux必学的60个命令
28 个必备的 Linux 命令行工具

1.第一个程序包

今天休息,随后打算照着网上的说的方法,实验一下eclipse到处war包的过程.随后遇到了很多坑.这里来挖一挖.高手略过.
先是我做了一个小程序,about输入域名(domainname)查询IP地址,用到了JSP,Servlet.
首先是一个表单用于输入域名和点击查询:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>IP地址查询</title>
</head>
<body>
<p>请输入域名查询其IP地址</p>
<div>
<form action="/ykmimi/IpChecker" method="post">
<input type="text" name="domainname"><br />
<input type="submit" value="查IP">
</div>
</form>
</body>
</html>

其次对应表单的action还有一个IpChecker.java 即用一个Servlet处理表单:

package com.ykmimi.lab;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//灰色内容均为测试用,已注释
/**
* Servlet implementation class IpChecker
*/
@WebServlet("/IpChecker")
public class IpChecker extends HttpServlet {
private static final long serialVersionUID = 1L;
 
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
 
}
 
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
String domainName = request.getParameter("domainname");
InetSocketAddress address = new InetSocketAddress(domainName,80);
// System.out.println(address.getAddress());
//获取该域名的ip地址
String ip = address.getAddress().getHostAddress();
//上下文设置属性
//ServletContext context = this.getServletContext();
//context.setAttribute("ip",ip);
RequestDispatcher dispatcher = request.getRequestDispatcher("/IpCheck.jsp");
dispatcher.include(request, response);
//获取字符~输出流对象,以在浏览器输出文字
PrintWriter out = response.getWriter();
out.print("您要查询的"+domainName+"的IP地址为:<br />");
out.print(ip);
 
}
 
}

然后直接在eclipse里点到IpCheck.jsp页面启动服务->Tomcat启动,弹出页面,输入域名,随后点击查询便能查询到域名的IP地址.在这个Servlet里面,使用的是InetSocketAddress类:

Alt textAlt text

之后利用RequestDispatcher的include方法把查询的IP一同展示到当前页面.

找了一篇不错博客关于Socket
https://www.cnblogs.com/rocomp/p/4790340.html

随后,借着Linux服务器想在线测试一下,不料发生了状况.

  • 一是用eclipse导出war包,虽然直接可以导出,但是还需要调整路径等.因为如果不选择同源文件一同导出war包,则传入服务器->解压后,form表单的action将找不到”/ykmimi/IpChecker”. 如果同源文件导出呢,还是发生错误,因为war包解压后的目录和eclipse中有出路.
  • 二是从服务器->浏览器访问源文件路径时,则还出现了class解析错误,因为我的eclipse和tomcat都是第九代了,而服务器中用的是jdk8,tomcat8代…有两种办法:1.升级服务器中软件.2.降低本地开发环境.
  • 三是war包的解压问题,有人说停止tomcat服务器后传入,后开启tomcat后tomcat将自动解压war包.可是我通过xshell,xftp即使刷新war包目录后还是没有解压.可能是哪里错了.但手动解压是没问题的.在xshell中使用cd命令切换到war包所在目录,使用jar xvf ykmimi.war进行解压,其中ykmimi.war是war包名称.

最后,总结了一下,服务器和本地开发环境要使用一致的版本.
不过,庆幸的是,IP查询这个功能还是做出来了,想想之前在小互联网公司做美工和网站维护时,经常使用的IP地址查询…做起来原来这么简单.
当然,这只是一个小demo,更厉害的是可以查询IP的浏览量,搜索网站目录结构及内容,和进行TCP/IP传输时截取和篡改了(*该项违反网络安全协议,可用于自己网站测试用于网络安全学习)…


2.在服务器端的神器Vim

之前看Unix系统编年史(也就是Linux系统的前身),了解到vi,也就是vim的作者 Bill Joy.
http://blog.csdn.net/adcxf/article/details/2091571 <-Bill Joy 介绍


在之前看PHP作者是个挺胖的哥们,而写出了让阿波罗成功登陆月球的代码的居然是个女的.名字叫 Margaret Hamilton <- 她的维基百科 https://en.wikipedia.org/wiki/Margaret_Hamilton_(scientist)
玛格丽特·汉密尔顿 | 旁边是「著作等身」的阿波罗制导系统的代码

同样是很伟大的程序员,在Bill Joy的Vim中开始界面也有作者提倡的帮助乌干达儿童的标语.

说了很多废话,这里讲解在Linux系统安装Vim


首先打开你的xshell或者putty.在Command line输入命令: vi 然后按tab键两下

Alt text
查看有没有vim,注意vi虽然是Bill的作品,但我们要使用的是vim,没有的话我们安装一个.
继续在命令行输入:yum -y install vim*(这里是centos,也就是Linux发行版的命令.)


在一系列的安装代码飘过后,我们在用vi命令查看下有没有vim显示了呢~

Alt text
至此,vim安装成功.在命令行输入vim回车.

Alt text

忍受着旁边看快手的大爷无情的噪音骚扰,我决定继续讲述我的Linux…


接下来我们做点有趣的东西

  • 首先我们用vim来写一个HelloWorld.java程序输出那句话.
    调用vim 回车,来到vim界面,这时你按键盘并不能输入什么.是的.现在是命令模式.
    那我们用命令 :new 文件名.后缀名 创建一个新的文件 HelloWorld.java
:new HelloWorld.java

…略…
这时界面已经是HelloWorld.java的编辑页面了.
好,我们写一个输出用来测试. 记得要先按下键盘上的 i 键用来输入.想切换回命令模式按一下 ESC.

//注意类名要与文件名一致否则编译出错
class HelloWorld
{
public static void main (String[] args)
{
System.out.println("你好世界!");
}
}

好,千万先别保存!,如果你和我一样之前习惯性地按了ctrl+S ,那么恭喜你,你现在的xshell或者已经卡住了.因为在vim中,保存什么的也是要用命令的.
刚才新建文件是用的 :new ,保存命令是 :x ,好,这时,你的HelloWorld.java文件才正式出现在文件夹root中.不要着急切换到root文件夹,因为root根目录是可以直接享受命令操控的.
用我们熟悉的编译方法 javac HelloWorld.java ,如果不提示错误,则编译通过了,看到root文件夹下面会有它的.class文件,如果提示错误,会告诉你错误在哪里.

Alt text

也许你发现


也许你发现你在编辑HelloWorld.java时,打出字母并没有高亮,那是因为你没有对vim进行配置.
设置方法很简单,回到初始命令行(如果你在别的目录,使用 cd ~/ 回到初始目录)

  • 输入命令 vim .vimrc 注意vim后面的空格
set number //显示行号
filetype on //检测文件的
set history=1000 //记录历史行数
set nocompatible //关闭兼容模式,显示vimvi的强大.
set shiftwidth=4 //设置当行之间交错时使用4个空格
syntax on //语法高亮度显示**
set autoindent //使用自动对齐
set smartindent //智能对齐
set tabstop=4 //第一行设置tab键为4个空格
set showmatch //设置匹配模式
set vb t_vb= //去掉错误提示音
set ruler //右小角光标位置显示
set nohls //取消搜索高亮
set incsearch //vim命令模式 /要搜索字眼 匹配内容
if has("vms") //从ifendif的意思:当覆盖一个文件的时候保留一个备份
set nobackup vms系统除外,因为vms系统会自动备份
else
set backup
endif

好,将以上内容写入打开的 .vimrc 然后 :x 保存并退出, 再打开刚刚的 HelloWorld.java 是不是显示得和我的一样了?


3.重装系统之殇

因为本地环境是tomcat9和jdk9,而服务器端当时没看好安装的是双8系统,而在Oracle官网上也没有这些老版本的维护了,所以决定重新安装下系统.

Alt text 停止服务器实例后,再选择后面的更换系统盘:

Alt text 我在之前做公司网站时,因为版本的问题这样重启服务器好多次,而最熟悉的当属aliyun linux…但选择这项的话是不能选择共享市场中配置的tomcat9和jdk9直接用的.
抱着学习态度…我选择了:

Alt text


这个系统是不带tomcat和jdk的…所以从头安装一次,顺便学习一下配置环境.

Alt text
在xshell输入java版本查询,果然.not found(java命令不存在)
jdk下载时要选择Linux版本.格式如图.

Alt text
有时候在xshell命令使用 yum list java*可以查看可下载的java包,但那些经常不包含最新版本.

一般tomcat先下载完毕了,别着急,一般tomcat是要有jdk才能运行的(java写的tomcat嘛,当然咯!)
看了一下vim不用再下载了(虽然没有了一些插件)(换系统这种事一定是要备份的,如果学习时,没有太重要的文件暂且不弄,那肯定也是很大的工程)

下载好了,那我们安装到哪个服务器文件里呢?

其实是不能乱安装的,每个目录的命名都是互相牵制的,没什么必要不要改名,找到一篇不错的博客讲解各个目录的作用:
https://www.cnblogs.com/silence-hust/p/4319415.html
其中讲到/usr/local是系统管理员安装自己下载软件的地方.那我们查看下这个目录.因为新服务器的缘故吧,虽然local里有文件,但是大多都是空文件,不同管它们,创建两个文件夹,一个叫java一个叫tomcat.

  • 使用xshell命令 cd /usr/local 切换到local目录,随后使用创建文件夹命令 mkdir java tomcat 这样就创建好啦!

  • 为了了解更多的远程ssh工具,SSH:安全外壳协议 SSH: Secure Shell Protocol
    安全外壳协议(SSH)是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议。
    我又下载了个Putty,准备用它的pscp功能直接用命令行上传文件至服务器.
    为了方便调用pscp.exe,我在本地电脑环境变量设置了新的环境变量指定到pscp.exe的目录,例如我的是E:\putty, 这样,直接在本地命令行工具输入pscp即能使用它啦!
    调试了一阵终于可以了,

C:\Users\Administrator>pscp jdk-9.0.1_linux-x64_bin.tar.gz root@60.205.224.226:/usr/local/java

注意,这是命令行,输入是从pscp开始的,而文件jdk…前面没有盘符是因为文件就在Administrator中,如果你的文件在 d盘 就在文件前面加上d:\jdk…gz ,注意!!!一定要输入文件的全名,包括后缀名!这里在windows中查看文件全名的方法不再概述!

C:\Users\Administrator>pscp jdk-9.0.1_linux-x64_bin.tar.gz root@60.205.224.226:/usr/local/java
root@60.205.224.226's password:
jdk-9.0.1_linux-x64_bin.t | 89868 kB | 360.9 kB/s | ETA: 00:11:50 | 25%

小提示: 上传前先传个小文件例如新建个 a.txt 上传试试. 下载也是,比如建立新文件,选定文件夹后在xshell输入 touch 1.txt 即创建了一个新的文件. 再下载这个文件,如果下载成功,则目录选定正确.


OK,jdk包上传完成了,现在进行解压,使用命令:

//tar -zxvf 压缩文件名.tar.gz
tar -zxvf jdk-9.0.1_linux-x64_bin.tar.gz

参数 -zxvf 什么意思呢?
-c 创建压缩文件
-x 解开压缩文件
-t 查看压缩包内有那些文件
-z 用Gzip压缩或解压
-j 用bzip2压缩或解压
-v 显示压缩或解压的过程
-f 目标文件名
-p 保留原始的权限与属性
-P 使用绝对路径来压缩
-C 指定解压到的目录

为了方便设置环境变量,我们把文件夹目录的长名字改得短一些.
首先cd到java目录,用 ls 命令查看当前文件目录, 而后使用简单的改名方式 mv 当前名称 要改名称 进行改名. 如我现在的java目录下的jdk目录叫 jdk-9.0.1 ,我们直接改为 jdk9 (最好有版本号).
则使用 mv jdk-9.0.1 jdk9 ,即改为了jdk9. (mv 也有移动文件的功能)

虽然现在用不到安装包了,它留在服务器也占空间,但我们稍后再删除吧!以免再有什么问题,毕竟上传需要时间.

找了一篇配置环境的博客.比较新:我按照这个设置已经可以看java -version了:
https://www.cnblogs.com/zengjiqiang/p/6427744.html

#java path set
JAVA_HOME=/usr/local/java/jdk9
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
 
#tomcat path set
CATALINA_HOME=/usr/local/tomcat/tomcat9
CATALINA_BASE=/usr/local/tomcat/tomcat9
export CATALINA_HOME CATALINA_BASE

然后命令行执行: source /etc/profile
上面是我的 /etc/profile 关于jdk和tomcat环境配置的设置.可以参考一下.

其他Linux必须插件 : git


万事俱备只欠东风,这下本地开发环境和线上完全对应起来了.let’s go!


4.MySQL的没落与MariaDB的兴起

要制作动态页面项目(Dynamic Web Project),要实现大量的用户注册登录,要用到数据库.这里我们往服务器安装一个 linux版本的 MySQL ,首先依然是来到 /usr/local/目录 新建一个mysql目录.
在这一操作中,我想直接在母目录 ~/ 直接使用命令创建mysql目录后直接跳转到mysql目录:

cd /usr/local/ && mkdir mysql && cd mysql

这里的&&可以起到承上启下的作用,连接好几个操作.
之前操作不适合,但学会了删除目录的方法:

rm -rf

rm是remove的简写,而参数 r 就是向下递归,不管有多少级目录,一并删除.参数 f 就是直接强行删除,不作任何提示的意思. 不建议带参数 f .
然后在mysql目录中下载mysql的安装包:

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar

“wget” 这个名称来源于 “World Wide Web” 与 “get” 的结合。
这里说明wget比较详细:https://www.cnblogs.com/peida/archive/2013/03/18/2965369.html

下载好mysql的tar文件后我们使用解压命令进行解压,注意这里不是Gzip文件,首先用:

tar -xvf mysql-5.7.20-linux-glibc2.12-x86_64.tar

其次有 .gz 后再在tar 命令参数中加 -z ,即 -zxvf


设置mysql的环境变量: vim /etc/profile 在文档下面输入:

PATH=$PATH:/usr/local/mysql/mysql5.7/bin
export PATH

之后执行 source /etc/profile
再之后命令行输入mysql,但是报错…

调整报错时学会了 find 命令:
比如想找一个叫 .vimrc 的文件可以这么调用命令:

find / -name .vimrc

如果存在,服务器会给你这个文件的路径.

https://www.cnblogs.com/fuhj02/p/3541173.html mysql执行错误解析

重新安装mysql

http://blog.csdn.net/u013451157/article/details/62422515

实在不行就用别的数据库

这两天让服务器端 JDK 版本和 本地不匹配以及安装mysql不到位等问题弄得我头昏脑胀,
其实后来想了想,先用个安好mysql带jdk其他版本的镜像,然后直接升级jdk不就行了吗!

这次安装的环境 https://market.aliyun.com/products/56024006/cmjj014888.html?spm=5176.140139.722352.2.HhLQKx

后来发现了个事儿,MySQL之父把mysql卖给SUN,Oracle把SUN收购,然后mysql遇到了瓶颈,所以MySQL之父开始了它的分支去开源:
这个叫做MariaDB的数据库是以MySQL之父女儿名字命名的.
这里有个博客说明了在Linux上安装及配置MariaDB的流程配置,我已经试过了,可以说完全正确.http://blog.csdn.net/cccheer/article/details/56479090
下面是mariadb的官网:https://mariadb.com/

同样的,MariaDB一样有连接java的jar包:https://downloads.mariadb.org/connector-java/

而这篇文章,讲解为什么MariaDB将取代MySQL:https://www.csdn.net/article/2013-07-12/2816207-5-reasons-its-time-to-ditch-mysql

好了,在重装完JDK9, Tomcat9, 和最新的 MariaDB 后,正式开始我们的java web案例制作!


5.Java Web Project 部署之路

首先在 Linux 登录时,可以使用命令 ls / 查看所有的文件夹.

[root@iZ2zea0v6yzqrn1lbze76iZ ~]# ls /
aliyun-bin boot etc lib lost+found mnt proc run srv tmp var
bin dev home lib64 media opt root sbin sys usr

因为aliyun linux这个系统在官方和网上没有具体太详细的说明,我们就拿几个公用的(linux系统都存在的)文件夹说明一下:

  • /bin 放置的是在单用户维护模式下还能够操作的命令,可以被root和一般账号所使用,如cat,cp,bash,mv,chmod等。
  • /boot 放置开机时会使用到的文件,包括Linux内核文件以及开机所需配置文件。
  • /dev 任何设备与接口设备(Linux都以文件的形式存在于这个目录中)。
  • /etc 这个很熟悉了,系统主要的配置文件(可编辑文本文件)都存放在这个目录。包括/etc/profile
  • /home 系统默认的用户主文件夹(把它当作Windows的我的文档吧)。
  • /lib 函数库目录。放置开机时用到的函数库以及/bin或/sbin目录下命令调用的函数库。
  • /lib64 /lib的64位版本。
  • /media 可删除的设备,包括光驱、软盘等。
  • /mnt 临时挂载的设备,如U盘、CD-ROM等。
  • /opt 第三方软件(可选)安装目录,比如KDE等。 optional的意思!
  • /root 系统管理员的主文件夹。
  • /sbin 开机过程需要的命令,普通用户不能执行。这个s指的应该是super超级用户.
  • /srv 网络服务的数据目录。如WWW的网页数据可以放在/srv/www/目录。
  • /tmp 此目录任何人可以访问,临时目录,一般重启时全部清空。
  • /lost+found 使用标准的ext2/ext3文件系统文件格式会产生的一个目录。当文件系统发成错误,将一些丢失的文件碎片放置到这个目录里面。
  • /proc 这个目录是一个虚拟文件系统,它放置的数据代表内存中的数据,所以本身不占用硬盘。
  • /sys 和/proc类似,也是一个虚拟文件系统,主要记录内核相关信息。
  • /var 系统运行时变动和产生的文件,包括缓存、日志等。
  • /run 开机时一些底层的程序会向/var/run目录写入pid等,但整个文件系统尚未挂载完成,只有根分区已挂载,如果/var处于单独的分区就会产生错误,所以将run移动到/。
  • /usr 默认软件都在这个目录,有点类似Windows的”C:\Windows”和”C:\Program files\”的综合体。
    而在aliyun linux中多的一个aliyun-bin应该是aliyun linux在linux基础上实现的一些命令吧,也就相当于aliyun linux的内核程序集?MayBe

调用下面命令查看所有正在运行程序的快照.

ps aux

之后如果需要得到动态进行信息,使用top命令.

调用下面命令查看服务器CPU信息: 其实就是查看/proc下面的cpuinfo

cat /proc/cpuinfo

显示的total列就是我们总的物理内存.后面的是已使用的和未使用的等等.

下面命令是查硬盘大小:

fdisk -l

注意后面参数是 look 看单词中的 l


说了这么多,看上去很麻烦,因为Linux比windows来说要使用命令行,而不是直接可以直观地去查看.但是学习Linux更容易明白系统的本质,以及它与编程代码之间的关系.

要部署项目,首先得了解tomcat支持什么类型的文档以及它的设置方法,比如连接你的域名.
http://blog.csdn.net/weinianjie1/article/details/7954425
http://blog.csdn.net/jubincn/article/details/4856293 tomcat基本配置

怎样启动tomcat呢?

[root@iZ2zea0v6yzqrn1lbze76iZ ~]# cd /usr/local/tomcat/tomcat9/bin
[root@iZ2zea0v6yzqrn1lbze76iZ bin]# ./startup.sh

先切换到tomcat下的bin目录,执行其中的 ./startup.sh 注意,这里一定要有 ./
关闭tomcat服务则是相同目录下使用 ./shutdown.sh
查看tomcat是否已关闭: ps -ef | grep java

然后我们的项目需要导出为 .war 看了下网上很多博客讲到需要 maven install 等,随后下载 个 maven.
http://maven.apache.org/
下载的是最后带.bin的zip,下载后解压到目录,并将该解压的bin目录加入环境变量.maven具体学习
maven单独学习 今天截止到这 2018年1月4日 22:35:04 着手不联网的学习.

第一个war包上线
如何导出war包 http://blog.csdn.net/kobe_8_24_23/article/details/51524619
部署war包到tomcat根目录 http://blog.csdn.net/free4294/article/details/38230849
tomcat修改8080端口至80及虚拟主机设置 http://blog.csdn.net/zhuxinquan61/article/details/52152053

我的IP地址查询项目线上版本: http://www.ykmimi.com/ukyoweb1/


6.Linux全面熟悉及深入掌握

`2018年1月6日 13:50:32
今天遇到了一个问题,在我上传了一个简单的index.jsp的war包部署到服务端后,进行了tomcat的关闭和开启工作,而后遇到了关闭时,没有正常关闭的情况. 后来查看网站,一直在loading状态.而且用xshell也连接不到服务器了,但在阿里云控制台该实例是显示运行中的.
最后没有办法,选择了在阿里云控制台重启该实例.
我想应该是在设置server.xml时出了差错,并且不恰当的进行了tomcat的关闭和开启工作.

之后阿里云实例重启后,把servlet.xml中 Host 栏目更改如下,并重启 tomcat,给我的感觉是,tomcat的配置web很慢,所以在上传完war包后,要隔开一段时间再进行 ./startup.sh
下面是我现在页面正常时候的server.xml中 Host 字段:

<Host name="localhost" appBase="webapps"
unpackWARs="false" autoDeploy="true">
<Context path="/1" docBase="ykmimiindex.war" debug="0" privileged="true" reloadable="true" />
<Context path="/2" docBase="ukyoweb1.war" debug="0" privileged="true" reloadable="true" />

其中我把unpackWARs=”true”更改为了false,这样tomcat就不用再花费多余的时间去解压war包,而可以直接去运行war包. (其实私底下还是去设置了路径)
不过在webapps中,我们没有看到设置的path后面的 1 和 2 文件夹.它们现在存在于与 bin 文件夹同目录的 work 文件夹下面,,,并且可以看看编译后的.java文件(虽然现在不明白)

http://www.ykmimi.com/1/
http://www.ykmimi.com/2/

这样,我们利用server.xml中 Host 标签下的 Context path 设置了两个不同的网站子页!(路径)

将编程看作是一门艺术,而不单单是个技术。 敲打的英文字符是我的黑白琴键, 思维图纸画出的是我编写的五线谱。 当美妙的华章响起,现实通往二进制的大门即将被打开。

网友评论

登录后评论
0/500
评论
ykmimi.com
+ 关注