一、Linux命令进阶

思考:

  1. top命令: 如何以占用CPU使用率顺序排序及占用内存使用率顺序排序?
  2. free命令如何以G为单位显示磁盘使用情况?
  3. touch命令创建文件,创建一个已存在的文件时,执行后会有啥变化?
  4. 当执行df命令查看磁盘空间大于90%的时候,如何定位Linux系统的是那一个目录占据磁盘比较大?

二、Java 基础

  1. 都说 C 是面向过程的语言,Java 是面向对象的语言,请解释这其中的差别,并讲讲 Python 是什么类型的语言,区别是什么

  2. 请简述线程和死锁的概念,并且用代码实现线程死锁,在代码中以注释的形式标注死锁的条件

    第三、四问对具体数值不做要求

  3. 生产者与消费者
    前面说到 Java 是一门面向对象的语言,现在假设有这样一个场景:
    有一个生产基地,基地里的员工能够生产产品,但是产品的储存上限是10个,如果超过10个则会停止生产,于此同时,顾客也会在同一时间购买产品,也就是说,员工一边生产,顾客一边购买,并且员工每次生产完后都需要休息一下,顾客买完之后会用一段时间使用产品并继续购买。假设基地内只有一个员工,有两名顾客,请你模拟这样的一个场景,并在每次的购买或生产后输出剩余的商品数量。(如果商品卖完了,那么顾客就会等待。)

  4. 生产者与消费者的另一个场景:
    有一个生产基地,基地生产两类产品,平面产品和三维产品。平面产品包括长方形和三角形,每个平面产品需要计算其面积。三维产品包括长方体和圆柱体,每个三维产品需要计算体积。
    有一个仓库用于存放生产的产品,仓库的面积和体积是固定的,存放平面产品将占用面积,存放三维产品将占用体积。
    基地里有三名员工,一个负责生产平面产品,两个负责生产三维产品,生产后产品放入仓库(生产时显示详细信息),存入时如果剩余空间不足,抛出带剩余空间的空间不足异常。
    有三名消费者,两个消费平面产品,一个消费三维产品,消费时从仓库取出产品(消费时显示详细信息),如果仓库中没有需要的产品可以取出,抛出相应的异常消息。
    请完成以上要求,每个生产者或者消费者用一个线程模拟,注意类之间的继承关系和清晰的目录结构
    产品有具体属性,需要以此计算面积和体积,例如,长方形具有长宽,三角形具有底和高
    建议通过类图辅助理解,画类图加分

三、Python 综合

[blame Meursault]

这是这份题目中最值得做的一道题,做出来后找出题人,他可以特招。

阅读如下材料,并利用 Python 或其他你喜欢的编程语言完成后续题目。

游戏《原神》作为文化输出的优秀代表,塑造了许多可歌可泣的优秀人物,他们中有文智高绝、厚貌深情的草神,有仁厚宽容、宛然太清的芙卡洛斯,有进退黜陟、皆出圣心的那维莱特,还有忠心友善,人见人爱,有着高洁善良的灵魂,足以列为道德楷模的其他。
有人称:“我曾于上海的夜里看见米哈游的总部,灯火通明,预示着未来与先知,犹如命运照向我与无尽人世!”这足以看出《原神》这一游戏的优秀,它代表着中国游戏产业乃至整个互联网产业的方向。
  1. 请通过编程的方式获取 Bilibili 弹幕视频网站中《原神》官方账号的粉丝数随时间的变化,要求:获取持续四小时的原神粉丝数数量变化,每分钟记录一次,也就是获取 240 条数据,并将数据以你喜欢的文件格式保存。我们将对这些数据进行验证,所以请注意文件中需包含时间信息。
  2. 请通过 Python 程序实现上述数据的绘制能描述这段时间原神粉丝数变化的图形,可以使用折线图、散点图等。提示:Python 中常用的绘图库有 Matplotlib、Seaborn 等。
  3. (选做)任选一个机器学习模型,对上述数据进行拟合,能够预测后续《原神》官方账号的粉丝数的变化。
  4. (选做)完成一个简易服务端程序,实现:
    1. 对《原神》官方账号的粉丝数的爬取与暂停
    2. 能够获取当前爬取的最新一条数据。
    3. 尝试使用数据库对数据进行持久化。
    4. 实现一个简单的可视化界面,实现类似第二问中折线图的输出,或者在启动后实时绘制上述折线图。
    5. 尝试对服务器端程序进行容器化部署。
    6. 在开发过程中尝试使用 GitLab CI,请注意,SynX GitLab 不提供 CI 能力,你可以使用 GitLab SaaS。
      提示:常用的 Python 服务端框架有 Flask、Sanic、FastAPI 等,本问对请求体和响应体不做要求,请自行设计并给出文档。

四、MySQL

学习软件工程没有数据库怎么刑?

在基础部分中,你已经了解Linux系统的常用使用基础了,下面请在Linux系统中安装Mysql并启用服务。

  1. 安装mysql
  2. 建立下图所示的Employee 表
    +----+-------+--------+-----------+
    | id | name  | salary | managerId |
    +----+-------+--------+-----------+
    | 1  | Joe   | 70000  | 3         |
    | 2  | Henry | 80000  | 4         |
    | 3  | Sam   | 60000  | Null      |
    | 4  | Max   | 90000  | Null      |
    +----+-------+--------+-----------+
  3. 利用sql语句查询高于领导工资的员工
    Tip: managerId指的是该员工对应领导的id,即查询输出的表应该为:

    +----------+
    | Employee |
    +----------+
    | Joe      |
    +----------+

五、Docker

Docker 是一个开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间完全隔离,性能开销极低。

  1. 在你的Linux系统上安装 Docker。验证 Docker 是否成功安装,尝试运行一个 hello-world 镜像。
  2. 下载并运行 Nginx 镜像:
    下载 Nginx 镜像。运行 Nginx 镜像,并映射一个端口到宿主机。
  3. 创建并运行一个简单的容器:
    创建一个 Dockerfile,其中包含一个基础的 Ubuntu 镜像,并添加一个简单的 shell 脚本。构建 Docker 镜像,并运行一个容器。
  4. 配置 Docker 网络:
    创建自定义 Docker 网络。将容器连接到自定义网络,并测试容器之间的通信。
  5. 使用 Docker Volumes 存储数据:
    创建一个容器,其中包含一个 MySQL 数据库,并使用 Docker Volumes 来持久化数据库数据。

六、简单服务部署

LNMP为一种缩写,其代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。
Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。代表版本有:debian、centos、ubuntu、fedora、suse等。
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Mysql是一个关系型数据库管理系统。
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。
这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。

接下来,让我们尝试从使用nginx部署静态页面开始吧!

  1. 在Linux中安装并启动nginx。在Windows下访问得到该网页说明部署成功。
  2. 尝试部署下文提供的静态网页并进行本机访问
    welcome.html
  3. 有能力的同学可以尝试部署在校内可以访问的网页。

七、Linux编程初步

  1. 现有如下程序。在Linux系统中将其编译成可执行文件后,使用ls -l命令显示可执行文件的大小。虽然该程序包含一个大约 10MB 的数组,但可执行文件大小要远小于此,为什么?
    #include <stdio.h>
    #include <stdlib.h>
    char globBuf[65536];
    int primes[] = {2, 3, 5, 7};
    static int square(int x) {
    int result;
    result = x * x;
    return result;
    }
    static void doCalc(int val)
    {
    printf("The square of %d is %d\n", val, square(val));
    if (val < 1000){
        int t;
        t = val * val * val;
        printf("The cube of %d is %d\n", val, t);
    }
    }
    int main(int argc, char *argv[]) {
    static int key = 9973;
    static char mbuf[10240000];
    char *p;
    p = malloc(1024);
    doCalc(key);
    exit(EXIT_SUCCESS);
    }
  2. 阅读以下文本
    每个 C 语言程序都必须有一个称为 main()的函数,作为程序启动的起点。当执行程序时,命令行参数(command-line argument)(由 shell 逐一解析)通过两个入参提供给 main()函数。第一个参数 int argc,表示命令行参数的个数。第二个参数 char *argv[],是一个指向命令行参数的指针数组,每一参数又都是以空字符(null)1 结尾的字符串。第一个字符串,亦即 argv[0]指向的,(通常)是该程序的名称。argv 中的指针列表以 NULL 指针结尾(即 argv[argc]为 NULL)。
    每一个进程都有与其相关的称之为环境列表(environment list)的字符串数组,或简称为环境(environment)。其中每个字符串都以名称=值(name=value)形式定义。因此,在系统中,环境是“名称-值”的成对集合,可存储任何信息。常将列表中的名称称为环境变量(environment variables)。
    环境变量的常见用途之一是在 shell 中。通过在自身环境中放置变量值,shell 就可确保把这些值传递给其所创建的进程,并以此来执行用户命令。例如,环境变量 SHELL 被设置为 shell程序本身的路径名,如果程序需要执行 shell 时,大多会将此变量视为需要执行的 shell 名称。
    大多数 shell 使用 export 命令向环境中添加变量值。

    $ SHELL=/bin/bash Create a shell variable
    $ export SHELL Put variable into shell process's environment

    printenv 命令显示当前的环境列表,此处是其输出的一例:

    $ printenv
    LOGNAME=mtk
    SHELL=/bin/bash
    HOME=/home/mtk
    PATH=/usr/local/bin:/usr/bin:/bin:/
    TERM=xterm

在 C 语言程序中,可以使用全局变量 char **environ 访问环境列表。(C 运行时启动代码定义了该变量并以环境列表位置为其赋值。)environ 与 argv 参数类似,指向一个以 NULL 结尾的指针列表,每个指针又指向一个以空字节终止的字符串。
(1) 编写一个C语言程序,该程序接受一个环境变量名称作为命令行参数,并输出该环境变量的值。如果环境变量不存在,则输出 "Variable not found"。
(2) 编写一个C语言程序,该程序将当前环境中的所有环境变量名称和值进行转置,即将每个环境变量的名称和值互换,并将其作为新的环境变量保存到一个新的环境列表中。最后,程序输出新的环境列表。
(3) UNIX I/O 模型的显著特点之一是其输入/输出的通用性概念。这意味着使用 4 个同样的系统调用 open()、read()、write()和 close()可以对所有类型的文件执行 I/O 操作,包括终端之类的设备。因此,仅使用这些系统调用编写的程序,将对任何类型的文件有效。请编写一个C语言程序,该程序接受一个文件名作为命令行参数,并统计文件中的单词数量、行数和字符数。程序应输出这些统计数据。(提示:单词之间的间隔包含哪些字符?)


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注