Android 复习

一、界面布局和控件属性,包括界面的控件图、界面的结构图、常见属性

(一) 常用控件

1、TextView

<TextView
android:id="@+id/text_view"//定义一个id
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"//内容居中
android:textSize="24sp"
android:textColor="#00ff00"
android:text="hello world"
/>

2、Button

<Button
android:id="@+id/btn_1"//定义一个id
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"//位置居中
android:textSize="24sp"
android:textColor="#00ff00"
android:text="点击"
/>

3、EditText

<EditText
android:id="@+id/edit_1"//定义一个id
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"//100%宽并且居中
android:hint="请输入用户名"//输入提示文本
/>
EditText editInput = findViewById(R.id.edit_1);
editInput.setOnClickListener(view ->{
String getInputContent = editInput.getText().toString();
});

4.ImageView

<EditText
android:id="@+id/img_1"//定义一个id
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"//位置居中
android:src="@drawable/img_icon"
/>
ImageVIew img = findViewById(R.id.img_1);
img.setOnClickListener(view ->{
img.setImageResource(R.drawable.img_icon_2);//更改图片
});

5、AlertDialog

Button dialogBtn = findViewById(R.id.dialog_btn);
dialogBtn.setOnClickListener(view -> {
AlertDialog.builder dialog = new AlertDialog.builder(this);
dialog.setTitle("对话框标题");
dialog.setMessage("对话框提示信息");
dialog.setCancelable(false);//是否取消
dialog.setPositiveButton("确认",(DialogInterface dialog,int which) -> {
//确认事件
});
dialog.setNegativeButton("取消",(DialogInterface dialog,int which) -> {
//取消事件
});
dialog.show();//显示对话框
});

(二)、界面布局

1、常用的布局有

  • LinearLayout
  • RelativeLayout
  • ConstraintLayout
  • FrameLayout
  • PrecentFrameLayout

2、LinearLayout

水平或垂直布局
<LinearLayout
android:orientation="vertical"//或者horizontal>
</LinearLayout>

3、所有的布局都是直接或间接继承ViewGroup

  • 控件继承自TextView

  • 布局继承ViewGroup

2、通过控件直接生命绑定(只对单击事件有效)
<Button
android:id="@+id/button_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hello world"
android:onclick="popUp"
/>
Public class MainActivity extends AppCompatActivity implements View.OnClickListener{
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button_btn);
button.setOnClickListener(this);
}
@Override
private void onClick(View v){
if(v.getId() == R.id.button_btn){
Toast.makeText(this,"我单击事件被触发了",Toast.LENGTH_SHORT).show();
}
}
}

三、Android系统的四大组件,及其作用

  • 信使Intent

    • Activity,service,BroadcastReceiver之间通信需要Intent

    • 代表请求的意图

    • ContentPrivider不需要,因为有ContentResolver

    • 显示Intent

      1、启动
      Intent intent = new Intent(Activity.this,toActivity.class);
      intent.putExtra("name","chen");
      startActivity(intent);
      //返回数据给上一个应用
      startActivityForResult(intent,1);
      @Override
      private void onActivityResult(int reqCode,int resultCode,Intent data){
      if(reqCode == RESULT_OK){
      string data = data.getStringExtra("age");
      }
      }
      2、接收
      Intent intent = getIntent();
      String name = intent.getStringExtra("name");
      //返回数据给上一个应用
      Intent intent = new Intent();
      intent.putExtra("age",18);
      setResult(RESULT_OK,intent);
      finish();
    • 隐藏Intent:

      1、首先在Mainifest中进行声明
      <Activity android:name=".toBeActivity">
      <intent-filter>
      <action android:name="com.tobeStart"/>
      <category android:name="android.intent.category.DEFAULT">
      <intent-filter/>
      <Activity/>
      2、在事件中启动
      Intent intent = new Intent('com.toBeStart');
      startActivity(intent);

Activity

Android所有可见页面都是Activity,前台届界面

他是app的表示层

作用:与用户交互,显示信息

BroadcastReceiver

广播消息监听

监听系统广播、其他应用程序广播,其他组件广播

ContentPrivider 共享数据

用于进程间共享数据

另一个app需要通过ContentResolver与ContentProvider来通信

Service

后台服务,无用户界面

四、掌握 Activity 的生命周期状态,各个状态间转换时调用方法

  • 目的提高内存的利用率,映入App生命周期机制

  • 特点:生命周期不由app进程控制,系统决定

  • 优先级

    • 前台进程:前台Activity或前台Service,或正在处理广播

    • 可见进程:Activity可见但不在最前

    • 服务进程:拥有后台Service,Activity不可见或不存在

    • 后台进程: Activity不可见,并且没有Service

    • 空进程: 没有Activity和Service

  • Activity声明周期

    1、onCreate()//它在活动第一次被创建的时候调用。加载布局、绑定事件
    2、onStart()//在活动由不可见变为可见时调用
    3、onResume()//在活动准备好和用户进行交互时调用。此时活动处于返回栈顶,运行状态。
    4、onPause()//系统准备启动或恢复另一个活动时调用,通常在此释放CPU资源
    5、onStop()//活动完全不可见的时候调用
    6、onRestart()//由停止状态变为运行状态时调用
    7、onDestory()//销毁之前调用,之后活动得状态将变为销毁状态

五、使用List View和Adapter进行界面动态开发的一般方法

1、声明List<Map<String,Object>> lists

2、初始化数据 int[] photos = new int[]{R.drawable.tiger};String[] new String[]{"李白"}; String[] desc = new String[]{"诗仙"}

3、初始化化列表

lists = new ArrayList<Map<String,Obeject>>();
for(int i=0; i<names.length;i++){
Map<String,Object> listItem = new HashMap<String,Object>();
listItem.put("img",photos[i]);
listItem.put("name",names[i]);
listItem.put("desc",desc[i]);
lists.add(listItem);
}

4、装配Adapter

SimpleAdapter adapter = new SimpleAdapter(this,lists,R.layout.item,new String[]{"img","name","desc"},new int[]{R.id.img,R.id.name,R.id.desc});
mListView.serAdapter(adapter);

六、List View的事件处理

//查看
mListView.setOnItemClickListener((AdapterView<?> adapterView,View,view,int position,long id) ->{
lists.get(position).get("name").toString();
});
//删除
mListView.setOnItemLongClickListener((AdapterView<?> adapterView,View,view,int position,long id) ->{
lists.remove(position);
adapter.notifyDataSetChanged();
});
//添加
LayoutInflater factory = LayoutInflater.from(this);
View viewDiag = factory.inflate(R.layout.add_item_dialog, null);
View viewDiag = factory.inflate(R.layout.add_item_dialog, null);
EditText userNameET = viewDiag.findViewById(R.id.addNameItem);
EditText userDescET = viewDiag.findViewById(R.id.addDescItem);
//在lists显示内容中添加一行
Map<String,Object> listitem=new HashMap<String,Object>();
listitem.put("header", photos[0]);
listitem.put("name", et_name.getText().toString());
listitem.put("desc", et_introduce.getText().toString());
lists.add(listitem); //提示adapter刷新页面
adapter.notifyDataSetChanged();

七、数据存储的类别,掌握SP和SQlite的使用

1、声明、初始化

SharedPreferences pref;
SharedPreferences.Editor editor;
pref = getSharedPreferences("cookies",MODE_PRIVATE);
pref.getBoolean("isLogin",false);
//get
editor = pref.edit();
editor.putBoolean("isLogin",true);
editor.apply();

操作系统复习

操作系统复习题

一、操作系统引论

1.试说明推动OS发展的主要动力是什么?
  • 计算机系统资源的利用率不断提高;
  • 方便用户
  • 器件不断更新换代
  • 计算机体系结构不断发展
  • 新的应用需求不断被提出
2.微机OS按运行方式来分,可分为哪几类?举例说明。
  • 单用户多任务OS: 只允许一个用户上机(使用计算机),但允许用户程序作为一个任务运行,主要配置在8位和1位微机上。最具代表性的单用户单任务OS是CP/M(8位)和MS-DOS(16位)。
  • 单用户多任务OS:只允许一个用户上机,但允许用户把程序分为若干任务并发执行,从而有效地改善了系统性能。最具代表性的单用户任务OS是由微软Win3.1、Win95、Win98等。
  • 多用户多任务OS:允许多个用户通过各自的终端使用一台机器,共享主机系统中的各种资源,而每个用户程序又可进一步分为若干个任务并发执行,从而可以进一步提高资源利用率和系统吞吐量。最具代表性的多用户多任务OS是UNIX系统,各种类UNIX系统(Solaris、Linux系统等)以及Windows NT/Server系列的系统。

二、进程的描述与控制

1.什么是前驱图?请画出下列4条语句的前驱图。

S1: a = x + y;

S2: b = z + 1;

S3: c = a + b;

S4: w = c + 1;

graph TD
A((S1))-->S3((S3))
B((S2))-->S3((S3))
S3-->S4((S4))
2.在创建一个进程时,OS需要完成的主要工作是什么?

OS 发现请求创建新进程后,首先,调用进程创建原语;其次,申请一个空白PCB,并向该PCB中填写用于控制和管理进程的信息;再次,为该进程分配运行时所需的资源;最后,把该进程的PCB转入就绪状态并插入就绪队列中。

3.试说明引起进程阻塞或被唤醒的主要事件。

引起进程阻塞或被唤醒的主要事件介绍如下。

  • ① 向系统请求共享资源失败。进程在向系统请求共享资源时,由于系统已无足够的资源分配给它,此时进程会因不能继续运行而转变为阻塞状态。
  • ② 等待完成某种操作。当进程启动某种操作后,如果该进程必须在操作完成之后才能继续执行,则应先阻塞该进程。
  • ③ 尚未到达新数据。对于相互合作的进程,如果一个进程需要获得另一个进程提供的数据后才能处理该数据。但所需数据尚未到达,则进程阻塞。
  • ④ 等待到达新任务。在某些系统中,特别是在网络环境下的OS中,往往会设置一定量的系统进程,这种进程每当完成任务后便会把自己阻塞起来,等待新任务的到来。

三、 处理机调度与死锁

1.什么是死锁?产生死锁的原因和必要条件是什么?如何预防死锁?

死锁是指多个进程在运行过程中因争夺资源造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,他们都将无法向前推进。产生死锁的原因有:

  • ① 竞争不可抢占性资源
  • ② 竞争可消耗资源
  • ③ 进程间推进顺序不当

产生死锁必须同时具备4个必要条件:

  • ① 互斥条件
  • ② 请求和保持条件
  • ③ 不可抢占条件
  • ④ 循环等待条件

预防死锁是通过破坏产生死锁的4个必要条件中的一个或多个来实现的。其中互斥条件是设备固有属性,不能改变,因此主要破坏产生死锁的其他3个必要条件。

  • ① 破坏 “请求和保持”条件。当一个进程在请求资源时,它不能持有不可抢占资源。
  • ② 破坏“不可抢占”条件。当一个已经保持了某些不可抢占性资源的进程提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。
  • ③ 破坏“循环等待”条件。对系统所有资源类型进行线性排序,并赋予他们不同的序号,规定每个进程必须按序号递增的方式请求资源。

四、进程同步

1. 利用信号量机制实现进程互斥时,对互斥信号量的wait()和signal()操作为什么要成对出现?

利用信号量机制实现进程互斥时,对互斥信号量mutex的wait()和signal()操作必须成对出现,缺少wait(mutex)将会导致系统混乱,不能保证进程对临届资源的互斥访问;而缺少signal(mutex)则将会使临界资源永远不被释放,从而使因等待该资源而阻塞的进程不能被唤醒。

semaphore empty=500;//博物馆可以容纳的最多人数
semaphore mutex=1;//用于出入资源的控制
{ ...
wait(empty);
wait(mutex);
进门;
signal(mutex);
参观;
wait(mutex);
出门;
signal(mutex);
signal(empty);
}

五、存储器管理

一、为什么说分段系统较分页系统更易实现信息共享与保护?
  • ① 对于分页系统,每个页面是分散存储的,为了实现信息共享与保护,页面之间需要一一对应起来,为此需要建立大量的页表项。

  • ②对于分段系统,每个段都从0开始编址,并采用一段连续的地址空间,这样在实现信息共享与保护时,只须为所要共享与保护的程序设置一个段表项,将其中的起始地址与内存一一对应起来即可。

七、输入/输出系统

1、I/O 软件一般分为用户层软件、设备独立性软件、设备驱动程序和中断处理程序这4个层次,它们的基本功能分别是什么?请说明下列工作分别是在哪一层完成的?
(1)向设备寄存器写命令

在设备驱动程序中完成的。

(2) 检查用户是否有权使用设备

检查用户是否有权使用设备,属于设备保护,因此其在设备独立性软件中完成。

(3) 将二进制整数转换成ASCII 的格式打印

将二进制整数转换成ASCII格式打印是通过I/O库函数完成的,如C语言的库函数printf中就有打印格式的控制字符串,因此在其用户层软件中完成。

(4)缓冲管理

缓冲管理属于I/O的公有操作,因此是在设备独立性软件中完成的。

八、文件管理

我喜欢用日历,不用月历。为什么?

厚厚一本日历是整整一年的日子。每扯下一页,它新的一页———光亮而开阔的一天便笑嘻嘻地等着我去填满。我喜欢日历每一页后边的“明天”的未知,还隐含着一种希望。“明天”乃是人生中最富魅力的字眼儿。生命的定义就是拥有明天。它不像“未来”那么过于遥远与空洞。它就守候在门外。走出了今天便进入了全新的明天。白天和黑夜的界线是灯光;明天与今天的界线还是灯光。每一个明天都是从灯光熄灭时开始的。那么明天会怎样呢?当然,多半还要看你自己的。你快乐它就是快乐的一天,你无聊它就是无聊的一天,你匆忙它就是匆忙的一天;如果你静下心来就会发现,你不能改变昨天,但你可以决定明天。有时看起来你很被动,你被生活所选择,其实你也在选择生活,是不是?

每年元月元日,我都把一本新日历挂在墙上。随手一翻,光溜溜的纸页花花绿绿滑过手心,散发着油墨的芬芳。这一刹那我心头十分快活。我居然有这么大把大把的日子!我可以做多少事情!前边的日子就像一个个空间,生机勃勃,宽阔无边,迎面而来。我发现时间也是一种空间。历史不是一种空间吗?人的一生不是一个漫长又巨大的空间吗?一个个“明天”,不就像是一间间空屋子吗?那就要看你把什么东西搬进来。可是,时间的空间是无形的,触摸不到的。凡是使用过的日子,立即就会消失,抓也抓不住,而且了无痕迹。也许正是这样,我们便会感受到岁月的匆匆与虚无。

有一次,一位很著名的表演艺术家对我讲她和她的丈夫的一件事。她唱戏,丈夫拉弦。他们很敬业。天天忙着上妆上台,下台下妆,谁也顾不上认真看对方一眼,几十年就这样过去了。一天老伴忽然惊讶地对她说:“哎哟,你怎么老了呢!你什么时候才老的呀?我一直都在你身边怎么也没发现哪!”她受不了老伴脸上那种伤感的神情。她就去做了美容,除了皱,还除去眼袋。但老伴一看,竟然流下泪来。时针是从来不会逆转的。倒行逆施的只有人类自己的社会与历史。于是,光阴岁月,就像一阵阵呼呼的风或是闪闪烁烁的流光;它最终留给你的只有无奈而频生的白发和消耗中日见衰弱的身躯。为此,你每扯去一页用过的日历时,是不是觉得有点像扯掉一个生命的页码?

我不能天天都从容地扯下一页。特别是忙碌起来,或者从什么地方开会、活动、考察、访问归来,看见几页或十几页过往的日子挂在那里,黯淡、沉寂和没用;被时间掀过的日历好似废纸。可是当我把这一叠用过的日子扯下来,往往不忍丢掉,而把它们塞在书架的缝隙或夹在画册中间。就像从地上拾起的落叶。它们是我生命的落叶!

别忘了,我们的每一天都曾经生活在这一页一页的日历上。

然而人生的大部分日子是重复的——重复的工作与人际,重复的事物与相同的事物都很难被记忆。所以我们的日历大多页码都是黯淡无光。过后想起来,好似空洞无物。于是,我们就碰到一个非常重要的关于人本话题——记忆。人因为记忆而厚重、智慧和变得理智。更重要的是,记忆使人变得独特。因为记忆排斥平庸。记忆的事物都是纯粹而深刻个人化的。所有个人都是一个独特的“个案”。记忆很像艺术家,潜在心中,专事刻画我们自己的独特性。你是否把自己这个“独特”看得很重要?广义地说,精神事物的真正价值正是它的独特性。无论是一个人,还是一种文化。记忆依靠载体。一个城市的记忆留在它历史的街区与建筑上,一个人的记忆在他的照片上、物品里、老歌老曲中,也在日历上。

然而,人不能只是被动地被记忆,我们还要用行为去创造记忆。我们要用情感、忠诚、爱心、责任感,以及创造性的劳动去书写每一天的日历。把这一天深深嵌入记忆里。我们不是有能力使自己的人生丰富、充实以及具有深度和分量吗?

所以我写过:

“生活就是创造每一天。”

我还在一次艺术家的聚会中说:

“我们今天为之努力的,都是为了明天的回忆。”

为此,每每到了一年最后的几天,我都是不肯再去扯日历。我总把这最后几页保存下来。这可能出于生命的本能。我不愿意把日子花得精光。你一定会笑我,并问我这样就能保存住日子吗?我便把自己在今年日历的最后一页上写的四句诗拿给你看:

岁月何其速,

哎呀又一年;

花叶全无迹,

存世惟诗篇。

现在我来回答文章开始时那个问题:为什么我喜欢日历?因为日历具有生命感。或者说日历叫我随时感知自己的生命并叫我思考如何珍惜它。

蜂鸣器-Linux-gcc

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <linux/kd.h>
// 设定默认值
#define NOTESCONUT 605
int k[NOTESCONUT][2] = {{0, 1374}, {277, 229}, {330, 229}, {370, 573}, {0, 115}, {330, 229}, {370, 573}, {0, 115}, {330, 229}, {370, 229}, {440, 229}, {330, 229}, {370, 229}, {277, 458}, {277, 229}, {330, 229}, {370, 573}, {0, 115}, {330, 229}, {370, 573}, {0, 115}, {330, 229}, {370, 229}, {554, 229}, {440, 229}, {494, 229}, {370, 458}, {277, 229}, {330, 229}, {370, 573}, {0, 115}, {330, 229}, {370, 573}, {0, 115}, {330, 229}, {370, 229}, {440, 229}, {330, 229}, {370, 229}, {277, 229}, {330, 229}, {220, 229}, {247, 229}, {277, 458}, {440, 458}, {370, 458}, {554, 458}, {494, 229}, {554, 115}, {494, 115}, {440, 229}, {494, 229}, {370, 229}, {0, 115}, {554, 115}, {2794, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 115}, {880, 115}, {988, 115}, {1109, 115}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {659, 458}, {740, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 115}, {880, 115}, {988, 115}, {1109, 115}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {1175, 458}, {1109, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 115}, {880, 115}, {988, 115}, {1109, 115}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {659, 458}, {740, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 115}, {880, 115}, {988, 115}, {1109, 115}, {1480, 229}, {0, 458}, {740, 229}, {0, 229}, {740, 229}, {740, 229}, {0, 916}, {370, 229}, {370, 229}, {330, 115}, {330, 344}, {370, 229}, {330, 229}, {277, 229}, {277, 229}, {330, 115}, {277, 344}, {0, 1374}, {370, 229}, {370, 229}, {330, 229}, {370, 229}, {415, 229}, {440, 458}, {415, 458}, {370, 229}, {415, 115}, {370, 115}, {330, 458}, {0, 687}, {370, 229}, {370, 229}, {330, 115}, {330, 344}, {370, 229}, {330, 229}, {277, 229}, {277, 229}, {330, 115}, {277, 344}, {0, 458}, {330, 229}, {330, 229}, {370, 458}, {330, 229}, {330, 229}, {370, 458}, {370, 115}, {415, 115}, {440, 458}, {494, 458}, {370, 229}, {554, 229}, {554, 229}, {659, 229}, {740, 229}, {740, 458}, {1109, 229}, {988, 573}, {0, 115}, {740, 229}, {0, 229}, {740, 229}, {740, 229}, {1109, 229}, {988, 115}, {880, 115}, {1109, 115}, {1319, 115}, {1480, 687}, {988, 229}, {988, 229}, {932, 229}, {988, 229}, {880, 115}, {740, 344}, {659, 229}, {0, 229}, {659, 229}, {659, 229}, {740, 229}, {740, 229}, {554, 229}, {554, 229}, {659, 229}, {740, 229}, {740, 458}, {1109, 229}, {988, 573}, {0, 115}, {740, 229}, {0, 229}, {740, 229}, {740, 229}, {1109, 229}, {988, 115}, {554, 115}, {880, 115}, {740, 115}, {1480, 687}, {988, 229}, {988, 229}, {932, 229}, {988, 229}, {880, 115}, {740, 115}, {0, 229}, {659, 115}, {659, 344}, {740, 229}, {740, 229}, {659, 229}, {740, 229}, {0, 229}, {740, 229}, {659, 115}, {659, 115}, {740, 229}, {740, 229}, {740, 229}, {1109, 229}, {1109, 229}, {0, 458}, {880, 115}, {880, 115}, {988, 229}, {880, 115}, {988, 344}, {1109, 229}, {740, 229}, {0, 458}, {659, 115}, {659, 115}, {740, 458}, {1109, 458}, {988, 229}, {880, 229}, {740, 229}, {659, 229}, {740, 229}, {0, 115}, {740, 229}, {0, 115}, {880, 115}, {659, 458}, {0, 458}, {0, 115}, {740, 229}, {740, 115}, {740, 115}, {0, 229}, {659, 115}, {659, 115}, {740, 229}, {1109, 458}, {880, 229}, {988, 229}, {880, 115}, {988, 344}, {1109, 229}, {1109, 573}, {0, 115}, {659, 115}, {659, 115}, {740, 229}, {880, 458}, {659, 115}, {659, 115}, {740, 229}, {1109, 458}, {1109, 115}, {988, 115}, {880, 229}, {831, 229}, {740, 229}, {659, 229}, {740, 229}, {0, 916}, {1480, 229}, {1319, 229}, {1109, 229}, {988, 229}, {1109, 229}, {880, 229}, {659, 229}, {370, 115}, {440, 115}, {494, 115}, {554, 115}, {659, 115}, {740, 115}, {880, 115}, {988, 115}, {1109, 115}, {988, 115}, {880, 115}, {740, 115}, {659, 115}, {554, 115}, {494, 115}, {440, 115}, {659, 573}, {0, 115}, {659, 115}, {659, 115}, {659, 229}, {554, 229}, {494, 229}, {440, 229}, {370, 229}, {440, 229}, {1480, 229}, {1319, 229}, {1109, 229}, {988, 229}, {880, 229}, {740, 229}, {880, 115}, {554, 115}, {740, 115}, {554, 115}, {880, 115}, {554, 115}, {740, 115}, {554, 115}, {988, 229}, {0, 115}, {880, 229}, {0, 115}, {740, 115}, {0, 115}, {740, 229}, {740, 229}, {740, 229}, {740, 229}, {740, 229}, {880, 229}, {880, 229}, {880, 229}, {554, 458}, {988, 229}, {1109, 229}, {740, 573}, {0, 115}, {1109, 229}, {988, 229}, {880, 229}, {740, 229}, {659, 229}, {740, 115}, {659, 115}, {880, 115}, {659, 115}, {988, 115}, {659, 115}, {1109, 115}, {659, 115}, {1319, 115}, {1397, 115}, {1109, 115}, {1397, 115}, {1319, 115}, {1397, 115}, {1480, 115}, {1397, 115}, {1480, 229}, {554, 229}, {554, 229}, {659, 229}, {740, 229}, {740, 458}, {1109, 229}, {988, 573}, {0, 115}, {740, 229}, {0, 229}, {740, 229}, {740, 229}, {1109, 229}, {988, 115}, {880, 115}, {1109, 115}, {1319, 115}, {1480, 458}, {740, 115}, {880, 115}, {988, 115}, {740, 115}, {880, 115}, {988, 115}, {1109, 115}, {880, 115}, {988, 115}, {1109, 115}, {1319, 115}, {1109, 115}, {1319, 115}, {1480, 115}, {1760, 115}, {1976, 115}, {2960, 115}, {2637, 115}, {2217, 115}, {1976, 115}, {2637, 115}, {2217, 115}, {1976, 115}, {1760, 115}, {1760, 115}, {1661, 115}, {1480, 115}, {1319, 115}, {1480, 115}, {0, 344}, {740, 229}, {740, 458}, {1109, 229}, {988, 573}, {0, 115}, {740, 229}, {0, 229}, {740, 229}, {740, 229}, {1109, 229}, {988, 115}, {554, 115}, {880, 115}, {740, 115}, {1480, 687}, {988, 229}, {988, 229}, {932, 229}, {988, 229}, {880, 115}, {740, 115}, {0, 229}, {659, 229}, {0, 229}, {740, 229}, {740, 229}, {659, 229}, {740, 229}, {0, 229}, {740, 229}, {659, 115}, {659, 115}, {740, 229}, {740, 229}, {740, 229}, {1109, 229}, {1109, 229}, {0, 458}, {880, 115}, {880, 115}, {988, 229}, {880, 115}, {988, 344}, {1109, 229}, {740, 229}, {0, 458}, {659, 115}, {659, 115}, {740, 458}, {1109, 458}, {988, 229}, {880, 229}, {740, 229}, {659, 229}, {740, 229}, {0, 115}, {740, 229}, {0, 115}, {880, 115}, {659, 458}, {0, 458}, {0, 115}, {740, 229}, {740, 115}, {740, 115}, {0, 229}, {659, 115}, {659, 115}, {740, 229}, {1109, 458}, {880, 229}, {988, 229}, {880, 115}, {988, 344}, {1109, 229}, {1109, 573}, {0, 115}, {659, 115}, {659, 115}, {740, 229}, {880, 458}, {659, 115}, {659, 115}, {740, 229}, {1109, 458}, {1109, 115}, {988, 115}, {880, 229}, {831, 229}, {740, 229}, {659, 229}, {740, 229}, {0, 458}, {659, 229}, {740, 229}, {880, 458}, {659, 229}, {740, 229}, {1319, 458}, {1109, 115}, {988, 115}, {554, 229}, {554, 229}, {659, 229}, {659, 229}, {1480, 458}, {0, 458}, {370, 229}, {0, 229}, {370, 229}, {0, 229}, {370, 229}, {0, 229}, {370, 115}, {440, 115}, {494, 115}, {554, 115}, {370, 229}, {0, 229}, {370, 229}, {0, 229}, {370, 229}, {330, 458}, {370, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 115}, {880, 115}, {988, 115}, {1109, 115}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {1175, 458}, {1109, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 115}, {880, 115}, {988, 115}, {1109, 115}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {659, 458}, {740, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 229}, {0, 229}, {740, 115}, {880, 115}, {988, 115}, {1109, 115}, {1480, 687}, {740, 229}, {0, 229}, {740, 229}, {740, 229}};
int main(void)
{
int console_fd;
int i; // 循环计数器
// 打开控制台,失败则结束程序
if ((console_fd = open("/dev/console", O_WRONLY)) == -1)
{
fprintf(stderr, "Failed to open console. \n");
perror("open");
exit(1);
} // 重复播放
for (i = 0; i <= NOTESCONUT; i++)
{
printf("%d ", k[i][0]);
int magical_fairy_number = k[i][0] == 0 ? 0 : 1193180 / k[i][0];
ioctl(console_fd, KIOCSOUND, magical_fairy_number);
usleep(k[i][1] * 1000);
ioctl(console_fd, KIOCSOUND, 0);
usleep(10000);
}
return EXIT_SUCCESS;
}
Tags:C

$watch使用

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="Vue.js"></script>
</head>
<body>
<div id="app">
<input v-model="title"></input>
<h1>{{title}}</h1>
<button @click="startListen">开始监听</button>
<button @click="stopListen">停止监听</button>
</div>
</body>
</html>
<script>
var app = new Vue({
el: '#app',
data: {
title: 'hello',
isListen: false,
unWatch:null
},
methods: {
startListen() {
this.unWatch = this.$watch('title', (oldVal, newVal) => {
console.log(oldVal, newVal)
});
},
stopListen(){
this.unWatch();
}
}
});
</script>

开发职业乐趣

开发职业的乐趣 -《人月神话》

编程为什么有趣?作为回报。它的从业者期望得到什么样的快乐?
首先,这种快乐是一种创造事物的纯粹快乐。如同小孩在玩泥巴时感受到快乐一样,成年人喜欢创建事物,特别是自己进行设计。我想这种快乐是上帝创造世界的折射,一种呈现在每片独特的,崭新的树叶和雪花上的喜悦。
其次,这种快乐来自于开发对他人有用的东西。内心深处,我们期望我们的劳动成果能够被他人使用,并能对他们有
所帮助。从这一角度而言,这通小孩用黏土为“爸爸的办公室”捏制铅笔盒没有任何本质的区别。
第三,快乐来自于整个过程体现的一股强大的魅力将相互啮合的零部件组装在一起,看到他们以精妙的方式运行着,并收到了预期的效果。比起弹球游戏机或自动点唱机所具有的迷人魅力,程序化的计算机毫不逊色。
第四,这种快乐是持续学习的快乐,它来自于这项工作的非重复特性。人们所面临的问题总有这样那样的不同,因而解决问题的人可以从学习新的事物,有时是实践上的,有时是理论上的,或者兼而有之。
最后,这种快乐还来自于在易于驾驭的介质上工作。开发者,就像诗人一样,几乎仅仅在单纯的思考中工作。开发者凭空的运用自己的想象,来建造自己的“城堡”。很少有创造介质如此灵活,如此易于精炼和重建,如此容易实现概念上的设想(不过我们将会看到,容易驾驭的特性也有它自己的问题)。
然而程序毕竟同诗歌不同,它是实实在在的东西;它可以移动和运行,能独立产生可见的输出;它能打印结果,绘图形,发出声音,移动支架。神话和传说中的魔术在我们的时代已经变成现实。在键盘上键入正确的咒语,屏幕会活动、变幻,显示出前所未有的也不是不可能存在的事物。
编程的快乐在于它不仅满足了我们内向深处进行创造的渴望,而且还唤醒了每个人内心的情感。

常用git命令

triumph

triumph

git命令
1. `git init` [文件名] 初始化 git仓库 ;直接跟文件名可以创建文件并初始化git仓库
2. `git log` 查看 提交日志
> `git log -p` 查看具体变动的内容
> `git log --oneline`
> `git log --all --oneline --graph` 信息多条一行显示 图示全部历史记录
3. `git commit -m` + "描述信息" 提交到暂存区
4. `git status` 查看提交状态
5. `git clone` + "远程仓库地址" "克隆远程仓库"
6. git tag -a 标签名 -m "备注"
7. git checkout -b + "分支名"
8. git remote add + "托管仓库名" "地址"
9. git remote [-v 详细]
10. git push -u "远程仓库名"(默认origin) "分支名"(默认master)
11. git clone "远程仓库名"
12. git pull == git fetch && git merge
13. git branch -D + "分支名" 删除分支(如果是已合并的 -d)
14. git merge + "要合并的分支名"
15. 提交远程仓库文件缺失 git pull --rebase origin master (pull=fetch+merge)
16. 设置git忽略.idea文件
> echo '.idea' >> .gitignore
> git rm --cached -r .idea (删除本地仓库的内容,以解除git 对.idea的追踪)
> git add .gitignore
> git commit -m 'ignore-.idea'
> git push -u origin main

Vue实例生命周期

triumph

triumph

Vue生命周期

Vue实例的生命周期

  • 生命周期:从实例创建、运行到销毁期间,总是伴随着各种各样的事件,这些事件统称为生命周期. vue每个组件都是独立的,每个组件都有一个属于它的生命周期,从一个组件创建、数据初始化、挂载、更新、销毁,
  • 生命周期钩子:就是生命周期事件的别名

主要的生命周期函数:

  • 被创建期间的生命周期函数:
    • beforeCreate():实例在内存中被创建出来,此时,还没有初始化data和methods属性
    • created(): 实例已经在内存中创建完成,此时data和methods已经创建完成,此时还没有开始编译模板
    • beforeMount():此时已经完成了模板的编译,但是还没有挂载到页面中
    • mounted():此时,已经将编译好的模板,挂载到了页面指定的容器中显示
  • 运行期间的生命周期函数
    • beforeUpdate(): 状态更新之前执行次函数,此时data中的状态是最新的,但是界面数据并未更新,因为此时还未重新渲染DOM节点
    • updated():实例更新完成后调用此函数,此时data中的状态值和界面上显示的数据都已经完成了更新。界面也已经被重新渲染完成。
  • 销毁期间的生命周期函数
    • beforeDestroy: 实例销毁之前调用,此时,实例仍然可以可用。
    • destroyed: Vue实例销毁后调用,调用后,Vue实例指示的所有东西都会被解绑,事件监听器被全部移除,所有子实例也一样。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<title>Vue生命周期</title>
</head>
<body>
<div id="app">
<h1 id="h1">{{msg}}</h1>
<button @click="msg='react'" >修改</button>
</div>
</body>
</html>
<script>
/*创建Vue实例,得到viewModel*/
const vm = new Vue({
el: "#app",
data: {
msg: "Vue"
},
methods: {
show() {
console.log('执行了show()');
}
},
beforeCreate() { //实例完全被创建出来之前,会执行它
console.log("实例被创建之前");
// this.show();
// console.log(this.msg);
// 在此阶段,data和methods()均未初始化
},
created() { //实例创建完成调用
console.log("实例被创建");
// console.log(this.msg);
// this.show();
//
},
beforeMount() {//此时,模板已经存在内存中编辑完成了。但是尚未把模板渲染到页面中
console.log("实例被挂载之前");
// const renderText = document.querySelector('h1').innerText;
// console.log(renderText);
//在此时,页面中的元素,还未真正被替换过来,只是之前写的一些模板字符串
},
mounted() {//此时,内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了
console.log("实例挂载完成");
// const renderText = document.querySelector('h1').innerText;
// console.log(renderText);
//此函数是 实例创建期间的最后一个生命周期函数,当执行完后,表明,实例已经被完全创建完成,如果无更新内容一直在内存中
},
beforeUpdate() {//此时页面还没被更新,数据已经更新
console.log("更新data");
// const renderPageText = document.querySelector('h1').innerText;
// console.log('页面内容:' + renderPageText);
// console.log('data中的数据' + this.msg);
},
updated() {
console.log("同步data和页面数据");
// const renderPageText = document.querySelector('h1').innerText;
// console.log('页面内容:' + renderPageText);
// console.log('data中的数据' + this.msg);
//此时页面和data数据已经保持同步啦
},
beforeDestroy() {
//console.log("执行销毁实例之前");
// const renderPageText = document.querySelector('h1').innerText;
// console.log('页面内容:' + renderPageText);
// console.log('data中的数据' + this.msg);
},
destroyed() {
//console.log("实例已经销毁");
},
});
</script>

此段来自

  • 常用的生命周期方法:create()/mounted():常用于发送Ajax请求启动定时器等异步任务,beforeDestory():常用于做一些收尾工作,例如关闭定时器;
<body>
<div id="app">
<button @click= "destroyVm">点击我取消Vue实例</button>
<p v-show = "isShow">我是四川码酱</p>
</div>
<script src="js/vue.js" type="text/javascript"></script>
<script type="text/javascript">
new Vue({
el: "#app",
data: {
isShow: true
},
beforeCreate() {
console.log("我是beforeCreate方法,我被执行了");
},
created() {
console.log("我是created方法,我被执行了");
},
beforeMount() {
console.log("我是beforeMount方法,我被执行了");
},
mounted(){ // 初始化显示之后立即调用,也是执行一次
this.intervalId = setInterval(() =>{
console.log("=====");
this.isShow = !this.isShow;
}, 1000)
},
beforeUpdate() {
console.log("我是beforeUpdate方法,我被执行了");
},
updated() {
console.log("我是updated方法,我被执行了");
},
beforeDestroy() { // 死亡之前回调一次
console.log("我是beforeDestroy方法,我要被销毁了");
// 清除定时器
clearInterval(this.intervalId)
},
destroyed() {
console.log("我是destroyed方法,我被执行了");
},
methods: {
destroyVm(){
this.$destroy();
}
}
})
</script>
</body>

Vue生命周期

关于Vue更多

history对象

triumph

triumph

Bom对象

history对象

1.更改URL

方法说明
assign()载入一个新文档
reload()绕过缓存载入当前的文档
replace()替换当前文档
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>location对象</title>
</head>
<body>
<input type="button" value="载入新文档" onclick="newPage()"></input>
<input type="button" value="刷新页面" onclick="refreshPage()"></input>
<input type="button" value="替换当前内容" onclick="replacePage()"></input>
<div id="time"></div>
</body>
</html>
<script>
/* 获取并显示当前载入时间*/
const obDate = new Date(),
nowDate = obDate.getDate();
const nowTime = obDate.toLocaleTimeString();
document.getElementById('time').innerHTML = nowTime;
/**
* 载入新文档
*/
function newPage() {
window.location.assign("http://127.0.0.1:5500/index.htm");
}
/**
* 绕过缓存刷新页面
*/
function freshPage() {
location.reload(true); //“(forcedReload: boolean): void”已被弃用ts(6385)
/*Location.reload() 该方法只有一个参数,当变化true时,将强制浏览器从服务器加载页面资源,当变为或未false传参时,浏览器则可能从缓存中读取页面。
该方法在跨域调用(执行该方法的脚本文件的域和Location对象位于页面的跨不同)时,将会引发 DOMException异常。*/
}
/**
* 替换当前页内容
*/
function replacePage() {
location.replace("https://router.vuejs.org/guide/essentials/dynamic-matching.html#reacting-to-params-changes");
}
</script>

2.获取url参数

location属性名 的方式,即可获取当前用户访问url的指定部分。 通过location属性名 = 值 的方式可以改变当前加载的页面。

属性说明
hash返回一个url锚部分
host返回一个url的主机名和端口
hostname返回url的主机名
href返回完整的url
pathname返回url路径名
prot返回url服务器使用的端口号
protocol返回一个url协议

location对象

triumph

triumph

Bom对象

location对象方法

1.更改URL

方法说明
assign()载入一个新文档
reload()绕过缓存载入当前的文档
replace()替换当前文档
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>location对象</title>
</head>
<body>
<input type="button" value="载入新文档" onclick="newPage()"></input>
<input type="button" value="刷新页面" onclick="refreshPage()"></input>
<input type="button" value="替换当前内容" onclick="replacePage()"></input>
<div id="time"></div>
</body>
</html>
<script>
/* 获取并显示当前载入时间*/
const obDate = new Date(),
nowDate = obDate.getDate();
const nowTime = obDate.toLocaleTimeString();
document.getElementById('time').innerHTML = nowTime;
/**
* 载入新文档
*/
function newPage() {
window.location.assign("http://127.0.0.1:5500/index.htm");
}
/**
* 绕过缓存刷新页面
*/
function freshPage() {
location.reload(true); //“(forcedReload: boolean): void”已被弃用ts(6385)
/*Location.reload() 该方法只有一个参数,当变化true时,将强制浏览器从服务器加载页面资源,当变为或未false传参时,浏览器则可能从缓存中读取页面。
该方法在跨域调用(执行该方法的脚本文件的域和Location对象位于页面的跨不同)时,将会引发 DOMException异常。*/
}
/**
* 替换当前页内容
*/
function replacePage() {
location.replace("https://router.vuejs.org/guide/essentials/dynamic-matching.html#reacting-to-params-changes");
}
</script>

2.获取url参数

location属性名 的方式,即可获取当前用户访问url的指定部分。 通过location属性名 = 值 的方式可以改变当前加载的页面。

属性说明
hash返回一个url锚部分
host返回一个url的主机名和端口
hostname返回url的主机名
href返回完整的url
pathname返回url路径名
prot返回url服务器使用的端口号
protocol返回一个url协议