在安卓手机上跑Linux桌面

多年后,当我回到大学,我依然能回想起那年,被大一不能带电脑的沙雕规定支配的愤怒

背景

每当我有事要做却不想做。。。就会折腾一些奇奇怪怪的东西。。。最近摸鱼成果:在安卓上运行完整的Linux桌面。。。啥你说Run a Linux desktop on Android有啥用?当然是To code anywhere啦!

教程

1. 安装termux

详细过程略,随便去一个应用市场应该就能下到。如果能给root权,建议授予root权限,并且在root权限下执行所有安装命令 termux下进入root权限需要安装tsu包 

2. 安装AnLinux

过程略,这个App主要提供安装的具体脚本。

3. 安装一个Linux发行版

  1. 启动AnLinux,并点击choose选择发行版,笔者使用的Debian 
  2. 点击copy以复制app显示的命令,这时候会弹出广告,直接返回就好了。(笔者复制到的命令:pkg install wget proot -y && wget https://raw.githubusercontent.com/EXALAB/AnLinux-Resources/master/Scripts/Installer/Debian/debian.sh && bash debian.sh
  3. 将命令在Termux中粘贴并执行,注意,如果是用root权限安装,记得把当前目录切换到非root环境下的那个目录(命令:cd /data/data/com.termux/files/home/),以免根目录混乱。 
安装完成后就可以执行./start-debian.sh以进入debian了: 

4. 安装一个Linux桌面

  1. 再次打开AnLinux并从侧边划出的菜单选择Setup Desktop
  2. 第一个Choose选择刚刚安装的发行版,第二个选择要装的桌面环境,笔者选择debian+xfce
  3. copy命令,并复制到发行版的终端中执行。注意,选择的发行版要和启动的发行版对应,否则可能出现问题(笔者复制到的命令:wget https://raw.githubusercontent.com/EXALAB/AnLinux-Resources/master/Scripts/DesktopEnvironment/Apt/Xfce4/de-apt-xfce4.sh && bash de-apt-xfce4.sh) 
  4. 这里一键脚本的命令是安装的VNC来实现的图形化,中途会要求设置vnc秘密,注意别输错了。安装完成后使用命令vncserver-start来启动服务端,然后随便打开个vnc客户端进行连接。根据安装完成后的提示,端口通常为5901

问题

你以为这就完了,那我还写个鬼的教程,直接说这俩app真好用就得了。 这样安装完后确实能用了,装个codeblocks,写代码没问题。再装个firefox,浏览网页也凑合,中文乱码的问题装一下fonts-noto-cjk就解决了。但是,如果是从电脑端远程上手机,一旦涉及到qt程序,键盘输入完全错位,而且vnc下fcitx起不来,无法进行中文输入,使用起来很不舒服。 经过一段时间的摸鱼探索,终于找到了个奇怪的解法:不用vnc。用xrdp,既没有键盘错位,还能输中文。
# apt install xrdp
# systemctl enable xrdp # systemctl start xrdp 习惯性systemctl,然并卵( 好在debian系还能这样操作:
/etc/init.d/xrdp start/etc/init.d/xrdp stop
start了xrdp之后,安卓端可以用microsoft remot desktop来连接,windows可以用自带的远程桌面来连接。session选择sesman-any,ip填127.0.0.1,然后输入用户名和密码,可以使用root来登陆(如果没有设置root密码可以通过passwd命令来设置)。
装上fcitx并启动,美滋滋

已知问题

声音好像还是没办法播放出来,虽然有root权限,有些文件依然无权访问,比如主目录下的thinclient_driver。部分程序依然无法运行,比如chromium,比如htop。不过总算是在手机上完整地运行了桌面系统,配上小键盘,写代码还算舒适。 上一张全家福:

《大数据技术基础》上机三

  1. 编程实现文件合并和去重操作
对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文件的一个样例供参考。 python代码
#!/bin/python

import sys
import os

argv = sys.argv
file1=sys.argv[2].split("/")[-1]
file2=sys.argv[3].split("/")[-1]

os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} >> /dev/null".format(argv[1],argv[2],file1))

os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} >> /dev/null".format(argv[1],argv[3],file2))

A = open(file1,'r').read().split('\n')
B = open(file2,'r').read().split('\n')
C = []

print(A)
print(B)

def m(x):
    if len(x) != 0 and not(x in C):
        print("Appending : " + x)
        C.append(x)

list(map(m, A))
list(map(m, B))

print("result after map:")
for x in C:
    print(x)
运行命令
python mapred1.py 192.168.43.206 /A.txt /B.txt
  1. 编写程序实现对输入文件的排序
现在有多个输入文件,每个文件中的每行内容均为一个整数。要求读取所有文件中的整数,进行升序排序后,输出到一个新的文件中,输出的数据格式为每行两个整数,第一个数字为第二个整数的排序位次,第二个整数为原待排列的整数。下面是输入文件和输出文件的一个样例供参考。
python代码
#!/bin/python


import sys
import os

argv = sys.argv
file1=sys.argv[2].split("/")[-1]
file2=sys.argv[3].split("/")[-1]
file3=sys.argv[4].split("/")[-1]
os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} > /dev/null".format(argv[1],argv[2],file1))
os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} > /dev/null".format(argv[1],argv[3],file2))
os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} > /dev/null".format(argv[1],argv[4],file3))

def sp(x):
    return open(x,'r').read().split('\n')[0:-1]

A,B,C = list(map(sp, [file1,file2,file3]))

print(A)
print(B)
print(C)

def mer(x):
    return int(x)

D = list(map(mer,A+B+C))

D.sort()
print("result after map:")
for x in range(len(D)):
    print(str(x+1) + ' ' + str(D[x]))
执行命令
python mapred2.py 192.168.43.206 /3-2-1.txt /3-2-2.txt /3-2-3.txt
  1. 对给定的表格进行信息挖掘
下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。
python代码
#!/bin/python

import sys
import os

argv = sys.argv
file1=sys.argv[2].split("/")[-1]

os.system("wget http://{}:50075/streamFile{}?nnaddr=127.0.0.1:9000 -O {} >> /dev/null".format(argv[1],argv[2],file1))


A = open(file1,'r').read().split('\n')[1:-1]
par={}
def m(x):
    if len(x) != 0 :
        kid, parent = x.split('\t')
        par[kid]=[]
        return [kid,parent]

B=list(map(m, A))

kids=list(par.keys())

def mkdic(x):
    par[x[0]].append(x[1])

list(map(mkdic,B))

def getparent(x):
    if x in par:
        return par[x]
    else:
        return ['']

def findgrand(x):
    return list(map(getparent,par[x]))

grands = list(map(findgrand,kids))

print('grandchild\tgrandparent')
for i in range(len(grands)):
    grand1, grand2 = grands[i]
    for g in grand1+grand2:
        if len(g) != 0:
            print(kids[i] + '\t\t' + g)
#命令
python mapred3.py 192.168.43.206  /parents.txt

《大数据技术基础》上机二

  1. 编程实现以下指定功能,并用Hadoop提供的HBase Shell命令完成相同任务:
(1)列出HBase所有的表的相关信息,例如表名;
hbase(main):001:0> list
(2)在终端打印出指定的表的所有记录数据;
scan 'test'
(3)向已经创建好的表添加和删除指定的列族或列;
put 'test','1','column1 data:*','test of c1'
(4)清空指定的表的所有记录数据;
truncate 'test'
(5)统计表的行数。
count 'test'
  1. 现有以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据:
学生表(Student)
学号(S_No) 姓名(S_Name) 性别(S_Sex) 年龄(S_Age)
2015001 Zhangsan male 23
2015003 Mary female 22
2015003 Lisi male 24
课程表(Course)
课程号(C_No) 课程名(C_Name) 学分(C_Credit)
123001 Math 2.0
123002 Computer Science 5.0
123003 English 3.0
选课表(SC)
学号(SC_Sno) 课程号(SC_Cno) 成绩(SC_Score)
2015001 123001 86
2015001 123003 69
2015002 123002 77
2015002 123003 99
2015003 123001 98
2015003 123002 95
创建表
create 'Student','S_No','S_Name','S_Sex','S_Age'
create 'Course','C_No','C_Name','C_Credit' 
create 'SC','SC_Sno','SC_Cno','SC_Score' 
添加数据 以Student表为例
put 'Student','s001','S_No','2015001' 
put 'Student','s001','S_Name','Zhangsan' 
put 'Student','s001','S_Sex','male' 
put 'Student','s001','S_Age','23' 
查看特定行的特定列
get 'Student','s001',{COLUMN=>'S_Sex'}
更改数据 直接put覆盖即可
put 'Student','s001',"S_Sex","male"
删特定行的数据
deleteall "Student","s002"
  1. 利用HBase和MapReduce完成如下任务: 假设HBase有2张表,表的逻辑视图及部分数据如下所示:
书名(bookName) 价格(price)
atabase System Concept 30$
Thinking in Java 60$
Data Mining 25$
要求:从HBase读出上述两张表的数据,对“price”的排序,并将结果存储到HBase中。
 create 'book','bookName' 
 put 'book','val_60$','bookName:','Thinking in Java' 
 put 'book','val_20$','bookName:','Database System Concept' 
 put 'book','val_30$','bookName:','Data Mining' 

《大数据技术基础》上机一

1.编程实现以下指定功能,并利用Hadoop提供的Shell命令完成相同任务: (1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件;
#!/bin/bash

if [ -n $1 ]
then
    if [ -e $1 ]
    then
        if [ -n $2 ]
        then
            `hdfs dfs -test -e $2$1`
            if [ $? -eq 0 ]
            then
                `hdfs dfs -appendToFile $1 $2$1`
            else
                `hdfs dfs -put $1 $2$1`
            fi

        else
            echo "请指定上传到hadoop中的位置"
        fi
    else
        echo "$1 不存在"
    fi
else
    echo "请制定上传的文件"
fi

(2)从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
#!/bin/bash

if [ -n $1 ]
then
    `hdfs dfs -test -e $1`
    if [ $? -eq 0 ]
    then
        if [ -n $2 ]
        then
            n="(1)"
            file="downFromHdfs"
            while [ -e $file ]
            do
                file=$file"_"$n
            done
            `hdfs dfs -copyToLocal $1 $file`
        else
            n="(2)"
            file="downFromHdfs"
            while [ -e $file ]
            do
                file=$file"_"$n
            done
            `hdfs dfs -copyToLocal $1 $file`
        fi
    else
        echo "没有这个文件:$1"
    fi
else
    echo "请指定下载的文件"
fi
(3)将HDFS中指定文件的内容输出到终端中;
hdfs dfs -cat /test1.txt
(4)显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;
hdfs dfs -ls /test1.txt
(5)给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;
hdfs dfs -ls /
(6)提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;
hdfs dfs -rm /test/text.txt #删除文件
hdfs dfs -mkdir /dir #创文件夹
hdfs dfs -touchz /dir/dir1/t.txt #创建文件
(7)提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;
hdfs dfs -mkdir -p /dir/dir1 #递归创建文件夹
hdfs dfs -rmdir /dir #删除文件夹
hdfs dfs -rmr /dir #递归删文件夹
(8)向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;
hdfs dfs -appendToFile append.txt /test1.txt #向结尾追加
#向开头追加
hdfs dfs -get /test1.txt
cat test1.txt >> append.txt
hdfs dfs -put -f append.txt /test1.txt
(9)删除HDFS中指定的文件;
hdfs dfs -rm /test1.txt
(10)删除HDFS中指定的目录,由用户指定目录中如果存在文件时是否删除目录;
hdfs dfs -mkdir -p /dir
(11)在HDFS中,将文件从源路径移动到目的路径。
hdfs dfs -mv /test1.txt /test2.txt

《Linux系统应用与开发》上机实习报告

实验一

  • cd 命令:切换目录 (1)切换到目录 /usr/local
     $ cd /usr/local
    
    (2)去到目前的上层目录
     $ cd ..
    
    (3)回到自己的主文件夹
     $ cd
     或
     $ cd ~
    
  • ls 命令:查看文件与目录 (4)查看目录/usr 下所有文件(包括隐藏文件)的详细信息
     $ ls /usr
    
  • mkdir 命令:新建新目录 (5)进入/tmp 目录,创建一个名为 a 的目录,并查看该目录是否创建成功
     $ cd /tmp
     $ mkdir a
    
    (6)创建目录 a1/a2
     $ mkdir -p a1/a2
    
  • pwd 命令:查看当前路径 (7)切换到上例创建的目录 a,并查看当前目录路径
     $ cd /tmp/a
     $ pwd
    
  • rmdir 命令:删除空的目录 (8)将上例创建的目录 a(/tmp 下面)删除
     $ cd /tmp
     $ rmdir a
    
    (9)删除目录 a1/a2,查看有多少目录存在
     $ rmdir a1/a2
    
  • cp 命令:复制文件或目录 (10)将主文件夹下的.bashrc 文件复制到/usr 下,并命名为 bashrc1
     $ sudo cp ~/.bashrc /usr/bashrc1
    
    (11)在/tmp 下新建目录 test/test1,再复制这个目录 test/test1 内容到/usr
     $ mkdir -p /tmp/test/test1
    
  • mv 命令:移动文件与目录,或更名 (12)将上例文件 bashrc1 移动到目录/usr/test
     $ sudo cp /usr/bashrc1 /usr/test/
    
    (13)将上例 test 目录重命名为 test2
     $ sudo mv /usr/test /usr/test2
    
  • rm 命令:移除文件或目录 (14)将上例复制的 bashrc1 文件删除
     $ sudo rm /usr/test2/bashrc1
    
    (15)将上例的 test2 目录删除
     $ sudo rm -rf /usr/test2
    
  • cat 命令:查看文件内容 (16)查看主文件夹下的.bashrc 文件内容
     $ cat ~/.bashrc
    
  • tac 命令:反向列示 (17)反向查看主文件夹下.bashrc 文件内容
     $ tac ~/.bashrc
    
  • more 命令:一页一页翻动查看 (18)翻页查看主文件夹下.bashrc 文件内容
     $ more .bashrc
    
  • head 命令:取出前面几行 (19)查看主文件夹下.bashrc 文件内容前 20 行
     $ head -10 ~/.bashrc
    
    (20)查看主文件夹下.bashrc 文件内容,后面 50 行不显示,只显示前面几行
     $ head --lines=-10 .bashrc
    
  • tail 命令:取出后面几行 (21)查看主文件夹下.bashrc 文件内容最后 20 行
     $ tail -20 ~/.bashrc
    
    (22) 查看主文件夹下.bashrc 文件内容,只列出 50 行以后的数据
     $ tail -50 .bashrc
    
  • touch 命令:修改文件时间或创建新文件 (23)在/tmp 下创建一个空文件 hello 并查看时间
     $ touch /tmp/hello
     $ stat /tmp/hello
    
  • chown 命令:修改文件所有者权限 (24)将hello 文件所有者改为 root 帐号,并查看属性
     $ chown root /tmp/hello
    
  • find 命令:文件查找 (25)找出主文件夹下文件名为.bashrc 的文件
     $ find ~/ -name .bashrc
    
  • tar 命令:压缩命令 (26)在/目录下新建文件夹 test,然后在/目录下打包成 test.tar.gz
     $ sudo mkdir /test
     $ sudo tar -czvf /test.tar.gz /test
    
    (27)解压缩到/tmp 目录
     $ tar -xzvf /test.tar.gz -C /tmp
    
  • grep 命令:查找字符串 (28)从~/.bashrc 文件中查找字符串'examples'
     $ cat ~/.bashrc | grep examples
    
    (29)配置 Java 环境变量(JAVA_HOME),用 vi 或 gedit 文本编辑器打开~/.bashrc 配置文件,
     $ echo 'export JAVA_HOME=/HHHHH' >> ~/.bashrc
     $ vi ~/.bashrc
    
    (30)查看 JAVA_HOME 变量的值
     $ source .bashrc
     $ echo $JAVA_HOME
    

实验二

1. 设计如下一个菜单驱动程序。

Use one of the following options: P: To display current directory 
S: To display the name of running file 
D: To display today’s date and present time 
L: To see the listing of files in your present working directory W: To see who is logged in 
Q: To quit this program Enter your option and hit: 
菜单程序将根据用户输入的选择项给出相应信息。要求对用户的输入忽略大小写,对于无效选项的输入给出相应提示。要求使用 case 语句实现以上功能,输入相应的字母后应该执行相应的命令完成每项功能,如输入 P 或 p,就执行 pwd 命令。
    #! /bin/bash

    echo 'Use one of the following options:'
    echo 'P: To display current directory'
    echo 'S: To display the name of runnning file'
    echo 'D: To display todays date and present time'
    echo 'L: To see the listing of files in your present working directory'
    echo 'W: To see who is logged in'
    echo 'Q: To quit this program'
    echo "Enter your option and hit: "
    while :
    do
    read choice
    case $choice in
        P|p) pwd
        ;;
        S|s) echo $0
        ;;
        D|d) date
        ;;
        L|l) ls
        ;;
        W|w) who
        ;;
        Q|q) exit
        ;;
        *) echo "Wrong option"
        ;;
    esac
done

2. 编写一段 bash Shell 程序

根据从键盘输入的学生成绩,显示相应的成绩等级,其中60分以下为“Failed!”,60~70分为“Passed!”,70~80 分为“Medium!”,80~90分为“Good!”,90~100分为“Excellent!”。如果输入超过100或负数的分数,则显示错误分数提示。
    #!/bin/bash
    
    echo 'Please input a student grade, we would judge the levels: '
    
    while :
        do
            read grade
            if [ $grade -ge 0 ]
            then
                if [ $grade -lt 60 ] then
                    echo 'Failed!'
                elif [ $grade -lt 70 ]
                then
                    echo 'Passed!'
                elif [ $grade -lt 80 ]
                then
                    echo 'Medium!'
                elif [ $grade -lt 90 ]
                then
                    echo 'Good!'
                elif [ $grade -le 100 ]
                then 
                    echo 'Excellent!'
                else
                    echo 'Wrong input, please try again: '
                    continue
                fi
                    echo 'Please input a student grade, we would judge the levels: '
                continue
            fi
            echo 'Wrong input, please try again: '
        done

3. 编写一个 Shell 过程完成如下功能(必须在脚本中使用函数)。

  1. 程序接收 3 个参数:$1、$2 和$3,合并两个文件$1、$2 为$3,并显示,三个文件均为文本文件。
  2. 如果文件$3 不存在,那么先报告缺少$3,然后将合并后的内容输出到 mydoc.txt。如果有$3,就合并到$3。
  3. 如果文件$2 和文件$3都不存在,那么先报告缺少$2、$3,只显示$1 的内容。
  4. 如果文件$1 不存在,则提示缺少$1,要求重新运行程序。
    #!/bin/bash
    
    function1 ( ) {
    
    if [ $1 ]
    then
        if [ -e $1 ]
        then
            if [ -r $1 ]
            then
                if [ $2 -a -e $2 ]
                then
                    if [ -r $2 ]
                    then
                        outFile=$3
                        if [ -e mydoc.txt ]
                        then
                            rm mydoc.txt
                        fi
    
                        if [ $3 ]
                        then
                            if [ -w $3 ]
                            then
                                outFile=$3
                            else
                                touch mydoc.txt
                                outFile=mydoc.txt
                                echo "文件 ${3} 不存在或者不可写"
                            fi
                        else
                            touch mydoc.txt
                            outFile=mydoc.txt
                            echo '缺少$3'
                        fi
                        cat $1 >> $outFile    
                        cat $2 >> $outFile
                        cat $1
                        cat $2
                    else
                        echo "文件 ${2} 不可读"
                    fi
                else
                    if [ $2 ]
                    then
                        echo "文件${2} 不存在"
                    else
                        echo '缺少$2 $3'
                        cat $1
                    fi
                fi
            else
                echo "文件 ${1} 没有可读权限"
                exit
            fi
        else
            echo "文件 ${1} 不存在"
            exit
        fi
    else
        echo '缺少$1 请重新运行程序'
    fi
    }
    
    function1 $1 $2 $3

4. 编写一个脚本,显示当天日期,查找给定的某用户是否在系统中工作。如果在系统中, 就发一个问候给他

    #!/bin/bash
    sudo echo "今天的日期是:`date "+%Y-%m-%d"`"
    Users=`who | cut -d \  -f 1`
    Ttys=`who | cut -d \  -f 2`
    Numbers=`who | grep -c :`
    
    while (( $Numbers>0 ))
    do
        n1=`echo $Users | cut -d \  -f $Numbers`
        n2=`echo $Ttys | cut -d \  -f $Numbers`
        echo "Hello" | sudo write $n1 $n2
        let "Numbers--"
    done

实验三

1.实验目的

  • 了解 Linux 下 C 语言程序编译和调试的环境。
  • 掌握 GCC 的各种编译参数。
  • 掌握 makefile 的使用方法。
  • 掌握 gdb 调试工具的使用。

2.实验平台

  • 操作系统:Deepin

3.实验内容

(1)输入以下 C 程序hostname.c

#include <sys/utsname.h>
#include <unistd.h>
#include <stdio.h> 
#include <stdlib.h>

int main()
{

    char computer[256]; 
    struct  utsname uts;
    if (gethostname(computer, 255) !=0 || uname(&uts)<0) 
    { 
        fprintf(stderr, "could not get host information \n"); 
        exit(1);
    }

    printf("computer host name is %s \n", computer);
    printf("system is %s on %s hardware \n", uts.sysname, uts.machine); 
    printf("nodename is %s \n", uts.nodename);
    printf("version is %s, %s\n", uts.release, uts.version); 
    
    exit(0);

}

-E 选项

使用 gcc –E hostname.c –o hostname.i 生成预处理文件,观察在本目录中生成的hostname.i 文件。
$ gcc –E hostName.c –o hostName.i 
$ head hostName.i 
# 1 "hostName.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "hostName.c"
# 1 "/usr/include/x86_64-linux-gnu/sys/utsname.h" 1 3 4
# 25 "/usr/include/x86_64-linux-gnu/sys/utsname.h" 3 4
# 1 "/usr/include/features.h" 1 3 4

-S 选项

使用 gcc –S hostname.c –o hostname.s 生成汇编文件,观察在本目录中生成的hostname.s文件。
$ gcc –S hostName.c –o hostName.s
$ head hostName.s
    .file   "hostName.c"
    .section    .rodata
    .align 8
.LC0:
    .string "could not get host information \n"
.LC1:
    .string "computer host name is %s \n"
.LC2:
    .string "system is %s on %s hardware \n"
.LC3:

-o 选项

$ gcc hostName.c –o hostname
$ ./hostname 
computer host name is squarefong-PC 
system is Linux on x86_64 hardware 
nodename is squarefong-PC 
version is 4.9.0-deepin13-amd64, #1 SMP PREEMPT Deepin 4.9.57-1 (2017-10-19)

-g 选项

$ gcc hostName.c –g –o hostname
$ gdb hostname
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from hostname...done.
(gdb) l
1   #include <sys/utsname.h>
2   #include <unistd.h>
3   #include <stdio.h> 
4   #include <stdlib.h>
5   
6   int main()
7   {
8   
9       char computer[256]; 
10      struct  utsname uts;
(gdb) b 6
Breakpoint 1 at 0x81b: file hostName.c, line 6.
(gdb) r
Starting program: /home/squarefong/Documents/LinuxCourse/third/hostname 

Breakpoint 1, main () at hostName.c:11
11      if (gethostname(computer, 255) !=0 || uname(&uts)<0) 
(gdb) n
17      printf("computer host name is %s \n", computer);
(gdb) c
Continuing.
computer host name is squarefong-PC 
system is Linux on x86_64 hardware 
nodename is squarefong-PC 
version is 4.9.0-deepin13-amd64, #1 SMP PREEMPT Deepin 4.9.57-1 (2017-10-19)
[Inferior 1 (process 23091) exited normally]

(2)按照以下目录结构存放程序,然后制作 makefile 文件,把 makefile 文件内容附上。现有一个程序由 7 个文件组成。

/main.c /functions/mytool1.c /functions/mytool2.c /functions/mytool3.c /functions/mytool1.h /functions/mytool2.h /functions/mytool3.h
#makefile
main : main.o mytool1.o mytool2.o mytool3.o
    gcc -o main main.o mytool1.o mytool2.o mytool3.o

main.o : /main.c /functions/mytool1.h /functions/mytool2.h /functions/mytool3.h
    gcc -c /main.c -I /functions

mytool1.o : /functions/mytool1.h /functions/mytool1.c
    gcc -c /functions/mytool1.c


mytool2.o : /functions/mytool2.h /functions/mytool2.c
    gcc -c /functions/mytool2.c


mytool3.o : /functions/mytool3.h /functions/mytool3.c
    gcc -c /functions/mytool3.c

clean : 
    rm main main.o mytool1.o mytool2.o mytool3.o

test: main.o mytool1.o mytool2.o mytool3.o
    gcc -o test /main.c /functions/mytool1.c /functions/mytool2.c /functions/mytool3.c -I /functions -g

Deepin 安装Anbox

1.安装snap

$ anbox session-manager

2.安装相关的包

$ wget https://launchpadlibrarian.net/333439595/anbox-modules-dkms_9~xenial1_all.deb
$ wget https://launchpadlibrarian.net/333439593/anbox-common_9~xenial1_all.deb$ sudo dpkg -i anbox*.deb

3.安装anbox

$ sudo snap install core$ sudo snap install --edge --devmode anbox
如果网上不好的同鞋可以考虑proxychains
$ sudo proxychains snap install core
$ sudo proxychains snap install --edge --devmode anbox
安装完成后不造为啥启动失败,重启一下竟然就好了

4.启动anbox

如果有快捷方式,那很好 
但是如果没有,启动anbox就不怎么直观了 
首先打开一个terminal
$ anbox session-manager
然后再打开一个terminal
$ anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
启动完的效果图 

5.给anbox安装app

事先下载好apk,切换到apk所在目录,启动anbox,执行下面命
$ adb install firefox.apk