首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Docker学习笔记-- 如何使用Dockerfile构建镜像

Dockerfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。 1. Dockerfile的书写规则及指令使用方法 Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。 Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。 (1)FROM(指定基础image) 构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。该指令有两种格式: FROM<image> 指定基础image为该image的最后修改的版本。或者 FROM<image>:<tag> 指定基础image为该image的一个tag版本 (2)MAINTAINER(用来指定镜像创建者信息) 构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。格式: MAINTAINER<name> (3)RUN(安装软件用) 构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。该指令有两种格式: RUN<command>(thecommandisruninashell-`/bin/sh-c`) RUN["executable","param1","param2"...](execform) (4)CMD(设置container启动时执行的操作) 设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。该指令有三种格式: CMD["executable","param1","param2"](likeanexec,thisisthepreferredform) CMDcommandparam1param2(asashell) 当Dockerfile指定了ENTRYPOINT,那么使用下面的格式: CMD["param1","param2"](asdefaultparameterstoENTRYPOINT) ENTRYPOINT指定的是一个可执行的脚本或者程序的路径,该指定的脚本或者程序将会以param1和param2作为参数执行。所以如果CMD指令使用上面的形式,那么Dockerfile中必须要有配套的ENTRYPOINT。 (5)ENTRYPOINT(设置container启动时执行的操作) 设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。两种格式: ENTRYPOINT["executable","param1","param2"](likeanexec,thepreferredform) ENTRYPOINTcommandparam1param2(asashell) 该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。 #CMD指令将不会被执行,只有ENTRYPOINT指令被执行 CMDecho“Hello,World!” ENTRYPOINTls-l 另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数。 FROMubuntu CMD["-l"] ENTRYPOINT["/usr/bin/ls"] (6)USER(设置container容器的用户) 设置指令,设置启动容器的用户,默认是root用户。 #指定memcached的运行用户 ENTRYPOINT["memcached"] USERdaemon 或 ENTRYPOINT["memcached","-u","daemon"] (7)EXPOSE(指定容器需要映射到宿主机器的端口) 设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。格式: EXPOSE<port>[<port>...] #映射一个端口 EXPOSEport1 #相应的运行容器使用的命令 dockerrun-pport1image #映射多个端口 EXPOSEport1port2port3 #相应的运行容器使用的命令 dockerrun-pport1-pport2-pport3image #还可以指定需要映射到宿主机器上的某个端口号 dockerrun-phost_port1:port1-phost_port2:port2-phost_port3:port3image 端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口。 (8)ENV(用于设置环境变量) 构建指令,在image中设置一个环境变量。格式: ENV<key><value> 设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:ENV JAVA_HOME /path/to/java/dirent (9)ADD(从src复制文件到container的dest路径) 构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。格式: ADD<src><dest> <src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;<dest> 是container中的绝对路径 (10)VOLUME(指定挂载点)) 设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。格式: VOLUME["<mountpoint>"] FROMbase VOLUME["/tmp/data"] 运行通过该Dockerfile生成image的容器,/tmp/data目录中的数据在容器关闭后,里面的数据还存在。例如另一个容器也有持久化数据的需求,且想使用上面容器共享的/tmp/data目录,那么可以运行下面的命令启动一个容器: dockerrun-t-i-rm-volumes-fromcontainer1image2bash container1为第一个容器的ID,image2为第二个容器运行image的名字。 (11)WORKDIR(切换目录) 设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。格式: WORKDIR/path/to/workdir #在/p1/p2下执行vima.txt WORKDIR/p1WORKDIRp2RUNvima.txt (12)ONBUILD(在子镜像中执行) ONBUILD<Dockerfile关键字> ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。详细资料可参考https://www.dockboard.org/docker-quicktip-3-onbuild 2. 创建Dockerfile,构建jdk+tomcat环境 Dockerfile文件 #Pullbaseimage FROMubuntu:13.10 MAINTAINERzingwang"zing.jian.wang@gmail.com" #updatesource RUNecho"debhttp://archive.ubuntu.com/ubuntuprecisemainuniverse">/etc/apt/sources.list RUNapt-getupdate #Installcurl RUNapt-get-yinstallcurl #InstallJDK7 RUNcd/tmp&&curl-L'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz'-H'Cookie:oraclelicense=accept-securebackup-cookie;gpw_e24=Dockerfile'|tar-xz RUNmkdir-p/usr/lib/jvm RUNmv/tmp/jdk1.7.0_65//usr/lib/jvm/java-7-oracle/ #SetOracleJDK7asdefaultJava RUNupdate-alternatives--install/usr/bin/javajava/usr/lib/jvm/java-7-oracle/bin/java300 RUNupdate-alternatives--install/usr/bin/javacjavac/usr/lib/jvm/java-7-oracle/bin/javac300 ENVJAVA_HOME/usr/lib/jvm/java-7-oracle/ #Installtomcat7 RUNcd/tmp&&curl-L'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz'|tar-xz RUNmv/tmp/apache-tomcat-7.0.8//opt/tomcat7/ ENVCATALINA_HOME/opt/tomcat7 ENVPATH$PATH:$CATALINA_HOME/bin ADDtomcat7.sh/etc/init.d/tomcat7 RUNchmod755/etc/init.d/tomcat7 #Exposeports. EXPOSE8080 #Definedefaultcommand. ENTRYPOINTservicetomcat7start&&tail-f/opt/tomcat7/logs/catalina.out tomcat7.sh exportJAVA_HOME=/usr/lib/jvm/java-7-oracle/ exportTOMCAT_HOME=/opt/tomcat7 case$1in start) sh$TOMCAT_HOME/bin/startup.sh ;; stop) sh$TOMCAT_HOME/bin/shutdown.sh ;; restart) sh$TOMCAT_HOME/bin/shutdown.sh sh$TOMCAT_HOME/bin/startup.sh ;; esac exit0 我已经把这些文件上传到了Githubhttps://github.com/agileshell/dockerfile-jdk-tomcat.git 3. 构建镜像 脚本写好了,需要转换成镜像: dockerbuild-tzingdocker/jdk-tomcat. dockerrun-d-p8090:8080zingdocker/jdk-tomcat 默认情况下,tomcat会占用8080端口,刚才在启动container的时候,指定了 -p 8090:8080,映射到宿主机端口就是8090。 http://<host>:8090host为主机IP 参考 Docker - Reference - Dockerfilehttp://docs.docker.com/reference/builder/http://www.blogjava.net/yongboy/archive/2013/12/16/407643.html一些例子http://dockerfile.github.io/https://github.com/Toub/toub-docker-tomcat8-java8-auto-deployhttps://github.com/eugeneware/docker-wordpress-nginxhttps://github.com/gemnasium/rails-meets-docker 本文转自 Mr_sheng 51CTO博客,原文链接:http://blog.51cto.com/sf1314/1979301

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

学习ophone里使用sqlite3

写得很辛苦,大家觉得好的话请多多回帖支持我,有时间会发布第二篇 演示环境 Windows xp Eclipse 3.4.2 Ophone SDK 1.0 一、 创建工程 在Eclipse里 File->new->Android project->输入工程名sqlite_demo等等如下图:->点击完成 二、建立数据库连接类 在src下oms.sqlite_demo下新建DBHelper类 写代码如下 /*classDBHelpercodestart*/ packageoms.sqlite_demo; importandroid.content.Context; importandroid.database.sqlite.SQLiteDatabase; importandroid.database.sqlite.SQLiteOpenHelper; importandroid.database.sqlite.SQLiteDatabase.CursorFactory; importandroid.util.Log; /** *数据库连接类 * *@authoryifangyou2010-01-15 * */ publicclassDBHelperextendsSQLiteOpenHelper{ privatestaticSQLiteDatabasedb=null; /** *连接数据库,数据库不存在则创建 * *@paramContextcontext,内容上限文 *@paramStringdbname,数据库名字 *@paramCursorFactoryfactory,数据库游标 *@paramintversion,数据库版本 *@returnSQLiteDatabase返回数据库操作类 */ publicDBHelper(Contextcontext,Stringdbname,CursorFactoryfactory, intversion){ super(context,dbname,factory,version); } /** *连接数据库,数据库不存在则创建 * *@returnSQLiteDatabase返回数据库操作类 */ publicSQLiteDatabasegetconnect(){ if(db==null){ db=this.getWritableDatabase(); } returndb; } /** *断开数据库连接 * *@returnvoid */ publicvoidclose(){ if(db!=null){ db.close(); } } @Override publicvoidonCreate(SQLiteDatabasearg0){ } @Override publicvoidonUpgrade(SQLiteDatabasearg0,intarg1,intarg2){ } } /*classDBHelpercodeend*/ 三、操作数据库 在sqlite_demo.java里的代码如下 packageoms.sqlite_demo; importandroid.app.Activity; importandroid.database.Cursor; importandroid.database.sqlite.SQLiteDatabase; importandroid.os.Bundle; importandroid.util.Log; publicclasssqlite_demoextendsActivity{ privatefinalStringDB_NAME="testdb"; privatefinalStringTABLE_NAME="student"; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); DBHelperdbh=newDBHelper(this.getBaseContext(),DB_NAME,null,1); SQLiteDatabasedb=dbh.getconnect(); createTable(db); queryTable(db); dbh.close(); } publicvoidcreateTable(SQLiteDatabasedb){ db.execSQL("CREATETABLEIFNOTEXISTS"+TABLE_NAME+"(" +"stud_no"+"TEXT," +"stud_name"+"TEXT" +");"); Stringsql_1="insertinto"+TABLE_NAME+"(stud_no,stud_name)values('S777','LilyChang');"; Stringsql_2="insertinto"+TABLE_NAME+"(stud_no,stud_name)values('S888','LindaLin');"; Stringsql_3="insertinto"+TABLE_NAME+"(stud_no,stud_name)values('S999','BruceWang');"; db.execSQL(sql_1);db.execSQL(sql_2);db.execSQL(sql_3); } publicvoidqueryTable(SQLiteDatabasedb){ Stringstr="select*from"+TABLE_NAME; Cursorc=db.rawQuery(str,null); Log.v("loginactive","查询记录"); Log.v("loginactive",String.valueOf(c.getCount())); if(c!=null){ c.moveToFirst(); while(!c.isLast()){ Log.v("loginactive","outp."); Stringstud_no=c.getString(0); Stringstud_name=c.getString(1); System.out.println(stud_no+"---------------"+stud_name); Log.v("loginactive",stud_no+"---------------"+stud_name); c.moveToNext(); } } } } 四、启动DDMS 在eclipse里 Window->New Perspective->DDMS 五、运行 选择">"里的run configure->如下图填完后->apply->run 六、查看结果 点击run后马上点击右上角的DDMS就能在log里看到结果 七、命令行下查看数据库 Cd $OPHONE_HOME/tools adb pull /data/data/oms.sqlite_dmoe/databases/testdb test.db sqlite3 test.db 本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/603509,如需转载请自行联系原作者

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

学习笔记-Linux系统基础知识2

shell GUI :graphic User Interface x-window CS架构 Gnome KDE Xface CLI: Command Line Interface sh bash csh ksh zsh tcsh dll: Dynamic Link Library .so: shared object login: 用户名:用户ID 认证机制: Authentication 授权:Authorization 审计:Audition(日志) prompt:命令提示符 命令: magic number:魔数 标识二进制命令执行的格式 Linux上的Shebang符号(#!) #!/bin/bash # command option arguments 短选项 - 长选择 -- arguments 作用对象 option 执行方式 有些选项可以带参数 目录:文件,路径映射 路径:从指定起始点到目的地所经过的路径 层次化文件管理的机制 File System Filesystem Hierarchy Standard(文件系统层次化标准)FHS FHS定义了系统中每个区域的用途、所需要的最小构成的文件和目录, 同时还给出了例外处理与矛盾处理 最顶级的/ ls:列出list pwd:Print Working Directory 文件类型: -:普通文件 d:目录文件 c:字符设备文件(character) b:块设备文件(block) l:符号连接文件(sysbolic link file)软连接 p:命令管道(pipe) s:套接字文件(socket) Xshell 远程登录工具 文件权限:9位 每3位一组,rwx 文件硬链接的次数 文件的属主(owner) 文件的属组(group) 文件大小(size) 单位是字节 时间戳(timestamp)最近一次被修改的时间(共有3个时间戳) 访问(access) 修改(modify)文件的内容发生了改变 改变(change),metadata,元数据,文件的属性 ls 指令 -h(human人类识别) :做单位转换 -a(all)显示以.开头的隐藏文件 (蓝色表示目录) -A :除..和.外的所有文件 -d : 显示目录自身属性 -i : 显示文件的索引节点号 index node(inode) -r : 逆序显示 -R :递归(recursive)显示 cd: change directory 家目录,主目录,home directory cd ~ 回到家目录 cd ~USERNAME 进入指定用户的家目录 cd - :当前目录和前一次所在的目录之间来回切换 命令类型: 内置命令(shell内置) 外部命令:在文件系统的某个路径下有一个与命令名称相应的可执行文件 环境变量:命名的内存空间 printenv 显示环境变量 PATH :使用冒号隔开的一堆路径 type:显示指定属于哪种类型 hash(hash表,键值对):缓存,记录缓存记录使用过的命令,次数和路径 o(1)速度级别 缓冲是实现系统加速的 本文转自飞行萌51CTO博客,原文链接:http://blog.51cto.com/8527508/1937448 ,如需转载请自行联系原作者

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

马哥运维学习作业(五)

1、显示当前系统上root、fedora或user1用户的默认shell; 1 2 3 4 5 6 [root@C7-1~] #useraddfedora#新建用户fedora [root@C7-1~] #useradduser1#新建用户user1 [root@C7-1~] #egrep'^(root|fedora|user1)\>'/etc/passwd|cut-d:-f1,7#由于(root|fedora|user1)是扩展表达式,所以要使用egrep或grep-E root: /bin/bash fedora: /bin/bash user1: /bin/bash 注:^(root|fedora|user1)\>表示以这三个用户开头的行。cut -d: -f1,7表示以:为分隔符,取第1和第7字段,这二个字段是用户名和shell的。 图示: 2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello(); 1 2 3 4 [root@C7-1~] #egrep-o"^[_[:alpha:]]+\(\)"/etc/rc.d/init.d/functions checkpid() __pids_var_run() ....略 注:根据题目要求,文件中__pids_var_run()也是符合要求的,^[_[:alpha:]]+中,_不能省掉,代表以_或大小写字母开头,+表示前面字符可以出现一次或多次,\(\)是使用转义符来代表小括号() 图示: 3、使用echo命令输出一个绝对路径,使用grep取出其基名; 1 2 3 4 5 6 [root@ cat ~] #echo"/mnt/sdc"|grep-E"[^/]+$"#行尾的字符串[^/]除了/斜线的任意内容,+代表这个/至少出现1次 /mnt/sdc [root@ cat ~] #echo"/mnt/sdc/"|grep-E"[^/]+/?$"#如果sdc后还带一个/,就用/?表示可以出现1次或不出现 /mnt/sdc/ [root@ cat ~] #echo"/mnt/sdc"|grep-E-o"[^/]+/?$"|cut-d"/"-f1#-o只显示匹配的,以/作为分隔符,取第1字段,取出sdc sdc 扩展:取出其路径名 1 2 [root@ cat ~] #echo"/mnt/sdc/test"|grep-o"/.*/"#取出路径名,"/.*/"表示以/开头后面可出现任意长度任意字符,以/结尾,这样就符合路径名的规则。 /mnt/sdc/ 图示: 4、找出ifconfig命令结果中的1-255之间数字; 1 2 3 4 5 6 [root@C7-1~] #ifconfig|grep-E-o"\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>" 192 168 2 127 ...略 图示: 5、挑战题:写一个模式,能匹配合理的IP地址; 1 2 3 4 5 6 7 8 [root@ cat ~] #catip#手动写了几个IP地址,有对有错,用下面的条件来筛选 980.168.88.66 192.168.88.255 253.252.251.0 192.168.2.60 255.0.0.690 [root@ cat ~] #grep-E"\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>"ip 192.168.2.60 6、挑战题:写一个模式,能匹配出所有的邮件地址; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@note1~] #cat/tmp/mail#编写了6个邮箱地址,其中4、5不符合邮箱命名规范 [root@c7-1~] #catmail 342076957@qq.com zhaodongwei@zhaodongwei.cn dongwei_zhao@cmdmedia.cn _dongwei@cmd.cn liupeng@_dfdfd.com zjj.d@baidu.com [root@c7-1~] #egrep-o"[[:alnum:]]+[[:punct:]]*[[:alnum:]]*@[[:alnum:]]+.[[:alnum:]]*.?[[:alnum:]]*"mail 342076957@qq.com zhaodongwei@zhaodongwei.cn dongwei_zhao@cmdmedia.cn dongwei@cmd.cn zjj.d@baidu.com 注:首先,咱们要了解邮箱地址的构成,简单来说,是由:用户名@域名 构成。用户名命名要求:可使用字母、数字、下划线,开头可以使用数字或字母(QQ邮箱就是数字开头)域名命名要求:可使用字母、数字、下划线组成,不能使用特殊字母开头等详细的介绍请看下图:分别是新浪、163邮箱命令介绍。阿里域名的命名介绍 图示: 7、查找/var目录下属主为root,且属组为mail的所有文件或目录; 1 2 3 4 [root@c7-1~] #find/var-userroot-groupmail /var/spool/mail [root@c7-1~] #find/var-userroot-groupmail-ls#-ls是将查找到的文件显示出来 1343212080drwxrwxr-x2rootmail167月3105:06 /var/spool/mail 图示: 8、查找当前系统上没有属主或属组的文件; 1 2 3 4 5 [root@C7-1~] #find/-nouser-o-nogroup-ls#用-nouser-o-nogroup表示没有属 find :‘ /proc/16897/task/16897/fd/6 ’:没有那个文件或目录 find :‘ /proc/16897/task/16897/fdinfo/6 ’:没有那个文件或目录 find :‘ /proc/16897/fd/6 ’:没有那个文件或目录 find :‘ /proc/16897/fdinfo/6 ’:没有那个文件或目录 进一步:查找当前系统上没有属主或属组,且最近3天内曾被访问过的文件或目录; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 为了方便演示,创建了一个user1的用户,并用user1创建了一个文件,然后删除user1 [user1@C7-1~]$ touch /tmp/b #在user1用户下创建/tmp/b文件 [user1@C7-1~]$ll /tmp/b #查看属主和属组,属于user1 -rw-rw-r--.1user1user109月521:24 /tmp/b [user1@C7-1~]$登出 [root@C7-1~] #登出 [root@C7-1 test ] #登出 [root@C7-1~] #登出 Lastlogin:MonSep521:23:452016 [root@C7-1~] #userdeluser1#退出后,删除user1用户 [root@C7-1~] #iduser1#user1用户已删除 id :user1:nosuchuser [root@C7-1~] #ls-l/tmp/#b文件属主和属组已变为数字 总用量4 -rw-r--r--.1rootroot289月201:2712 -rw-rw-r--.12023202309月521:24b 方法一: [root@note1~] #find/-nouser-a-nogroup-a-atime-3#-atime-3表示3天没有访问过的文件,查找到了b和user1用户下的文件 find :‘ /proc/16901/task/16901/fd/6 ’:没有那个文件或目录 find :‘ /proc/16901/task/16901/fdinfo/6 ’:没有那个文件或目录 find :‘ /proc/16901/fd/6 ’:没有那个文件或目录 find :‘ /proc/16901/fdinfo/6 ’:没有那个文件或目录 /tmp/b /home/tom /home/user1 /home/user1/ .bash_logout /home/user1/ .bash_profile /home/user1/ .bashrc /home/user1/ .bash_history 方法二: [root@C7-1~] #find/\(-nouser-o-nogroup\)-a-atime-3#也可以这样用 find :‘ /proc/16901/task/16901/fd/6 ’:没有那个文件或目录 find :‘ /proc/16901/task/16901/fdinfo/6 ’:没有那个文件或目录 find :‘ /proc/16901/fd/6 ’:没有那个文件或目录 find :‘ /proc/16901/fdinfo/6 ’:没有那个文件或目录 /tmp/b /home/tom /home/user1 /home/user1/ .bash_logout /home/user1/ .bash_profile /home/user1/ .bashrc /home/user1/ .bash_history 图示: 9、查找/etc目录下所有用户都有写权限的文件; 1 2 3 4 5 [root@c7-1~] #find/etc-perm-222-ls#所有用户都有写权限用-perm-222表示 335545640lrwxrwxrwx1rootroot179月500:00 /etc/mtab -> /proc/self/mounts 336897120lrwxrwxrwx1rootroot499月500:01 /etc/pki/tls/certs/ca-bundle .crt-> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle .pem 336897130lrwxrwxrwx1rootroot559月500:01 /etc/pki/tls/certs/ca-bundle .trust.crt-> /etc/pki/ca-trust/extracted/openssl/ca-bundle .trust.crt ...略 10、查找/etc目录下大于1M,且类型为普通文件的所有文件; 1 2 3 [root@c7-1~] #find/etc-size+1M-typef-ls#大于1MB用-size+1M表示 342884416824-r--r--r--1rootroot69848329月500:05 /etc/udev/hwdb .bin 677968023772-rw-r--r--1rootroot385892411月212015 /etc/selinux/targeted/policy/policy .29 11、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的文件; 1 2 [root@c7-1~] #find/etc/init.d-perm-113-ls#用户都有执行,其它用户有写权限用-perm-113表示 336884510lrwxrwxrwx1rootroot119月500:01 /etc/init .d->rc.d /init .d 12、查找/usr目录下不属于root、bin或hadoop的文件; 1 2 3 4 [root@c7-1~] #find/usr-not\(-userroot-o-userbin-o-userhadoop\)-ls#-not放在()外面,对里面的内容,即不也不又不,做条件 674247010drwx------2polkitdroot66月102014 /usr/share/polkit-1/rules .d [root@c7-1~] #find/usr!\(-userroot-o-userbin-o-userhadoop\)-ls#-not和!是同样的意思 674247010drwx------2polkitdroot66月102014 /usr/share/polkit-1/rules .d 13、查找/etc/目录下至少有一类用户没有写权限的文件; 1 2 3 4 [root@c7-1~] #find/etc-not-perm-222-ls#至少一类用户没有写权限用-perm-222表示 3355456112drwxr-xr-x76rootroot81929月504:04 /etc 335545624-rw-r--r--1rootroot4659月500:00 /etc/fstab ....略 14、查找/etc目录下最近一周内其内容被修改过,且不属于root或hadoop的文件; 1 2 3 4 5 6 7 8 9 10 [root@note1~] #ll/etc/test123#默认没有满足条件的文件,所以先在/etc下创建一个test123的文件,查看其属主和属组都是root -rw-r--r--1rootroot0Sep116:00 /etc/test123 [root@note1~] #useraddtest#创建一个test用户,用来把上面文件属主属组都改为test [root@note1~] #chowntest.test/etc/test123#把/etc下的test123改为属主属组root [root@note1~] #ll/etc/test123#已改为root -rw-r--r--1 test test 0Sep116:00 /etc/test123 [root@note1~] #find/etc-mtime-7-a-not-userroot-not-userhadoop#根据题目要求查看,-mtime-7表示7天没修改过 /etc/test123 [root@note1~] #find/etc-mtime-7-not\(-userroot-o-userhadoop\)-ls#-not放外面对里面来做判断,不属于root和hadoop。注意-not放外面要把()里的-a换成-o 3974950-rw-r--r--1 test test 0Sep116:00 /etc/test123 图示: 本文转自cix123 51CTO博客,原文链接:http://blog.51cto.com/zhaodongwei/1845603,如需转载请自行联系原作者

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

mysql性能优化学习笔记-存储引擎

mysql体系架构 客户端(java、php、python等) mysql服务层(连接管理器、查询解析器、查询优化器、查询缓存) mysql存储引擎(innodb、myisam等) 存储引擎针对表而言的,不针对库 mysql存储引擎 mysql存储引擎之MyISAM 5.5前默认的存储引擎、临时表(查询、排序时由查询优化器生成的表)、系统表 特性: 并发性与锁级别(表级锁), 表损坏修复,检查check table tablename,修复repair table tablename 此外也可以通过myisamchk对表进行修复,但是必须注意的是使用该命令进行修复时需要将mysql服务停止后进行。否则有可能对数据表造成更大的损坏。 myisam支持全文索引 myisam表支持数据压缩,可以使用myisampack命令进行压缩,如:myasimpack -b -f tablename.MYI。对已经压缩后的表不能进行写操作,因此要慎重操作。 限制: 5.0前,单表文件最大支持4G。如存储大表需要修改MAX_Rows和AVG_ROW_LENGTH;5.0后默认支持256TB 使用场景 非事务型应用 只读类应用 空间类应用 mysql存储引擎之Innodb MySQL5.5及以后版本默认存储引擎 Innodb使用表空间进行数据存储 由innodb_file_per_table参数的值进行控制,如果为ON,则独立表空间(tablename.ibd)。如果为OFF,则会存储到系统共享表空间ibdataX。 如何选择系统表空间和独立表空间 系统表空间无法简单的收缩文件大小 独立表空间可以通过optimize table命令收缩系统文件 系统表空间会产生IO瓶颈 独立表空间可以同时向多个文件刷新数据 建议对Innodb使用独立的表空间。5.6后已经是默认方式。 如何将系统表空间转换为独立表空间 1、使用mysqldump导出所有表数据 2、停止Mysql服务,修改参数,并删除Innodb相关文件。如果是主从架构可以先处理从库再处理主库。 3、重启Mysql服务,重建Innodb系统表空间 4、重新导入数据 Innodb存储引擎的特性 Innodb数据字典信息 Innodb的特性 事务性存储引擎 完全支持事务的ACID特性, Redo Log(重做日志,已提交事务,实现事务的持久性)和Undo Log(未提交事务进行回滚) Innodb支持行级锁 支持更多的写并发 行级锁由存储引擎层实现的。 什么是锁? 管理资源的并发访问 实现事务的隔离性 锁的类型 共享锁(读锁) 独占锁(写锁),排他性 锁的粒度 行级锁、页级锁、表级锁 表级锁 行级锁 阻塞和死锁 什么是阻塞,不同锁之间的兼容性,不同锁之间需要等待锁响应。 什么是死锁,两个或两个以上,互相占用资源而互相等待。一般情况下系统会自动处理。 Innodb状态检查 shown engine innodb status 使用场景 Innodb适用于大多数OLTP应用 mysql存储引擎之CSV 文件存储特点:csv文件作为存储引擎。数据以文件方式存储在文件中。 特点 以csv格式进行数据存储 所有的列定义不能是NULL 不支持索引(不适用于大表及在线系统) 可以直接对数据文件进行编辑 使用场景 适用于数据交换的中间表 mysql存储引擎之Archive 特点 以zlib对表数据进行压缩,磁盘I/O更少 存储在ARZ为后缀的文件中 存储特点: 只支持insert和select操作,支持行级锁 只允许在自增ID列上添加索引 使用场景 日志和数据采集类应用 mysql存储引擎之Memory 特点 也成为Heap存储引擎,所有数据保存在内存中。一旦mysql重启,则数据会丢失,表结构会保存。 功能特点: 支持hash索引(等值查询)和btree(范围查询)索引,默认为hash索引 所有字段固定长度为char(10) 不支持blog和text等大字段 使用表级锁,因此性能也不一定会很高。 表最大大小由参数max_heap_table_size参数决定 容易混淆的概念 临时表,系统使用的临时表;create temporary table建立的表。 使用场景 用于查找或映射表,如邮编和地区的对应表。 保存数据的中间表 混存周期性聚合数据的结果表 mysql存储引擎之Federated 特点 提供了远程访问mysql服务器上表的方法 本地不存储数据,数据全部存储在远程服务器上 本地会保存远程数据库表结构和远程连接的信息 如何使用 由于可以通过其他方式替代,因而默认是禁止的。但可以在启动时通过federated参数 mysql://user_name[:password]@host_name[:port]/dbname/tablename 使用场景 偶尔的统计分析和手工查询 如何选择存储引擎 参考条件 事务 备份,热备 崩溃恢复 存储引擎的特性 尽量不要同时混合使用多种存储引擎 本文转自秋楓博客园博客,原文链接:http://www.cnblogs.com/rwxwsblog/p/5785848.html,如需转载请自行联系原作者

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

Hadoop基础入门学习笔记(基本概念)

一、数据块(blck) HDFS(Hadp Distributed File System)默认的最基本的存储单位是64M的数据块。 和普通文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。 二、元数据节点(Namende)和数据节点(datande) 元数据节点用来管理文件系统的命名空间 其将所有的文件和文件夹的元数据保存在一个文件系统树中。 这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)及修改日志(edit lg) 其还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的。 数据节点是文件系统中真正存储数据的地方。 客户端(client)或者元数据信息(namende)可以向数据节点请求写入或者读出数据块。 其周期性的向元数据节点回报其存储的数据块信息。 从元数据节点(secndary namende) 从元数据节点并不是元数据节点出现问题时候的备用节点,它和元数据节点负责不同的事情。 其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。这点在下面会详细叙述。 合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。 1、 元数据节点文件夹结构 VERSIN文件是java prperties文件,保存了HDFS的版本号。 layutVersin是一个负整数,保存了HDFS的持续化在硬盘上的数据结构的格式版本号。 namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的。 cTime此处为0 strageType表示此文件夹中保存的是元数据节点的数据结构。 1 2 3 4 namespaceID=1232737062 cTime=0 strageType=NAME_NDE layutVersin=-18 2、文件系统命名空间映像文件及修改日志 当文件系统客户端(client)进行写操作时,首先把它记录在修改日志中(edit lg) 元数据节点在内存中保存了文件系统的元数据信息。在记录了修改日志后,元数据节点则修改内存中的数据结构。 每次的写操作成功之前,修改日志都会同步(sync)到文件系统。 fsimage文件,也即命名空间映像文件,是内存中的元数据在硬盘上的checkpint,它是一种序列化的格式,并不能够在硬盘上直接修改。 同数据的机制相似,当元数据节点失败时,则最新checkpint的元数据信息从fsimage加载到内存中,然后逐一重新执行修改日志中的操作。 从元数据节点就是用来帮助元数据节点将内存中的元数据信息checkpint到硬盘上的 checkpint的过程如下: 从元数据节点通知元数据节点生成新的日志文件,以后的日志都写到新的日志文件中。 从元数据节点用http get从元数据节点获得fsimage文件及旧的日志文件。 从元数据节点将fsimage文件加载到内存中,并执行日志文件中的操作,然后生成新的fsimage文件。 从元数据节点将新的fsimage文件用http pst传回元数据节点 元数据节点可以将旧的fsimage文件及旧的日志文件,换为新的fsimage文件和新的日志文件(第一步生成的),然后更新fstime文件,写入此次checkpint的时间。 这样元数据节点中的fsimage文件保存了最新的checkpint的元数据信息,日志文件也重新开始,不会变的很大了。 3、从元数据节点的目录结构 4、数据节点的目录结构 数据节点的VERSION文件格式如下: 1 2 3 4 5 namespaceID=1232737062 storageID=DS-1640411682-127.0.1.1-50010-1254997319480 cTime=0 storageType=DATA_NODE layoutVersion=-18 blk_<id>保存的是HDFS的数据块,其中保存了具体的二进制数据。 blk_<id>.meta保存的是数据块的属性信息:版本信息,类型信息,和checksum 当一个目录中的数据块到达一定数量的时候,则创建子文件夹来保存数据块及数据块属性信息。 本文转自南非蚂蚁51CTO博客,原文链接:http://blog.51cto.com/ixdba/1428278 ,如需转载请自行联系原作者

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

IOS UI 2013-8-9学习笔录

1.设置控件属性: 按住鼠标右键,然后拖放到controller.h,如果设置成 @property(retain,nonatomic)IBOutletUILabel*label; @property(retain,nonatomic)IBOutletUIButton*leftButton; 就是该ViewController的属性,可以在.m文件中使用self.label获取到该控件; 例如: [self.leftButtonsetTitle:@"LOVE"forState:UIControlStateHighlighted]; 就是点击按住按钮不放,然后按钮中文本会编程LOVE,但松手之后还会复原。 2.设置控件方法 按住鼠标右键,然后拖放到controller.h,如果选择IBAction的话就设置的是方法属性 - (IBAction)leftClick:(id)sender; - (IBAction)rightClick:(id)sender; 可以在.m文件中在自动生成的点击方法里面添加逻辑代码: 例如: - (IBAction)rightClick:(id)sender { self.label.text=@"right"; } 3.处理两个按钮同时拥有同一个事件,怎么区分? 如果两个按钮同时指向拥有一个同一个click方法,但我们要知道是哪个按钮点击了该方法,那我们就要通过方法的click:(id)sender这个参数来识别是哪个按钮触发了该事件,最好是给每一个按钮设置一个tag来唯一标识每个按钮,然后在.m文件中通过宏定义来设置这些tag 例如: #define LEFT_BUTTON_Tag 1 #define RIGHT_BUTTON_Tag 2 -(IBAction)click:(id)sender { UIButton *button = (UIButton *)sender; if(button.tag == LEFT_Button_Tag) { self.Label.text = @"Left click"; } } 常用函数: -(void)removeFromSuperview; -(void)insertSubview:(UIView *)view atIndex:(NSInteger)index; -(void)exchangeSubviewAtIndex:(NSInterger)index1 withSubviewAtIndex:(NSInteger)index2; -(void)addSubview:(UIView *)view; -(UIView *)viewWithTag:(NSInteger)tag; 4.通过代码重新设置Lable大小: CGRect frame = CGRectMake(100,100,200,100); //测试之前先将Use Autolayout的功能不选,让我们自己来对label大小适合文字布局 //求字体大小 //在原来的基础上添加 self.label.text = str; //求字体的长度大小,隐藏在CGSize的分类方法中 CGSize size = [str sizeWithFont:self.label.font]; //自定义长方形大小 CGRect frame = CGRectMake(self.label.frame.origin.x,self.label.frame.origin.y,size.width,self.label.frame.size.height); //通过自己设置的frame大小来改变当前label长度的大小 self.lable.frame = frame; 额外方法: CGSize labelSize = [s sizeWithFont:font constrainedToSize:size lineBreakMode:UILineBreakModeWordWrap]; 意思就是:把字符串s当成font字体时候,在区间size内使用这行的情况下那么s应该有的大小,也就是s在最大size范围内的宽和高 将一个view添加到另外一个view中 [self.view addSubview:label2];//添加了之后计数器加1,要释放 [label2 release]; 本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366441,如需转载请自行联系原作者

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

Intent进阶 和 Intent-filter 学习笔记

1,Intent的基础用法 Intent是android中各activity之间通信的一个很重要的类,一般我们是这么使用的 //创建一个intent Intentintent=newIntent(); //压值进intent中 //intent是基于一种基于Map的数据结构 //传我们的基本数据类型的可以之间key,value方式传值 intent.putExtra("hello","Helloworld"); //但是,传一个对象的时要注意,该对象要实现序列化窗口才可以传值 //putExtra(Stringname,Serializablevalue) Demodemo=newDemo(); intent.putExtra("Demo",demo); //然后,我们把这个intent传到另外一个activity intent.setClass(xxx.this,zzz.class); startActivity(intent); //------- //目标activity //获取传过来的intentIntentintent=getIntent(); //从Intent中获取值 Stringhello=intent.getStringExtra("Demo"); Demodemo=(Demo)intent.getSerializable("Demo"); 以上代码就是最基础的Intent的用法 2,深入Intent的构造和Intent-filter的基础入门 首先我们看下Intent的构造方法 Intent() //Createanemptyintent. Intent(Intento) //Copyconstructor. Intent(Stringaction) //Createanintentwithagivenaction. Intent(Stringaction,Uriuri) //Createanintentwithagivenactionandforagivendataurl. Intent(ContextpackageContext,Class<?>cls) //Createanintentforaspecificcomponent. Intent(Stringaction,Uriuri,ContextpackageContext,Class<?>cls) //Createanintentforaspecificcomponentwithaspecifiedactionanddata. 出这些构造方法中我们,可以看出,新建一个Intent其实可以设置很多东西,这里我说说componentName,action,category,data componentName componentName 直译的话就是组件的名字的意思,如果我们写的一个类当作成一个组件,那么这个componentName就是用来封装我们写的这些类的位置. //创建一个component的对象 ComponentNamecomponentName=newComponentName(Context.this,xxx.class); Intentintent=newIntent(); Intent.setComponent(componentName); startActivity(intent); //---------- //在xxxactivity中 ComponentNamecomp=getIntent().getComponent(); StringpackageName=comp.getPackName(); StringclassName=comp.getClassName(); 其实细心的同学可以发现,其实跟setClass(),没什么区别吗,而且,还比setClass()麻烦,其实,setClass()是封装了这个功能而已,最实现还是要用到这个类. Action,category,data简单入门 我感觉,学intent 和 intent-filter把action,category,data搞清楚才算真正的掌握了intent的用法. Action 如果学过Structs2的同学应该不会陌生,所谓的action就是发送一个特定的请求,然后,由一个符合这个请求的activity响应 官方文档中是这么说action的: The action largely determines how the rest of the intent is structured — particularly thedataandextrasfields — much as a method name determines a set of arguments and a return value. For this reason, it's a good idea to use action names that are as specific as possible, and to couple them tightly to the other fields of the intent. In other words, instead of defining an action in isolation, define an entire protocol for the Intent objects your components can handle. 我简要说下我理解的大义,有错欢迎指出 action 在很大一部分程度上决定你的intent 是如何构建的,特别是还有data,和 额外的一些字段,还有更多的是如何决定方法名,设置数组和返回的参数.由于这个原因,这是一个很好的方法去尽可能的具体的使用action,用action把这些字段紧密的联系在一起.另外,灵活定义你的action,然后把它定义在一个文档中为你的intent对象的组建能够正常处理 渣翻译…可能比谷歌翻译还有烂…有错欢迎指出!!!!!!!!!!!!! category 要使一个action能够正常运行,category是必不可少的,关于category详细介绍请看开发者文档中的intent and intent-filter 这里说下注意的细节和使用. 首先,这句话是很重要的..取之于官方文档 Therefore, activities that are willing to receive implicit intents must include "android.intent.category.DEFAULT" in their intent filters. 这句话,告诉我们在intent-filter(可以用xml创建也可以用代码创建,这里主要讲xml的创建),必须添加一个android.intent.category.DEFAULT,至于,不添加会发生什么事…我花了半个小时的排错告诉我是无法运行的 //在我们要运行的activity中添加 <activityandroid:name=".SecondActivity"android:label="second"><intent-filter> <actionandroid:name="kg.tom.TEST"/> <categoryandroid:name=" android.intent.category.DEFAULT"/> </intent-filter> </activity> //firstActivity //在创建好的一个监听器里面方法中写上 Intentintent=newIntent(); intent.setAction("kg.tom.TEST"); //利用action来运行相应的activitystartActivity(intent); 注意:每个intent只能设置一个action,但是,可以设置多个category,这里的组合问题,自己好好想想吧. data 因为就是一些参数的介绍,看官方文档就好了,我是这样理解这个DATA,例如,我们一个Mp3播放器,当我们在任务管理器中点击一个MP3文件,MP3这个文件就是一个data,就会触发我们,在intent-filter匹配这个Mp3,<data />的activity运行.. 本文转自 liam2199 博客,原文链接:http://blog.51cto.com/youxilua/772705 如需转载请自行联系原作者

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

android学习之-获得手机屏幕大小

主类 packagesucre.android; importandroid.app.Activity; importandroid.os.Bundle; importandroid.util.DisplayMetrics; importandroid.widget.TextView; /** *取得手机屏幕的大小,用到了android.util下的DisplayMetrics *@authorqiaolei * */ publicclassEXT03_05extendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //定义DisplayMetrics对象 DisplayMetricsdm=newDisplayMetrics(); //根据windowManager获取Metrics //调用getWindowManager()之后,会取得现有的Activity的Handler,然后调用getDefaultDisplay() //取得屏幕宽高将其放到dm中 getWindowManager().getDefaultDisplay().getMetrics(dm); //获取屏幕的宽和高 Stringstr="手机屏幕的分辨率为:"+dm.widthPixels+"x"+dm.heightPixels; //定义要显示str内容Textview TextViewtv=(TextView)findViewById(R.id.myTextView); //将内容放到TextView中 tv.setText(str); } } 本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/742952,如需转载请自行联系原作者

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

Android开发学习笔记:RadioButton和CheckBox浅析

一.RadioButton单选按钮 RadioButton(单选按钮)在Android开发中应用的非常广泛,比如一些选择项的时候,会用到单选按钮。它是一种单个圆形单选框双状态的按钮,可以选择或不选择。在RadioButton没有被选中时,用户能够按下或点击来选中它。但是,与复选框相反,用户一旦选中就不能够取消选中。 实现RadioButton由两部分组成,也就是RadioButton和RadioGroup配合使用.RadioGroup是单选组合框,可以容纳多个RadioButton的容器.在没有RadioGroup的情况下,RadioButton可以全部都选中;当多个RadioButton被RadioGroup包含的情况下,RadioButton只可以选择一个。并用setOnCheckedChangeListener来对单选按钮进行监听 下面的具体的例子: MainActivity.java packagecom.android.radiobutton; importandroid.app.Activity; importandroid.os.Bundle; importandroid.widget.RadioGroup; importandroid.widget.Toast; publicclassMainActivityextendsActivity{ //声明RadioGroup RadioGroupraGroup1,raGroup2; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //通过findViewById获得RadioGroup对象 raGroup1=(RadioGroup)findViewById(R.id.radioGroup1); //添加事件监听器 raGroup1.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){ @Override publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){ //TODOAuto-generatedmethodstub if(checkedId==R.id.radioBtn1){ Toast.makeText(MainActivity.this,"你来自广东省",Toast.LENGTH_LONG).show(); } elseif(checkedId==R.id.radioBtn2){ Toast.makeText(MainActivity.this,"你来自广西省",Toast.LENGTH_LONG).show(); } else{ Toast.makeText(MainActivity.this,"你来自湖南省",Toast.LENGTH_LONG).show(); } } }); raGroup2=(RadioGroup)findViewById(R.id.radioGroup2); raGroup2.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){ @Override publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){ //TODOAuto-generatedmethodstub if(checkedId==R.id.radioBtn4){ Toast.makeText(MainActivity.this,"你的性别是男",Toast.LENGTH_LONG).show(); } else{ Toast.makeText(MainActivity.this,"你的性别是女",Toast.LENGTH_LONG).show(); } } }); } } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello1" /> <RadioGroup android:id="@+id/radioGroup1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <RadioButton android:id="@+id/radioBtn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn1" /> <RadioButton android:id="@+id/radioBtn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn2" /> <RadioButton android:id="@+id/radioBtn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn3" /> </RadioGroup> <!--在两个RadioGroup之间画条横线--> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#ffffff" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello2" /> <RadioGroup android:id="@+id/radioGroup2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <RadioButton android:id="@+id/radioBtn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn4" android:textColor="#ffffff" /> <RadioButton android:id="@+id/radioBtn5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn5" /> </RadioGroup> </LinearLayout> strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello1">你来自哪个省</string> <string name="hello2">你的性别是</string> <string name="app_name">单选按钮测试</string> <string name="radioBtn1">广东</string> <string name="radioBtn2">广西</string> <string name="radioBtn3">湖南</string> <string name="radioBtn4">男</string> <string name="radioBtn5">女</string> </resources> 效果图: RadioButton的另一种效果: 要实现上面的效果,只要在main.xml布局文件中的<RadioButton/>加入android:button="@null" android:drawableRight="@android:drawable/btn_radio"即可,代码如下所示: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello1" /> <RadioGroup android:id="@+id/radioGroup1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <RadioButton android:id="@+id/radioBtn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn1" android:button="@null" android:drawableRight="@android:drawable/btn_radio" /> <RadioButton android:id="@+id/radioBtn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn2" android:button="@null" android:drawableRight="@android:drawable/btn_radio" /> <RadioButton android:id="@+id/radioBtn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn3" android:button="@null" android:drawableRight="@android:drawable/btn_radio" /> </RadioGroup> <!--在两个RadioGroup之间画条横线--> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#ffffff" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello2" /> <RadioGroup android:id="@+id/radioGroup2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <RadioButton android:id="@+id/radioBtn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn4" android:textColor="#ffffff" android:button="@null" android:drawableRight="@android:drawable/btn_radio" /> <RadioButton android:id="@+id/radioBtn5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/radioBtn5" android:button="@null" android:drawableRight="@android:drawable/btn_radio" /> </RadioGroup> </LinearLayout> 二.CheckBox复选按钮 CheckBox复选按钮是一种有双状态按钮的特殊类型,可以选中或者不选中。可以现在布局文件中定义多选按钮,然后对每一个多选按钮进行事件监setOnCheckedChangeListener,通过isChecked来判断选项是否被选中 下面是具体的例子: MainActivity.java packagecom.android.checkbox; importandroid.app.Activity; importandroid.os.Bundle; importandroid.widget.CheckBox; importandroid.widget.CompoundButton; importandroid.widget.Toast; importandroid.widget.CompoundButton.OnCheckedChangeListener; publicclassMainActivityextendsActivity{ //声明复选按钮 privateCheckBoxcBox1; privateCheckBoxcBox2; privateCheckBoxcBox3; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //通过findViewById获得CheckBox对象 cBox1=(CheckBox)findViewById(R.id.checkbox1); cBox2=(CheckBox)findViewById(R.id.checkbox2); cBox3=(CheckBox)findViewById(R.id.checkbox3); //注册事件监听器 cBox1.setOnCheckedChangeListener(listener); cBox2.setOnCheckedChangeListener(listener); cBox3.setOnCheckedChangeListener(listener); } //响应事件 privateOnCheckedChangeListenerlistener=newOnCheckedChangeListener(){ @Override publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked) { //cBox1被选中 if(buttonView.getId()==R.id.checkbox1){ if(isChecked){ Toast.makeText(MainActivity.this,"你喜欢足球",Toast.LENGTH_LONG).show(); } } //cBox2被选中 elseif(buttonView.getId()==R.id.checkbox2){ if(isChecked){ Toast.makeText(MainActivity.this,"你喜欢篮球",Toast.LENGTH_LONG).show(); } } //cBox3被选中 elseif(buttonView.getId()==R.id.checkbox3){ if(isChecked){ Toast.makeText(MainActivity.this,"你喜欢排球",Toast.LENGTH_LONG).show(); } } } }; } main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:textSize="20sp" android:textStyle="bold" android:textColor="#FFFFFF" /> <CheckBox android:id="@+id/checkbox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/football" android:textSize="16sp" /> <CheckBox android:id="@+id/checkbox2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/basketball" android:textSize="16sp" /> <CheckBox android:id="@+id/checkbox3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/volleyball" android:textSize="16sp" /> </LinearLayout> strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">你喜欢的运动是</string> <string name="app_name">复选按钮测试</string> <string name="football">足球</string> <string name="basketball">篮球</string> <string name="volleyball">排球</string> </resources> 效果图: 三.总结 RadioButton和CheckBox的区别: 1、单个RadioButton在选中后,通过点击无法变为未选中单个CheckBox在选中后,通过点击可以变为未选中 2、一组RadioButton,只能同时选中一个一组CheckBox,能同时选中多个 3、RadioButton在大部分UI框架中默认都以圆形表示CheckBox在大部分UI框架中默认都以矩形表示 RadioButton和RadioGroup的关系: 1、RadioButton表示单个圆形单选框,而RadioGroup是可以容纳多个RadioButton的容器 2、每个RadioGroup中的RadioButton同时只能有一个被选中 3、不同的RadioGroup中的RadioButton互不相干,即如果组A中有一个选中了,组B中依然可以有一个被选中 4、一般情况下,一个RadioGroup中至少有2个RadioButton 5、一般情况下,一个RadioGroup中的RadioButton默认会有一个被选中,并建议您将它放在RadioGroup中的起始位置 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/652042

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

学习OpenStack之 (3):Devstack Screen 使用技巧

Devstack环境中,openstack运行在一个screen中,每个service运行在一个window中。我总结的几个tips: 0. 注意需要使用screen启动用户来进行一下操作 1. 查看当前用户开启的所有screen:screen -list s1@dev:~/devstack$ screen -listThere is a screen on:9606.stack (12/12/2014 11:22:54 AM) (Detached)1 Socket in /var/run/screen/S-s1. 2. screen attach:screen -r <screen id,比如上图中的9606>(注:openstack的rejoin-stack.sh也是调用该命令来reattach openstack) (打*的是当前的window) 3. screen dettach:screen -d 4. 移到下一个window:CRTL + A + n 5. 移到前一个window:CRTL + A + p 6. 直接跳到 0 ~9 的某window,比如上图中的第7个:CRTL + A + 7 7. 直接跳到第10个以后的window,比如第17个:CRTL + A + ',输入 17 8. 在screen window中滚动屏幕:开始滚动模式CTRL + [,然后可以使用上下左右键滚屏,按CTRL + ]退出滚动模式 9. 重启某个Cinder service: (1)CRTL + a + <n,比如18 c-vol window> (2)CRTL + c, 杀掉进程 (3)按向上键,出现之前运行的命令,输入即重启c-vol service 10. 按CRTL + a, 稍等一秒,再按 " (shift + ' 所在键)显示screen中所有window的列表 (四个键连续按是不行的 :)) 11. 默认的所有screen 快捷键 本文转自SammyLiu博客园博客,原文链接:http://www.cnblogs.com/sammyliu/p/4159475.html,如需转载请自行联系原作者

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

Android学习笔记--工程创建及目录结构

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 一,新建project New->androidproject->projectname->buildtarget(开发的版本选择)->apllcationname->packagename->createactivity(显示界面)->minsdkversion(最低兼容sdk版本) 二,android程序的目录结构 Src==>编写的源文件 Gen==>引用程序的资源文件(不要修改) Android==>源文件jar文件 Assets==>放置任何文件 Res==>此处放置会在gen中生成相应ID Drawable放置图片分为多个分辨率图片hdpi,ldpi,mdpi高中低 Layout布局方式 Values adnroidManifest.xml全局配置文件 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360580,如需转载请自行联系原作者

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

Android学习笔记--Activity的生命周期

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 参考文档:安装目录/docs/index.html Activity的生命周期函数 onCreate(Activity被第一个创建时),onReStart,onStart(Activity可视的时候),onDestroy,onPause(Activity暂停状态),onResume(Activity可被获得焦点的时候),onStop(Activity不可见的时候) 启动一个新的Activity会依次调用onCreate,onStart,onResume 调用另外一个Activity会依次调用onPause(第一个),onCreate(第二个),onStart(第二个),onResume(第二个),onStop(第一个) 调用返回按钮Activty会依次调用onPause(第二个),onReStart(第一个),onStart(第一个),onResume(第一个),onStop(第二个),onDestory(第二个) onDestory()被调用的时机1.明确调用finish方法2.系统自适应释放 Task基本概念(栈中的所有Activity)栈压栈,弹栈(后进先出原则) Task运行过程,当应用程序启动之后,运行第一个Activity被压入栈中(显示会时栈中最顶部的Activity) 3.模态化窗体(对话框) 在AndroidManifest.xml文件中<Activityandroid:name=".MofityActivity" android:label="MofityActivity" android:theme="@anroid:style/Theme.Dialog" /> 可被杀死的方法onStop,onPause,onDestory 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360576,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

用户登录
用户注册