安卓APP源码和设计报告——个人通讯录

news2024/11/18 21:50:12

摘 要

随着移动设备制造技术和移动通信网络的迅猛发展,全球手机用户日益增加,手机成为了很多人日常生活中必不可少的一部分,手机业在日益发展的同时,人们对手机的功能需求和体验需求也越来越高,因此各种智能手机相继而出,当前市场上最流行的智能手机的操作系统非Android莫属。Android是一种以Linux为基础的开源代码操作系统,主要应用于手机,因为其良好的人机交互能力和能够安装使用众多功能各异的应用软件而深受人们喜爱,本文就介绍其基于Android 3.2.1版本开发的一个“个人通讯录”。根据当下人们的使用习惯和实际需求,本文对通讯录提出了新的构想和设计,并在这样的基础上,构建实现了该通讯录。在实现通讯录基本功能浏览、添加、修改、标记、发短信、打电话、发邮件等的基础上.

【关键词】 Android 手机 通讯录

  1. 系统概述

  2. 需求分析

    1. 基本功能需求

      1. 能熟练进行手机应用程序app的设计和代码编写能力;

      2. 熟练掌握进行Android开发环境和参数配置的能力;
        3.熟练掌握独立编写手机界面程序的能力;
        4. 掌握基于XUtils进行网络开发的能力;
        5. 掌握用Android Studio进行程序的编写、运行和打包发布的能力;

    1. 系统用例分析
      图1-1显示了通话记录功能模块。包括了联系人详细信息查看,增加在选择一个条目后,可以对其进行拨打电话,发送短信功能的操作,也可以进行删除。

      手机用户
      图1-1 通话记录模块用例图

      图13为个人中心模块中设置个人详细信息子模块的用例。该模块的功能就是用户查看自己的个人基本信息。
      手机用户

      图1-3 设置个人信息模块用例图
       

  1. 总体设计方案

    1. 系统模块关系与划分
      一个好的系统设计的步骤决定了程序是否能按照设计者的目的按时完成,是否能在规定的时间内按照设计者的要求高质量的完成程序必要的功能。并且按照标准的设计步骤对程序进行调试,测试,以及后期的优化完善,使程序更加具有健壮性和可用性。通过对通讯录功能、系统模块、用户需求方面进行全方位的分析制定开发流程。
      采用标准的开发流程确定系统具有用户管理功能,联系人增删改功能,通讯功能,查找功能,备份等功能。

    2. Android开发组件

Android开发分为四大组件,分别是:活动(Activity):用于表现功能。服务(Service):用于后台运行服务,不提供界面呈现。广播接收器(BroadcastReceiver ):用于接收广播。内容提供商(Content Provider):支持在多个应用中存储和读取数据,相当于数据库。

  1. Activity组件

Android中,Activity是所有程序的根本,所有程序的流程都是运行在Activity中,Activity是Android当中最基本的模块之一。在Android的程序当中,Activity代表手机屏幕的一屏。如果把手机当作浏览器,那么Activity相当于一个网页。在Activity当中可以添加一些Button、Check box等控件。可以看到Activity概念和网页的概念相当类。

一般一个Android应用由多个Activity组成的。这多个Activity之间可以进行互相跳转,和网页跳转稍微不一样,Activity之间的跳转有可能返回值,例如,从Activity A 跳转到Activity B,那么当Activity B 运行结束的时候,有可能会给Activity A 一个返回值。这样做在很多时候是相当方便的。

当打开一个新的屏幕时,原来的屏幕会成为暂停,并且进入历史堆栈中。用户可以选择性的移除一些没有必要的屏幕,因为Android会把每个应用的开始到当前的每个屏幕保存在堆栈中。 Activity在运行是会受到一些突然事件的影响,例如:你正在使用一个Activity ,突然来电话了,这时你的应用就要具备处理这些突然事件的能力,这就需要用Activity 生命周期。

② Service组件

Service是Android系统中的一种组件,它不能自己运行,只能在后台运行,并且可以和其他组件进行交互。Service是一种程序,它可以运行很长时间,但是它却没有用户界面。例如:打开一个音乐播放器的程序,这个时候若想上网,就打开Android浏览器,这个时候虽然已经进入了浏览器这个程序,但是,歌曲播放并没有停止,而是在后台继续一首接着一首的播放。本系统客户端扩展功能就是采用Service来进行设计和开发的。

③Broadcast Receiver组件

在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的机制。BroadcastReceiver是对发出来的Broadcast进行过滤接受并响应的组件。这个组件除了接受和响应广播通知之外,什么都不做。很多广播由系统代码产生,比如时区变化,电磁量变低,拍摄照片,或是用户改变语言首选项,都会产生广播。应用程序本身也可以启动一个广播,比如,让其他应用程序知道,某些数据已经完成下载,可以被这些应用程序使用了。

注册BroadcastReceiver有两种方式。方式一:在AndroidManifest.xml进行注册。这种方法有一个特点是即使应用程序已经关闭了,但这个BroadcastReceiver依然会接受广播出来的对象。方式二:在代码中注册广播,第一种俗称静态注册,第二种俗称动态注册。动态注册比静态注册较灵活。静态注册一个BroadcastReceiver时,无论应用程序是否启动。都可以接受对应的广播。动态注册的时候,如果不执行unregister Receiver();方法被取消。但如果执行这个方法,就不能接受广播。

④ Content Provider组件

Content Provider是Android提供的第三方应用数据的访问方案。

在Android中,对数据的保护是很严的,除了放在SD卡中的数据,一个应用的数据库、文件等内容,都不允许直接访问。Content Provider屏蔽了内部数据的存储细节,向外提供了上述统一的接口模型,这样的抽象层次,大大简化了上层应用的书写,也对数据的整合提供了更方便的途径。在各大组件中,Service和Content Provider都是那种需要持续访问的。Service如果是一个耗时的场景,往往会提供异步访问的接口,而Content Provider不论效率如何,都提供的是约定的同步访问接口。使用Content Provider能够灵活的替换底层使用的存储设备,不用考虑底层存储设备的细节,从而使应用系统具有良好的数据。

  1. 系统详细设计

2.1通讯录需求分析

根据手机功能调查显示,近十成消费者都会使用手机通讯录功能,随着手机通讯录功能的不断加强与完善,手机通讯录的意义,已不仅仅像电话薄一样显示电话号码,而是向着个性化、人性化的方向发展。通讯录从无到有,从英文到中文,经历了十几年的发展历程,今后的发展趋势就是从通讯录发展为名片夹,也就是在一个联系人之下有手机号码、固话号码、公司、住址、邮箱、备注等内容。手机通讯录扮演着与用户直接交互并且提供服务的重要角色,它需要提供良好的用户体验,方便用户操作,接收用户的操作并把这些操作转换成相应的命令,采用用户活动的方式完成各个服务的逻辑流程。其功能主要包括增加、删除、编辑联系人,查找联系人,通讯功能

2.1.1增加、删除、编辑联系人

点击通信录界面中的增加按钮,进入增加联系人界面。输入联系人的基本信息,并可根据用户需求增加个性化信息如头像、姓名、手机号码、办公室电话、家庭电话、职务职称、单位名称、地址、邮政编码、Email、其他联系方式、备注这些信息,单击确认返回主界面。点击通信录中一个已存在的联系人,进入联系人编辑界面,可修改联系人的资料或进行删除联系人操作,完成后退回到主界面。对列表中联系人的标记,点击menu键弹出功能界面上的删除按键也可进行删除。还可以在菜单上选择删除全部联系人来清空通讯录。在删除联系人的过程中,系统将提示用户是否继续操作,若放弃操作,则联系人信息将继续保存。

2.1.2通讯功能

用户在通讯录选择联系人进入联系人详细信息界面,选择打电话、发信息还是发邮件的功能进行操作。

2.2数据库设计

2.2.1Android数据库概述

Android自带了SQLite数据库,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。

关于Sqlite的数据类型,你会惊讶:Typelessness(无类型). 对! SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么. 对于SQLite来说对字段不指定类型是完全有效的。

SQLite有五个特点,分别是独立性、非服务式、零配置、元处理、开放性。

独立性:sqlite使用标准C语言实现,它只需要很少的系统支持,这使得它很容易移植进嵌入式设备,因此,它能够应用于更广泛的软件环境。Sqlite使用一个虚拟文件系统完成和磁盘的交互,在不同的系统中完成这个交互层是很简单的。

非服务式:极大多数的数据库都是以服务的方式实现,这要求客户必须通过某种中间接口来连接数据库。然而slqite可以直接访问数据库,不需要任何中间接口来完成。

零配置:因为sqlite不需要中间接口,所以我们不需要安装其他配置。

元处理:sqlite的数据库操作具有原子性、孤立性,程序或系统崩溃不会引发数据错误。

开放性:任何人可以自由获得和使用sqlite的源码。

因为sqlite有这么多的优点,已经有非常多的网站和软件开始使用sqlite数据库,大大方便了开发人员进行开发。已知的有:Goolge、QQ、Iphone、Mac电脑等。

2.2.2数据库表详细设计

对系统所需功能需求分析通过了设计确定了系统数据库中表的设计,该系统有一张表电话薄表,下面为表的详细设计。

表user:

字段名类型是否可为空是否为主键描述
NameString用户名
sexString电子邮箱
Phoneint联系电话
QQStringQQ号码
companyString公司
jobString工作

2.3系统界面设计

2.3.1界面布局

Android的资源文件保存在/res的子目录中。其中/res/drawable/目录中保存的是图像文件,/res/values目录中保存的是用来自定义字符串和颜色的文件,/res/xml目录中保存的是XML格式的数据文件。所有在程序开发阶段可以被调用的资源都保存在这些目录中,在对界面进行绘制时要考虑到不同手机屏幕大小可能不一样,应尽量兼容大多数手机屏幕尺寸,使之显示无障碍。

登录界面代码

//登录界面

public class LoginActivity extends Activity {

private EditText et_id, et_name;

private Button btn_regist, btn_login_user,btn_login_manager;

//SQLite的声明

SQLiteOpenHelper helper;

//密码

private String _pword;

//用户名

private String _name;

//控件初始

public void initView(){

et_id = findViewById(R.id.editText1);

et_name = findViewById(R.id.editText2);

btn_regist = findViewById(R.id.button1);

btn_login_user = findViewById(R.id.button2);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

//初始化

initView();

//数据库的创建,及调用

helper = new Sqliteopenhelper(this);

//获取可读数据

helper.getWritableDatabase();

//注册用户监听事件

btn_regist.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//跳转到注册界面

Intent intent = new Intent(LoginActivity.this, registerActivity.class);

//启动

startActivity(intent);

}

});

//普通用户登陆按钮监听事件

btn_login_user.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

_name = et_id.getText().toString();

_pword = et_name.getText().toString();

//判断账号和密码是否都为空

if (_name.equals("") || _pword.equals("")) {

Toast.makeText(getApplicationContext(), "请输入用户账号密码!", Toast.LENGTH_SHORT).show();

} else {

//方法:数据库的操作,查询

sureuser();

}

}

});

}

private void sureuser() {

//数据库的操作,查询

SQLiteDatabase sdb = helper.getReadableDatabase();

try {

String sql = "select * from user where name=? and pword=?";

// 实现遍历id和name

Cursor cursor = sdb.rawQuery(sql, new String[] { _name, _pword });

//判断数据是否大于0

if (cursor.getCount() > 0) {

BaseApplication.getInstance().setName(_name);

BaseApplication.getInstance().setPassword(_pword);

//跳转到通讯录界面

Intent intent = new Intent(LoginActivity.this, MailListActivity.class);

//获取数据

Bundle bundle = new Bundle();

bundle.putString("name", _name);

intent.putExtras(bundle);

//启动

startActivity(intent);

} else {

Toast.makeText(getApplicationContext(), "用户登录失败,账号密码错误或者选择正确的登录类型!",

Toast.LENGTH_SHORT).show();

}

//游标关闭

cursor.close();

//数据关闭

sdb.close();

} catch (SQLiteException e) {

Toast.makeText(getApplicationContext(), "亲,请注册!", Toast.LENGTH_SHORT).show();

}

}

}

注册界面代码

//注册界面

public class registerActivity extends Activity {

//文本编辑:id,用户名

private EditText etid,etname;

//按钮:取消,确定

private Button btn_qu,btn_sure;

//声明数据库

SQLiteOpenHelper helper;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_register);

//创建Sqliteopenhelper对象

helper=new Sqliteopenhelper(this);

//获取可写数据

helper.getWritableDatabase();

etid=findViewById(R.id.etid);

etname=findViewById(R.id.etname);

btn_qu=findViewById(R.id.btn_qu);

btn_sure=findViewById(R.id.btn_sure);

//确定按钮监听事件

btn_sure.setOnClickListener(new sureListener());

//取消按钮监听事件

btn_qu.setOnClickListener(new quListener());

}

//确定按钮监听事件

class sureListener implements OnClickListener {

@Override

public void onClick(View v) {

try{

//创建数据库对象进行获取可写数据

SQLiteDatabase sdb=helper.getWritableDatabase();

//创建内容键值对对象

ContentValues values=new ContentValues();

values.put("name",etid.getText().toString());

values.put("pword",etname.getText().toString());

//插入值

sdb.insert("user",null, values);

Toast.makeText(getApplicationContext(), "注册成功", Toast.LENGTH_SHORT).show();

//跳转到登录界面

Intent intent=new Intent(registerActivity.this,LoginActivity.class);

//创建Bundle对象

Bundle bundle=new Bundle();

//放置字符串文本

bundle.putString("name",etname.getText().toString());

intent.putExtras(bundle);

//启动

startActivity(intent);

//结束

finish();

}

catch(SQLiteException e)

{

Toast.makeText(getApplicationContext(), "注册失败", Toast.LENGTH_SHORT).show();}

}

}

//取消按钮监听事件

class quListener implements OnClickListener {

@Override

public void onClick(View v) {

//结束

finish();

}

}

}

首页代码

public class MailListActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

private TabLayout mTabLayout;

private Fragment[] mFragmensts;

private DrawerLayout mDrawerLayout;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

NavigationView navigationView = findViewById(R.id.nav_view);

navigationView.setNavigationItemSelectedListener(this);

//DataGenerator控制fragment的分页

mFragmensts = DataGenerator.getFragments("TabLayout Tab");

initView();

}

@Override

public boolean onNavigationItemSelected(@NonNull MenuItem item) {

if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {

mDrawerLayout.closeDrawer(GravityCompat.START);

}

int id = item.getItemId();

switch (id) {

case R.id.nav_info:

startActivity(new Intent(this, MoreActivity.class));

break;

case R.id.nav_exit:

startActivity(new Intent(this, LoginActivity.class));

finish();

break;

}

return true;

}

private void initView() {

//分页功能是通过tablayout和fragment实现的

mTabLayout = (TabLayout) findViewById(R.id.bottom_tab_layout);

mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

@Override

public void onTabSelected(TabLayout.Tab tab) {

onTabItemSelected(tab.getPosition());

// Tab 选中之后,改变各个Tab的状态

for (int i = 0; i < mTabLayout.getTabCount(); i++) {

View view = mTabLayout.getTabAt(i).getCustomView();

ImageView icon = view.findViewById(R.id.tab_content_image);

TextView text = view.findViewById(R.id.tab_content_text);

if (i == tab.getPosition()) { // 选中状态

icon.setImageResource(DataGenerator.mTabResPressed[i]);

text.setTextColor(getResources().getColor(android.R.color.black));

} else {// 未选中状态

icon.setImageResource(DataGenerator.mTabRes[i]);

text.setTextColor(getResources().getColor(android.R.color.darker_gray));

}

}

}

@Override

public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

public void onTabReselected(TabLayout.Tab tab) {

}

});

// 提供自定义的布局添加Tab

for (int i = 0; i < 2; i++) {

mTabLayout.addTab(mTabLayout.newTab().setCustomView(DataGenerator.getTabView(this, i)));

}

}

private void onTabItemSelected(int position) {

Fragment fragment = null;

switch (position) {

case 0:

fragment = mFragmensts[0];

break;

case 1:

fragment = mFragmensts[1];

break;

}

if (fragment != null) {

//切换分页

getSupportFragmentManager().beginTransaction().replace(R.id.home_container, fragment).addToBackStack(null).commit();

}

}

}

网络请求代码

/**

* 更多工具界面

*/

public class MoreActivity extends AppCompatActivity {

private EditText edtNum;

private TextView tvAdress;

private Button btnQuery;

private RecyclerView rv_data;

private PhoneModel resultModel;

private List<InfoModel> goodsModels = new ArrayList<>();

MyAdapter mAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_photo_num);

x.Ext.init(getApplication());

x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.

init();

//recyclerview初始化

rv_data = findViewById(R.id.rv_data);

mAdapter = new MyAdapter(goodsModels);

rv_data.setLayoutManager(new LinearLayoutManager(this));

rv_data.setAdapter(mAdapter);

}

//控制初始化

private void init() {

edtNum = findViewById(R.id.edt_num);

btnQuery = findViewById(R.id.btn_query);

tvAdress = findViewById(R.id.tv_adress);

rv_data = findViewById(R.id.rv_data);

//点击查询按钮

btnQuery.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

String num = edtNum.getText().toString();

if (!TextUtils.isEmpty(num)) {

getData(num);

} else {

Toast.makeText(MoreActivity.this, "请输入号码", Toast.LENGTH_SHORT).show();

}

}

});

}

//请求聚合数据api 获取电话号码信息

private void getData(final String num) {

RequestParams params = new RequestParams("apis.juhe.cn/mobile/get?"+num +"&key=2b83ed20642560618b61847b0cd526e5");

// params.setSslSocketFactory(...); // 如果需要自定义SSL

params.addQueryStringParameter("wd", "xUtils");

x.http().get(params, new Callback.CommonCallback<String>() {

@Override

public void onSuccess(String result) {

resultModel = new Gson().fromJson(result, PhoneModel.class);

runOnUiThread(new Runnable() {

@Override

public void run() {

String info = num + " "+ resultModel.getResult().getProvince() + " " + resultModel.getResult().getCity();

tvAdress.setText(info);

//更新列表数据

goodsModels.add(new InfoModel(num,resultModel.getResult().getProvince(),resultModel.getResult().getCity()));

mAdapter.notifyDataSetChanged();

}

});

}

@Override

public void onError(Throwable ex, boolean isOnCallback) {

Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();

}

@Override

public void onCancelled(org.xutils.common.Callback.CancelledException cex) {

Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();

}

@Override

public void onFinished() {

}

});

}

}

数据相关代码

//新建类Sqliteopenhelper 继承于SQLiteOpenHelper

public class Sqliteopenhelper extends SQLiteOpenHelper {

//数据库名:

private static final String DBNAME="test.db";

//用户表名

private static final String TABLENAME = "user";

//版本号:具体我也不知道是什么,照着写就行了

private static final int TESTVERSION = 1;

public Sqliteopenhelper(Context context) {

super(context, DBNAME, null, TESTVERSION);

}

//初始化,创建表

@Override

public void onCreate(SQLiteDatabase db) {

String sql1="create table" + " " + TABLENAME + "(_id varchar,name text,pword text)";

db.execSQL(sql1);

}

//失败后删除,重新创建

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

if(newVersion>oldVersion)

{

String sql1=" drop table"+" " + TABLENAME;

db.execSQL(sql1);

this.onCreate(db);

}

}

}

4.3测试总结

通过对本系统进行的多次的测试,系统正确实现了对联系人增加、修改、备份、发信息、打电话、等操作,实现了用户对通讯录的基本要求。在测试过程中对程序细节上出现的漏洞进行修补,系统运行的稳定性基本达到要求,运行结果比较良好。在整个工程的构思方面还存在着不足,这些问题还需要今后逐一解决。与此同时,这个软件还可以进一步扩展,带给用户更好的体验与生活的便捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ--重试机制

原文网址&#xff1a;RabbitMQ--重试机制_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍RabbitMQ的重试机制。 问题描述 消费者默认是自动提交&#xff0c;如果消费时出现了RuntimException&#xff0c;会导致消息直接重新入队&#xff0c;再次投递&#xff08;进入队首&am…

【iOS】—— MVVM模式

MVVM模式 文章目录MVVM模式为什么使用MVVM&#xff1f;MVVM分别代表什么含义&#xff1f;MVVM通信关系MVVM模式的优缺点优点:缺点:概括总结MVVM文件分类为什么使用MVVM&#xff1f; iOS中&#xff0c;我们使用的大部分都是MVC架构。虽然MVC的层次明确&#xff0c;但是由于功能日…

C# 11新特性之file关键字

C#11 添加了文件作用域类型功能&#xff1a;一个新的 file 修饰符&#xff0c;可以应用于任何类型定义以限制其只能在当前文件中使用。这样&#xff0c;我们可以在一个项目中拥有多个同名的类。 目录示例file不可以与其他修饰符一起使用file可以修饰的类型file 不可修饰的类型f…

主流报表开发工具FastReport.Net全新发布,邀您体验最新版试用

FastReport .Net是一款适用于 WinForms、Blazor Server、ASP.NET、MVC、.NET 6 和 .NET Core 的报告生成工具。FastReport代表着“速度”、“可靠”和“品质”&#xff0c;是当今主流的报表开发工具。 该产品在本月进行了重大版本v2023的发布&#xff0c;接下来让我们一起看看…

【OpenCV-Python】教程:4-9 特征匹配 match

OpenCV Python 特征匹配 【目标】 特征匹配Brute-Force Matcher 和 FLANN Matcher 【理论】 Brute-Force Matcher字面意思是蛮力匹配器&#xff0c;所以它的过程也很简单&#xff0c;从一个集合里取出一个特征描述子&#xff0c;然后与第二个集合里的特征逐个的进行匹配比较…

传统MES架构的智能化改进---python在Aprol上的实践

一、开题依据 MES是属于生产车间级的管理信息系统。作为生产与计划之间的信息“集线器”&#xff0c;MES 主要包括以下功能模块&#xff1a;工序详细调度、资源分配和状态管理、生产单元分配、过程管理、人力资源管理、维护管理、质量管理、文档控制、产品跟踪和产品清单管理、…

Solidworks导出为URDF用于MoveIT总结(带prismatic)

环境 Solidwoks2018 SP0 / Solidwoks2021 SP5&#xff1b;Ubuntu20.04&#xff1b;ROS1 Noetic; Solidwoks2018 SP0对于平移副有问题&#xff0c;显示不出来&#xff0c;Solidwoks2021 SP5没有问题。 官网有段话&#xff1a; There is a known STL export bug with SolidWork…

Jdk Tomcat 安装教程 — 2022.12.11

文章目录一、安装jdk教程二、tomcat 安装三、修改Tomcat端口号安装Tomcat之前要确保安装jdk一、安装jdk教程 安装vim命令包&#xff0c;此操作如果执行不了&#xff0c;需要使用root权限执行 执行如下命令&#xff1a; yum install -y vim-enhanced2. 下载jdk安装包&#xff…

3D打印切片软件Cura入门

安装好之后&#xff0c;添加一台打印机&#xff0c;参数可以随便设置。 Cura安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1T1MBcZYBCVfhtFKDBjypmQ?pwd2022 提取码&#xff1a;2022 基本操作 按住鼠标右键不放&#xff1a;旋转 按住滚轮不放&#xff1…

制作USB启动盘(U盘安装ubuntu20.04)

文章目录制作USB启动盘&#xff08;U盘安装ubuntu20.04&#xff09;制作USB启动盘的工具ubuntu20.04系统安装u盘制作进入bios制作USB启动盘&#xff08;U盘安装ubuntu20.04&#xff09; 制作USB启动盘的工具 制作USB启动盘的工具有rufus&#xff0c;UNetbootin&#xff0c;Un…

汇编语言—第1章 各类存储芯片及内存空间

1、各类存储器芯片 一台PC机中&#xff0c;装有多个存储类芯片&#xff0c;这些存储器芯片从物理连接上来看是独立的、不同的器件。 &#xff08;1&#xff09;随机存储器 用于存放供CPU使用的绝大部分程序和数据 &#xff08;2&#xff09;装有BIOS&#xff08;Basic Input/Ou…

AI遮天传 DL-反馈神经网络RNN

本文会先介绍动态系统的概念&#xff0c;然后介绍两种简单的反馈神经网络&#xff0c;然后再介绍两种门控神经网络(LSTM, GRU)&#xff0c;最后是关于反馈神经网络的应用(本次以语音识别为例)。 RNN: Recurrent neural network&#xff0c;一般叫它“反馈神经网络”或者“循环神…

1565_AURIX_TC275_开关电源模式相关寄存器

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个寄存器可以设置开关电源的开关频率&#xff0c;之前在文档中看到过这个默认的数值是1.5M的频率&#xff0c;现在看来应该是这个1.56M的一个近似了。准确的数值不是1.5M而是1.56M。 1. …

任务四:标准化组织概览

标准化组织概览一、标准化组织1、ITU电信标准化部门无线电通信部门电信发展部门2、3GPP3、3GPP24、CCSA二、TDD-LTE与FDD-LTE系统的对比三、LTE技术特点及基本指标1、LTE主要技术特点2、峰值数据速率3、控制面延迟4、用户面延迟5、用户吞吐量6、频谱效率7、移动性8、覆盖9、频谱…

同事跳槽拿下阿里 P6Offer,程序员:会点基础还真不行

前阵子&#xff0c;同事程序员 H 偷偷的向阿里菜鸟投递了自己的简历... 不久后程序员 H 就收到了阿里菜鸟的面试通知&#xff0c;经历 5 轮面试&#xff0c;一举成功拿下 offer 并定级 P6。 小天趁着未来的阿里大佬还在身边&#xff0c;向程序员 H 讨教了一下面试阿里菜鸟的经…

法则三:架构师如何在一定时间内最大化自己的增量价值

法则三&#xff1a;架构师如何在一定时间内最大化自己的增量价值 作为一个架构师&#xff0c;必须要创造足够的商业价值&#xff0c;才能保障自己职业的长期。 那么你作为架构师&#xff0c;该如何为你的公司、部门或团队提供可量化的增量价值呢&#xff1f; 主要有扩大收入与…

2022.12.11 学习周报

文章目录摘要文献阅读1.题目2.摘要3.传统RNN存在的问题4.RNN与IndRNN的对比4.1 隐含层状态更新公式4.2 结构示意图4.3 IndRNN的优势5.IndRNN的分析5.1 RNN5.2 LSTM5.3 IndRNN的初始化5.4 梯度截断5.5 IndRNN6.实验结果6.1 Adding Problem6.2 Sequential MNIST Classification6.…

Spring 体系常用项目

如今做Java尤其是web几乎是避免不了和Spring打交道了&#xff0c;但是Spring是这样的大而全&#xff0c;新鲜名词不断产生&#xff0c;学起来给人一种凌乱的感觉&#xff0c;我就在这里总结一下&#xff0c;理顺头绪。 Spring Spring 概述 Spring 是一个开源框架&#xff0c…

R语言学习笔记——基础篇:第六章-基本图形

R语言 R语言学习笔记——入门篇&#xff1a;第六章-基本图形 文章目录R语言一、条形图1.1、垂直与水平条形图补——数据为因子时绘制垂直与水平条形图1.2、堆砌条形图与分组条形图1.3、数据整合条形图1.4、条形图的微调1.5、棘状图二、饼图三、直方图四、核密度图4.1、简易核密…

CSS基础-装饰,基线,光标类型,边框圆角(胶囊),文字溢出,元素隐藏,边框合并,css画三角形...

CSS基础-装饰 目录CSS基础-装饰1.1 认识基线(了解)1.2 文字对齐问1.3 垂直对齐方式(拓展)项目中 vertical-align 可以解决的问题2.1 光标类型3.1 边框圆角3.2 边框圆角的常见应用4.1 溢出部分显示效果5.1 元素本身隐藏(拓展)元素整体透明度(拓展)边框合并(拓展)用CSS画三角形技…