首页 文章 精选 留言 我的

精选列表

搜索[笔记工具],共10000篇文章
优秀的个人博客,低调大师

Android开发问题笔记

1、Toolbar问题:最低版本15,必须使用support,才能使用Toolbar,Toobar是5.0引入的 2、BottomTab:这个用TabLayout解决了 3、后端API最好采用一个成熟的框架来做,比如Restful的Django-Rest-Framework,既可以简化IT设施层、又可以复用成熟的设计: 4、最后还是用Android Studio生成向导的TabLayout+ViewPager+PlaceFragment解决问题。 5、官网的Best Practice值得参考借鉴 6、采用OkHTTP做网络访问 7、采用Picasso做图片加载 8、采用ExpandListView做According:http://www.cnblogs.com/eyu8874521/archive/2012/08/16/2642605.htmlhttp://my.oschina.net/amigos/blog/62614 9、非动态调整的信息尽量在layout里面指明 10、代码Copy+粗心大意坑死人:出现问题应该先自己定位。 11、Android的UI设计思路不是做好UI套数据,而是由数据结构出UI结构,UI和数据通过Adapter在结构上匹配生成。所以本质上android不是拖拽式开发的界面设计,而是官方所宣称的MCV结构,类似于网页的MVT架构。 12、Android设计开发第一坑:布局 13、ListView子项的margin可以用devider来设置 14、调效果用手机,比模拟器快,调代码用模拟器,跟踪比真机方便。 15、要努力拉长App代码调试的时间周期,因为run一次的时间消耗不短。 16、通过沟通提高前后端联调效率的一个方法:对领域模型的设计要有专门的沟通通气会议。 17、AndroidSDK的本地安装文档,因为引用了远程文件的原因,可用性不是很好。 18、关键设计一定要有相关方审查步骤,比如数据模型、比如移动后端的API。 19、ListView里面不应该出现布局不一致的ListItem,这样就会导致ItemView的复用出现问题 20、Button可以用text显示,tag传值。 21、给RxJava传递的final参数可能需要copy复制才可以保证多线程读写问题,一般只有UI主线程和后台线程的情境下不需要 22、资源状态列表,这个信息可以从官方API指南找到: [html] view plain copyprint? <selectorxmlns:android="http://schemas.android.com/apk/res/android";> <item android:color="hex_color" android:state_pressed=["true"|"false"] android:state_focused=["true"|"false"] android:state_selected=["true"|"false"] android:state_active=["true"|"false"] android:state_checkable=["true"|"false"] android:state_checked=["true"|"false"] android:state_enabled=["true"|"false"] android:state_window_focused=["true"|"false"]/> </selector> 23、Fragment的onCreate用来初始化数据,onCreateView用来初始化界面,前者一般只执行一次,后者随界面切换多次执行,所以后者里面最好不要做数据加载,如果某些数据加载必须在界面初始化以后做,要加上首次执行条件判断。 24、TextView里可用的HTML标签,注意标签不能String资源里面直接写,直接写就被过滤掉了,但是写在代码的String变量里面可以,虽然不太符合Android开发规范,但是避免了字符转换,算是比较nice的解决方式。 [html] view plain copyprint? <ahref="..."> <b> <big> <blockquote> <br> <cite> <dfn> <divalign="..."> <em> <fontsize="..."color="..."face="..."> <h1> <h2> <h3> <h4> <h5> <h6> <i> <imgsrc="..."> <p> <small> <strike> <strong> <sub> <sup> <tt> <u> 25、onCreate、onStart里面对View做操作,View都可能还没有渲染成功,所以比如getHeight得到的可能是0,要确保view渲染以后代码执行,可以用view.post(runnable) 26、ListView显示不全,原因是AppbarLayout占了两行空间。把TabLayout移出AppbarLayout 27、为什么要用接口:没有基类的实现负担,实现基类的不同子类对象实例的灵活可换。丛某种角度讲:接口是静态类型语言非鸭式辨型导致的累赘。 28、Fragment的的资源新建初始化必须放在onCreate,放在onCreateView里面会导致重复调用,从而资源泄露。 29、has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here 这个问题的交互诱因是Activity退出的时候,其界面上的dialog还在显示,解决方法,覆盖相关组件的onDestroy方法,把dialog释放掉: [java] view plain copyprint? @Override publicvoidonDestroy(){ super.onDestroy(); if(mLoadingDialog!=null&&mLoadingDialog.isShowing()){ mLoadingDialog.dismiss(); } } 另外多说一句话,静态对象不能引用组件资源,否则会导致被引用的组件资源无法正常地被系统框架释放掉。 30、Android Studio 主题资源站:http://www.androidstudiothemes.com/ 31、一般来讲带反向应用的组件实例对象变量要在组件onDestroy的时候把这些变量都要释放掉(=null),至于静态变量最好不要有对组件的引用,也就是说有对组件有反向应用的对象变量最好不要做成静态的。一般有队组件有反向引用的对象主要是系统组件对象。 32、AVD虚拟机启动错误提示: [plain] view plain copyprint? emulator:WARNING:.//android/metrics/metrics_reporter_ga.c:138:curl_easy_perform()failedwithcode7(Error) emulator:WARNING:.//android/metrics/metrics_reporter_ga.c:145:GotHTTPresponsecode0 修改方法:Open the Android Studio->Preferences, go to Appearance & Behavior->System Settings->Usage Statistics, and uncheck "Send usage statistics to Google". Now the matrics_reporter will be disabled during emulator starting. 推荐出不出错误,都做此修改,不然虚拟机启动以后,Log老报这方面的连接错误。 33、Fragment的getView()在onCreateView这个函数执行之前是空的,所以onCreateView函数里面只能用自己inflate的view来做findViewbyID操作。 34、RxAndroid导致的空指针问题:一般网络数据爬取完,要操作Activity或者Fragment的资源来完成数据显示更新,但是由于网络访问和用户切换界面操作的时间差,当你做数据显示更新的时候,也许Activtiy或者fragment的资源已经不复存在由此导致NullPointer Error问题,可以通过操作这些资源之前做个空指针判断来解决这个问题。 35、Fragment的Context Activity空指针问题,由于API不同版本之间的不一致性,在Fragment的生存生命周期内,可能存在其Context Activity其实不存在或者被销毁,在这种情况下,如果要使用这个Actiity对象,也要做空指针判断。 36、对于Fragment的使用,《Android权威编程指南》曾经推荐尽量使用标准库里的Fragment,并且放弃使用FragmentActivity,转而使用标准库中的Activity类,放弃使用support.v4.app.fragment,转而使用app.fragment,放弃使用getSupportFragmentManager().转而使用getFragmentManager()方法 37、对于所有View的取其界面属性值的处理,比如getHeight,getWidth,都要用post异步化,因为做成同步,很容易是界面未正确渲染时的结果。 本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/5874621.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

android152 笔记 2

27.谈谈UI中, Padding和Margin有什么区别? Padding 文字对边框, margin是控件对父窗体. 28. widget相对位置的完成在activity的哪个生命周期阶段实现。控件的宽度和高度在oncreat()方法里面拿不到因为还没有创建出来,一般在onResume()方法里面去拿。也可以在控件的onmeasure() 计算方法里面去拿,燃料后调用ondraw方法去绘制。 这个题没看懂… widget可以理解成桌面小控件, 也可以理解成 某个button, imageview这样的控件… onmeasure() // 计算 控件在屏幕上的位子 某个view 要显示在界面 ondraw 被显示到界面上的 . 29. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。主线程里面有一个looper死循环迭代消息队列,消息里面有handler来处理消息。 30. AIDL的全称是什么?如何工作? Android interface definition language (android接口定义语言) , 用来跨进程的访问方法, 访问远程的服务的方法. 一个作为客户端一个作为服务端。Java里面的IDL是java的跨进程访问的方法。 aidl里面是接口,服务端里面有aidl文件,并且会生成对应的java文件,在onbind方法里面返回的binder对象实现了这个接口,客户端就会拿到实现了接口的对象,就可以调用对象里面的方法,客户端也会有aidl文件和对应的java文件。在传递复杂类型对象的时候要实现Pacelble接口。 如何工作 day7 queryStudent .手机卫士 Itelephony 接口挂断电话. 31. 请解释下Android程序运行时权限与文件系统权限的区别。 Android程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 打电话,访问网络,获取坐标,读写sd卡,读写联系人等..安装的时候会提示用户… drwx 文件系统的权限是linux权限. 比如说sharedpreference里面的Context.Mode.private Context.Mode.world_read_able Context.Mode_world_writeable 777自己 同组 其他 32. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面? 找到对应的浏览器的意图过滤器,传递数据URI , 激活这个意图 Intent intent = new Intent(); intent.setClassName(packageName, className); intent.seturi() 33. 对android主线程的运用和理解。 主ui线程不能执行耗时的操作, service,content provider,receive,activity这几个都是运行在主线程不能执行耗时的操作,activity5秒,receive10秒,service20秒,content provider5秒。 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5164982.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

多域间访问笔记

多域间访问 域树 子域 林 林的根域 Enterprise Admins(企业管理组)可以对活动目录中的整个林做修改 Schema Admins(架构管理组)可以对活动目录中的整个林做架构修改 创建林 在新林中新建域 创建子域 在现有林中新建域 多域控 在现有域中添加域控制器 创建林中域树 使用高级模式安装 新建域树根不是新子域 林中域之间的信任关系是默认创建 自动建立 传递信任 双向信任 林中跨域访问 AGDLP 将benet用户账户加入benet全局组 将benet全局组加入accp本地域组 给accp本地域组赋权限 林之间的信任分为:外部信任和林信任 外部信任是指在不同林的域之间创建不可传递的信任 创建外部信任前,在两个域的DNS设置条件转发器互相指向对方 Active Directory域和信任关系——accp.com域名——属性——信任——新建信任 建立林信任 提升域功能级别2003以上 Active Directory域和信任关系——域名——提升域功能级别 提升林功能级别2003以上 Active Directory域和信任关系——提升林功能级别 创建林信任 在两个域的DNS服务器上互相设置条件转发器,解析对方的地址 林间跨域访问 AGDLP 将被信任域账户加入被信任域全局组 将被信任域全局组加入信任域本地域组 给信任域本地域组赋权限 本文转自 jin626889 51CTO博客,原文链接:http://blog.51cto.com/zuoshou/1291882,如需转载请自行联系原作者

优秀的个人博客,低调大师

MyBatis For .NET学习笔记:开篇

本来打算在年前好好研究一下这个MyBatis 的ORM框架. 可是中间临时另有安排而不得已中断.目前开源的ORM框架已经太多了.其实在开源社区OSChina上可以看到已经成列各个语言/平台. 以前做过一段Java. 在.NET平台项目中叶也曾使用NHibernate和Spring.NET. 但大都是随着项目的完善提交而没有深入研究. 本篇作为MyBatis For .Net一个开篇.虽然使用过相关的ORM框架但对这个MyBatis了解甚少.. 也不知下面关于 MyBatis FOr .NEt这个主题上能写多少. 开源项目iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQLMaps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例. 现在我们能从IBATIS项目中能分别看到衍生出来两个不同的版本.Net和Java. 当然这也是得益于开源社区的力量: 在Google of Code代码托管库中 MyBatis 官网: MyBatis Web Site MyBatis For JAva on Google Code MyBatis For .NEt On Google Code 我大概Google一下相关的关于MyBatis中文资料相对比较少. 另外当你找到官方给你提供的相关Code Of Google上文档和代码实例你会发现Java和.Net版本之间的巨大差别. Java中Wiki文档提供相关源代码实例 已经相关文档说明.可惜的.NET上除了几句毫无意义的说明 基本上什么都没有了. 这对E文来说是一个”小挑战”. 相比我曾经用过的比较熟悉的NHibernate,MyBatis还是有自己突出的特点. 相信熟悉Nhibernate都应该知道, NHibernate对数据库结构提供了较为完整的一站式封装,代码自动生成,减少代码和sql的开发量,使开发人员摆脱开sql,ado.net和事务、缓存等底层. 而MyBatis相对Nhibernate 则体现 是在一种对ORM半自动化封装. 为何? MyBATIS需要开发人员自己来写sql语句,这可以增加了程序的灵活性,在一定程度上可以作为ORM的一种补充.其实这样封装模式在实际项目需求下对ORM本身来说灵活性更强. 架构设计人员应该结合自己的项目的实际情况,来选择使用不同的策略。MyiBATIS和NHibernate都做了映射,但iBATIS是把实体类和sql语句之间建立了映射关系,这种策略可以允许开发人员自己来写合适的sql语句,而NHibernate在实体类和数据库之间建立了映射关系,sql对于开发人员是不可见的,对于那些数据量非常大的应用,无法去优化sql语句. 类似 现在项目团队中正在开发一个项目CodeExplorer.采用Nhibernate.做数据访问层映射. 当没过一天我们提交自己代码进行测试,项目DBA会立马过来说:"哪个谁谁谁? 把一个PageFrom页面list数据检索修改一下 关联表太多. 性能参数太低." 你回应道:"这没法改! Nhibernate代码自动生成 SQL语句封装更是不可见的. 怎么改? " 这种情景其实在Nhibernate架构项目中几位常见. 这也是完整一站式封装所不能适应项目需求的地方 就是灵活性. 这点给我映像最深的是在一些信息查询系统 NhiberNate表现在对于多表连接查询,复杂的sql实现如果本身满足不了需求有可能需要借助其他方案来解决性能问题. 另外值得注意 的是我们往往在追究性能问题过多关注数据体现上.其实问题真正原因是在数据库结构设计上是否合理也是有很大关系. 可见对数据库模式有较高的要求.NHibernate需要数据库有良好的设计和比较完善的约束. 才能体现出Nhiernate完整封装的优势.而MyBaTis把SQL语句操作权从Nbiernate完整封装中重新交给了我们. 不知道还有人记得James Elliott的那句话, As good object-oriented developers got tired of this repetitive work, their typical tendency towards enlightened laziness started to manifest itself in the creation of tools to help automate the process. When working with relational databases, the culmination of such efforts were object/relational mapping tools. 本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/763806

优秀的个人博客,低调大师

Android学习笔记--广播机制

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.Adnroid的广播机制 2.BroadcastReceiver的作用 事件触发之后的一种解决方法 3.BroadcasrReceiver的编写方法 在AndroidManifest.xml中注册广播 <receiverandroid:name=".TextReceiver"> <intent-filter> <actionandroid:name="android.intent.action.EDIT"> </intent-filter> <receiver> 例://BroadcasrReceiver PublicclassTestReceiverextendsBroadcastReceiver{ PublicTestReceiver(){ System.out.println("TestReceiver"); } @override PublcvoidonReceive(Contextcontext,Intentintent){ System.out.println("OnReceiver"); //对象会被销毁TestReceiver } } Activity中的写法例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 PublicvoidonClick(Viewv){ TestReceivertr=newTestReceiver(); Intentintent=newIntent(); intent.setAction(Intent.ACTION_EDIT);//与AndroidManifest中的过滤内容对比 TestActivity.this.sendBroadcast(intent); } 4.BroadcastReceiver的生命周期 5. 注册BroadcastReceiver的方法 BroadcastReceiver用于监听被广播的事件(Intent)为了达到这个目的,BroadcastReceiver必须进行注册,以下是注册的两种方法 在应用程序的代码当中进行注册 注册BroadcastReceiver registerReceiver(receiver,filter) 取消注册 UnregisterReceiver(receiver); Activity中代码例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 //绑定广播事件 PublicvoidonClick(Viewv){ //生成receiver对象 smsReceiver=newSMSReceiver(); IntentFilterfilter=newIntentFilter(); filter.addAction(" android.provider.Telephony.SMS_RECEIVED" ); //注册广播事件 TestActivity.this.registerReceiver(smsReceiver,filter); } //接触广播事件 PublicvoidonClick(Viewv){ TextActicity.this.unregisterReceiver(smsReceiver); } PublicclassSMSReceiverextendsBroadcastReceiver{ @override PublicvoidonReceive(Contextcontext,Intentintent){ System.out,println("receivemessage"); //对接受的短消息进行处理 //接受Intent对象中的数据 Bundlebundle=Intent.getExtras(); //在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组 Object[]myObjects=(Object[])bundle.get("pdus"); //创建一个SmsMessage类型的数组 SmsMessage[]message=newSmsMessage(myObjects.length); System.out,println(message.length); For(inti=0;i<myObjects.length;i++){ //使用Object数组当中的对象创建SmsMessage对象 Message=SmsMessage.createFromPdu((byte[])myObjects); System.out,println(message.getDisplayMessageBody()); } } } 在AndroidManifest.xml中进行注册(不论应用程序的开启或关闭) <receiverandroid:name=".TestReceiver"> <intent-filter> <actionandroid:name="android,intent.action.PICK"> </intent-filter> <receiver> 6.Android内置的BroadcastActions 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360565,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--Activity初步

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.Activity的主要作用(UI)应用程序组件 创建一个activity类 创建Activity要点 a.一个activity就是一个类,并且这个类要继承activity b.需要从写onCreate方法(程序运行首先调用) c.在配置文件中注册每一个activity d.要为activity中添加必要的控件 e.对应布局文件一个布局文件对应一个activity 得到控件例findViewById(R.id.MyButton); 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360579,如需转载请自行联系原作者

优秀的个人博客,低调大师

2、权限、变量、for 学习笔记

ls 显示目录内容,不包含以点开头的文件 ls -a 显示目录内容,包含以点开头的文件 ls -l 长格式显示目录内容 ls -d 显示目录自身的信息,通常与-l同时使用 ls -r 逆序显示目录内容 ls -R 递归显示目录内容 ls -h 以易读的方式显示文件大小,通常与-l同时使用 ls -i 显示inode信息 tree 树状形式显示目录内容 alias 显示当前shell中定义的所有别名 alias 别名='原始命令' 定义别名 unalias 别名 删除命令别名 file FILE... 查看文件内容格式 cat -E FILE 显示行结束符 cat -v FILE 显示非打印字符 cat -e FILE 相当于-vE cat -n FILE 显示时给行按顺序编号 cat -s FILE 多个连续的空白行显示为一个空白行 head -# 显示文件顶部#行的内容 tail -# 显示文件尾部#行的内容 tail -#f 动态显示文件尾部#行的内容 echo命令的用法: echo -e "\033[##;##m string \033[0m" 第一个#: 3表示前景色,4表示背景色 第二个#:颜色,0-7 0 黑色 1 红色 2 绿色 3 黄色 4 蓝色 5 紫色 6 天蓝 7 白色 echo -e "\033[31;42;5m LINUX \033[0m" 效果:绿底红字闪烁 通配符: * 匹配任意长度的任意字符 ? 匹配任意单个字符 [] 匹配指定字符范围内的任意单个字符 [^] 匹配指定字符范围外的任意单个字符 [:upper:]] 所有大写字母 [:lower:]] 所有小写字母 [:alpha:]] 所有字母 [:digit:]] 0-9 [:alnum:]] 0-9及所有字母 [:space:]] 所有空白字符 [:punct:]] 所有标点符号 练习:复制/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位数字的文件或目录至/tmp下 cp -r /var/1*[0-9]*[a-z] /tmp 练习:如果符合条件是目录,也要复制; 1、复制/etc目录下以p开头,中间跟了任意字符,并以d结尾的文件至/tmp目录中; 2、复制/etc/目录下以p开头,中间跟了4个任意字符,并以d结尾的文件至/tmp/a目录中;如果a不存在,先创建出来; 3、复制/etc/目录下以任意一位数字开头,并以非数字结尾的文件至/tmp/b目录中; 4、复制/etc/目录下以非字母开头,后面跟了一个字母及其它任何长度字符的文件至/tmp/c目录中; 1、cp -r /etc/p*d /tmp 2、cp -r /etc/p????d /tmp/a 3、cp -r /etc/[0-9]*[^0-9] /tmp/b 4、cp -r /etc/[^[:alpha:]][[:alpha:]]* /tmp/c cp命令的长用选项: -r:递归 -d: 当源为链接文件时,复制链接文件本身而非指向的源文件 -p: 保持原有属性 mv: 移动文件,或重命名 rm: 移除文件 删除非空目录:# rm -rf stat FILE 显示文件或文件系统信息,包含(access、modify、change时间) touch FILE 创建空文件或修改文件时间信息 -c: 不创建空文件 -a: 仅修改访问时间 -m: 仅修改修改时间 -t STAMP: [CC]YYMMDDhhmm.ss 修改当前时间 /etc/passwd: 用户名:x:UID:基本组ID:comment信息:HOME:默认shell useradd: adduser -u UID:指定UID -g GID: 指定GID,即指定用户的基本组,但GID要事先存在 -G GID:指定用户的额外组,组要事先存在; -c "Comment": -d /path/to/somewhre: -s /path/to/shell: 指定默认shell,应该指定使用/etc/shells文件中出现的shell; -m: 创建用户时,强制给用户创建家目录; -M: 创建用户,但不创建家目录; -r: 创建系统用户 id: 1-499 不会为用户创建家目录 默认shell为/sbin/nologin groupadd GrpName -g GID: 创建组并为其指定GID 用户类别: 管理员:0 普通用户:1-65535 系统用户:1-499 登录用户:500+ 用户组: 管理员组 普通组 以用户为视角,组可为两类: 基本组: 显示在/etc/passwd中GID字段组,为用户的基本组; 额外组,附加组: /etc/group userdel: 删除用户, 默认会保留家目录 格式:userdel UserName -r: 一并删除家目录 设定用户密码: passwd 普通用户:passwd 管理员: 改自己密码:passwd 改其它用户密码:passwd UserName /etc/shadow文件的格式: UserName:加密的密码:最近一次密码修改时间:最短使用期限:最长使用期限:警告区间:非活动区间:帐号的过期期限:预留段 passwd -l UserName 锁用户 passwd -u UserName 解锁 设定组密码:gpasswd GroupName usermod: -u UID: -g GID: -G GID: 默认会覆盖原有的附加组;如果是添加,则同时使用-a选项; -c String: -d /path/to/New_Home: 默认不会迁移用户的家目录;如果要迁移,则同时使用-m -s SHELL: -l New_login_name: -L: 锁定用户帐号 -U: 解锁 如何修改组属性定义: groupmod: -g GID -n New_Group_Name: UserName:加密的密码:最近一次密码修改时间:最短使用期限:最长使用期限:警告区间:非活动区间:帐号的过期期限:预留段 修改帐号日期属性:chage -m 修改最短使用期限。为零时代表任何时候都可以更改密码 -M 修改最长使用期限。密码保持有效的最大天数 -W 修改警告区间。用户密码到期前,提前收到警告信息的天数 -I 修改非活动区间或停滞日期。如果一个密码已过期这些天,那么此帐号将不可用 -E 修改帐号的过期期限。过了这天,此帐号将不可用 查看用户相关信息id: id UserName -u: 显示UID,跟-n一起使用则显示用户名 -g: 显示基本组ID,跟-n一起使用则显示基本组名 -G: 显示所有组ID,跟-n一起使用则显示所有组名 su -l UserName 切换用户,且切换到该用户的家目录 练习: 1、创建一个用户mandriva,其ID号为2002,基本组为distro(组ID为3003),附加组为linux; # groupadd linux # groupadd -g 3003 distro # useradd -u 2002 -g distro -G linux mandriva 2、创建一个用户fedora,其全名为Fedora Community,默认shell为tcsh; # useradd -c "Fedora Community" -s /bin/tcsh fedora 3、修改mandriva的ID号为4004,基本组为linux,附加组为distro和fedora; # usermod -u 4004 -g linux -G distro,fedora mandriva 4、给fedora加密码,并设定其密码最短使用期限为2天,最长为50天; # passwd fedora # chage -m 2 -M 50 fedora 5、将mandriva的默认shell改为/bin/bash; # chsh -s /bin/bash mandriva Linux文件类型: 普通文件 - 目录 d 链接文件 l 字符设备 c 块设备 b 命名管道 p 套接字文件 s 权限:read, write, execute 用户不拥有某位权限,则使用 - 占位; 文件: r: 可以使用内容查看类的命令来显示其相关内容; w: 可以使用编辑器修改其内容; x: 可以将其发起一个进程; 目录: r: 可以使用ls命令查看目录内容的文件信息; w: 可以创建、删除文件; x: 可以使用ls -l命令查看目录内容的文件信息,并且可用cd命令切换此目录为工作目录; chmod命令: 操作三类用户的权限:使用8进制形式 chmod [-R] OCTAL-MODE file... -R可以递归修改目录下文件的权限 操作指定类别用户的权限:使用u,g,o,a来赋权,基于=或+/-来进行 u: 属主 g: 属组 o: 其它 a: 所有 =:操作指定类别用户的权限;u=, ug=, u=,g= +/-: 操作指定类别用户的单个权限: u-x, g+r, o-x, +x 参照其它文件的权限为当文件赋权 --reference=要参照的文件 要修改权限的文件 umask 创建文件:666-umask 文件默认决不允许出现执行权限,如何具有执行权限,则权限值加1; 创建目录:777-umask root用户的umask为022;用户名和基本组组名一致umask为002,否则umask为022; 修改文件的属主或属组:chown, chgrp -R: 递归 --reference= chown [option] UserName[{:|.}GroupName] file... 权限应用模型: 进程的属主,是否与文件的属主相同;如果相同,进程则以文件属主的权限来访问文件;否则 进程的属主所属的组,是否其中之一与文件的属组相同;如果相同,进程则以文件属组的权限来访问文件;否则, 进程则以文件的其它用户的权限来访问文件; 练习: 1、新建一个用户openstack,但不给其创建家目录;创建完成后使用su命令切换至此用户,查看其命令提示符及PATH和HOME两个环境变量的值; # useradd -M openstack # su - openstack # echo $PATH $HOME 2、复制/etc/skel目录为/home/openstack; # cp -r /etc/skel /home/openstack 3、改变/home/openstack及其内部文件的属主属组均为openstack; # chown -R openstack.openstack /home/openstack 4、/home/openstack及其内部的文件,属组和其它用户没有任何访问权限; # chmod -R go= /home/openstack # su - openstack # echo $PATH $HOME 练习: 完成以下任务: (1)新建系统组mysql;新建系统用户mysql,属于mysql组,要求其没有家目录且shell为/sbin/nologin; # groupadd -r mysql # useradd -r -s /sbin/nologin -g mysql mysql (2)新建GID为600的组magedu;新建用户gentoo,要求其家目录为/users/gentoo,密码同用户名; # groupadd -g 600 magedu # mkdir /users # useradd -d /users/gentoo gentoo # passwd gentoo (3)新建用户centos,其家目录为/users/centos,密码同用户名; # useradd -d /users/centos centos # passwd centos (4)新建用户www,其家目录为/users/www;删除www用户,但保留其家目录; # useradd -d /users/www www # userdel www (5)用户gentoo和centos均以magedu为其附加组; # usermod -a -G magedu gentoo # usermod -a -G magedu centos bash特性之六:bash的快捷键 Ctrl+a: 跳至命令行首 Ctrl+e: 跳至命令行尾 Ctrl+u: 删除命令行首至当前光标所在处的内容 Ctrl+k: 删除当前光标所有处至命令行尾的内容 Ctrl+l: 清屏,相当于clear命令 Ctrl+c: 取消或终止; Ctrl+z: 将当前命令送至后台,fg调回前台 ELF: #!/bin/bash 程序=指令+数据 变量: 弱类型语言: 1、不强制区分变量的类型,无论存储何种数据,均以字符格式进行; 2、无须事先声明;用到时,直接使用,直接赋值; bash: 动态编程语言,是弱类型语言; bash的特性之九:bash中的变量 变量的类型: 本地变量:只对当前shell进程有效,对其子shell以及其它shell都无效; 定义变量: [set]Var_Name="Value" 引用变量: ${Var_Name} 撤销变量: unset Var_Name 局部变量:仅对局部代码生效 local Var_Name="Value" 环境变量:对当前shell进程及其子shell都有效; export Var_Name="Value" 或 Var_Name="Value" export Var_Name 位置变量: $1, ..., $n ./first.sh 2 8 特殊变量: $0: 脚本名称自身 $?: 上一条命令的执行状态; 状态用数字来表示:0-255; 0: 成功 1-255: 失败 $$ $! $# 位置参数的个数 $* 所有的位置参数 变量的命名要求: 只能使用数字、字母和下划线组成; 不能以数字开头; 不能使用程序中的关键字; 见名知义;totalWeight set 环境变量:用来bash的工作特性,用于保存当前会话的属性信息; 显示所有环境变量:export, env, printenv 定义:export Var_Name="Value" PATH, PS1 bash的配置文件:持久保存用户配置 profile类:为交互式登录的用户提供配置 /etc/profile:全局 /etc/profile.d/*.sh:全局 ~/.bash_profile:个人配置,仅对当前用户有效 功能: 设定环境变量 运行命令或脚本 bashrc类:非交互工登录用户提供配置 /etc/bashrc: 全局 ~/.bashrc: 个人配置 功用: 设定本地变量 定义命令别名 登录类型: 交互式登录: 直接通过终端输入用户信息登录系统; su - UserName或su -l UserName; 非交互式登录: su UserName 图形界面的终端 执行脚本 新增配置的生效方式: 通知shell重读配置文件的命令: source (.) . FILE 重新登录 交互式登录用户: /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc 非交互式登录用户: ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh bash脚本:面向过程的编程中 顺序执行:默认法则,逐条执行各语句 选择执行:分支,条件判断,符合条件的分支予以执行; 循环执行:将同一段代码反复执行有限次,所以,循环必须有退出条件,否则将陷入死循环; for循环: for var_Name in 列表; do 语句1 语句2 ... done 语法错误检测: # bash -n 脚本文件 列表的生成方法: 生成数字序列:{start..end}、seq [start] [step] end 练习:写一个脚本,列出1-10的奇数 #!/bin/bash for num in `seq 1 2 10`; do echo $num done 练习:写一个脚本,用file命令显示/var/log目录下每个文件的内容类型; 提示:列表生成的方法为/var/log/* #!/bin/bash # dirName=/var/log for fileName in $dirName/*; do file $fileName done 练习:写一个脚本, 1、创建/tmp/scripttest目录,用变量保存目录名; 2、在目录里创建测试文件tfile1-tfile20; 3、创建用户testuser1和testuser2; 4、将tfile1-tfile10的属主和属组改为testuser1; 5、将tfile11-tfile20的属主和属组改为testuser2; #!/bin/bash dirName=/tmp/scripttest mkdir $dirName for fileNo in {1..20}; do touch $dirName/tfile$fileNo echo "Create $dirName/tfile$fileNo finished" done useradd testuser1 useradd testuser2 for fileNo in {1..10}; do chown testuser1:testuser1 $dirName/tfile$fileNo done for fileNo in {11..20}; do chown testuser2:testuser2 $dirName/tfile$fileNo done 文本处理类的命令:wc, word count wc [option] [file]... -l: 统计行数 -c: 统计字节数 -w;统计单词数 tr: 转换字符或删除字符 tr '集合1' '集合2' 将集合1替换为集合2 tr -d '字符集合' 删除字符集合 cut -d字符 -f# 操作对象 -d字符:指定分隔符 -f#: 指定要显示字段 单个数字:一个字段 逗号分隔的多个数字:指定多个离散字段 -:连续字段,如3-5; sort: 默认按字符进行比较 sort [option] file... -f: 忽略字符大小写; -n: 比较数值大小; -u: 重复的行,只显示一次; -t: 指定分隔符 -k: 指定分隔后进行比较字段 uniq: 移除重复的行 -c:显示每行重复的次数 -d:仅显示重复过的行 -u: 仅显示不曾重复的行 练习: 1、统计/bin、/usr/bin、/sbin和/usr/sbin等各目录中的文件个数; # ls /bin | wc -l 2、显示当前系统上所有用户的shell,要求,每种shell只显示一次; # cut -d: -f7 /etc/passwd | sort -u 3、取出/etc/passwd文件的第7行; # head -7 /etc/passwd | tail -1 4、显示第3题中取出的第7行的用户名; # head -7 /etc/passwd | tail -1 | cut -d: -f1 # head -7 /etc/passwd | tail -1 | cut -d: -f1 | tr 'a-z' 'A-Z' 5、统计/etc目录下以P或p开头的文件个数; # ls -d /etc/[Pp]* | wc -l 练习:写一个脚本,用for循环实现 显示/etc/init.d/functions、/etc/rc.d/rc.sysinit和/etc/fstab各有多少行; #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do wc -l $fileName done #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do lineCount=`wc -l $fileName | cut -d' ' -f1` echo "$fileName: $lineCount lines." done #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do echo "$fileName: `wc -l $fileName | cut -d' ' -f1` lines." done 练习:写一个脚本 将上一题中三个文件的复制到/tmp目录中; 用for循环实现,分别将每个文件的最近一次的修改时间改为2011年9月15号13点27分; #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do cp $fileName /tmp baseName=`basename $fileName` touch -m -t 201109151327 /tmp/$baseName done 练习:写一个脚本 显示/etc/passwd中第3、7和11个用户的用户名和ID号; #!/bin/bash # for lineNo in 3 7 11; do userInfo=`head -n $lineNo /etc/passwd | tail -1 | cut -d: -f1,3` echo -e "User: `echo $userInfo | cut -d: -f1`\nUid: `echo $userInfo |cut -d: -f2`" done for:通过使用一个变量去遍历给定列表中的每个元素,在每次变量赋值时执行一次循环体,直至赋值完成所有元素退出循环; 总结:生成列表的方式 1、直接给出列表; 2、使用文件名通配的机制生成列表 3、可以使用{}或seq命令生成数字序列 1, $lineCount `seq 1 $lineCount` {1..$lineCount} 4、使用命令生成 本文转自开源殿堂 51CTO博客,原文链接:http://blog.51cto.com/kaiyuandiantang/1934514,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--Service初步

1.Service是什么 是一个应用程序组件 没有图形化界面 通常处理一些耗时较长的操作 可以是使用service更新ContnetProvider.发送intnet以及启动系统的通知等等 2.Service不是什么 不是一个单独的进程 不是一个线程 3.Service生命周期 4.启动和停止Service的方法 服务例:publicclassFirstServiceextendsService{ @Override PublicIBinderonBind(Intentintent){ System.out.println("ServiceonBind"); Returnnull; } @Override PublicvoidonCreate(){ super.onCreate(); System.out.println("ServiceonCreate"); } //启动服务时方法 @Override PublicintonStartCommand(Intentintent,intflage,intstartId){ System.out.println("flags-->"+flags); System.out.println("startId-->"+startId); System.out.println("serviceonStartCommand"); ReturnSTART_NOT_STICKY; } @Override PublicvoidonDestroy(){ System.out.println("ServiceonDestroy"); super.onDestroy(); } } 在AndroidMnaifest.xml中注册服务:<serviceandroid:name=".FirstService"></service> 在Activity中调用Service例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 //启动服务 PublicvoidonClick(Viewv){ Intentintent=newIntent(); intent.setClass(Activity.this,FirstService.class); startService(intent); } //停止服务 PublicvoidonClick(Viewv){ Intentintent=newIntent(); intent.setClass(Activity.this,FirstService.class); stopService(intent); } 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360561,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--Scoket编程

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.什么是Socket Socket英文意为"插座" 所谓Scoket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄 应用程序通常通过"套接字"向网络发出请求或者应答网络请求 2.Socket基本通信模型 3.使用基于TCP协议的Socket ServerSocketActivity代码例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 PublicvoidonClick(Viewv){ NewServerThread().start(); } //TCPserver ClassServerThreadextendsThread{ Publicvoidrun(){ //声明一个serverSocket对象 ServerSocketserverSocket=null; Try{ //创建serverSocket对象并在4567端口监听 serverSocket=newServerSocket(4567); //调用serverSocket的accept方法,接受客户端所发送的请求 Socketsocket=serverSocket.accept();//阻塞函数 //从socket当中得到inputstream对象 InputStreaminputStream=socket.getInputStream(); Bytebuffer[]newbute[1024*4]; Inttemp=0; //从inputStream当中读取客户端所发送的数据 While((temp=inputStream.read(buffer))!=-1){ System.out,println(newString(buffer,0,temp)); } }catch(Execptione){ e.printStackTrace(); }finally{ Try{ serverSocket.close(); }catch(IOExecptione){ e.printStackTrace(); } } } } TCPClient代码例: Publicstaticvoidmain(String[]args){ Try{ //创建一个Socket对象,指定服务器端的ip地址和端口号 Socketsocket=newSocket("192.168.1.1",4567); //使用InputStream读取硬盘上的文件 InputStreaminputStream=newFileInputStream("F://file/words.txt"); //从Socket上得到outputStream outputStreamoutputStream=socket.getOutputStream(); Bytebuffer[]=newbyte[4*1024]; Inttemp=0; //将inputStream的数据取出并写入到outputStream While((temp=inputStream.read(buffer))!=-1){ outputStream.write(buffer,0,temp); } outpurStream.flush(); }catch(Execptione){ e.printStackTrace(); } } //UDPServer ClassServerThreadextendsThread{ Publicvoidrun(){ Try{ //创建一个DatagramSocket对象,并制定监听端口号 DatagramSocketsocket=newDatagramSocket(4567); Bytedata[]=newbyte[1024]; //创建一个空的DatagramPacket对象 DatagramPacketpacket=newDatagramPacket(data,data.length); //使用receive方法接受客户端所发送的数据 Socket.receive(packet);//阻塞方法 Stringresult=newString(packet.getData(),packet.getOffset(),packet.getLength());//设置数据偏移量,得到该次数据的长度 System.out.println("result-->"+result); }catch(Execptione){ e.printStackTrace(); } } } //UDPClient Publicstaticvoidmain(String[]args){ Try{ //创建一个DatagramSocket对象,并制定监听端口号 DatagramSocketsocket=newDatagramSocket(456 7); InetAddressserverAddress=InetAddress.getByName("192.168.1.1"); Stringstr="hello"; Bytedata[]=str.getBytes(); DatagramPacketpacket=newDatagramPacket(data,data.length,serverAddress,4567); Socket.send(packet); }catch(Execptione){ e.printStackTrace(); } } 4.使用基于UDP协议的Socket 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360562,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--程序调试

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.DDMS的使用 LogCat的VerboseDebugInfoWarningError的功能 增加过滤器createfilter=>system.out 通过fileexplorer功能实现文件的取出,放入 2.常见程序调试 A)多多查看DDMS的log和java中的方式相同 B)使用Log类输出各类信息 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360570,如需转载请自行联系原作者

优秀的个人博客,低调大师

Redis自学笔记 --string类型

string类型 set 赋值 get 取值 setnx 先判断是否存在,不存在赋值,存在返回0 setrange 设置指定key的value值的子字符串赋值。 第一个字符为0,数字6代表从第6个开始修改,20代表字符串长度。 mset 一次设置多个key的赋值 msetnx 一次设置多个key的赋值,先判断是否存在,不存在赋值,存在返回0,若其中任何一个存在的话,全部都赋值不成功 。 getset 设置key的值,并返回key的旧值 getrang 获取key的alue值的子字符串。 mget 一次可以获取多个key的值。 incr 对key的值做加操作,并且返回新的值 incrby 同incr相似,加指定值,key不存在的时候会设置key,并认为原来的value是0 decr 与incre相似,最减法操作 decrby 与incrby相似,减去指定值 append 给指定key的字符串追加value strlen 取指定key的value值的长度 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3583686.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

MongoDB学习笔记(一)--基础

Insert MongoDB在执行插入时,首先会将插入的数据转换成BSON格式。然后MongoDB数据库会对BSON进行解剖,并检查是否存在_id建。 >doc = { "_id" : 1, "author" : "yyd", "title" : "MongoDB Test", "text" : "this is a test", "tags" : [ "love", "test" ], "comments" : [ { "author" : "yyd_guest", "comment" : "yes" }, { "author" : "yyd_admin", "comment" : "no" } ] } > db.yyd.insert(doc); Query 全部查找 返回除了 tags 字段外的所有字段 返回 tags = test 除了 comments 的所有列 返回 id=1 的 title 字段 <, <=, >, >= 大于 $gt、小于 $lt、大于等于 $gte、小于等于 $lte $all $all 操作类似$in 操作,但是不同的是,$all 操作要求数组里面的值全部被包含在返回的记录里面。 $exists $exists 操作检查一个字段是否存在。 $exists:true代表返回存在这个键的值。 $exists:false代表返回不存在这个键的值。 $mod > db.user.find("this._id%2==1"); > db.user.find({_id:{$mod:[2,1]}}); 两句话一样的效果。 $ne $ne 意思是 not equal,不等于。 $in $in 操作类似于传统关系数据库中的 IN。 $nin $nin 跟$in 操作相反。 $or $nor $nor 跟$or 相反。 $size $size 操作将会查询数组长度等于输入参数的数组。 skip 跳过前 2 条记录。 limit 每页返回 3 条记录 sort() sort()方法对返回记录集按照指定字段进行排序返回,1 表示升序,-1 表示降序。 count() count()方法返回查询记录的总数目。 Remove Update update() db.collection.update( criteria, objNew, upsert, multi ) 参数说明: Criteria:用于设置查询条件的对象 Objnew:用于设置更新内容的对象 Upsert:如果记录已经存在,更新它,否则新增一个记录 Multi:如果有多个符合条件的记录,全部更新 注意:默认情况下,只会更新第一个符合条件的记录 save() 如果存在更新它,如果不存在,新增记录。 $inc 增加1,对int等有效。 对一个_id=3 的 user 的年龄进行加 1,两种方法。 $set { $set : { field : value } } 把 field 的值设置成 value,当 field 不存在时,增加一个字段,类似 SQL 的 set 操作,value 支持所有类型。 $unset { $unset : { field : 1} } 删除给定的字段 field。 $push { $push : { field : value } } 如果 filed 是一个已经存在的数组,那么把 value 追加给 field; 如果 field 原来不存在,那么新增 field 字段,把 value 的值赋给 field; 如果 field 存在,但是不是一个数组,将会出错。 $pushAll { $pushAll : { field : value_array } } 功能同$push,只是这里的 value 是数组,相当于对数组里的每一个值进行$push操作。 $addToSet { $addToSet : { field : value } } 如果 filed 是一个已经存在的数组,并且 value 不在其中,那么把 value 加入到数组; 如果 filed 不存在,那么把 value 当成一个数组形式赋给 field;$pop 如果 field 是一个已经存在的非数组类型,那么将会报错。 $pop { $pop : { field : 1 } } 删除数组中最后一个元素 { $pop : { field : -1 } } 删除数组中第一个元素 $pull { $pull : { field : _value } } 如果 field 是一个数组,那么删除符合_value 检索条件的记录; 如果 field 是一个已经存在的非数组,那么会报错。 $pullAll { $pullAll : { field : value_array } } $rename { $rename : { old_field_name : new_field_name } 重命名指定的字段名称。 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3557414.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册