在安卓手机上跑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

专注力:专注工具

第 7 章 如何利用的“第二自我”策略

你有多重人格

事实上,我们在不同情况下会有不同反应很正常。只是大多数人并不清楚他们其实可以选择反应方式,不清楚他们所拥有的选择代表了很大的潜在资本。非但如此,人们总倾向于把他们的情绪、态度甚至行为归咎到外部因素上。

你确实可以选择

“第二自我”策略是关于决定你的众多性格中哪一条对给定情景最有效,以及让这一性格进行主导。我把这些性格称作“第二自我”,让正确的性格做主,你会发现自己的办事效率变得更高,并且所需承受的压力也会更少,甚至你会觉得做这些事很有趣。 如果在某些情况下你的反应总是毫无建设性可言,你可以停止做出这种反应,用其他方式代替。例如你在愤怒的时候,从一数到十,在不满情绪上升的情况下,这给你时间考虑不满情绪是否真的有用,也给你时间重新反应。

第二自我类别

这里列举一些你可能会有用的“第二自我”
  • 钱眼小姐:理性、能干、保守。是准备税务、决定购置物品的好人选。
  • 匈奴王:坚强,始终清楚目标所在,不屈服。如果曾经有人盛气凌人地欺负你,让你不能做自己喜欢的或者需要的事情,或者当你处理手头工作收到很多外界的干扰,这会是很阿訇的人选。
  • 阿尔伯特:能够打破陈规、别出新意地想问题,不惧失败或他人的嘲弄。当你需要创造力时,这是很好的人选,是头脑风暴的很好选择。
  • 大孩子:幽默、爱冒险、思想开放。当你发现自己对事太严肃认真时,这是个好选择。
  • 超人:坚强、自信、能干。当需要信心,比如在做演讲、拨打并不太肯定的电话时,你需要这样的人选。
  • 哈耳摩尼亚修女:温柔、善于安抚、致力于为有关人士寻求双赢局面。在和通情达理的人进行协商时的有利人选。
选择合适的性格来对某件事情进行主管的简略步骤: 
1. 分析手头的任务,处理这项任务需要什么品质? 
2. 用你的记忆或想象力创造或再造一个拥有那些品质的人,然后进入这种理想状态。给“第二自我”取一个名字。 
3. 让“第二自我”主宰你,直到任务完成,或者直到你到达某个需要另一个“第二自我”的时刻。 
4. 完成这项任务,然后自觉地从这种“第二自我”中退出,进入到更典型的自我中,或者进入另一种更适合于你将要做的事的“第二自我”中

雇用你自己来做顾问

能在多种情况下依然保持有效的“第二自我”身份是顾问。通过假装你是自己高薪聘请的顾问来对如何使生活回报最大化进行评估,这能让你对自己的生活获得一种全新的看法。用一种中立的、质疑的态度来对你正在做的事以及做事的方式进行分析,问题的症结在哪里,哪些方面需要更多或更新的资源,以及其他。 当你用一种“抽离”的状态来重新审视自己的生活,也就是说好像从外界来看待你自己的生活,就像在看一场电源,忽然间你会获得一种全新的画面。要想让这一画面真实形象,你可以站起来,闭上双眼,然后用你的所有感官再造这样一个人。举个例子,如果在你的想象中。这位顾问的个子比你高,你可能会注意到自己的姿态有些转变。如果你感觉你的顾问应该不像你自己那样情绪化,你可能会感觉自己的精神状态变得更加冷淡。 就像其他顾问一样,注意什么起作用,什么不起作用,需要什么,什么对其他人有用,然后写下你的建议。 然后再回归到相关的状态,阅读这份报告然后决定你想要接受这些建议中的哪些,并开始将这些建议付诸行动。定期召集顾问来对你的做事方式以及确实有效的变更进行评估。

创造你的终极敌人

一般来说,积极地想问题比较好,但有时策略性的消极思维也是有所裨益的。你是否曾经注意到人们在对敌作战时是多么地全身投入?敌人越具体越好。你可以通过创造“第二自我”的最终变体来利用这种力量。:可能会阻止你前进的任何事物特征,一个终极敌人。

专注力:专注策略

第 3 章 如何专注时间模式以取得成功

出人意料的时间模式

  • 每个人都有自己的行为模式。一遍一遍做同样的事就会一遍遍得到同样的结果。人们都有一套关于如何利用时间的模式。比如有人先做容易的事,有人先解决最难的。
  • 人们总喜欢重复旧有的方式,即便这样效果并不理想。并不是所有的人都会从以往失败的经历中总结出更好的经验教训。
  • 人们通常能意识到别人的模式,却意识不到自己的模式
  • 模式也可以包括情感、想法、影像和行动。

如何发现你自己的模式

常见的不良模式

  • 保持身材的老调常谈
  • 持续对工作不满
  • 持续对财务方面的不满
  • 反复出现的有害关系

常见的与时间相关的不良模式

  • 先做最不重要的事
  • 拖延
  • “救火”(先做最紧急而不是最重要的事)
  • 任由内心的自责主宰思想

如何发现自我模式

  1. 询问他人。(前提确保坦诚)
  2. 想想父母都有哪些消极模式,然后评估自己是否复制这些模式。或者处于叛逆,采取了完全相反的消极模式。
  3. 使用分解法。想象游离出真实自我,以旁观者角度,不带感情看自己。
  4. 使用“把你的问题教给别人”技巧
  5. 下一次运用某一模式时,进行规划。当一种模式总是一模式干扰的形式重复出现,把它记录下来,这能让你继续按照原计划做事,因此能成为一种治愈和诊断练习。
  6. 使用“高层自我”来信技巧。即游离于目前你承受的压力之外的自己。

了解目前的模式都给你带来了些什么

  • 神经语言程式学,假设每种行为都附有一个积极的意愿。这个意愿总是想要给您带来某些好处。
  • 当你识别出消极模式,要弄清这一模式给您带来了些什么,比如不愿清空废物间,可能是有东西有情感价值或者精神慰藉。
  • 在把消极模式转换为更有效模式之前,你需要找到其他方法来获得这些模式所带来的好处。
  • 关键是要找出对你有用的方式,这就是不断尝试不断犯错的过程。

如何避免过多承诺

 一个典型的消极时间模式就是过分安排时间。要做的大于能做的,最后偷工减料草草了事,甚至无法完成。 
 给自己一些时间,平复感情方面的反应,考虑新的项目能否安排进你的时间。

第 4 章 如何克服专注障碍

摆脱不太重要的80%

可选项1:删除或减少

通常情况下,有些事情是可以完全不必去做的,对大多数人来说,这至少代表了所花费时间的10%-15%。这里列举一些绝大多数人都能删减的事项:
  • 获取不相关的信息
  • 低效地处理文书工作
  • 在邮件上花费过多时间
  • 毫无价值或者不必要的会议

选项2:分配任务

看看剩下的工作哪些是可以分配给其他人去做的。Keep in mind, 你的目标是尽可能多地把时间利用在能给你带来最大价值的事情上。比如:自己归档,复印,出差,接听日常电话等,可以分配出去。 
可选的方式:
  • 雇佣兼职人员
  • 利用虚拟助手
  • 利用在线自由撰稿人

真正做你应该做的事的秘诀

  • 很多时候, 做其他事情比做我们必须要做的事情要有趣的多
  • 低附加值活动倾向于那些很容易的、不会给人带来恐慌甚至可能会让人感到身心愉悦的事情
  • 你所需要的是真正能让困难的事情变得简单、变得有趣的方法和技巧。将任务分解成易于完成的子任务,直到这些子任务都很容易完成,直到不再惧怕这些任务。例如去健身房,先拿着健身包出门,先告诉自己如果不想健身了可以回家,实际上,一旦出门了,很可能真的去健身了。

谁说必须从头开始

很多情况下,你并不需要从头开始。花一分钟想想你的目标,这个目标的哪一部分对你来说最有吸引力,最能让你激动,就从哪开始,不必太过在意它们是否逻辑上正常。

创造流程

当“流程”状态出现,你常常无比投入于你所从事的事情,而失去了时间概念。这是一种令人愉悦的经历,在这个经历中,你仿佛成为你所做事情的媒介——一种紧张而又容易的专注状态。问题是,你要怎样创造这样一个状态,这里有三个关键因素。
  1. 选一个刚好在你能力范围之内或者刚好高出你能力范围的任务。
  2. 确保任务包含即刻反馈
  3. 创造一个注意力分散点尽量少的环境。

充分利用零碎时间

分解策略同样适用于时间。把零散的时间利用起来,能做成很多事情。这里有几点建议:
  • 把平时看电视的时间利用起来
  • 在购物清单上加上“为实现目标奋斗20分钟”,在购物前或者后,花20分钟在项目上
  • 配孩子或者小伙伴看一次不怎么想看的电影之后,可以一起去电影院,然后他们进去看,自己去附加等待咖啡店。

发明自己的障碍克服策略

本章提到的策略都是为了使想要逃避的任务变得更容易做,做起来更有意思。除了上面提到的,还有些其他方法,包括:
  • 做这些工作的时候,听一些你喜欢的音乐
  • 和喜欢的人一起工作
  • 当一件事情完成,给自己一定的奖励作为回报
  • 和别人打赌你一定能完成这些工作,要保证赌注是你真正会心疼的东西

第 5 章 如何专注于已经凑效的事情

  • 在为成功努力的过程中,大多数人专注的焦点都不是他们真正应该做的事情。
  • 当你做80/20分析时,通常你会发现给你带来最多价值的那20%是你已经在做的事情,只是你做得还不够多。
  • 假若你想成为任意领域中那5%的胜者,你需要多做你擅长的事少考虑要把你做不好的事情做得更好这样的问题

你的强项是什么

  1. 论及观点创新,你最大的优点是什么?
  2. 对于表达自我,你最擅长什么?
  3. 和他人打交道方面,你最擅长什么?
  4. 完成任务方面,你最擅长什么?

你何时做了正确的事

  • 一般情况下,你做事情都会拖延,但在做什么事情时你不会拖延?
  • 一般情况下,你都不会完成已经开始的工作,但偶尔也有例外,那这些例外有什么不同?
  • 一般情况下,你工作日的工作都不是从最重要的事情开始的,但有时你确实是这样做的,这些时候和平时有什么不同?
对比徒劳无益的模式和哪些例外,你会找到改变的线索。而这些问题本身常常都有解决的方法。
  1. 首先写下一件你通常没法做的跟自己想象中一养好的事
  2. 现在想出至少一次你曾经做好的时候
  3. 你曾经的那次有什么不同之处
  4. 下一次你需要做相同的工作时,你将如何运用这一策略

留意事情发展好的时候

  1. 在每天快结束的时候,花点时间回顾一下当天发生的事情,注意那些对你有效的事物,并想想这些事情为什么会对你有效。
  2. 再花点时间想想你可以怎样把这些确实有效的技巧运用到目前你所面临的其他挑战上去。
  3. 最好是能把所有有效的内容都记录下来,这样将来遇到困难的时候,你就可以看看这份清单,然后找出已经被证明有效的方法来帮助你解决这些新挑战。这种方法最妙的地方在于你其实是在向自己学习,并且你知道这些技巧确实有效。

学习巴甫洛夫和他那些流口水的狗

  • 有些时候你确实可以状态极好地完成一件事,只不过对于我们大多是人而言,那些体力和脑力状态是可欲不可求的。
  • 一旦你意识到自己处于一种产出能力特别强的状态时,把它和一种声音进行关联(比如一首歌)或者一种气味(例如薄荷油)。你这么做过几次之后,这种精神状态和其他元素就会联系起来,直到形成那种一旦你听到这种声音或者闻到这种味道,积极的状态就会出现的情形。

你在何时获得最好的主意

就像我们注意到,好的主意出现时,我们应该在自己分心前、在这些主意消失前及时把它们记录下来。可以在容易产生想法的地方随处放些纸笔:浴室、床头、客厅沙发边、厨房。

如何驾驭白日梦

正是你在洗澡走路健身房跑步机上所做的事情,也就是在这些时候,突然间会有一个想法出现在你的脑中。这些信息来自于潜意识,而潜意识中充满了你在清醒时所做的事。如果你想要这种白日梦出现更多,那么就需要: 
- 花更多时间来做那些使你有可能产生想法的事情 
- 当有注意产生时,不要立即对它们进行评判。一个消极的主意会很快扼杀新的主意。即使你的直觉告诉你这个主意并不现实或者并不相关,不要放弃这个主意。它可能会引导你想出另一个有用的主意。 
- 永远不要逼自己去想,而是让这些主意自己主动冒出来。

隐藏的想法来源:夜晚所做的梦

如果你在快睡觉前把注意力集中在这个问题上,你很可能会获得一个解决方法。不是说要去担心这个问题,而是把它们作为你正寻求答案的问题。然后睡觉,第二天一早,写下任何你能记住的内容。如果你在梦境中醒来,立即进行记录。第二天,坐在安静的地方看看你所写的内容。梦境是有寓意的,问题的解决方法可能以某种符号的形式出现。让你的思想自由发散,想想你的梦可能在试图告诉你什么。。。。

第 6 章 如何战胜拖延

首先:你确定自己有问题吗

如果你一直把事情放到最后一刻才去做,不过最终你还是会完成这件事,并且每次都做得很好,那就不算拖延。

拖延的诱惑

  • 任何物体在不受外力作用的条件下,都将保持静止或匀速直线运动。
  • 躺在沙发上休息的人倾向于继续躺着休息
  • “错误”的选项在当下显得非常有吸引力。“正确”选项的吸引力(在当下显得很弱),他的吸引力要长期才能体现出来。关键问题是:通常而言,“正确”选项在长期才能给我们带来回报。“错误”选项的回报则是立竿见影的。
  • 选择“正确”选项的秘诀就是将正确的选项变得和“错误”选项一样生动,一样富有感情,一样的吸引人。发挥你的想想力,用比“错误”选项更强烈的态度去观察、倾听、品尝、闻、感受“正确”选项。
成功具象化如果你无法对自己所期待的结果进行具象化想象,那么开始回忆以前曾给你带来巨大满足感的成功经历。记住自己全部感官的感受,然后把这些特点转移到你目前的目标上。

用锚的力量添加专注

让理想的状态通过一种能让你轻松作出最佳选择的方式“锚”住,停留下来,这是一个很有效的方法。利用巴甫洛夫和狗的方法,把这一技巧运用到你想要避免拖延的各种情况中去。
  1. 如果你倾向于拖延某项工作,想想当这些事情都完成之后,你所能感受到的轻松和惬意。
  2. 尽你所能为这个积极状态创造生动画面。这情景需要包括你经历这种状态的一切,包括看到的,听到的,感受到的甚至品尝和闻到的一切。
  3. 将这些感觉不断“放大”,直到它们给你带来足够强烈的感觉。
  4. 当你到达顶峰时,做一个手势,比如捏紧拇指和食指。将这两个指头捏一秒钟,然后再放开。这成为你的“锚”,你将经历这个状态的一个信号。
  5. 重复这个过程,多做几次,最好能持续一天或两天。
  6. 检查一下这之间的紧密程度,“抛锚”,也就是做出这一手势,然后检查自己的感觉。如果感觉还是不强烈,那么继续练习。

抗拒的原因以及如何克服

  • 条件不符。列出你认为自己需要的所有条件。这些条件都存在吗?如果不是,将项目分解成小任务,然后看现在的条件是否足够完成第一个小任务。是,则完成小任务,否,继续做另一个小任务。
  • 如果你是危机爱好者,那么考虑通过其他方式给自己增加这种肾上腺素震荡所带来的兴奋感。例如蹦极,高难度的网络游戏,高强度训练。
  • 试着对你不想做的事情说不。如果有什么办法可以让你不想做的事情消失,那么尽早去做(比如分配给其他人去做)。如果不行的话,不妨对做这件事会给你带来什么好处进行评估,然后记住这些好处。
  • 允许自己做事不完美。练习不完美地做一些小事,然后观察会发生什么(或者什么事都不会发生)。让自己严格挑剔的内心缓和下来。
  • 如果你的拖延是对那些让你做事情的人的一种对抗,那么想想有没有其他更直接的方法来表达愤怒、怨恨或者建立一种掌控感。通常最好的办法就是在一开始就不要接受这份工作,如果可能的话。
  • 这并不要感觉很好,只需要工作完成。但如果你可以把它和一些感觉很好的事情练习起来(比如,在做税单发票分类工作的同时听听音乐)。或者在任务完成后奖励自己,这会容易得多

走出第一步

第一步通常事最难的。 根据不同的行为模式,可以把人分为两类: 
1. 行动向导型人群,这类人可以在不同的任务间自由变换; 
2. 状态向导型人群,这类人更容易拖延,更容易遭遇不确定、挫折、空虚以及内疚感。 如果你是状态向导型人,建议首先认同自己不愿意做这件事,然后许诺你只做10分钟。当你即将到达自己所规定的时间时,很可能你的状态将发生改变,你可以继续做这件工作。 你还可以对小块任务策略的外延进行拓展,比如在通向目标的过程中设置一些有纪念意义的里程碑式节点。

拖延以及你的“任务”清单

大致有三种基本类型的人
  1. 清教徒:这些人首先会去完成最困难的任务,然后再享受做剩下那些容易的事的过程。这些人会先吃掉一串葡萄中最小最不成熟的那颗。
  2. 享乐主义者:这些人首先会去做一两件容易的事,然后再慢慢开始做其他一些更复杂的事情。这些人会先吃掉一串葡萄中最大最成熟的那颗。
  3. 赌徒:这些人会把任务写在分类卡片上,然后闭眼,把这些卡片顺序弄乱,然后再根据所出现的卡片顺序来做事。(不洗牌)这种做法符合赌徒对不可预知事件的热爱
哪种是最好的,对你来说最有效就是最好的。把这些方法都试一遍,然后采用能让你再一天中完成最重要事情的方法。

专注力:找到专注力的焦点

第 1 章 如何专注于至关重要的20%

帕累托法则(80/20法则)

  • 你的80%的收益或价值其实仅来源于20%的努力
  • 80/20法则同样适用于消极的事中,有时候20%或者更少时间做的事情,造成了80%的不开心。

推广

  • 关注工作中积极的20%,比如简化工作空间,80%的时间需要的物品唾手可得。
  • 列出占据你工作时间的十项任务,再列出最能增加价值的三件事
  • 列出空闲时最常做的十件事,再列出做得最有意思的三件事

如何转到更积极的方向上来

  •  早上醒来,花一两分钟想想生命中值得感激的事情。同时,想一想这一天你所期待的事情
  •  当有事情进行的很好的时候,花点时间把它记下来。不一定是多大成就,也许只是处理得非常得当的一通电话或者回答的同学的一个问题。花时间注意这些积极的东西,这可以帮你在思想上达到某种平衡
  •  注意其他人所做的积极而有价值的事情,花点时间去赞美他们所做的事。
  •  夜晚时分,简要回顾一下当天发生的事情。积极和消极的方面都想想,想想从这些事情中你都学到了些什么

为什么我们总是在做那些令人不甚满意的任务或行为

  • 我们早已习惯了去做占用很多时间但是效果一般的事
  • 人们在某件事上投入越多(金钱时间或感情)越难以割舍。(零容忍准则以克服)
  • 面子问题

第 2 章 如何专注于你的第一个目标

如何设定SMART目标

要想做到专注,首先要明确你想要获取什么
  • S(Specific) 具体。减肥: 模糊。减轻体重5斤: 具体。
  • M(Measurable) 可计量。
  • A(Attainable) 可获得的。
  • R(Realistic) 现实的。
  • T(Timely)

只有一个真正的目标节点

如果你确实想要实现目标,设定目标的过程应该怎样进展
  1. 设定一个目标。
  2. 开始做一切你认为可以帮助你实现目标的事情。
  3. 对此过程中的效果进行监控。
  4. 如果效果不行,找替换措施,开始做些改变
  5. 重复步骤3、4,直到实现目标。
利用这种方法,你永远不会失败!可能失败的唯一原因是你的放弃 这不表示你不能为目标内所能控制的任务设定截至日期,比如决定去健身房健身,设置下周前选定一家健身中心

宏伟目标很伟大,将他们分解成一个个小目标

宏伟目标能让你看到未来想要的生活,分解成小目标会让你一直有进步和成就的感觉。在最终目标之前,不要吝啬于庆祝。建立一些里程碑式的事件,在这些事件完成之时,进行庆祝。

规划诚可贵,行动价更高

图表和其他一些视觉辅助措施能帮你专注于所需要的事情,但是它们不能成为你所需要做的事情的替代品。少做点规划,把更多的注意力放在实现目标上

你无法专注于你看不见的事物

如果你想保证每天花点时间做些对你来说比较重要的事情,那么就在身边保一个与此相关的视觉或听觉符号。(照片,图画,单词等等。。。)定期改变这个符号,能帮助你更新其力量以提醒你采取行动。

用一张前十清单点燃你的激情

做一个清单,写出实现这些目标的前十个理由。他们将在你筋疲力尽的时候帮助你,激励你前进。

《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

$ sudo apt install snapd

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