diff --git a/Android/教程/Androidstudio使用技巧学习.txt b/Android/教程/Androidstudio使用技巧学习.txt new file mode 100644 index 00000000..61f2e573 --- /dev/null +++ b/Android/教程/Androidstudio使用技巧学习.txt @@ -0,0 +1,64 @@ +Android studioгʹü + +1. ༭ +۵ء +alt+ ߴ +windowп޸restore layout + +2. +projectܹѡͬģʽ +structure鿴xml.javaļṹ +favoritesղصļСϵ +TODOߣע +Commanderߴ + +3.˵ʵִ󲿷ֹ +4. ܹʵֻı༭еԣͨView|Toolbar˵ѡع +5. λǰλá +6. ״̬ͶˣҪϢȥλãзָıʽļʱʶʱť +7. ò +ctrl+a,ctrl+w,ctrl+z,ctrl+shift+z +ctrl+e鿴ļ +ctrl+alt+ͷ +ctrl+һĸʵcutcopypasteչճֵ·ֵƫá + +8.IJ˵ +9. ȡ +10.ʹü̵ +alt+f1 selectin +ctrl+n class +ctrl+shift+n find file +ctrl+g find line +ctrl+alt+home related file +ctrl+shift+backspace last edit location +ctrl+h type hierarchy +ctrl+b declaration +11.Һ滻ı +ctrl+f +ctrl+shift+f +ctrl+r +ctrl+shift+r + + +Androidstudioнб +1. helperܹfind actionAndroidstudioеĽԽв +ctrl++۵ +ctrl+-չ +ctrl+shift++۵д +ctrl+shift+-վд +ctrl+۵չ +2. ִд벹ȫ +ͷѡenterʹ +3. ע +ctrl+/javaע +ctrl+shift+/javaʷ +4.ʹôɹ +5.붯̬ģ +6.ƶ +7.ƴﶼЩ޹ؽҪϸ֦ĩڣĶ + +´ع +оҲӦÿö +ⱾôǸõģһ£ֱӹ黹ˡ + +ɶgitѧϰʱҪһˡ⣬һ˵еҵһ㹻ʱȥѧϰʹЩ¶ɡ diff --git a/Android/教程/Android问题详解.md b/Android/教程/Android问题详解.md new file mode 100644 index 00000000..ad9585ea --- /dev/null +++ b/Android/教程/Android问题详解.md @@ -0,0 +1,63 @@ +# Android的HelloWorld级别的问题解决 + +-------------- + +## >附加知识补充 + +---- + +> 1. sdk manager管理Android开发环境和系统镜像的文件夹 +2. avd manager管理Android虚拟设备的工具,我们自己创建的avd设备存放在.android的目录下面。 +3. android device monitorAndroid的状态监视工具和控制台命令窗口 +4. android debug bridge(adb)Android的调试工具 + +---- + +>使用eclipse创建Android程序比Androidstudio困难n倍,毕竟自己小白,不懂一些原理,所以导致helloworld小程序的各种难产。 + +## > Android创建过程中的版本问题 + +* 首先在高版本的Android sdk中提供了对低版本Android sdk的支持,这种支持不是直接兼容低版本的东西,而是通过支持库包来时线即Android Support Library package来保证高版本的sdk的向下兼容性,也就是说让低版本的sdk能够运行高版本的功能。其中: + V4 Support Library支持API4及更高版本的Android sdk + V7-----------------------7----------------------- + V9-----------------------9----------------------- + V13----------------------13---------------------- + V17----------------------17---------------------- +* 在libs的文件夹目录下会产生低版本兼容库,Android-support-v4或者v7等,这与你在创建工程时选择的最低兼容sdk版本有关。另外,如果选择的编译版本较高时,会产生一个单独的兼容文件夹,并且会报错(此错误网上有解决方法,经测试,没几个可行的) + + +## >关于style.xml/AppTheme相关的问题 + +------ + +解决这个问题主要有三种方法,参考: +http://www.jianshu.com/p/6ad7864e005e +(给的原理说明十分清晰) + +1. 将所有values下的styles.xml都改为同样的最基础版本的theme,即baseTheme里的基本主题 +2. 如果想使用最新的主题效果,可以可以将AndroidManifest.xml里的minSdkVersion改成14(及已经包含此主题的sdk) +3. 如果想兼容更低版本并且支持新主题,需要导入支持库,即Android-support-v7-appcompat库,下载完成后通过导入工程的方式,将这个库导入到相应的文件当中。在libs目录下回有兼容库包。(具体方法参考原网站) + +## >Android使用过程中图标的导入问题 + +------ + +android:icon="@drawable/bear"变量的值经常出错,在制定文件夹下面并没有对应的图标需要插入自己导入的图标然后修改这个变量的值。 + + +## >关于Android启动模拟器失败的解决方法 + +-------- + +> Dx unsupported class file version 52.0 + +* 首先创建虚拟设备,对应相应的sdk,然后运行虚拟设备,继续讲程序launch到虚拟设备当中,其间出现这样的错误,在其他网站上已经有比较详细的说明: + 这个问题主要的原因是依赖包的编译版本比主程序的编译版本高,导致主程序无法正常编译或运行,解决这个问题无非两招: + 1. 提升主程序的编译器版本,用最新的编译器编译主程序,这样就可以兼容那个依赖包 + 2. 降低依赖包的编译版本。 + +具体方法参考: +http://blog.csdn.net/feijitouhaha/article/details/52141274 + + + diff --git a/Android/教程/New Document.md b/Android/教程/New Document.md new file mode 100644 index 00000000..de263028 --- /dev/null +++ b/Android/教程/New Document.md @@ -0,0 +1,21 @@ +# android总体知识总结(一) + +---- + +## Activity宏观的介绍 + +----- + +* Activity是一个应用程序窗口,本身不提供用户界面元素,只提供UI组件摆放和依附的容器,视图(View)在layout.xml中定义,Activity.setContentView()方法,将Activity于View建立关联。 +* 布局管理器--导演 +* Activity--舞台 +* View(UI控件)--演员 +* 生命周期的每个阶段都有自己的回调函数 + * onCreate + * onStart + * onResume + * onRestrart + * onPause + * onStop + * onDestroy +* \ No newline at end of file diff --git a/Android/教程/android学习目录.md b/Android/教程/android学习目录.md new file mode 100644 index 00000000..5be0391b --- /dev/null +++ b/Android/教程/android学习目录.md @@ -0,0 +1,40 @@ +# android的学习目录和索引 + +## 第一章 + + +## 第二章 + + +## 第三章 + + +## 第四章 + + +## 第五章 + + +## 第六章 + + + +## 第七章 + + +## 第八章 + + +## 第九章 + + + +## 第十章 + + + +## 第十一章 + + + +##第十三章 \ No newline at end of file diff --git a/Android/教程/第10章Service和BroadcastReceiver.md b/Android/教程/第10章Service和BroadcastReceiver.md new file mode 100644 index 00000000..f3b432e2 --- /dev/null +++ b/Android/教程/第10章Service和BroadcastReceiver.md @@ -0,0 +1,16 @@ +# Service + + + + + + + + + + + +## 与service相关的方法和类总结 + +* Service + * IBinder onBinder(intent intent)通过该对象IBinder与service进行通信 \ No newline at end of file diff --git a/Android/教程/第13章 android网络应用.md b/Android/教程/第13章 android网络应用.md new file mode 100644 index 00000000..1a6b5d1e --- /dev/null +++ b/Android/教程/第13章 android网络应用.md @@ -0,0 +1 @@ +asf \ No newline at end of file diff --git a/Android/教程/第1章基础知识讲解.md b/Android/教程/第1章基础知识讲解.md new file mode 100644 index 00000000..9a41cc80 --- /dev/null +++ b/Android/教程/第1章基础知识讲解.md @@ -0,0 +1,46 @@ +# 第一章基础知识讲解 + +----- + +## >Android系统简介 + +----- + +* **android 分层** + 1. 应用程序层 + 2. 应用程序框架层 + 3. 系统运行库 + 4. linux核心层。 +* **设计规则** + 1. 每个程序都运行在了自己的进程空间中,需要时启动,不需要时终止。 + 2. 每个程序都有自己的运行库ART,各应用程序之间的代码是相互隔离的。 + 3. 每个程序被分配唯一的ID,任何应用程序的代码与其他应用程序的代码是相互隔离的。 + +* **Android应用程序的四大组件** + 1. activity活动,用于与用户进行交互的可视化界面,凡是在应用程序中看到的东西都是放在activity中。每一个activity子类集成父类Activity。 + 2. Service服务,无需可视化界面,需要在后台长期运行的应用程序,背景音乐播放器,和后台数据处理任务等,继承自父类Service。 + 3. Broadcast Receiver广播接收器,接受和处理广播消息的组件。没有影虎界面,在相应其接收到的信息时可以启动一个activity,继承自父类BroadcastReceiver。 + 4. Content Provider内容提供者,可以将指定的一组数据让其他程序使用。数据可能存储在文件系统或者SQLlife中。继承自父类ContentProvider。 + 5. 补充Intent,负责对应一次操作中的动作、动作涉及的数据、附加数据进行描述。Android根据此描述找到对应的组件,将intent传递给调用的组件。 + +* **Android应用程序框架层** + 1. 使用java语言编写。 + 2. 使用java native interface调用core lib层的本地方法 + 3. 实现了一系列服务:活动管理器,窗口管理器、内容提供器、视图系统、通告管理器、包管理器、电话管理器、资源管理器、位置管理器、xmpp服务。 + +* **系统运行库** + 1. 系统C库: 从BSD集成的标准C系统函数库 + 2. 媒体库:基于OpenMax库,支持多种音频视频图像文件 + 3. Serface Manager:显示子系统管理,提供了2D&3D图层的无缝融合 + 4. LibWebCore:最新的web浏览器引擎。 + 5. SGL:底层的2D图形引擎 + 6. 3Dlibraries:基于OpenGL3D软件加速 + 7. FreeType:文图和矢量图字体显示 + 8. SQLLite:数据库引擎。 + 9. Dalvik:虚拟机,在程序执行时,编译成dex的字节码后交给dalvik虚拟机执行 + 10. ART:虚拟机,Dalvik的替代品。在应用成许安装时,吧程序代码转换成及其语言,避让程序成为真正的本地应用。 + - 采用了AOT预编译技术。函数调用去虚拟化,调用接口和虚函数时,需要寻找真正的函数,浪费大量的时间。去虚拟化后可以迅速调用。消除异常检查。 + - 更高效的垃圾回收机制GC。GC调用有三种情况:GC_EXPLICIT(应用程序通过system.gc主动调用)GC_FOR_ALLOC(内存分配不足时) GC_CONCURRENT(给java层分配内存后,计算一份陪的大小达到阈值时,对象大小超过384KB)GC_MALLOC(内存分配失败)GC_EXTERANL_ALLOC(外部内存分配失败) + +* **Linux内核** + 安全性、内存管理、进程管理、网络协议栈、驱动模型。 \ No newline at end of file diff --git a/Android/教程/第1章基础知识详解工程介绍.md b/Android/教程/第1章基础知识详解工程介绍.md new file mode 100644 index 00000000..f322a728 --- /dev/null +++ b/Android/教程/第1章基础知识详解工程介绍.md @@ -0,0 +1,41 @@ +# android的helloworld + +--------- + +## >androidStudio的开发步骤 + +----- + +1. 创建android项目和文件结构 +2. 在XML布局文件中定义应用程序的用户界面 +3. 在.java文件中编写业务的实现。 + +> android 的文件结构中只有三个有用:.java实现应用程序的业务,res中的.xml实现工程的视图的资源文件,manifest.xml实现相关资源的协调配置。 + +> 4大组件:activity,service,broadcastreceiver,contentProvider,intent(不同组件之间通讯的载体) + +## >android studio 中的文件结构 +* src文件夹,保存java文件 +* res文件夹,保存资源文件和xml文件 +* bin文件夹,存放生成的目标文件 +* gen文件夹,自动生成的R.java文件 + +## >相关文件的理解 + +----- + +* R.java是一个资源统筹文件,每个资源对应一个内部类的int值和field,相当于为为每个其他的资源文件添加了一个变量,或者说,定义了一个相对于软件的全局变量。在.java文件中相当于添加了一个字段:public static final int app_name = 00123031;在xml文件中的引用方法:@string/app_name;另外标识符不需要R资源文件的定义就可以直接使用:@+id/ok +* value/string.xml,定义了全局的字符串常量。 +* androidManifest.xml全局描述文件。统筹了很多东西。通过标签声明需要的权限,声明被调用用的权限。 + +## >antivity中包含的方法的总结 + +----- + +getWindow()获得当前窗口的对话框 +setContentView()设置当前activity的主要视图xml文件 +setTheme()设置xml文件显示的主题风格 +签名防止同名的包中的程序被覆盖。 + + + diff --git a/Android/教程/第2章界面编程Dialog.md b/Android/教程/第2章界面编程Dialog.md new file mode 100644 index 00000000..3884cec5 --- /dev/null +++ b/Android/教程/第2章界面编程Dialog.md @@ -0,0 +1,16 @@ +## 第二章界面编程Dialog + +----- + +# >对话框 + +----- + +* AlertDialog + 1. 组成:包括图标区、标题区、内容区、按钮区 + 2. 使用步骤:定义对象->设定标题->设定图标->设定对话框的内容->设置按钮->创建对象 + 3. 相关方法:setTitle();setCustomTitle();setIcon();setPositiveButton();setNegativeButton;setNeutralButton();setMessage();setItems();setSingelChoiceItems();setAdapter();setView() + +> 遇到的问题: +> android:theme="@android:style/Theme.Material.Dialog.Alert在manifest.xml中修改视图的主题失败,导致软件不能启动 +> View root = this.getLayoutInflater().inflate(R.layout.popup,null);这句话的具体意图没有搞明白,似乎是把某个视图声明为子视图。 \ No newline at end of file diff --git a/Android/教程/第2章界面编程View组件.md b/Android/教程/第2章界面编程View组件.md new file mode 100644 index 00000000..edf2dcc6 --- /dev/null +++ b/Android/教程/第2章界面编程View组件.md @@ -0,0 +1,15 @@ +# 第二章界面编程view组件的应用 + +---- + +# >view组件 + +---- + +> 对于属性和相关方法的理解,其中每一个空间都是一个对象,每个对象都有指定的属性和方法。在xml可以定义一个对象,并通过xml的语法格式对创建的对象的属性进行初始化;同样也可以在java中使用public方法对相关的对象进行属性的设置。 +> 另外,可以在xml使用对象的布局,也可以通过java对布局进行设定。 + +* 属性和相关方法 + + +> 事实证明刚才犯了一个及其傻逼的错误,在对android极其不了解的情况下,认为同一个页面可以使用多个布局,极其傻逼,浪费了自己大量时间,不过也让自己静下心来,认真的读了一点点代码。 \ No newline at end of file diff --git a/Android/教程/第3章事件监听机制.md b/Android/教程/第3章事件监听机制.md new file mode 100644 index 00000000..97e7af73 --- /dev/null +++ b/Android/教程/第3章事件监听机制.md @@ -0,0 +1,119 @@ +# Android第三章 + +---- + +## >事件处理的概述 +---- + +* 两种事件处理机制 + 1. 基于监听的事件处理 + 2. 基于回调的事件处理 + +## >基于监听的事件处理机制 + +---- + +* 涉及到的三类对象 + 1. Event Source事件源,指各个组件。 + 2. Event 界面组件上发生的特定的事情,。 + 3. Event Listener监听事件源发生的事情。并对各种事情作出相应的响应。 + 4. Event Handler事件处理器,当事件监听器捕获事件后,由响应的事件处理器识别特定的事件,并做出响应的动作。 + +* 事件监听机制的工作流程 + 普通组件(事件源对象) 发生很多事件,生成多种事件对象 被同一个监听器对象捕获 监听器通过不同的事件处理器处理这个事件。 + > 每个组件可以根据不同的事件类别指定多个监听器,每一个监听器可以监听多个事件源。 + +## >实现事件监听器的方法 +---- +1. 内部类作为时间的监听器 + 使用内部类作为事件监听器能够在这个类内复用该监听器。该监听器类能够自由访问外部类的所有界面组件 +2. 外部类作为时间监听器 + 事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。外部类形式的时间监听器不能够自由访问GUI界面的类中的组件。同时也适用于监听器于GUI界面没有任何耦合情况。 + > 监听器还是主要来写显示逻辑,具体的业务逻辑放到外部的其他函数或者类中进行处理。 +3. Activity类本身作为事件监听器 + 不推荐,activity类本身用来界面初始化工作,包含事件监听器容易造成程序的逻辑结构混乱。 +4. 匿名类作为时间监听器类 + 大部分时候事件监听器类的代码没有什么复用价值,所以只要使用匿名类来实现事件监听器想要达到的页面逻辑就好。 +> android可以直接在界面布局中制定标签绑定事件的处理方式。 +> android:onClick="clickHandler" + +## >基于回调的事件处理方法 + +---- + +* 回调机制 + 事件的处理直接绑定到与组件相关的时间处理函数上,而非通过监听器的监听和事件处理器的匹配处理。有点像事件监听器和事件源融合在一起,不需要单独的时间监听器类,事件源本身能够监听自身发生的各种事件。 +* 基于回调的事件传播 + 当返回为true时,表明该方法已经能够处理发生的事件,事件不会向外传播给外层的时间监听器。当返回为false时,如果有外围的监听器处理同一个事件,则事件会向外传播,同时被其他监听器坚挺到。如果存在各种监听器,其监听顺序为:绑定的事件监听器-->基于回调的内部事件监听器-->基于回调的外部事件监听器。 + +## >相应系统设置的事件 + +---- + +* 用来获取系统的配置 + ```Configuration cfg = getResources().getConfiguration(); + ``` +* onConfigurationChanged能够监听相关的配置改变的事件。 + +## >Handler消息传递机制 + +--- + +* 工作原理 + android第一次启动,主线程负责activityUI界面的线程,而且只允许UI线程对主界面进行修改,其他新启动的线程无法对主界面进行直接修改,需要使用Handler进行消息传递。 +* Handler简介 + 1. 在新启动的线程中发送消息 + 2. 在主线程中获取和处理消息 + >好像是原来的事件处理机制变成了消息处理机制,通过监听消息,处理消息完成一系列动作,同事件处理一样。 +* Handler涉及的方法 + 1. HandlerMessage() + 2. hasMessage() + 3. hasMessages() + 4. obtainMessage() + 5. sendEmptyMessage() + 6. sendEmptyMessageDelayed() + 7. sendMessage() + 8. sendMessageDelayed() + +* Handler、Loop、MessageQueue的工作原理 + 1. Message是Handler接受和处理的对象 + 2. Looper每个线程只能有一个Looper,loop方法负责读取MessageQueue中的消息 + 3. MessageQueen消息队列,采用了先进先出的方式管理队列。 + +``` +private Looper() +{ + mQueue = new MessageQueue(); + mRun = true; + mThread = Thread.currentThread(); +} +``` + +* Looper类的使用方法 + 1. 调用Looper的prepare方法,创建Looper对象,生成对应的MessageQueue来管理事件 + 2. 创建Handler子类,用于发送本线程的消息。重写HandlerMessage方法,负责处理来自其他线程的消息。 + 3. 调用Looper的loop方法启动Looper类 +>UI线程一般专门用来相应用户的界面操作,而其他的逻辑运算和处理都交给其他线程处理主要目的是防止UI线程被阻塞而让用户以为界面卡顿。 +>此时如果UI线程与其他线程的交互方式,就是Handler消息传递机制,同事件监听机制的逻辑十分相似。 + +## >异步任务 + +---- + +* 解决新线程不能更新UI主界面的问题的方法 + * 使用Handler消息处理机制 + * Activity.runOnUiThread(Runnable) + * View.post(Runnable) + * View.postDelayed(Runnable,long) + * 异步处理机制 + +* AsyncTask异步类 + 1. 创建AsyncTask的子类,并制定三个参数的类型。 + 2. 根据需要实现下列方法 + * dolnBackground()后台线程即将执行的任务,通过调用publishProgress()更新任务的执行进度 + * onProgressUpdate()调用更新任务进度的方法后,会触发这个方法 + * onPreExecute()方法,执行后台操作前被调用,完成初始化工作 + * onPostExcute()后台任务执行完成后,调用这个方法 + 3. 调用AsyncTask子类的execute方法开始执行好事任务。 + + diff --git a/Android/教程/第4章Activity和Fragment(2).md b/Android/教程/第4章Activity和Fragment(2).md new file mode 100644 index 00000000..c6a35fb9 --- /dev/null +++ b/Android/教程/第4章Activity和Fragment(2).md @@ -0,0 +1,102 @@ +4# 第四章Activity和Fragment(2) + +---- + +## >Activity的回调机制 +---- + +* **回调机制的解释** + 通用程序框架在完成整个应用个通用功能和流程时,在特定点上需要相应的业务逻辑实现。(java swing中的init()方法,java Thread中的run()方法,都是一种回调机制) +* **回调机制的存在形式** + 1. 以接口的形式存在 + 2. 以抽象方法的形式存在,通过oncreate、onActivityResult()函数能够直接创建一个Activity,例如当有一个Activity被调用时(生成相应的实例时)就会通过onCreate方法创建一个Activity。 + +## >Activity的生命周期 + +----- +* 四个状态 + 1. 运行状态:当前Activity位于前台,用户可见,可以获得焦点。 + 2. 暂停状态:其他Activity位于前台,该activity依然可见,但不能获得焦点 + 3. 停止状态:该activity不可见失去焦点 + 4. 销毁状态:activity结束。 +* 生命周期示例图 + ![Activity的生命周期](http://img.my.csdn.net/uploads/201109/1/0_1314838777He6C.gif) + +* Activity的四种加载模式 + 1. standard:标准模式 + 每次启动Activityandroid都会启动一个新的实例,并通过Activity添加到当前的task栈顶,就相当于同一个类会有多个对象同时在运行。 + 2. sigleTop:Task栈顶单例模式 + 与standard模式基本相同,但是当要启动的类本身就位于栈顶事,那么将不会重新创建Activity实例,而是复用之前的Activity。 + 3. sigleTask:Task内单例模式 + 在同一个task中只允许有一种实例。不存在创建,存在移动到栈顶显示。 + 4. sigleInstace:全局单利模式 + 无论从哪个任务中启动Activity都会只创建一个单一的实例。 + +> android 采用task栈对Activity进行管理,先启动的放在 task栈底,后启动的Activity被放在了task栈顶。 + +## >Fragment详解 + +----- + +* **Fragment的简介** + Fragment代表了Activity的子模块,因此可以吧Fragment理解成Activity片段。Fragment拥有自己的生命周期,能够接受自己的输入事件。 + * Fragment总作为Activity的界面组成部分。Fragment可调用getActivity()方法返回Activity,Activity可以使用FragmentManager来管理相应的Fragment + * Fragment的add(),remove(),replace()方法可以动态地添加、删除或者替换Fragment。 + * 一个Activity可以痛死组合多个Fragment;一个Fragment 也可以被多个Activity复用。 + * Fragment可以响应自己的输入输出事件,有自己的生命周期。但是收到Activity的控制。 + >Fragment主要是为了简化大屏手机的UI的设计。 + +* **创建Fragment** + onCreate()系统创建Fragment回调的方法 + onCreateView()当Fragment绘制界面时回调这个方法 + onPause()用户离开Fragment后回调的方法 + +## >Fragment与Activity通信 +---- + +* 在布局文件中使用元素添加Fragment + ``` + + ``` +* 在java代码中通过FragmentManager对象实现。getFragmentManager()返回FragmentManager,beginTransaction()启动返回FragmentTransaction对象。 + +## >Fragment管理与Fragment事物 + +---- + +* FragmentManager可以完成的功能 + * FragmentManager.findFragmentById()/...ByTag()获取指定的Fragment + * popBackStack()将Fragment从后台栈中弹出 + * 调用addOnBackStackChangeListener()注册监听器 + * add() + * remove() + * commit() + * replace() + +## >Fragment 的生命周期 + +---- + +* 四种不同的状态 + * 运行状态,fragment位于前台获取焦点 + * 暂停状态,activity位于前台Fragment可见 + * 停止状态,Fragment不可见失去焦点 + * 销毁状态,fragment被删除。 + +* 生命周期的控制函数。 + > 以下的函数都是回调函数,在不同的时间被触发调用 + * onAttach()当Fragment被添加到Activity中时 + * onCreate()创建Fragment时 + * onActivityCreated()当所在Fragment所在的Activity被启动时 + * onCreateView()每次创建绘制该Fragment的View组件时 + * onStart()启动Fragment时 + * onResume()恢复Fragment时 + * onPause()暂停Fragment时 + * onStop()停止Fragment时 + * onDestroyView()销毁Fragment包含的组件时 + * onDestroy()销毁Fragment时 + * onDetach()将该Fragment从Activity中删除时 \ No newline at end of file diff --git a/Android/教程/第4章Activity和Fragment.md b/Android/教程/第4章Activity和Fragment.md new file mode 100644 index 00000000..7244380c --- /dev/null +++ b/Android/教程/第4章Activity和Fragment.md @@ -0,0 +1,210 @@ +# 第四章Activity与Fragment的应用 + +---- + + +## >建立配置和使用Activity + +---- + +* activity能够提供许多不同的操作页面,它们做成Activity栈,当前活动的应用位于栈顶。 +* **LauncherActivity&&ArrayAdapter** + 每一个列表项对应一个intent,用于保存启动不同的activity的相关信息。 + intentForPostion()提供了位置和不同activity对应的信息,将列表项链接到制定的intent。 + +* **ExpandableListActivity&&ExpandableListAdapter** + 设置界面显示过程中,使用了适配器的相关函数,其中复写的函数能够自动调用生成相应的界面。 + * getChild()获得子字表的内容 + * getChildID()获得子表的id + * getChildrenCount()获得子表的项目数量 + * TextView()获得每个子表的textView配置 + * getChildView()获得每个子表的textView内容 + * getGroup()获得主表 + * getGroupCount()获得主表的数量 + * getGroupId()获得主表的id + * getGroupView()决定主表的外观 + * isChildSelectable()返回被选中的子表像 + * hasStableIds()返回id + 当在ExpandableListActivity中定义Adapter时,这些函数必须都被复写,保证能够生成一个新的列表,就相当于XML对应的配置属性一样,这样才能完整的显示整个表格。 + +* **PreferenceActivity&&PreferenceFragment** + 1. 实现了参数设置界面,让Fragment集成了PreferenceFragment + 2. 在onCreate中调用addPreferencFromResource()方法,加载制定的界面布局文件。 + +* **在manifest.xml中配置多个Activity资源** + 2. 配置多个Activity: + ``` + + + + + + + + ``` + +## >启动和关闭Activity +---- + +* **启动activity的两种方法** + * context.startActivity(intent) + * context.startActivity(intent,int) + +* **关闭Activity的两种方法** + * context.finish() + * context.finishActivity(int) +* **代码示例** + ``` + Intent intent = new Intent(MainActivity.this,SecondActivity.class); + startActivity(intent); + ``` + +## >使用Bundle向指定的activity传递数据 + +---- + +* **intent携带额外数据的方法** + * putExtras(Bundle) + * getExtras() + * putExtra() + * getXxxExtra() + * putXXX(String,XXX) + * putSeriaLizable(String,Srializagle) + * getXXX(String) + * getSerializable(String,Serializable) + +* **使用bundle和intent机制向指定的activity传递数据的方法** + * 定义方法,向介质添加批数据并且将介质传递给目标activity + ``` + Person p = new Person(name.getText(),toString(),passwd.getText().toString(),gender); + Bundle data = new Bundle(); + data.putSerializable("person),p); + Intent intent = new Intent(MainActivity.this,ResultActivity.class); + intent.putExtras(data); + startActivity(intent); + ``` + * 使用方法,从传递过来的intent中提取数据 + ``` + Intent intent = getIntent(); + Person p = (Person) intent.getSerializableExtra("person"); + ``` +## >启动Activity并且获取返回结果 +* 当前的Activity启动另一个Activity获取它的结果并且返回到当前的Activity。 +* **实现方法** + 重写onActivityResult(int requestCode,int resultCode,intent intent)方法(相当于一种回调方法)当被启动的Activity生命周期结束并且返回结果时,该方法将会被触发。 +* **实现过程** + 1. 用特殊函数启动另外的activity + ``` + Intent intent = new Intent(MainActivity.this,ResultActivity.class); + intent.putExtras(data); + startActivityForResult(intent,0); + ``` + 2. 当activity结束时,触发onActivity函数,需要重写它。 + 3. 在另外的activity中仍旧需要bundle和intent进行配合传递数据 + + + + + + + + +>对类的补充: + +### Intent类(交互介质) +* **Intent类作用** +每个应用程序都有若干个Activity组成,每一个Activity都是一个应用程序与用户进行交互的窗口,呈现不同的交互界面。因为每一个Acticity的任务不一样,所以经常互在各个Activity之间进行跳转,在Android中这个动作是靠Intent来完成的。你通过startActivity()方法发送一个Intent给系统,系统会根据这个Intent帮助你找到对应的Activity,即使这个Activity在其他的应用中,也可以用这种方法启动它。 +* **Intent的定义:** +Intent是Android系统用来抽象描述要执行的一个操作,也可以在不同组件之间进行沟通和消息传递。 +Intent意图可以是明确的指定组件的名称,这样你可以精确的启动某个系统组件,比如启动一个Activity。它也可以是模糊的,没有指定组件名称,只要是能够匹配到这个Intent的应用都可以接收到,比如发送一个拍照Intent,所有的拍照应用都会响应。 +* **Intent有以下几个属性:** +动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。 + + +###Bundle类(批数据,是一个键值对) + +* **Bundle类的作用** + Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。我们经常使用Bundle在Activity之间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必须实现Serializable 或Parcelable接口。下面分别介绍Activity之间如何传递基本类型、传递对象。 +* **Bundle的定义和使用** + * 新建一个bundle类 + view plain copy + Bundle mBundle = new Bundle(); + * bundle类中加入数据(key -value的形式,另一个activity里面取数据的时候,就要用到key,找出对应的value) + view plain copy + mBundle.putString("Data", "data from TestBundle"); + * 新建一个intent对象,并将该bundle加入这个intent对象 + view plain copy + Intent intent = new Intent(); + intent.setClass(TestBundle.this, Target.class); + intent.putExtras(mBundle); + * Bundle提供了各种常用类型的putxxx()/getxxx()方法,用于读写基本类型的数据。 + +## Context类的(主体上下文) + +---- + +* **Context类的定义** + Interface to global information about an application environment. This is an abstract class whose implementationis provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc +* **Context使用场景** + 1. 它描述的是一个应用程序环境的信息,即上下文。 + 2. 该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。 + 3. 通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息 +* **Context类图集成关系** + ![context类图继承关系](http://hi.csdn.net/attachment/201203/1/0_1330607569Vj4c.gif) +* **Context相关的方法** + * getSystemService(String)获得系统级服务 + * startActivity(Intent)启动一个Activity + * startService(Intent)启动一个service + * getSharedPreferences(String, int) +* **Context什自己的理解** + Context类相当于一个上下文环境,能够很好的统筹一个Activity、service或者app的资源和调度方式,他是负责指挥这些资源的类的接口,他能启动关闭一个app等。 + +### Serializable类 + +---- +> 序列化的内容补充 +> 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 把Java对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为Java对象的过程称为对象的反序列化。 + +* **Serializable接口的定义** + 为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。 +* **使用情况** + * 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候; + * 当你想用套接字在网络上传送对象的时候; + * 当你想通过RMI传输对象的时候; + +* **Parcelable和Serializable的区别** + 内存间数据传输时推荐使用Parcelable,activity间传输数据使用Parcelable,是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC) + 保存到本地或者网络传输时推荐使用Serializable + +### Parcelable类 +* **Parcelable类的作用** + 想要在两个activity之间传递对象,那么这个对象必须序列化,Android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒。但是android中还有一种特有的序列化方法,那就是实现Parcelable接口,使用这种方式来序列化的效率要高于实现Serializable接口。不过Serializable接口实在是太方便了,因此在某些情况下实现这个接口还是非常不错的选择。 +* **Parcelable类的使用情况** + * 永久性保存对象,保存对象的字节序列到本地文件中; + * 通过序列化对象在网络中传递对象; + * 通过序列化在进程间传递对象。 +* **Parcelable接口定义** + ``` + public interface Parcelable + { + //内容描述接口,基本不用管 + public int describeContents(); + //写入接口函数,打包 + public void writeToParcel(Parcel dest, int flags); + //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入 + //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例 + public interface Creator + { + public T createFromParcel(Parcel source); + public T[] newArray(int size); + } + } + ``` +* **实现序列化的步骤** + 1. implements Parcelable + 2. 重写writeToParcel方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从 Parcel容器获取数据 + 3. 重写describeContents方法,内容接口描述,默认返回0就可以 + 4. 实例化静态内部对象CREATOR实现接口Parcelable.Creator \ No newline at end of file diff --git a/Android/教程/第5章intent属性及配置.md b/Android/教程/第5章intent属性及配置.md new file mode 100644 index 00000000..d03fd50e --- /dev/null +++ b/Android/教程/第5章intent属性及配置.md @@ -0,0 +1,119 @@ +# android第五章Intent和IntentFilter的进行通信 + +----- + +## >intent对象的描述 + +---- + +* intent的理解 + intent用来表示自己的意图:需要启动哪个Activity。两个Activity可以吧需要交换的数据封装成Bundle对象,然后使用Intent来携带Bundle对象,这样就实现了两个Activity对象之间的数据交换 + +* 组件的启动方法 + 1. Activity + * startActivity(intent) + * startActivity(intent,int) + 2. Service + * StartService(Intent) + * bindService(inten,seviceConnection,int) + 3. BroadcastReceiver + * sendBroadcast(intent) + * sendBroadcast(intetn,String) + * sendOrderedBroadcast(intent,String,BraodcastReceiver,Handler,int,String,Bundle) + * sendOrderedBroadcast(intet,String) + * sendStickyBroadcast(intent) + * sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,String,Bundle) +* 包含的属性 + Component,Action,Category,Data,Type,Extra,Flag + +## >intent的属性及intent-filter配置 + +---- + +* Component属性 + * intent设定component属性的方法: + setClass(Context packageContext,Class cls) + setClassName(Context packageContext,String className) + setClassName(String packageName,String className) + 分别通过应用环境接口Context类,component类和字符串的方式实现了指定启动对象的方法 + * 启动Activity的中组件的具体方法: + > MainActivity.this表示自身,在内部使用外部类的时候这样表示。 + ``` + ComponentName comp = new ComponentName(MainActivity.this,secondActivity.class) + Intent intent = new Intent(); + intent.setComponent(comp) + startActivity(intent) + ``` +* Action属性的配置 + 是一个字符串,制定Intent要去完成的一个抽象的动作。Action的值可能是intent.ACTION_VIEW,具体查看什么取决于 + 可以通过setAction方法这只Action属性 +``` +Intent intetn = new Intent(); +intetn.setAction(MainActivity.CRAZYIT_ACTION); +startActivity(intent) +``` + + +* Category属性的配置 + 可以通过add + 是一个字符串,为Action增加额外的附加信息。可以指定多个Category要求 + +* intent-filter的配置,这是被启动的Activity的配置文件,配置的事目标activity的intent属性,这个是activity的唯一标识。 +> 开始有点理解这些东西了,可能就是一个用来交互的实体类,对于每一个对象的唯一身份标识,只需要创建一个这个实体,就能通过相同的方式启动类,并且通过Bundle传递相应的参数。 + +``` + + + + +``` +* 指定Action、Category调用系统的Activity + 1. ACTION_MAIN + 2. ACTION_VIEW + 3. ACTON_ATTACH_DATA + 4. ACTION_ATTACH_DATA + 5. ACTION_EDIT。。。。。。。 + 6. CATAGORY_DEFAULT + 7. CATEGORY_BROWSABLE + 8. CATEGORY_TAB + +* 在intent-filter中,设置用户访问手机的权限 + +设置按钮,系统返回桌面 + +* Data,type属性的配置 + 向action提供操作的数据,data属性可以接受一个URI对象(scheme:/host:port/path) + content://com.android.contacts/contacts/1 + tel:123 + Type属性用来指定Data所对应的URI的MIME类型。 +> Toast.makeText(this.intent.toString(),Toast.LENGTH_LONG).show()相当于弹窗程序,可以用来检测数据的值。 + + --在androidManifest.xml中实现data和type属性的配置方法 + + +其中data元素匹配启动的方式是不完全匹配,只要已经显示定义的值相同就能启动相应的activity。其中如果帮同事这只了Action和Data属性,则能够同时通过两者启动Activity。 +当启动了多个Activity时,系统会显示打开这个请求的应用选择界面。也就是说,平时会看到的选择某个应用打开这个文档,就是通过这种方式实现的,通过指定Data和Type属性来定位不同的应用。 + +> 通过Action和data属性的组合应用,可以达到和系统交互信息的功能,就是简单的调用系统固有的组件,启动系统中本身存在的Activity + +* Extra属性 + 用来在多个Action之间进行数据交互,Extra是一个Bundle对象,类似于C++中的map类 + +* Flag属性 + 为intent添加一些额外的控制标志,通过addFlags()方法实现。 + * FLAG_ACTIVITY_BROUGHT_TO_FRONT不会被杀死的Activity启动。 + * FLAG_ACTIVITY_CLEAR_TOP弑父线程 + * FLAG_ACTIVITY_NEW_TASK创建一个新的Ativity + * FLAG_ACTIVITY_NO_ANIMATION不使用过度动画 + * FLAG_ACTIVITY_NO_HISTORY将被启动线程弹出工作栈 + * FLAG_ACTIVITY_REORDER_TO_FRONT带到前台 + * FLAG_ACTIVITY_SINGLE_TOP只会启动一个这样的activity + + + diff --git a/Android/教程/第6章android应用资源.md b/Android/教程/第6章android应用资源.md new file mode 100644 index 00000000..f9af5d02 --- /dev/null +++ b/Android/教程/第6章android应用资源.md @@ -0,0 +1,185 @@ +# android应用资源(一) + +----- + +## >应用资源概述 + +---- + +* 访问方式分类 + 1. 无法通过R资源清单类访问的原生资源,保存在assets目录下 + 2. 可通过R资源清单访问的资源,保存在res目录下 +* 源代码按照物理存储形式分类 + 1. 界面布局文件 + 2. java资源文件 + 3. 资源文件(android应用资源) + +* 资源的类型和存储方式 + 1. /res/animator/ 定义属性动画 + 2. /res/anim/ 定义补间动画 + 3. /res/color/ 定义颜色列表 + 4. /res/draWble/ 存放各种位图 + 5. /res/layout/ 存放布局界面 + 6. /res/menu/ 存放菜单资源 + 7. /res/raw/ 存放原生资源(音乐视频) + 8. /res/value/ 存放简单值,字符串值、整型值、颜色值、数组等 + 9. /res/xml/ 原生的XML内容 + +* 使用资源 + 1. 在java文件中访问,Pacage_name.R.resource_type.resource_name; + > 在这里使用的是资源清单,而不是实际资源,所储存到的东西不过是指向资源的一个整型数组。 + 2. getResources().getText(R.String.main_title)通过引用返回实际资源,用来建立资源副本 + Drawable logo = res.getDrawavle(R.drawable.logo); + 3. 在XML文件中访问,@pacage_name:resource_type/resource_name + +## >字符串、颜色、尺寸资源 +* 颜色值的定义#ARGB都是十六进制书。 +`这是一个字符串` +`#FOO` +`8dp` +` true ` +* 字符串颜色尺寸资源的使用 +``` + + +``` +* 在java代码中访问如下 +``` +R.color.c1 +R.string.c1 +R.dimen.cell_width +R.bool.bool_name + +``` +## >数组资源 + +---- + +* 定义普通数组 +``` + + @color/c1 + @color/c2 + +``` + +* 定义字符串数组 +``` + + @string/c1 + @string/c2 + +``` + +* 定义整型数组 + + +## >使用Drawable资源 + +---- + +* 使用方式 +``` +@package_name:drawable/file_name +package_name.R.drawable.file_name +``` + +* StateListDrawable资源 + 能够根据目标组件的状态切换不同的分辨率图片。 + 支持的属性 + android:stata_active + android:state_checkable + android:state_cheked + android:state_enable + android:state_first + android:state_focused + android:state_last... ... + +* 具体使用说明 + 1. 在res\drawnable\my_image.xml中建立如下内容。本质上是在原来直接显示图片的基础上,进行一次封装,是的显示的图片具有动态变化的效果。 +``` + + + +``` + +## >使用LayerDrawable资源 + +---- + +* 能够支持的属性 + anroid:drawble,制定图片对象 + android:id,指定对象的id + android:buttonm tom left button,指定显示的位置。 + +* 使用的语法格式 + + + +* 内涵解释: + 与StateListDrawable相似,包含以个Drawable数组,在不同的情况下调用不同的图片。 + + +## >使用ShapeDrawable资源 + +---- + +* 作用: + 用来定义一个基本的图形(矩形、线条、圆形) +* 使用:(下一级标签) + 定义了四个角的弧度 + 定义了渐变色填充 + 定义了几何形状内边距 + 定义几何形状的大小 + 定义使用单种颜色填充 + 定义为集合形状绘制边框 + +## >ClipDrawable资源 + +---- + +* 作用 + 从其他位图上截取一个图片片段 +* 使用:(这个标签的属性) + android:drawable,指定截取的资源 + android:clipOrientation,指定截取的方向 + android:gravity,指定截取时的对其方式 + +## >AnimationDrable资源 +---- + +* 作用: + 代表一个动画,相当于逐帧动画,也可以通过平移、变换计算出来的补间动画。 + :设置透明度 + :图片进行缩放变换 + :图片进行位移变换 + :图片进行旋转 + android:interpolator属性指定变化速度,linear_interpolator/accelerate_interploator/decelerate_interpolator:匀速变化/加速变化/减速变化。 +* 使用方法: + * 在XML文件中访问 + @package_name:anim/file_name + * 在java代码中访问 + package.R.anim.file_name + +## >属性动画资源 + +---- + +* 子类 + AnimatorSet、ValueAnimator、ObjectAnimator、TimeAnimator + +* 定义属性动画的根元素 + * ``` ``` + * ``` ``` + * ``` ``` + + diff --git a/Android/教程/第6章android应用资源原生图形资源.md b/Android/教程/第6章android应用资源原生图形资源.md new file mode 100644 index 00000000..f04a1e47 --- /dev/null +++ b/Android/教程/第6章android应用资源原生图形资源.md @@ -0,0 +1,154 @@ +# android应用资源(二) + +----- + + +## >使用原始XML资源 + +---- + +* 文件路径: + 在/res/xml/路径下创建xml内容。 + +* 访问方式: + * java中package_name.R.xml.file_name + * @package_name:xml/file_name + +* 获得实际的XML文件的方法 + * XmlResourceParser getXml(int id),使用XMLPullParser来解析该XML文档,该方法返回一个解析器对象(XMLResourceParser是XmlPullParser的子类) + * InputStream openRawResource(int id)获取xml文档对应的输入流。 + +* 使用XML文件 + XmlResourceParser xrp = getResources().getXml(R.xml.books) + xrp.getName()获取标签名 + xrp.getAttributedValue(null,"price");根据属性名获取属性值 + xrp.getAttributeVale(1);根据属性的索引来获取属性的值 + xrp.nextText()获取文本内容 + xrp.next()下一个事件 + +## >使用布局文件 +---- +> 参照第二章内容 + +## >使用菜单资源 + +---- + +> 参照第二章内容 + +## >样式和主题 + +---- + +> 感觉样式和主题就有点像html中css的作用,负责通过xml定义一系列完整的格式;而普通的java代码,就像网页前端中js脚本,负责完成前端的简单页面逻辑;普通的xml代码就像html代码,负责整体的布局。 + +* 样式的含义:相当于多个格式的集合,其他UI组件通过style属性来指定样式。 +* 样式的定义: + * name:指定样式的名称 + * parent:指定继承的父样式,获得父样式中的所有格式,同时可以覆盖父样式 + +``` + + + +``` + +* 样式的使用:style = "@package_name:style/file_name" + + +* 主题资源:不能作用于单个View组件,主体应该对整个应用中所有的Activity起作用,或对指定的Activity起作用。主要是定义窗口外观的格式。 + +* 主题资源的定义方法 + +``` + +``` +* 主题资源的使用方法: + * java:setTheme(R.style.CrazyTheme);指定单一的Activity应用主题 + * manifest.xml:;对整个工程使用某个主题。 + * xml在单个Activity中使用某个主题 + +> android内置了大量的主题资源 + + +## >属性资源 + +---- + +* 属性资源的定义: + * attr子元素:定义了一个属性 + * declare-styleable子元素:定义了一个styleable对象,包含了一组attr属性值。 + +* 属性资源的使用: +``` +TypedArray typedArray=content.obtaintStyledattributes(attrs,R.styleable.alphaImageView); +int duration= typedArray.getInt(R.styleable.AlphaImageView_duration,0) +alphaDelta = 255 * SPEED / duration; +``` + +## >使用原始资源 + +---- + +* 存放位置:/res/raw/或者/assets/目录下,前者会在R资源清单中生成一个索引项。后者是更彻底的原始资源,android需要通过AssetManager来管理该目录下的原始资源。 + +* R清单中的访问方式:@package_name:raw/file_name;或者:package_name.R.raw.file_name; +* asset中访问方式: + * InputStream open(String fileName):根据文件名来获取原始资源对应的输入流 + * AssetFileDescriptor openFd(String fileName):根据文件名来获取原始资源对应的AssetFileDescriptor。AssetFileDescriptor代表了一项原始资源的描述,应用程序可以通过AssetFileDescriptor来获取原始资源。 + + +## >国际化和资源自适应 + +---- + +* java实现国际化的方法: + 将标签和提示等信息放在资源文件中,资源文件是键值对,对每个资源文件中的key是不变的,但value随着不同的国家和语言改变。 +* java程序国际化的实现方法: + * java.util.ResourceBundle:加载一个国家的语言包 + * java.util.Locale:用于封装一个特定的国家区域、语言环境。 + * java.text.MessageFormat:用于格式化带占位符的字符串。 + * baseName_language_country.properties + * baseName_laguage.properties + * baseName.properties + +* java支持的国家和语言 +* 程序国际化的具体实现方法: + * 在不同国家的properties文件中定义大量的键值对,并将两个字节的值进行转换(native2ascii)。 + * 获得当前系统的国家语言环境Locale = Locale.getDefault(); + * 加载制定国家地区的properties文件,将得到的键值对放在bundle中: + ResourceBundle bundle = ResourceBundle.getBundle("mess",myLocale); + * 取出键值对中的值 + System.out.println(bundle.getString("hello")); +>其他程序国际化的方法也一样,能够通过(资源-国家-r语言)的方式,来定义不同的国家。 + +## >自适应不同屏幕的资源 + +---- + +* 屏幕资源:屏幕尺寸,屏幕分辨率、屏幕方向 + + + + + + + + +> 对dp和dpi的理解 +> dp出现的原因是android手机屏幕分辨率各不相同同,如果用px像素点来描述,会导致在不同的手机屏幕上效果差异较大。dp的目的是为了封装屏幕的分辨率。对于任何屏幕他的dp都是480dp*320dp,如果分辨率更高,那么,1dp就等于更多的px,如果分辨率更低,1dp就等于更少的px。其中dp和平乡的换算公式,被称为dpi,就是单位dp中含有像素的个数,或者说,单位inch中含有像素点的个数。 + +---- + +> 事实上dp的工作机制跟上述内容不同,但是为什么采取一种错误的理解方式,因为他们的机制一样,但是结果不一样。 + +---- + +> 那就应该用学习html中的方法,机制理解起来可能比较简单,重要的是对标签的记忆组合与对审美的要求。而js和android中的java代码则对逻辑要求比较严谨。 \ No newline at end of file diff --git a/Android/教程/第7章图形与图像处理(动态处理).md b/Android/教程/第7章图形与图像处理(动态处理).md new file mode 100644 index 00000000..f2fe2387 --- /dev/null +++ b/Android/教程/第7章图形与图像处理(动态处理).md @@ -0,0 +1,79 @@ +# 第七章图形与图像处理(动态处理) + +---- + +## 逐帧动画 + +------ + +* AnimationDrawable与逐帧动画。在元素中定义子元素,表示动画的全部帧,并制定持续时间即可。 +``` + + + +``` + +## 补间动画 + +---- + +* android使用Animation代表抽象的动画类 + * AlphaAnimation:透明度改变的动画,指定开始透明度、结束透明度、动画持续时间 + * ScaleAnimation:大小缩放的动画,指定缩放中心、开始缩放比、结束缩放比、动画持续时间 + * TranslateAnimation:位移变化的动画,指定开始位置、结束位置、动画持续时间 + * RotateAnimation:旋转动画,旋转轴心、开始旋转角度、结束旋转角度 + * 通过interpolator指定动画运行期间,动态补入多少帧,在哪些时刻补入。能够指定动画的变化速度。 + +* interpolator的实现类 + * LinearInterpolator:均匀速度改变 + * AccelerateInterpolator:加速 + * AccelerateDecelerateinterpolator:中间加速 + * CycleInterpolator:循环播放n次,变化速度正玄曲线 + * DecelerateInterpolator:减速 + +* 自定义补间动画 + * 继承Animation,重写抽象基类的interpolatedTime时间进行比方法和Transformation补间动画变形程度。 + * Transformation代表了对图片或者视图的变形程度,封装了一个Matrix对象用来对图形进行位移、倾斜、旋转等变换。封装了一个Camera对象,进行三维空间变换。getMatrix():将Camera所有变换应用到matrix上 + * getMatrix():Camera对应变换应用到matrix上 + * rotateX():X轴旋转 + * rotateY():Y轴旋转 + * rotateZ():Z轴旋转 + * translate():目标组件在三维空间内变换 + * applyToCanvas():应用到场景当中 + + +## 属性动画 + +----- + +* 属性变化可以定义任意性质的变化。可以针对任何对象执行的动画,需要制定动画持续时间、动画的插值方式、动画的重复次数、重复行为、动画集、帧刷新率 +* 属性动画的API + * Animator:提供了创建属性动画的基类。 + * ValueAnimator:属性动画主要的时间引擎,负责计算各个帧的属性值,定义了属性动画的绝大部分核心功能。 + * ObjectAnimator:对指定对象的属性执行动画,是ValueAnimator的子类 + * AnimatorSet:组合多个Animator,并制定多个Animator的播放次序。 + * IntEvaluator:计算int属性值的计算器。 + * FloatEvaluator:计算float类型的计算器 + * ArgbEvaluator:计算十六进制颜色值的计算器 + * TypeEvaluator:计算器接口。自定义计算器。 + +* ValueAnimator创建属性动画的步骤: + 1. 调用ofInt() ofFloat() ofObject()静态方法创建ValueAnimator实例 + 2. 调用setXxx() 方法设置动画持续时间,差值方式、重复次数 + 3. 调用start()方法启动动画 + 4. 为ValueAnimator注册AnimatorUpdateListener监听器,监听ValueAnimator计算出来的值,并将这些值应用到制定对象上。通过getAnimatorValue()方法来计算值,并应用到任何对象上。 + +* ObjectAnimator创建属性动画的步骤 + * 继承了ValueAnimator,已经绑定了指定的对象,直接将ValueAnimator计算的值应用到制定对象的指定属性上。 + * 必须为绑定的制定对象提供特定的setter方法才行。如果没有开始值,必须提供getter方法提供开始值。 + * 如果对象是View需要调用onAnimationUpdate()中调用View.invalidate()方法来刷新屏幕显示。 + + +## 使用SurfaceView实现动画 + +---- + +* SurfaceView与SurfaceHolder相互关联使用,后者提供了方法: + * lockCanvas()锁定surfaceView对象,或者对指定区域更新。 diff --git a/Android/教程/第7章图形与图像处理.md b/Android/教程/第7章图形与图像处理.md new file mode 100644 index 00000000..f559e32a --- /dev/null +++ b/Android/教程/第7章图形与图像处理.md @@ -0,0 +1,113 @@ +# 第七章图形与图像处理(静态处理) + +> Bitmap是有像素点构成的点阵图。 + +------ + +## 使用简单的图片 + +---- + +* 通过Drawable对象进行访问。 + R.drawable.file_name + @drawable/file_name + +* 通过BitmapDrawable对Bitmap对象进行封装,以下皆为静态方法,来自BitmapFactory。 + * BitmapDrawagle drawable - new BitmapDrawable(bitmap);通过Bitmap对象的到另外的图像 + * createBitmap(Bitmap source,int x,int y,int width, int height):从源位图source的制定位置开始截取一个图像。 + * createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean filter):对原来的位图进行缩放 + * createBitmap(int width,int height,Bitmap.Config config):创建一个宽width、height的新位图 + * createBitmap(Bitmap source,int x,int y,int width,int height,Matris m,boolean filter);截取一段图像 + * decodeByteArray(byte[],int offset, int length);从指定字节数组的offset位置开始,将长度length的字节解析成Bitmap对象。 + * decodeFile(String pathName):从pathName指定文件中解析、创建Bitmap对象 + +* 用来判断是否被回收: isRecycled() + 用来强制回收:recycle() + +* 使用静态方法导入一张图片: + * AssetManager assets=getAssets(); + * InputStream assetsFile = assets.open(images[currentImg++]); + * BitmapDrawable bitmapDrawable=(BitmapDrawable) image.getDrawable(); + * image.setImageBitmap(BitmapFactory.decodeStream(assetFile)); + +## >绘图 + +---- + +* 绘图基础 + * 集成View组件,重写onDraw()回调方法。 +*使用Canvas画布进行画图 + * drawArc() + * drawBitmap() + * drawCircle() + * drawLine() + * drawLines(),drawOvl() + * drawPath(),drawPoint() + * drawPoints(),drawRect() + * drawRoundRect() + * drawText() + * drawTextOnPath() + * clipRect() + * clipRegion(); + * Canvas坐标变换rotate()旋转,scale()缩放,skew()倾斜,translate()移动; +* 使用Paint进行绘图 + * setARGB()设置颜色。 + * setAlpha()设置透明度 + * setColor()设置颜色 + * setPathEffect()设置路径 + * setShader()设置画笔的填充效果 + * setShadowLayer()设置阴影 + * setStrokeWidth()设置笔触宽度 + * setStrokeJoin()设置笔转风格 + * setStyle()设置paint的填充风格 + * setTextAlign()设置文字对齐方式 + * setTextSize()设置文本的文字大小。 + +* 使用Path类 + * 预先将N个点连成一条路径,然后在路径上绘制 + * 子类ComposePathEffect/CornerPathEffect/DashPathEffect/DiscretePathEffect/SumPathEffect + +* 绘图应用-绘制有用游戏 + 重复调用onDraw()方法,每次在View组件上绘制不同的东西,形成逐帧动画。 + * 双缓冲画图板 + * 弹球游戏 + +## >图形特效处理 + +---- + +* 使用Matrix控制变换步骤 + 1. 获取Matrix对象 + 2. 调用Matrix的方法进行变换(矩阵方法) + 3. 将程序Matrix所做的变换应用到指定图形或组件。 + +* Matrix提供的方法 + * setTranslage + * setSkew() + * setTotate() + * setScale() + +* Matrix 应用举例 + * 键盘操作图片移动 + * 移动游戏背景 + +* 使用drawBitmapMesh扭曲图像 + * bitmap:扭曲的源位图 + * meshWidth/meshHeight划分格子数 + * verts扭曲后个顶点的位置 + * vertOffset:控制verts数组中扭曲的开始。 + * 通过drawBitmapMesh()方法对源位图扭曲绘制。 + +* drawBitmapMesh 应用举例 + * 可揉的图片 + +## >使用Shader填充图形 + +---- + +* 使用Shader对象指定渲染效果来填充图像。子类: + * BitmapShader位图平铺 + * LinerGradient线性渐变 + * RadialGradient圆形渐变 + * SweepGradient角度渐变 + * ComposeShader组合渲染效果 diff --git a/Android/教程/第8章数据存储IO.md b/Android/教程/第8章数据存储IO.md new file mode 100644 index 00000000..bcc4f94c --- /dev/null +++ b/Android/教程/第8章数据存储IO.md @@ -0,0 +1,341 @@ +# 第8章Android数据存储于IO接口 + +----- + +> Android 内置了sqlife数据库 + +## 使用sharePreferences + +---- + +* 使用方法,SharedPreferences负责读取数据,SharedPreferences.Editor负责写入数据。 + * contains()是否包含指定key的数据 + * getAll()获取sharedPreferences数据里全部的keyValue对 + * getXX()得到指定键的值 + * clear()清空用户配置 + * putXxx()存入键值对 + * remove()删除键值对 + * commit()提交修改 + +* 只能通过Context.getSharedPreferences(String,int)方式来获取Preferences的一个实例。 + + +## File存储 + +---- + +* FileInputStream openFileInput(String name)打开应用程序数据文件夹下的那么文件对应的输入流 +* FileOutputStream openFileOutput(String name , int mode)打开应用程序数据文件夹下的name文件对应的输出流。模式分别有MODE_PRIVATE(只能被当前程序读写),MODE_APPEND(追加方式,应用程序读写),MODE_WORLD_READABLE(被其他程序读取),MODE_WORLD+WRITEABLE(由其他程序读写) +* 相关方法 + * getDir()创建name对应的子目录 + * getFilesDir()获取应用程序的数据文件夹的绝对路径 + * fileList()返回应用程序的数据文件夹下的全部文件 + * deleteFile()删除数据文件夹下的制定文件 + +* 读取SD卡上的文件 + * Environment.getExternalStorageState()判断是否插入了SD卡 + * Environment.getExternalStorageDirectory()获取外部存储器 + * FileInputStream、FileOutputStream、FileReader、FileWriter读写sd卡内容 + * 权限配置,创建删除文件的权限和向sd卡中写入数据的权限: + ``` + + + ``` + + +## SQLife数据库 + +---- +* sqlife数据的格式 + 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型: + + NULL: 这个值为空值 + + VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。 + + CHAR(n):长度固定为n的字串,n不能超过 254。 + + INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8. + + REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号. + + TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE). + + BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。 + + DATA :包含了 年份、月份、日期。 + + TIME: 包含了 小时、分钟、秒。 +* SQLife提供的数据库访问方式: + + +| 方法名称 | 方法表示含义 | +| -------- |:------------:| +| openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) | 打开或创建数据库 | +| insert(String table,String nullColumnHack,ContentValues values) | 插入一条记录 | +| delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 | +| query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) | 查询一条记录 | +| update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 | +| execSQL(String sql) | 执行一条SQL语句 | +| close() | 关闭数据库 | + +Google公司命名这些方法的名称都是非常形象的。例如openOrCreateDatabase,我们从字面英文含义就能看出这是个打开或创建数据库的方法。 + +* SQLife进行数据库操作的具体步骤 + 1. 获取SQLife对象,它代表了与数据库的链接 + 2. 调用SQLife的方法,来执行SQL语句 + 3. 操作SQL语句的执行结果,用SimpleCursorAdaptor封装Cursor + 4. 关闭SQLifeDatabase,回收资源。 + +* SQLite3工具 + * 只支持五中基本数据类型。null,integer,real,text,blob. + * 使用slite3工具执行相应的命令,能够通过命令行管理数据库 + * 弱类型的数据库,能够将任何数据类型保存到任何数据类型当中,在创建数据库的时候不必声明具体的数据类型。(主键除外)例如: +``` +create table mytest{ + id integer primary key, + name , + gender, + pass , +} +``` + + +## SQLife具体的操作方式说明 + + +1. 打开或者创建数据库 + 在Android 中使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)打开或者创建一个数据库。它会自动去检测是否存在这个数据库,如果存在则打开,不存在则创建一个数据库;创建成功则返回一个SQLiteDatabase对象,否则抛出异常FileNotFoundException。 + + 下面是创建名为“stu.db”数据库的代码: + openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory) + 参数1 数据库创建的路径 + 参数2 一般设置为null就可以了 + [sql] view plain copy print?在CODE上查看代码片派生到我的代码片 + db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null); + +2. 创建表 + + 创建一张表的步骤很简单: + + 编写创建表的SQL语句 + 调用SQLiteDatabase的execSQL()方法来执行SQL语句 + + + 下面的代码创建了一张用户表,属性列为:id(主键并且自动增加)、sname(学生姓名)、snumber(学号) + [sql] view plain copy print?在CODE上查看代码片派生到我的代码片 + private void createTable(SQLiteDatabase db){ + //创建表SQL语句 + String stu_table="create table usertable(_id integer primary key autoincrement,sname text,snumber text)"; + //执行SQL语句 + db.execSQL(stu_table); + } + +3. 插入数据 + 插入数据有两种方法: + ①SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法, + 参数1 表名称, + 参数2 空列的默认值 + 参数3 ContentValues类型的一个封装了列名称和列值的Map; + ②编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行 + 第一种方法的代码: + [sql] view plain copy print?在CODE上查看代码片派生到我的代码片 + private void insert(SQLiteDatabase db){ + //实例化常量值 + ContentValues cValue = new ContentValues(); + //添加用户名 + cValue.put("sname","xiaoming"); + //添加密码 + cValue.put("snumber","01005"); + //调用insert()方法插入数据 + db.insert("stu_table",null,cValue); + } + + 第二种方法的代码: + [sql] view plain copy print?在CODE上查看代码片派生到我的代码片 + private void insert(SQLiteDatabase db){ + //插入数据SQL语句 + String stu_sql="insert into stu_table(sname,snumber) values('xiaoming','01005')"; + //执行SQL语句 + db.execSQL(sql); + } + +4. 删除数据 + + 删除数据也有两种方法: + + ①调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法 + 参数1 表名称 + 参数2 删除条件 + 参数3 删除条件值数组 + + ②编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。 + + 第一种方法的代码: + [sql] view plain copy print?在CODE上查看代码片派生到我的代码片 + private void delete(SQLiteDatabase db) { + //删除条件 + String whereClause = "id=?"; + //删除条件参数 + String[] whereArgs = {String.valueOf(2)}; + //执行删除 + db.delete("stu_table",whereClause,whereArgs); + } + + 第二种方法的代码: + [sql] view plain copy print?在CODE上查看代码片派生到我的代码片 + private void delete(SQLiteDatabase db) { + //删除SQL语句 + String sql = "delete from stu_table where _id = 6"; + //执行SQL语句 + db.execSQL(sql); + } + +5. 修改数据 + + 修改数据有两种方法: + + ①调用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法 + 参数1 表名称 + 参数2 跟行列ContentValues类型的键值对Key-Value + 参数3 更新条件(where字句) + 参数4 更新条件数组 + + ②编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。 + + 第一种方法的代码: + [sql] view plain copy print?在CODE上查看代码片派生到我的代码片 + private void update(SQLiteDatabase db) { + //实例化内容值 ContentValues values = new ContentValues(); + //在values中添加内容 + values.put("snumber","101003"); + //修改条件 + String whereClause = "id=?"; + //修改添加参数 + String[] whereArgs={String.valuesOf(1)}; + //修改 + db.update("usertable",values,whereClause,whereArgs); + } + + 第二种方法的代码: + [sql] view plain copy print?在CODE上查看代码片派生到我的代码片 + private void update(SQLiteDatabase db){ + //修改SQL语句 + String sql = "update stu_table set snumber = 654321 where id = 1"; + //执行SQL + db.execSQL(sql); + } + +6. 查询数据 + 在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下: + + public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit); + + 各个参数的意义说明: + + 参数table:表名称 + + 参数columns:列名称数组 + + 参数selection:条件字句,相当于where + + 参数selectionArgs:条件字句,参数数组 + + 参数groupBy:分组列 + + 参数having:分组条件 + + 参数orderBy:排序列 + + 参数limit:分页查询限制 + + 参数Cursor:返回值,相当于结果集ResultSet + + Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等. + + Cursor游标常用方法 + + 方法名称 + 方法描述 + getCount() + 获得总的数据项数 + isFirst() + 判断是否第一条记录 + isLast() + 判断是否最后一条记录 + moveToFirst() + 移动到第一条记录 + moveToLast() + 移动到最后一条记录 + move(int offset) + 移动到指定记录 + moveToNext() + 移动到下一条记录 + moveToPrevious() + 移动到上一条记录 + getColumnIndexOrThrow(String columnName) + 根据列名称获得列索引 + getInt(int columnIndex) + 获得指定列索引的int类型值 + getString(int columnIndex) + 获得指定列缩影的String类型值 + + 下面就是用Cursor来查询数据库中的数据,具体代码如下: + [sql] view plain copy print?在CODE上查看代码片派生到我的代码片 + private void query(SQLiteDatabase db) { + //查询获得游标 + Cursor cursor = db.query ("usertable",null,null,null,null,null,null); + + //判断游标是否为空 + if(cursor.moveToFirst() { + //遍历游标 + for(int i=0;i= x)&&(e.getX()<=x+100)&&(e.getY()>=y)&&(e.getY()<=y+100)){ + flag = 1; + System.out.println(e.getX()+"..."+e.getY()); + + } + } + if((e.getID()==MouseEvent.MOUSE_RELEASED)&&(flag == 1)){ + x = e.getX(); + y = e.getY(); + repaint(); + flag = 0; + } + } + */ + public void processMouseEvent(MouseEvent e){ + if(e.getID() == MouseEvent.MOUSE_PRESSED){ + System.out.println("pressed"); + if((e.getX()>= x)&&(e.getX()<=x+100)&&(e.getY()>=y)&&(e.getY()<=y+100)){ + dx = e.getX()-x; + dy = e.getY()-y; + flag = 1; + System.out.println(e.getX()+"..."+e.getY()); + + } + } + if(e.getID()== MouseEvent.MOUSE_MOVED&&flag ==1){ + x = e.getX()-dx; + y = e.getY()-dy; + System.out.println(e.getX()+"..."+e.getY()); + + repaint(); + + } + if((e.getID()==MouseEvent.MOUSE_RELEASED)&&(flag == 1)){ + flag = 0; + } + + } + public void paint(Graphics g){ + g.drawImage(img, x, y,100,100, this); + } + + +} + + +``` \ No newline at end of file diff --git a/Java/Java基础/paint方法和Graphic类.md b/Java/Java基础/paint方法和Graphic类.md new file mode 100644 index 00000000..36ed65c8 --- /dev/null +++ b/Java/Java基础/paint方法和Graphic类.md @@ -0,0 +1,84 @@ +# 画图的标准步骤 + +------ + + package painting; + + import java.awt.Frame; + import java.awt.Graphics; + + /** + * 画图过程的整体框架. + * 继承了Frame类能够使用相关的框体数据。 + * 实现了Rnnable接口,本类能够作为一个线程被执行。 + * @author 宙斯 + * + */ + public class framePaint extends Frame implements Runnable{ + public static void main(String [] args){ + framePaint workStart = new framePaint(); + } + + /** + * 无参构造函数. + * 设置了窗体的基本属性。 + * 创建了与本类相关的线程并且执行。 + * 也就是说,这个类的对象在创建的时候,就已经执行了相关的画图代码,并且产生了一个看见的图形对象。 + * 而且这个绘制的过程,会作为一个普通的线程被执行。 + */ + public framePaint(){ + super("framePaint"); + setSize(350,350); + setVisible(true); + + new Thread(this).start(); + } + + /** + * 实现多线程的方法. + * run方法时Runnable线程的主要方法,当线程开始是,执行这个方法,所以画图方法在这个线程方法中被调用 + * 这个方法相当于画图过程的总方法。 + * @see java.lang.Runnable#run() + */ + public void run(){ + + repaint(); + } + + /** + * 实现画图的过程. + * 主要的画图方法,在调用画图对象的repaint方法时,这个方法被自动加载。 + * @see java.awt.Window#paint(java.awt.Graphics) + */ + public void paint(Graphics g){ + + } + } + +# Graphics类中的主要方法 + +----- + +> 能绘制的图形: +> String 字符串 +> Line 直线 +> Rect 长方形 +> Oval 椭圆形 +> Arc 弧线 +> Polygon 多边形 +> + +* draw系列 + 绘制线条图形 +* fill系列 + 绘制平面图形,用前景色填充内容物 +* clearRect() + 清除指定区域内的图形 +* clipRect() + 截取制定区域内的图形 +* copyArea() + 赋值制定区域内的图形到指定区域 +* get/setColor/Font + 设置颜色字体等 +* setClip() + 截取制定形状内的图形 \ No newline at end of file diff --git a/Java/Java基础/事件处理.md b/Java/Java基础/事件处理.md new file mode 100644 index 00000000..3422200c --- /dev/null +++ b/Java/Java基础/事件处理.md @@ -0,0 +1,5 @@ +# 底层事件处理 + +----- + +* 在java.awt学习的时候,将监听器绑定到事件源上,当指定事件发生时监听器会自动匹配到相应的动作,执行相应的处理方式。但在底层事件处理过程中,不许要监听器,能够直接获取当前发生的底层事件,然后进行匹配处理。 \ No newline at end of file diff --git a/Java/Java基础/多线程共享资源问题.md b/Java/Java基础/多线程共享资源问题.md new file mode 100644 index 00000000..121799fd --- /dev/null +++ b/Java/Java基础/多线程共享资源问题.md @@ -0,0 +1,14 @@ +# 多线程共享受限资源 + +---- + +## >多线程共享受限资源存在的问题 + + +---- + +* **这个描述???** + 当你坐在桌子旁边时,手里有有一把叉子,准备插起盘子里最后一块十五,当叉子碰到十五的时候,它忽然消失了。 + +* **解决方法** + 给这个资源加锁,每个线程访问这个资源时上锁,访问结束后开锁。 \ No newline at end of file diff --git a/Java/Java基础/多线程的其他操作.md b/Java/Java基础/多线程的其他操作.md new file mode 100644 index 00000000..5fa17930 --- /dev/null +++ b/Java/Java基础/多线程的其他操作.md @@ -0,0 +1,40 @@ +# 多线程的应用 + +------ + +## 多线程停止线程 + +---- + +* stop方法已经过时不能使用,只能当run方法结束时,才能终止线程。开启多线程程运行时,代码通常是循环结构,只要控制住线程,通常可以让run方法结束。 +* 应当设计可以修改的无限循环标志。跳出无限循环,则会终止线程。 +* 当线程在循环内进入等待状态时,及时线程的循环条件不满足,必须终止线程,但是无法执行到判断语句进行线程的终止,此时,必须使用interrupt()函数来达到要求。 +* interrupt将处于冻结状态的线程强制转换到运行状态。此时wait()就会跑出我们处理已久的中断异常。 +* 当没有指定的方式让冻结的线程回复到运行状态时,这是需要对冻结进行清除。Thread提供了interrupt方法。 + + +## 多线程 守护线程 + +----- + +* 守护线程就是后台线程,也是一种依赖线程 +* 特点: + 当前台线程结束后,后台线程会自动终止,作为依赖线程,守护线程,不用强调结束。 +* 方法: + setDemon()设置某个线程为守护线程 + +## 多线程join方法 + +---- + +* t1.join() t1抢夺cpu执行权,主线程处于冻结状态,t1优先执行。相当于顺序执行两个线程。主线程碰到谁的join就会等谁执行。 +* 当A线程执行到了B线程的Join方法时,A线程就会等待,等B线程都执行完成,A才会执行。join才会临时加入线程执行。当B线程进入wait时,A线程也能继续执行。 +* toString 方法能够显示线程的名称,线程的优先级,线程当前的分组(线程组谁调用就是谁的线程组的) +* 所有线程包括主线程,默认是5。数越大优先级越高。MAX_PRIORITY,MIN_PRIORITY, +* yield()方法,当线程读到这里是,会释放执行权。这样会使所有的线程都有平均执行的效果。 + +## 什么时候会使用到多线程 + +---- + +* 当程序独立运算相互之间不相关的时候,可以用多线程封装一下,提高程序执行的速度 \ No newline at end of file diff --git a/Java/Java基础/多线程通讯问题.md b/Java/Java基础/多线程通讯问题.md new file mode 100644 index 00000000..bf7807e6 --- /dev/null +++ b/Java/Java基础/多线程通讯问题.md @@ -0,0 +1,166 @@ +# 多线程间的通讯 + +----- + +## 多线程通讯的定义: + +---- + +- 多个不同的线程对共同的数据进行不同的操作。 + +## 多线程通讯间的安全问题 + +----- + +* 安全问题的原因 + 例如当多个线程对同一个数据进行不同操作时,导致各种操作的先后顺序出现混乱。 +* 安全问题的解决方式 + 对这些线程操作数据的部分进行同步处理,使用相同的锁,将不同的部分锁起。 + +## 线程间通讯等待唤醒机制 + +----- + +* 可以模仿锁的工作原理(设置标志位,记录当前是够线程占用锁内的程序,实现只能有一个线程执行锁内代码的现象) +* 步骤: + 1. 设置标志位flag + 2. 当标志位处于输入状态时,执行输入程序,执行完成后修改为输出状态。 + 3. 当标志位处于输出状态时,执行输出程序,执行完成后修改为输入状态。 +## 等待唤醒机制的具体实现 + +---- + +* wait()和notify()函数必须在同步代码块或者同步函数当中使用。注意wait()会抛出中断异常。对持有监视器(锁)的线程进行操作。 +* wait()和notify()的操作对象是同步中持有当前锁的线程。 +* 线程的等待唤醒机制必须制定一把确定的锁。锁是任意的对象,任意对象都能成为锁,成为锁之后都能调用wait和notify的方法。而且这些方法都定义在Object类中。只有同一个锁上的被等待线程可以被同一个notify唤醒。等待唤醒必须是同一个锁。 + +## 使用新的工具类实现程序锁定和解锁 + +---- + + package painting; + + import java.util.concurrent.locks.Condition; + import java.util.concurrent.locks.Lock; + import java.util.concurrent.locks.ReentrantLock; + + /** + * @author 宙斯 + * + */ + public class LockerUsing { + + /** + * @param args + */ + public static void main(String[] args) { + Resource2 r = new Resource2(); + Produce2 pro = new Produce2(r); + Consumer2 con = new Consumer2(r); + + Thread t1 = new Thread(pro); + Thread t2 = new Thread(con); + Thread t3 = new Thread(pro); + Thread t4 = new Thread(con); + t1.start(); + t2.start(); + t3.start(); + t4.start(); + } + + } + class Resource2{ + private String name; + private int count =1; + private boolean flag = false; + private Lock lock = new ReentrantLock();//新建了一个锁对象 + private Condition condition_con = lock.newCondition();//生成了一个与锁相关的控制对象 + private Condition condition_pro = lock.newCondition(); + public void set(String name) throws InterruptedException{ + lock.lock(); + try{ + while(flag) + condition_pro.await(); + + this.name= name+"..."+count++; + System.out.println(Thread.currentThread().getName()+"生产者:"+this.name); + flag = true; + condition_con.signal(); + } + finally{ + lock.unlock();//异常处理当中释放锁的动过一定要被执行 + + } + } + public void out() throws InterruptedException{ + lock.lock(); + try{ + while(!flag) + condition_con.await(); + System.out.println(Thread.currentThread().getName()+"消费者:"+this.name); + flag = false; + condition_pro.signalAll(); + } + finally{ + lock.unlock(); + } + } + } + class Produce2 implements Runnable{ + private Resource2 res; + Produce2(Resource2 res){ + this.res = res; + + } + public void run() + { + while(true){ + try { + res.set("商品"); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + + class Consumer2 implements Runnable{ + private Resource2 res; + Consumer2(Resource2 res){ + this.res = res; + + } + public void run() + { + while(true){ + try { + res.out(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + + +* 代码的解释: + + 1. 单线程 -----多线程-----多线程操作同一个数据源的时候实行同步机制------带有满足条件的同步机制(睡眠唤醒机制) + 2. 实现了多线程不同操作相同的程序,这个类具有模板的价值.对资源的不同操作写到资源类中,并使用this资源类的锁,对各种不同的操作进行上锁 + 3. 而非写到其他操作类中,这样能够将同步和冲突解决都封装到资源类中便于理解和操作。 + 4. 当线程数多于两个,比如此程序中有两个在生产两个在消费,那么标准的方式应该是通过循环判断标志位是否合格, + 因为当某个线程判断满足后,但在进入之前肯能被其他线程修改标志位。 + 而且必须使用notifyAll()唤醒所有的线程。 + 5. 使用Locker及其相关类的好处 + 一个Locker上可以有很多condition对象执行操作,也就是只唤醒对方的condition + jdk1.5实现了多线程的升级解决方案 + 将同步设置Synchronize替换成Lock操作,可见 + 将Object中wait,notify,notifyAll替换成Condition对象。该对象可以Locker锁进行获取 + + + + + + diff --git a/Java/Java基础/补充:多线程基本操作.md b/Java/Java基础/补充:多线程基本操作.md new file mode 100644 index 00000000..a0eeb23b --- /dev/null +++ b/Java/Java基础/补充:多线程基本操作.md @@ -0,0 +1,48 @@ +# 多线程理论补充 + +------ + +## >让步机制 + +----- + +* **yield()** + thread.yield()线程执行这个函数会主动放弃执行的优先级,但只是暗示别的线程能够抢到更多的资源,没有确定的机制保证cpu资源一定被其他线程使用。 + +## >休眠机制 + +--- + +* **sleep()** + thread.sleep(30)线程停止执行30ms,可能会跑出异常,此线程调用interrupt()方法,中断了线程的执行。 + +## >优先权机制 + +---- + +* **setPriority()** + thread.setPriority()通过thread类中的常量对优先级进行设定。thread.getPriority()能够获取当前线程的优先级。 + +## >后台进程 + +----- + +* **后台线程(守护线程)thread.setDaemon()** + 程序运行时,在后台提供的一种通用的线程,当所有的非后台线程结束时,后台线程(守护线程)自动终止。必须在线程启动之前,调用方法setDaemon(),将线程设置成后台线程。isDeamon()判断是否为后台线程。 + +## >加入线程 + +---- + +* **t.join(a)** + t线程此时将被挂起,直到a线程结束才会被执行。当a线程结束时,t.isAlive()返回为假,线程恢复。 + +## >编码变体 + +----- + +* **implements Runnable** + 通过实现接口Runnable来达到作为线程类的方法。必须实现run方法。 + +* **建立有响应的用户界面** + 让运算作为一个独立的线程在后台独立运行。 diff --git a/Matlab/教程/MATLAB1.md b/Matlab/教程/MATLAB1.md new file mode 100644 index 00000000..58c11f75 --- /dev/null +++ b/Matlab/教程/MATLAB1.md @@ -0,0 +1,21 @@ +# > MATLAB操作界面 + +--- + +* **操作面板** + 1. 文件目录(文件结构的显示) + 2. 编辑器(打开的脚本文件) + 3. 命令行窗口(用于随时操作数据) + 4. 工作空间(用于储存变量的空间) + 5. 命令历史记录(用于储存命令行中的数据) + 6. 导航栏(主页、绘图、应用程序、编辑器、发布、视图) + +> 使用tab键调节嵌套中的缩进问题。 + + +* **辅助命令** + 1. path(搜索文件的目录) + 2. help path(查看帮助) + 3. cd(current directory) + 4. userpath(用户使用的路径) + 5. savepath(保存路径) \ No newline at end of file diff --git a/Matlab/教程/MATLAB10.md b/Matlab/教程/MATLAB10.md new file mode 100644 index 00000000..ac355e04 --- /dev/null +++ b/Matlab/教程/MATLAB10.md @@ -0,0 +1,34 @@ +# MATLAB的符号运算 + +## > MATLAB的符号运算 + +*** + +* **符号计算基础** + 1. 符号变量和符号常量``` a = sym('a'),syms b,c = sym('3') + 2. 符号表达式。生成方式,声明符号表达式中所有的变量为符号变量。或者直接使用sym函数生成一个符号表达式f = sym(字符串)。一些满足符号表达式的字符串能够自动转换为符号表达式 + 3. +* **符号函数** + 1. simplify(多项式规则化简) + 2. simple(多种规则对多项式化简) + 3. sym()符号表达式和数值的转换使用eval()或者numeric函数。 + 4. 因式分解函数factor(化简) , expand(展开) , collect(合并同类项) + 5. 符号矩阵。构建方式与数值矩阵相同,符号矩阵的运算同数值矩阵相同。 + 6. 符号矩阵的转置transpose,determ ,'是共轭转置 + 1. subs(f1,3)使用3 代替原函数中的自变量,得到最终的结果。 + 2. 符号极限,符号微分,符号积分 + 3. limit(y,0)计算y函数在零点的值 + 4. diff(y,3)微分求解 + 5. int(y3)求y3的积分函数 + 6. int(y4,1,2)对y4从一道二积分 +* **符号级数** + 1. symsum符号级数求和 + symsum(函数名臣,针对变量,起始,截止) + 2. Taylor(f函数名称,针对的变量,展开项数,展开的函数值) +* **符号方程求解** + 1. 符号代数方程 + 2. solve(方程表达式) + 3. 符号方程组 + 4. [x,y] = solve('x + y',时间,'x和y是... ...') + 5. 符号微分方程组 + 6. dsolve() \ No newline at end of file diff --git a/Matlab/教程/MATLAB2.md b/Matlab/教程/MATLAB2.md new file mode 100644 index 00000000..11efa0eb --- /dev/null +++ b/Matlab/教程/MATLAB2.md @@ -0,0 +1,65 @@ +# 命令和语句 + +## >命令行的特点 + +*** + +* **命名和语句** + 1. 字母开头,字母下划线,区分大小写 + 2. 不声明不定义拿来即用。 + 3. 分号决定语句是否输出 + 4. 英文省略号续行 +* **赋值** + 1. 等于号赋值给变量 + 2. 无赋值对象时默认赋值给ans +* **变量管理** + 1. 工作空间窗口查看 + 2. who whos 查看 +* **全局的文件操作** + 1. 清除变量的命令clear,清除所有变量或者单个变量 + 2. save[文件名][变量名][-append][-ascii] +> .mat文件是一种数据文件的类型,用于储存matlab中的数据 + +# >数据的类型和显示 + +--- + +* **format函数,控制显示** + 1. short long e rat hex + bank compact loose +* **MATLAB中常见的数据类型** + 1. 数值型:双精度,单精度,符号整型数据 + 2. 字符串、结构体、单元、多维矩阵、稀疏矩阵 + 3. 默认双精度double + 4. unit8()将double型数据转换成无符号整型 + 5. double()能够将int类型转换为double类型的数据 + +> class(变量)能够显示一个数据的类型 + +* **字符串类型的访问** + 1. 单引号 + 2. double()或者abs查看ascii值 + 3. char()转换为字符 + 4. str2num()获取字符串表面数值 + 5. num2str()数字表面上的字符串 +* **字符串的相关操作** + eval()执行字符串类型的语句(与PHP极其相似) +* **结构体的建立** + 结构体.成员名 =表达式 +* **结构体的访问** + 1. isstruct()返回结构体的类型1或者0 + 2. fieldnames()成员的名字 + 3. isfield(成员名,结构体名)一个变量是否是结构体的成员 + 4. rmfield() + 5. getfield() + +# >特殊的MATLAB数据类型 + +**** + +* **单元CELL** + 1. 使用大括号,允许不同类型的元素,同结构体 + 2. 结构体更像键值对,而单元更像是数组,无可定义的数组。 + + + + \ No newline at end of file diff --git a/Matlab/教程/MATLAB3.md b/Matlab/教程/MATLAB3.md new file mode 100644 index 00000000..26fece1e --- /dev/null +++ b/Matlab/教程/MATLAB3.md @@ -0,0 +1,41 @@ +# 矩阵 + +## >矩阵的建立 + +*** + +* **直接输入法** + 1. 空格和逗号建立行向量 + 2. 分号建立列向量 +* **使用M文件建立** + 1. 这里的m文件就是MATLAB的脚本文件 + 2. 可以直接使用该文件的名字加载脚本,也可以使用load命令 +* **特殊矩阵的建立** + 1. zeros()零矩阵 + 2. ones()1矩阵 +* **冒号表达式** + e1:e2:e3;表示起始值:步长:结束值; +* **linespace(1,5,3)** + +## >矩阵的简单操作 + +*** + +* **索引矩阵** + 1. 可以使用矩阵元素的行标和列标或者矩阵元素的序号来索引矩阵 + 2. 序号和下标之间的转换方式sub2ind(size(A),m,n);ind2sub(size(A),z); + 3. [m,n] = find(A == 8); +* **重排矩阵** + 1. reshape(A,m,n)大小相同 +* **矩阵转置** + 1. A = A' + +* **矩阵拆分** + 1. H = A(1,:)第一行所有列的内容。 + 2. H = A(2,3:5)第二行第三列到第五列 + 3. 向量索引和标量索引H = A([1 2],[1,2])校表索引的方法本质上是两个标量(精确定位),两个向量(生成范围) +* **删除矩阵元素** + 1. 赋空值 +* **矩阵扩展和压缩** + 1. repmat(A,2,1) + 2. unique(R)保留其中不同的数据(集合化) \ No newline at end of file diff --git a/Matlab/教程/MATLAB5.md b/Matlab/教程/MATLAB5.md new file mode 100644 index 00000000..c8a2c71c --- /dev/null +++ b/Matlab/教程/MATLAB5.md @@ -0,0 +1,31 @@ +# MATLAB的程序控制结构 + +## >M文件 + +*** + +* **分类** + 1. 命令文件=脚本文件,没有输入和返回,命令文件可以对工作空间的变量进行操作,文件内部的变量为局部变量,执行后自动清除。 + 2. 函数文件,可以有输入和返回。 + 3. 命令文件可以直接运行,函数文件必须以调用的形式运行。 +* **建立和打开** + 1. 可视化新建 + 2. edit命令新建 + +## >程序控制结构 +* **使用顺序结构的输入和输出** + 1. input(promt,'s')s参数决定是否为字符串 + 2. disp('string')能够显示字符串或者变量。 + 3. pause(3)暂停函数,中间是秒数 +* **使用分支结构** + 1. 单分支的if语句,由if决定是否执行 + 2. 双分支的if-else-end语句 + 3. 多分支结构if-elseif...else-end + 4. switch语句中的case可以加任何数据类型,也可以加矩阵向量数组集合 + 5. try分支,是一种试探性的分支,提高了程序的容错性。 + try 语句组1 + catch 语句组2 + end +* **使用循环结构** + 1. for循环 是在一个范围中循环 + 2. while循环是一个条件满足循环 \ No newline at end of file diff --git a/Matlab/教程/MATLAB6.md b/Matlab/教程/MATLAB6.md new file mode 100644 index 00000000..46304f58 --- /dev/null +++ b/Matlab/教程/MATLAB6.md @@ -0,0 +1,38 @@ +# MATLAB中程序的编写和调试 + +## >函数文件 + +*** + +* **基本结构** + 1. function[输出参数] = 函数名([输入形参])同命令文件的不同之处在于有参数的输入和输出 + 2. [注释说明] + 3. 函数体 + 4. 函数文件名和函数名称一致(不一致时使用文件名) + 5. 注释信息会在help命令中显示出来 + 6. 也可以使用lookfor命令查找 +* **函数参数可调标识变量** + 1. nargin 输入参数个数(由执行命令时,实际传入参数的数量决定) + 2. nargout 输出参数的个数(由执行命令时被赋值项的返回值个数决定nargout的值) + 3. varargin 代表未知的参数变量,实现了可变参数数量的输入。当输入变量多余设定好的参数是,varargin作为元胞数组,储存多余的变量,注意,MATLAB中的数组下标是从1开始的 + 4. varargout 实现了可变参数数量的输出。 + 5. 都是在函数文件内部实现的参数输入输出数量的控制。有点像巧妙地实现了函数的重载功能。 + 6. nargchk(2,4,nargin)可以生命输入参数的个数为2到4个。 + 6. error('wrongmessage')可以给出错误信息。 +## > 全局变量 + +*** + +* **global** + 1. 使不同M文件访问同一个变量数据 + 2. 每一个文件中都要声明给global + +## > 程序调试 + +*** + +* **断点和单步** + 1. 添加断点,能够一步一步执行,在执行过程中,可以对中间量进行测试和输出,载明窗口中进行操作。 +* **根据错误提示,一步步调试** + 1. 使用error()输出错误提示,然后调试 + 2. 使用系统中的错误提示 \ No newline at end of file diff --git a/Matlab/教程/MATLAB7.md b/Matlab/教程/MATLAB7.md new file mode 100644 index 00000000..0d273536 --- /dev/null +++ b/Matlab/教程/MATLAB7.md @@ -0,0 +1,34 @@ +# MATLAB中的绘图功能 + +## >二维高层绘图的基本函数 + +*** + +* **plot函数** + 1. plot(x,y); + 2. x和y为相同长度的向量 + 3. 如果plot为单个参数,绘制折现图,横坐标为自然数。如果参数为复数,则实轴和虚轴进行绘制。(可以绘制圆) + 4. 如果绘制过程中,自变量为向量,因变量为矩阵,则对矩阵的每一个列向量,绘制一个关于自变量的图像。也就是说,如果想要在同一图中绘制函数,不需要写多个plot,只需要将因变量转换为矩阵就好。 + 5. 如果绘制过程中,自变量和因变量同为高阶矩阵,则会为x的每一列为自变量,y的每一列为因变量,绘图。 + 6. 注意行向量的能够组合成行向量矩阵,列项量能组合成列项量矩阵。 + 7. linespace()和冒号表达式均可以产生行向量 +## >二维高层绘图辅助操作 + +*** +* 涉及到的函数、控制或者命令 +[这里有一张图片](http://) +* 标注 + * 坐标轴控制 + [这里有一张图片](http://) + * 图形名称 + * 曲线名称 + * 图例 +* 图形保持 +* 窗口分割 + + [这里有一张图片](http://) + +* 可以使用latex字符进行控制 +* xlim([xmin,xmax]) +* ylim([ymin,ymax]) +* axis([xmin,xmax,ymin,ymax]) \ No newline at end of file diff --git a/Matlab/教程/MATLAB8.md b/Matlab/教程/MATLAB8.md new file mode 100644 index 00000000..ccd44807 --- /dev/null +++ b/Matlab/教程/MATLAB8.md @@ -0,0 +1,51 @@ +# MATLAB二维底层绘图的修饰 + +## > 对象和句柄 +> *似乎MATLAB也能满足面向对象编程的一些条件诶! +> MATLAB也能实现GUI图形用户界面编程,同强大的C++、Java有一拼* + +*** + +* **对象和句柄的概念** + 1. MATLAB吧构成图形的各个基本要素成为图形对象,产生每一个图形对象时,MATLAB会自动分配一个唯一的值,用于表示这个对象,成为句柄(好像子对象和指向对象的指针) + +* **对象间的基本关系** + 1. 计算机屏幕->图形窗口->(用户菜单,用户控件,坐标轴) + 2. 坐标轴->(曲线,曲面,文字,图像,光源,区域,方框) + +## > 基本地城绘图函数 + +*** + +* **line对象** + 1. ` h = line([-pi:0.01:pi],sin([-pi:0.01:pi]));` + 2. 其中h成为line曲线对象的句柄。 + 3. line对象的修饰 + * color属性 + * LineWidth属性 + * LineStyle属性 + * Marker属性 + * MarkerSize属性 + 4. plot函数能够产生line对象,然后继续对返回的句柄进行操作、或者直接在绘制过程进行修饰。 + 5. ``` h1 = line('XData',[-pi:0.01:pi],'YData',sin([-pi:0.01:pi]),'LineWidth',1,'LineStyle',':','Color','r'); ``` + 6. +* **set底层对象的属性设置函数** + 1. 可以通过生成的句柄对MATLAB中生成的操作对象进行。使用set函数进行设定。` set(h1,'LineWidth',2,'Marker','p','MarkSize','15') ` + 2. line对象常见的性质XData,YData,ZData,Color(y,m,c,r,g,b,w,k),DisplayName(legend ()),LineStyle(-,--,:,-.,none),LineWidth,Marker(+,o,*,.,X,s,d,'^',V,>,<,p,h,none)。MarkerEdgeColor,MarkerFaceColor,MarkerSize,Type。 +* **text对象,底层标注函数** + 1. text是一个line的子对象,可以使用text函数进行操作。 + 2. ht = text(0,4,'string') + 3. text对象相关的属性:Color,FontSize,String,Rotation。 +* **axes对象,底层坐标轴函数** + 1. axes是一个line/figure的对象,可以使用axes()函数进行操作 + 2. ``` hf = figure; +ha = axes('Parent',hf,'Position','Units','Pixels',[10,10,10,100]);``` + 3. 常见属性:Box,GridLineStyle,Position,Units,XLabel,Ylabel,ZLabel,Xlim,Ylim,Zlim相关属性。 +> 补充一点对MATLAB的认识: +> MATLAB是矩阵实验室(Matrix Laboratory)之意。其主要提供了以下几种功能 +> 1. 数值计算 +> 2. 符号计算 +> 3. 文字处理 +> 4. 可视化建模仿真(图形功能强大) +> 5. 实时控制等功能(自动控制理论应用) +> MATLAB除了内部函数主包,还有三十多种工具包,用于不同领域,不同需求的功能拓展。 diff --git a/Matlab/教程/MATLAB9.md b/Matlab/教程/MATLAB9.md new file mode 100644 index 00000000..69309184 --- /dev/null +++ b/Matlab/教程/MATLAB9.md @@ -0,0 +1,29 @@ +# MATLAB Notebook使用简介 +> 沟通MATLAB和word等微软软件功能 + +## > Notebook的安装和启动 + +*** + +* **执行安装命令** + notebook -setup +* **执行启动命令** + 1. 原理Word调用MATLAB服务器进行操作。 + 2. (MATLAB和excel服务器之间也可以相互调用) + 3. 从Word中启动notebook或者从MATLAB中启动MATLAB。 + +## > M-book中命令的运行 + +*** + +* **代码的运行** + 1. 定义输入单元,格式发生变化define input cell + 2. 执行输入单元,evalute,执行已经输入的单元 + 3. 作用,就像是直接在word中进行m脚本文件的一些相关操作,当在论文中插入数据处理时用这种方法。 + 4. 使用[plot(a,b)]函数能够直接将图片绘制在word文档中 + 5. 定义自动初始化单元。define autoInit cell + +* **单元组** + 1. 将a和b定义为分别独立的输入单元,而且,其单步执行(就像给word添加了一种图形绘制和数值计算的能力插件) + 2. 定义为输入单元组,能够识别超过一行的命令。group cell。 + 3. 输出格式的控制。(notebook options) \ No newline at end of file diff --git a/Matlab/教程/matlab4.md b/Matlab/教程/matlab4.md new file mode 100644 index 00000000..ef8a9f8a --- /dev/null +++ b/Matlab/教程/matlab4.md @@ -0,0 +1,57 @@ +# MATLAB的矩阵处理基础 + +## >特殊矩阵的建立 + +*** + +* 零矩阵 +* 1矩阵 +* 单位矩阵eye(10) eye(m,n) +* 随机矩阵rand(m,n)randn(m,n)正态矩阵 获的(a,b)之间的随机矩阵A = a+(a-b)rand(m,n); +获得均值为u,方差为s的随机矩阵y = u+sqrt(s)*randn; + +> mean()求均值 +> std()求方差 + +* 魔方矩阵magic(5)行列对角线和相同 +* heilbert矩阵和toeplitz矩阵 +hilb(4)希尔伯特矩阵 每一个位置的元素为1/(i+j) +toeplitz(1:6)左上到右下的斜线元素相同 + +* 矩阵之间的加法和数乘; +* 矩阵的行列式det() +* 矩阵的逆inv() +* 向量的内积b的共轭转置,乘以a +conj(b)'*a +dot(a,b)直接求两个向量的内积。 + +## >线性方程组的求解 + +**** +方法一: +得到系数矩阵A = [1,2,3;1,4,9;1,8,27]; +常数向量b = [5,-2,6]'; +x = inv(A)*b +方法二:x =A/b + +* **矩阵的相似化简和分解** + 1. A = [1,2,3;4,5,6;7,8,9]jordan(A)获得A化简的jordan标准型 + 2. [V J] = jordan(A);获得的事相似矩阵和jordan标准型。 + 3. 矩阵的特征值eig() + 4. [E D]=eig(A)获得A的特征值和特征向量 + +* **向量和矩阵和范数** + 1. norm(A,1) + 2. norm(A,2) + 3. norm(A,inf) + 4. norm(A,'fro') +* **矩阵的分析** + 1. 函数矩阵(有函数构成的矩阵) + >syms x + A = [sin(x) exp(x) 1;cos(x) x^2+1 log(x)]; + diff(A);对矩阵求导 +* **矩阵函数** + 1. funm(A,@exp)通用矩阵函数 + 2. expm(A) + 3. funm(A, @sin) + 4. funm(A, @cos) \ No newline at end of file diff --git a/PHP/Yii/系列1.txt b/PHP/Yii/系列1.txt new file mode 100644 index 00000000..3e128be8 --- /dev/null +++ b/PHP/Yii/系列1.txt @@ -0,0 +1,178 @@ +һYii2 +1 +Yii һܣ PHP ܣڿٿִ Web Ӧó.Yii һͨõ Web ̿ܣڿֻ PHP Web ӦáΪĿܽṹƾɵĻ֧֣Yii رʺϿӦãŻվ̳ݹϵͳCMSĿȡ +2װ̳ +ͨ鵵ļװ? +1.[yiiframework.com](http://www.yiiframework.com/download/yii2-basic) ع鵵ļ +2. صļѹ htdocsĿ¼С +3. ޸ `config/web.php` ļ `cookieValidationKey` һԿ(ͨ Composer װ˲Զ) +? ?'cookieValidationKey' => 'Կ' +4.Ҫͨlocal/.../requirements.phpǷ㰲װyiiĻ +5.PHPûдõĻҪPHPxamppphp.exeĿ¼ӵpath·иȻͨcmdphp -v phpǷװͰװİ汾ǷҪ +6.Ȼͨlocal/.../web/index.phpǷܹСcongratulationsͳɹˡ + +ڶYiiĻ֪ʶ +ʶֹܲC++ģ⣬ʹùеӦ࣬ʵԶ̳yiiࡣʹԺͷ +࣬Ҫ +ԡ¼Ϊ +1. +УԺͳԱͬеʣԶȨޡijԱǹһ֣һԸġ +ʵԵķ +* ̳?yii\base\Object? +* һڱԵ˽гԱ +* ṩgettersetter߶ṩڷʡ޸ᵽ˽гԱ ֻṩgetterôΪֻԣֻṩsetterΪֻд + +YiiУ?yii\base\Object?ṩ˶Ե趨ˣҪʹ֧ԣ ̳?yii\base\Object?һϵпԵķ +* __isset()?ڲֵǷΪ?null +* __unset()?ڽֵΪ?null +* hasProperty()?ڲǷij +* canGetProperty()?һǷɶ +* canSetProperty()?һǷд + + +2¼ +>ʹ¼ضʱص㣬ִԤ趨һδ롣¼޴ڣ磬㷢˸΢һ¼¹עˣ·ݡJSҲص¼¼ʱ¼һϵΪ + +>ʹʱҪ׵ļҪ +һʲô¼ +˭¼ +˭¼ +¼ô +¼صЩ + +>¼ص +yii\base\Componentyii\base\Event +ж¼صһЩֱӶ¼ԡ + public static function on($class, $name, $handler, $data = null, + $append = true) + { + // ... ... + // ڰ¼handler + } + + public static function off($class, $name, $handler = null) + { + // ... ... + // ȡ¼handler + } + + public static function hasHandlers($class, $name) + { + // ... ... + // жǷӦhandler¼Ӧ + } + + public static function trigger($class, $name, $event = null) + { + // ... ... + // ڴ¼ + } + +>¼handler¼򣬼Ӧphp +ʹȫֵPHP +ʹijԱ +Ҳʹ + +>ʹonа +$person->on(Person::EVENT_GREET, 'person_say_hello +ʹoff +public function off($name, $handler = null) +trigger¼ķ +public function trigger($name, Event $event = null) + + +3Ϊ +>ã Ժͷв䡣?ͨΪ󶨵һ࣬ʹΪԺͷͺ౾ЩԺͷһ ҲҪдһµȥ̳лࡣ +>ΪصԼΪķ +yii\base\bahavior࣬ʵĶ +// Step 1: һΪ +class MyClass extends yii\base\Component +{ + // յ +} + +// Step 2: һΪ࣬󶨵MyClass +class MyBehavior extends yii\base\Behavior +{ + // Ϊһ + public $property1 = 'This is property in MyBehavior.'; + + // Ϊһ + public function method1() + { + return 'Method in MyBehavior is called.'; + } +} + +$myClass = new MyClass(); +$myBehavior = new MyBehavior(); + +// Step 3: Ϊ󶨵 +$myClass->attachBehavior('myBehavior', $myBehavior); + +// Step 4: ΪеԺͷͺͷԺͷһ +echo $myClass->property1; +echo $myClass->method1(); +* ?yii\base\Component?Լ࣬ԱʹΪ +* ?yii\base\Behavior?ԼΪ࣬涨Ϊ漰ԡ +* ComponentBehavior +* ʹComponentԺͷһʹΪжԺͷ +>ΪҪ +$owner?ԱָΪ +events()?ڱʾΪҪӦ¼ +attach()?ڽΪComponent +deatch()?ڽΪComponentϽ + +>Ϊ + +4YiiԼ +ԼһõģʽĬֵһԼYiiܰͨõԼȻִЧʡ +>YiiĿ¼ṹÿļдŵݺ + backend̨ Դļ + commonĿ¼ɹӦʹõӦ + console + environments + frontendǰ̨ǰԴ + nbproject + tests + vendorĿ¼composer.jsonİװyiiܱ + composer.json + composer.lock + init + init.bat + LICENSE.md + README.md + requirements.php + yii + yii.bat +index.phpļЭֵӦá + +> +@+Ԥı +@yii?ʾYiiڵĿ¼Ҳ?yii\BaseYii?ļڵλã +@app?ʾеӦõĸĿ¼һ?digpage.com/frontend +@vendor?ʾComposerĿ¼һ?@app/vendor?@app/../vendor? +@bower?ʾBowerĿ¼һ?@vendor/bower? +@npm?ʾNPMĿ¼һ?@vendor/npm? +@runtime?ʾеӦõʱڴʱļĿ¼һ?@app/runtime? +@webroot?ʾеӦõļ?index.php?ڵĿ¼һ?@app/web +@web?URLʾǰӦõĸURLҪǰˣ +@common?ʾͨļУ +@frontend?ʾǰ̨ӦڵļУ +@backend?ʾ̨ӦڵļУ +@console?ʾӦڵļУ +ʹComposerװYiiչעĶ + +>ԶػƵԼ +>ļԼ +YiiһļڲͬIDEвͬԱĹͬĹ +ṩһֹ淶ǰ汾Ʊü򵥣˳ͻͷIJ衣 + + + + + + + + + diff --git a/PHP/Yii/系列2.txt b/PHP/Yii/系列2.txt new file mode 100644 index 00000000..1da0b91a --- /dev/null +++ b/PHP/Yii/系列2.txt @@ -0,0 +1,84 @@ +yiiʶִ +>֪ʶ +ٿ +Ӧ +MVCģʽ + +>ļ +1modelsģ壩cnotrollersƣviexsͼconmmandstestsassets +2configļwebļ +3vendorļչļruntimeʱļ + + +>ִ +http://.../index.php?r=site/index +index.phpļwebļСyiiļһӦʵ壨ĸǸ +siteǿļӦcontrollersеsitecontrollersļදactionindex +indexǶľƣеviewssiteindex.phpļ +viewsͼļɶ +-> +index.phpڽű-> +Ӧ-> +-> + + ->ģ + ->ͼ +->Ӧ + + +ϵжblog +>ݿ +ݿ⣬ݱ +config/db.phpݿӵݿûû룬ݿͣ + + +>ϵ +giiɹߣּܡmodel +߿ٶ +giiҳָдӦģļ +ɾĵĹܣɾĵĹܣ + +ȻͻȻɾĹܾʵ + + +>ϵ + + +²鿴 +޸ +¹ + +ط +ģ ¼ ͼ +render +redirect¶תһҳ + + +̳Կִֶ࣬Уactionview()Уrenderתͼ + +ģ +Դ +֤ݵЧ +ҵ߼ +ActiveRecord뵱һűʵ뵱ڽһ¼а˺ܶݿвķҲһЩԣ¼¼ֶ + + +ÿ¼ʵһ࣬һķڶݿһֽвݡ + +activeform::begin޸µı +moudule->load()ͨģ͵Ŀٸֵ +moudule->save() ЧԵļ,Ӧһеֵ + + + + + + + + + + + + + + diff --git a/PHP/Yii/系列3.txt b/PHP/Yii/系列3.txt new file mode 100644 index 00000000..4276980a --- /dev/null +++ b/PHP/Yii/系列3.txt @@ -0,0 +1,36 @@ +yii +ģͼ +Զ֤ +ͨСԶhtml + + +ռ +namespaceռ +useģС + + +оcontrollerԺģݴݷļ + +Jikecontroller涨Jikecontroller̳controller뵱ڿ +溬actionķԴݡ + +modelsﶨJikeForm̳model࣬뵱ݿ +кܶݺͷ + + +Yii:$app->request->post()ĺ +model->rule()ķ֤ +model->load()ֵдӦֵ +model->validate()֤modelǷϷ + +$this->reder('index-two',['model'=>$model])һͼȾļڶͼݡ + +mvc +model ģ ݿϵ +viewͼ ûչֵIJ +controller ûɵҵ߼ + + + + + diff --git a/PHP/Yii/系列4.txt b/PHP/Yii/系列4.txt new file mode 100644 index 00000000..5b2dc903 --- /dev/null +++ b/PHP/Yii/系列4.txt @@ -0,0 +1,23 @@ +1ڵĸоһ㿿һ뿿£Ȼͨ˵ӣܵ﷨ʽѧһԡѧϰʽȫع鵽Ӥʽģ½׶ˣͬҲͨģѧϰܶණ +ѧϰע۲ݣ + +﷨ʽŵʹúһЩ﷨壩 + +ԣ̳еģıƹ̶ԳԼһ£ +ͷ̳ģĺͷԭͿͨվҵҪĿԼ¼һ£ + +Լͻƣ㶮ݿ-ģ--ǰͼ֮ϵ + +2controller viewmodelܽ + +controllers ļͬߵĿƺcontrollerҪд + +views ļûҪкܶ࣬ ļͬȻСдûҪ + +model ļͬĸҪдģݿͬſ + + +3ڿʼÿѧһ࣬ԣķҪעõϢ + +find()//->where(['status'=>1])->orderBy('age')->all() +ޣֵһactiverecord󣨰¼飩 diff --git a/PHP/Yii/系列5.txt b/PHP/Yii/系列5.txt new file mode 100644 index 00000000..158f1bbb --- /dev/null +++ b/PHP/Yii/系列5.txt @@ -0,0 +1,114 @@ +gii + +һmodel +һform +һɾIJĿ + + + +indexļ->ӦIJ + +1ִindexļִŶļȡļȡӦʵ +2·ɽr=site/index,ת +3ִsitecontroller/indexȻ +4ִоĶ +5ִйˣǹûȨޡpostǷȵ +6 ģȡ +7ŵͼģȾҳ +8ȾͼӦû + + +ֵ +ڽűļ +趨ȫֱ +yiiĺ +Ӧ + + +Ӧ壺 +application͵Ӧϵͳ +web/applicationеһĶ +yiiṹ +Yii::$appʶ +idԣ +basepathƶĿ¼ +defaultRouteȱʡrֵ + + + +ļҪ +yii\web\controller̳ж +󣨽ݣӦݣ + +actionɣγɶ +ÿһӦǰͼҳ + +renderǰ˴ + + + +ͼļ +yii\web\viewӦİ£ӦͼģļйȾɡ +html루̬֣PHP루̬֣ + + +ļ +൱ҳĽṹ +ļе$contentͼļеĴ +main.phpDzļԷд +α任$this->layout = ļ + + +ġģ +1ģ͵ݣ +ԡԱǩ츳ֵ֤ݵ +2ģԵĶͷʷʽ +Եȼҵ +$model = new CoForm(); +$model['name']='weixi'ֵ +ԱǩƶʾĶǩattributelabels(){}ʹ飬ֵԣֵΪֵΪʾ +3鸳ֵ +ʹloadֱӽݸֵ +4֤ +ruleݣһУǰΪݣΪҪ +$this->refresh()ҳˢ£controller + + +塢Ĵ +ActiveForm +field($medel,'username')->textInput()->hint('Please enter your name')->label('Name')?> + +аmodelеݴͼ + + +html::tag() +Html::submitButton() + + +塢giiӦ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PHP/Yii/系列6.txt b/PHP/Yii/系列6.txt new file mode 100644 index 00000000..e69de29b diff --git a/PHP/Yii/系列7.txt b/PHP/Yii/系列7.txt new file mode 100644 index 00000000..a8a5f510 --- /dev/null +++ b/PHP/Yii/系列7.txt @@ -0,0 +1,45 @@ + + + ['index'], + 'method' => 'get', + ]); ?> + + field($model, 'record_id') ?> + + field($model, 'label') ?> + + field($model, 'time_data') ?> + + field($model, 'user_own') ?> + + field($model, 'set_top') ?> + + field($model, 'num_love') ?> + + field($model, 'content') ?> + +
+ 'btn btn-primary']) ?> + 'btn btn-default']) ?> +
+ + + + + +//$model 是数据类,后边是数据项,提交时形成一个。 +/* +对activeForm和From类的理解,actioncreate()和actionupdate()的方法几乎一样,都是项数据库中保存一条数。 +前者,新建后保存,后者更改后保存 +两个函数分别把一个类的变量传递给create.php 和 update.php二者接受类的对象 +都把对象传递给同一张表单_from.php中的activeForm,进行处理,然后在返回, +极大的利用了代码的重复利用性。 +同时数据流完美清晰,值的学习。 + +模型中的isnewrecord 属性能够判断记录是新的记录还是旧的记录。 + +?> \ No newline at end of file diff --git a/PHP/Yii/需求分析.txt b/PHP/Yii/需求分析.txt new file mode 100644 index 00000000..c2c65601 --- /dev/null +++ b/PHP/Yii/需求分析.txt @@ -0,0 +1,36 @@ + +ƽ̨ѧ + +ѧУپ涨չʾ켰ɵԱˣ켰ɸˣ + +Ժˣͨſɻؼң򰴿δ + +¼ϴϵͳʾд¼ϢϢԭ򣨲ڶ֣ +УУʱ䣬֤סԺҪסԺ֤ȣͥסַʱ䵽ѣ +ʹʦȨ޽ˡ + +Ҫһÿһ鿴ڵ + +ٳ죬Ҫ˷Ż档ܾ룬Ҫ˵ԭ + + + +ҳ + +ѧ +ҳ棺д +ټ¼ҳ棺鿴Լټ¼б +鿴Ϣ٣ͨ״̬ǰ٣༭״̬ + + +ʦ +ٹ˵ļ +бҳ棺ѯijһʱУϸϢ + + +ݱ +ѧ ༶ Уʱ Уʱ ԭ Ŀĵַ ϵʽ Ƭ ֤ ״̬ˡͨɣ + + + + diff --git a/工作日志/2021年4月7日-简历说明.md b/工作日志/2021年4月7日-简历说明.md new file mode 100644 index 00000000..02a013df --- /dev/null +++ b/工作日志/2021年4月7日-简历说明.md @@ -0,0 +1,110 @@ +## 1 教育经历 +你好。我叫殷康龙,现就读于北京航空航天大学计算机学院,主要研究联邦学习在恶意软件检测领域的应用。本科就读于西北工业大学软件与微电子学院,主修软件工程。 + +在学校主要学习了数据结构与算法、C++程序设计、JavaEE企业级开发、面向对象程序设计、编译原理等课程,综合测评成绩在250人中排名第8。 + +## 2 校园经历 + +在学校里积极参加社团和活动。曾任软微学院科创部干事,参与组织一行代码大赛和程序设计比赛。曾任西工大新闻中心副部长,负责开发新文中心的功能网站,培训技术人员,维护西工大官方微信。 + + +## 4 主要成果 + +* 两次学校一等奖学金,一次华为奖学金,一次国家励志奖学金,一次电子工业出版社助学金,“优秀共青团员”称号 +* 2016-2017年连续两届FIRA机器人世界杯SimuRoSot项目国际特等奖(冠军),Air Challenge项目国际一等奖(亚军) +* 2017中国机器人大赛空中机器人-无人机大战水果项目一等奖 +* 2019年获得国家级大学生创新项目《基于超宽带定位技术的无人机目标追踪系统》和《基于网络爬虫和数据分析的高校信息整合系统》优秀结题 +* 获得《面向学生的校园信息交流系统V1.0》《基于scrapy框架的校园信息爬虫系统》《基于网络爬虫和数据分析的高校信息整合系统》计算机软件著作权 + +## 3 项目经历 + +> 项目概述、主要工作、最终成果 + +### 竞技策略开发——仿真5VS5SimuRosot +* 项目概述:15个人的开发团队,长期开发项目,C++、JAVA。工程项目主要包括数据处理模块、前场、后场、边路、底线、特殊策略、定位球策略等,主要用于参加5V5 simurosot的国内比赛和国外比赛。 +* 主要工作:负责开发前场的相关策略,主要包括策略选择模块(优势前场、保守前场、边路前场)、角色选择和切换模块(角色的稳定性,进入退出分开控制。)、目标计算模块(保持相对的阵型,减少阵型的抖动)、移动跑位模块、射门模块。使用PID控制方法对机器人控制,增强了前场的稳定性。使用JAVA为团队开发了数据测试平台,实现了对数据仿真、策略测试、可视化。。搭建团队开发的SVN版本控制系统,方便整个团队项目开发和维护。 +* 关键技术:开发测试平台主要使用java swing开发跨平台图形界面,提供了一系列GUI组件。主要包括数据导入模块、动态演示模块、数据显示模块。使用java io random_accessfile读取并解析file文件。使用java thread实现数据加载与数据展示的并行过程。通过事件监听与响应机制,实现对数据仿真动态演示过程的控制,包括仿真速度调节和仿真进度调节。使用javadoc生成标准的java文档供后续开发使用,方便开发维护。 +![](image/2021-04-06-21-33-39.png) +* 最终成果:暑假期间带领团队前往日照参加了2017中国机器人大赛,前往台湾 参加了FIRA机器人世界杯,取得多项冠军。 + +### 大创项目——基于网络爬虫和数据分析的高校信息整合系统 +* 项目概述:5个人,Python、MySQL。带领团队申请了《基于超宽带定位技术的无人机目标追踪系统》《基于网络爬虫和数据分析的高校信息整合系统》两个国家级大创项目,后者主要是利用爬虫综合网络信息,搭建web服务器,对数据进行二次处理,使用机器学习算法提供面向用户提供文章推荐功能、标签云索引功能和分类浏览功能,面向信息发布者提供了热点倾向功能、数据分析功能。 +* 主要工作:项目架构、服务器搭建,包括爬虫模块(数据解析模块xpath、URL获取与去重模块)、服务器模块(MySQL数据库设计、Json数据封装)、Android客户端(数据请求模块HTTP请求、数据展示)、数据处理模块。通过Scrapy完成网络信息爬虫,构建了Mysql数据库,使用Django后端框架和Bootstrap前端框架开发了项目网站,使用大数据的算法对信息分析处理,并将整个项目部署到腾讯云提供的CentOS服务器上。使用Github进行代码管理。 + +![](image/2021-04-06-21-18-56.png) +* 关键技术:scrapy框架介绍。使用request模块进行爬虫,通过调度去缓存下一条URL,控制网站访问的频率;使用xpath解析数据内容并将数据存储到mysql数据库中。 +> * (1)Scrapy引擎打开,向爬虫模块请求其需要爬取的起始URLs +> * (2)Scrapy引擎从爬虫模块那里获取到需要爬取的起始URLs,将它们放入调度器模块,作为待爬取的URL Requests; +> * (3)Scrapy 引擎向调度器模块发出请求,获取下一个待爬取页面的URL; +> * (4)调度器模块返回下一个待爬取页面的URL给Scrapy 引擎,Scrapy 引擎则将该 URL 经下载中间件模块(请求方向)转发给下载器; +> * (5)当下载器模块完成页面下载后,会生成一个该页面所对应的 HTTP Response,并将其经下载中间件(响应方向)发送给Scrapy 引擎; +> * (6)Scrapy 引擎从下载器模块处接收到HTTP Response 后,会将其经爬虫中间件模块(输入方向)发送给爬虫模块处理; +> * (7)爬虫模块处理接收到的 HTTP Response,并返回从中爬取到的Items及需要跟进的新的 URLs 给 Scrapy 引擎; +> * (8)Scrapy 引擎将(爬虫模块返回的)Items 转发给数据流水线模块,同时将(爬虫模块返回的)URLs 转发给调度器; +> * (9)以上 2~8 的过程会一直重复执行,直到调度器模块中没有 URL Requests 时,Scrapy 引擎关闭,爬虫停止。 + +![](image/2021-04-06-21-06-32.png) +* 关键技术:Django框架。使用Apache服务器,处理http请求。Django框架,MVC(model-view-control)的代码架构模式。从数据库中获取数据,封装成json格式,最后将响应的数据传递给android客户端。 +![](image/2021-04-06-21-17-24.png) +![](image/2021-04-06-21-58-13.png) +* 关键技术:数据处理算法。 + * 标签计算算法:jieba分词统计词频,TF-IDF算法进行词频统计,去除无关词汇,字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。 + * 分类算法:学科竞赛、科研信息、行政信息、招生信息、招聘就业、校园活动、升学留学、生活娱乐这八类,使用朴素贝叶斯分类器进行分类。(基于贝叶斯公式,可以试图讲解贝叶斯公式) + * 混合推荐算法:基于协同过滤算法提取项目的基本特征(人,文章的特征,通过人阅读的其他文章给出特征,通过相似的人看的其他电影打上相似的标签)。系统采用的KNN算法目的在于匹配项目中K个相似度最高的项目,作为预测推荐输出到用具接口。 +* 最终成果:两个国家级大创项目均获得优秀结题。 + +### 电子钱包JavaEE企业及开发项目 + +* 项目概述:在中科金财上市公司参与电子钱包项目的实习。 +* 负责使用Spring框架和mybatis实现数据库的访问和数据处理。 + + +### 无人机项目 + +* 项目概述:无人机加密通信项目开发。 +* 主要工作:主要是在Android平台(DJ无人机的地面站android手机开发),使用Java多线程和Socket编程,实现无人机之间的通信连接。主要通过UDP网络通信、心跳测试保持连接、回调处理等方式实现线程通信。在加密通信过程中,使用C++开发加密仿真环境。使用nodejs+electron对通信过程进行可视化。使用网页技术HTML、CSS、JavaScript做前端,使用C++做为本地的后端。通过封装C++通信的代码,提供C++通信接口,供nodejs调用。(代码的封装,接口提供,) +* 主要成果:完成实验室项目验收。 + + + +### 补充项目——软件与微电子学院学生信息系统。PHPweb开发 +* 项目概述:20个人组成的团队,PHP、MySQL。系统主要包括任务管理系统、证书认证系统、请销假平台、项目管理、活动,会议记录、党建系统、文件管理系统、就业记录等子系统。使用PHP作为后端开发脚本,使用MVCyii框架进行开发。 +* 主要工作:构建数据库。使用yii框架实现请销假平台,包括表单管理和MySQL数据库访问。yii框架是MVC结构。由controller处理逻辑内容,model封装数据库访问,view视图作为界面,用来渲染数据,发送到前端。 +![](image/2021-04-06-20-19-05.png) +* 最终成果:开发完成暑期项目实践,项目成功验收。 + + +### ~~补充项目——企业级开发JavaEE项目考试系统~~ +> 因为是java项目,等日后学完java再写 +### ~~补充项目———项目组织管理图书馆里系统开发~~ +> 因为是java项目。 +### ~~补充项目——windows通信编程。多人聊天室~~ +* 项目概述:单人项目开发。 +* 主要工作:MFC开发界面、windows网络通信。 +* 主要成果:课设。 +### ~~补充项目——TensorFlowIO优化~~ + +* 项目概述:分析TensorFlow源代码,对源代码进行修改重新编译。使用mmap方法,优化TensorFlow数据加载过程中的IO操作。 +* 主要工作:阅读源代码分析TensorFlow架构,使用多线程以流的方式读取多个文件。mmap封装大文件读取过程。编译并测试TensorFlow最后的优化效果。 + +![](image/2021-04-06-23-26-50.png) +1. 首先阅读了TensorFlow的源代码以及相关的研究资料,对TensorFlow的代码架构进行分析。 +2. 第一层设备通信层,负责网络通信和设备管理。设备管理模块可以实现TensorFlow的异构性,提供了对不同平台不同设备的支持,统一封装成相同的接口,使得上层模块在调用过程中,不必考虑具体的底层实现。通信模块主要通过两种协议实现不同设备之间的通信过程,分别是gRPC协议和RDMA协议。 +3. 第二层内核实现层,实现了核心算子(Operation)与张量(Tensor)的操作。所有的算子都是以张量为操作对象,依赖底层实现张量的内存分配和计算。 +4. 第三层图计算层,实现了计算图(Graph),包括本地计算流图和分布式的计算流图的实现。主要实现了计算图的创建、编译、优化和执行的细节。计算图中的每个节点都是内核实现层中的算子,计算图中的每条边代表内核实现层中的张量。 +5. 第四层API接口层,TensorFlow提供了原始的C API的实现,方便其他语言和平台进行调用。通过C API进一步实现其他语言的API,方便不同语言开发者选择熟悉的语言构建计算图。 +6. 第五层应用层,不同的编程语言通过API接口层调用TensorFlow的内核,实现相关的模型和应用。 + +![](image/2021-04-06-23-28-22.png) + +1. 使用linux的mmap方法申请内存空间,建立内存映射。 +2. 使用platform模块,对底层方法进行封装,实现异常情况处理,并记录内存映射的地址及相关信息,提供上层接口 +3. 利用platform模块提供的内存映射接口,创建读取器,复写父类中的数据读取方法。创建一个读取数据的算子,并注册到内核当中,提供其他语言的接口。 +4. 编写前端,调用内核新方法,使用MmapReader模型进行数据读取。 +5. 重新编译 + +* 最终成果:毕业答辩顺利完成。 + + +## 5 个人能力和性格 + diff --git a/工作日志/image/2021-04-06-20-19-05.png b/工作日志/image/2021-04-06-20-19-05.png new file mode 100644 index 00000000..35a8d701 Binary files /dev/null and b/工作日志/image/2021-04-06-20-19-05.png differ diff --git a/工作日志/image/2021-04-06-21-06-32.png b/工作日志/image/2021-04-06-21-06-32.png new file mode 100644 index 00000000..c3e60cb3 Binary files /dev/null and b/工作日志/image/2021-04-06-21-06-32.png differ diff --git a/工作日志/image/2021-04-06-21-17-24.png b/工作日志/image/2021-04-06-21-17-24.png new file mode 100644 index 00000000..403a35c2 Binary files /dev/null and b/工作日志/image/2021-04-06-21-17-24.png differ diff --git a/工作日志/image/2021-04-06-21-18-56.png b/工作日志/image/2021-04-06-21-18-56.png new file mode 100644 index 00000000..8c27f74d Binary files /dev/null and b/工作日志/image/2021-04-06-21-18-56.png differ diff --git a/工作日志/image/2021-04-06-21-33-39.png b/工作日志/image/2021-04-06-21-33-39.png new file mode 100644 index 00000000..7da95f81 Binary files /dev/null and b/工作日志/image/2021-04-06-21-33-39.png differ diff --git a/工作日志/image/2021-04-06-21-58-13.png b/工作日志/image/2021-04-06-21-58-13.png new file mode 100644 index 00000000..a962eb5d Binary files /dev/null and b/工作日志/image/2021-04-06-21-58-13.png differ diff --git a/工作日志/image/2021-04-06-23-26-24.png b/工作日志/image/2021-04-06-23-26-24.png new file mode 100644 index 00000000..b0ed8937 Binary files /dev/null and b/工作日志/image/2021-04-06-23-26-24.png differ diff --git a/工作日志/image/2021-04-06-23-26-50.png b/工作日志/image/2021-04-06-23-26-50.png new file mode 100644 index 00000000..10c4169b Binary files /dev/null and b/工作日志/image/2021-04-06-23-26-50.png differ diff --git a/工作日志/image/2021-04-06-23-28-22.png b/工作日志/image/2021-04-06-23-28-22.png new file mode 100644 index 00000000..b2c91ba4 Binary files /dev/null and b/工作日志/image/2021-04-06-23-28-22.png differ