首页 文章 精选 留言 我的

精选列表

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

docker容器技术笔记

1.docker架构 http://www.infoq.com/cn/articles/docker-source-code-analysis-part1/ Docker架构内各模块:Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer 以及Docker container。 2.下载docker工具网址 https://www.docker.com/docker-toolbox 3.下载dockerimage模板网址 http://download.openvz.org/template/precreated/ 4.dockerfile的作用 Dockerfile用来创建一个自定义的image http://blog.csdn.net/wsscy2004/article/details/25878223 基于Dockerfile搭建JAVA Tomcat运行环境:http://www.blogjava.net/yongboy/archive/2013/12/16/407643.html 阿里云服务器: 120.25.223.73:4200 120.25.88.150:4200 112.74.22.173:4200 sudo HTTP_PROXY=http://proxyx.com.cn:80 docker -d sudo docker pull ubuntu # 下载最新ubuntu镜像 Docker 主站点:https://www.docker.io Docker 注册中心API:http://docs.docker.com/reference/api/registry_api/ Docker Hub API:http://docs.docker.com/reference/api/docker-io_api/ Docker 迖端应用API:http://docs.docker.com/reference/api/docker_remote_api/ Dockerfile 参考:https://docs.docker.com/reference/builder/ Dockerfile 最佳实践:https://docs.docker.com/articles/dockerfile_best-practices/ docker参数详解 useage of docker -D 默认false 允许调试模式(debugmode) -H 默认是unix:///var/run/docker.sock tcp://[host[:port]]来绑定 或者unix://[/path/to/socket]来使用(二进制文件的时候),当主机ip host=[0.0.0.0],(端口)port=[4243] 或者 path=[/var/run/docker.sock]是缺省值,做为默认值来使用 -api-enable-cors 默认flase 允许CORS header远程api -b 默认是空,附加在已存在的网桥上,如果是用’none’参数,就禁用了容器的网络 -bip 默认是空,使用提供的CIDR(ClasslessInter-Domain Routing-无类型域间选路)标记地址动态创建网桥(dcoker0),和-b参数冲突 -d 默认false 允许进程模式(daemonmode) -dns 默认是空,使docker使用指定的DNS服务器 -g 默认是”/var/lib/docker”:作为docker使用的根路径 -icc 默认true,允许inter-container来通信 -ip 默认”0.0.0.0″:绑定容器端口的默认Ip地址 -iptables 默认true 禁用docker添加iptables规则 -mtu 默认1500 : 设置容器网络传输的最大单元(mtu) -p 默认是/var/run/docker.pid进程pid使用的文件路径 -r 默认是true 重启之前运行的容器 -s 默认是空 ,这个是docker运行是使用一个指定的存储驱动器 -v 默认false 打印版本信息和退出 docker run命令详解 Usage: docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG…] Run a command in a new container -a=map[]: 附加标准输入、输出或者错误输出 -c=0: 共享CPU格式(相对重要) -cidfile=””: 将容器的ID标识写入文件 -d=false: 分离模式,在后台运行容器,并且打印出容器ID -e=[]:设置环境变量 -h=””: 容器的主机名称 -i=false: 保持输入流开放即使没有附加输入流 -privileged=false: 给容器扩展的权限 -m=””: 内存限制 (格式:<number><optional unit>, unit单位 = b, k, m or g) -n=true: 允许镜像使用网络 -p=[]: 匹配镜像内的网络端口号 -rm=false:当容器退出时自动删除容器 (不能跟 -d一起使用) -t=false: 分配一个伪造的终端输入 -u=””: 用户名或者ID -dns=[]: 自定义容器的DNS服务器 -v=[]: 创建一个挂载绑定:[host-dir]:[container-dir]:[rw|ro].如果容器目录丢失,docker会 创建一个新的卷 -volumes-from=””: 挂载容器所有的卷 -entrypoint=””: 覆盖镜像设置默认的入口点 -w=””: 工作目录内的容器 -lxc-conf=[]: 添加自定义-lxc-conf=”lxc.cgroup.cpuset.cpus = 0,1″ -sig-proxy=true: 代理接收所有进程信号(even in non-tty mode) -expose=[]: 让你主机没有开放的端口 -link=””: 连接到另一个容器(name:alias) -name=””: 分配容器的名称,如果没有指定就会随机生成一个 -P=false: Publish all exposed ports to thehost interfaces 公布所有显示的端口主机接口 docker常用命令总结 docker pull <镜像名:tag> #从官网拉取镜像 docker search <镜像名> #搜索在线可用镜像名 查询容器、镜像、日志 docker top <container> #显示容器内运行的进程 docker images #查询所有的镜像,默认是最近创建的排在最上。 docker ps #查看正在运行的容器 docker ps -l #查看最后退出的容器的ID docker ps -a #查看所有的容器,包括退出的。 docker logs {容器ID|容器名称} #查询某个容器的所有操作记录。 docker logs -f {容器ID|容器名称} #实时查看容易的操作记录。 删除容器与镜像 docker rm$(docker ps -a -q) #删除所有容器 docker rm <容器名or ID> #删除单个容器 docker rmi <ID> #删除单个镜像 docker rmi$(docker images | grep none | awk ‘{print $3}’ | sort -r)#删除所有镜像 启动停止容器 docker stop <容器名or ID> #停止某个容器 docker start <容器名or ID> #启动某个容器 docker kill <容器名or ID> #杀掉某个容器 容器迁移 docker export <CONTAINER ID> > /home/export.tar #导出 cat /home/export.tar | sudo docker import – busybox-1-export:latest# 导入export.tar文件 docker save debian> /home/save.tar #将debian容器打包 docker load< /home/save.tar #在另一台服务器上加载打包文件 save和export的对比参考地址:http://www.fanli7.net/a/bianchengyuyan/C__/20140423/452256.html 运行一个新容器 #运行一个新容器,同时为它命名、端口映射。以debian02镜像为例 docker run -h=”redis-test” –name redis-test -d -p 51000:22 -p51001:3306 -p 51003:6379 -p 51004:6381 -p 51005:80 -p 51006:8000 -p 51007:8888 debian02 /etc/rc.local #从container中拷贝文件,当container已经关闭后,在里面的文件还可以拷贝出来。 sudo docker cp 7bb0e258aefe:/etc/debian_version . #把容器中的/etc/debian_version拷贝到 当前目录下。 2.映像操作 cat layer.tar | sudo docker import - ubuntu:3.0#从本地文件系统导入镜像 docker images docker pull ubuntu:12.04 <=> docker pull registry.hub.docker.com/ubuntu:12.04#从docker hub下载镜像 docker rmi <image id> #删除image docker rmi `docker images -a | awk '{if($2==0.0) print $3;}'`#删除tag==0.1的映像 docker rmi -f `docker images -a -q`#强制删除所有映像 docker commit [-m "..." -a "..."] containerID rep:tag#将容器导出为映像 sudo docker save -o ubuntu_14.04.tar ubuntu:14.04#将映像ubuntu:14.04保存到本地当前目录下的ubuntu_14.04.tar(要用.tar后缀) sudo docker load --input ubuntu_14.04.tar 或 sudo docker load < ubuntu_14.04.tar#载入save保存的镜像,也可以使用 docker import docker tag imageid 10.9.111.221:5000/ubuntu:12.0 docker pull 10.9.111.221:5000/ubuntu #在私有库中拉取最新的ubuntu docker search 10.9.111.221:5000/ubuntu#搜索私有库中的ubuntu库 curl http://104.131.173.242:5000/v1/search #查询私有仓库 3.容器操作 docker run -i ubuntu:3.0 /usr/bin/bash #启动容器,并且进入到Ubuntu容器的bash命令 -t伪造一个虚拟终端,当执行脚本时不能用-t选项 docker run -i -t --name mycontainer ubuntu:3.0 echo "liujidngd"#-i打开标准输出;-t允许伪终端;--name容器名字;--rm容器退出时强制删除容器 docker run -i -t --rm ubuntu:3.0 echo "liujidngd"#运行完该命令后,删除容器 docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...] docker ps#列出当前所有正在运行的container docker ps -l#列出最近一次启动的,且正在运行的container docker ps -a#列出所有的container docker rm `docker ps -a -q`#删除所有容器 docker rm $CONTAINER_ID#删除容器id为CONTAINER_ID的容器 docker stop CONTAINER_ID#停止docker实例 docker logs containerName#查看后台运行的容器的日志 ctrl +p+q 将容器推入后台运行 docker attach containerName#重新进入容器,或将容器提到前台 docker export CONTAINER_ID > ubuntu.tar#导出容器快照到本地当前文件夹下 cat layer.tar | docker import - ubuntu:3.0#从本地文件系统导入容器快照为镜像 docker commit containerID imagename #将容器导出为映像 4.Docker 数据管理(数据卷的使用,类似亍 Linux 下对目录戒文件迕行 mount) docker run -d -v /webapp ubuntu:0.1 echo "lk"#运行容器时在根目录下加载一个数据卷(创建了一个数据卷容器) docker run -d -v /src/webapp:/opt/webapp ubuntu:0.1 echo "lk"#挂载本地主机目录/src/webapp到容器目录/opt/webapp docker run -d -v /src/webapp:/opt/webapp:ro ubuntu:0.1 echo "lk"#挂载时指定只读权限 docker run -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash #将本地文件~/.bash_history挂载到主机文件/.bash_history docker run -d -v /data --name dbdata ubuntu:0.1 echo "lk"#创建了一个数据卷容器 docker run -d --volumes-from dbdata --name db1 ubuntu:0.1 echo "lk"#挂载数据卷dbdata下所有的数据卷,用于容器目录共享 docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata#将数据卷容器的数据备份到本地目录 5.Docker 中的网络功能 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。 当使用 -P 标记时,Docker 会映射一个 本地49000~49900 的随机端口到内部容器被开放使用的网络端口。 docker run -d -P training/webapp python app.py#使用随机端口绑定到容器在使用的端口 docker run -d -p 5000:5000 training/webapp python app.py#使用固定端口绑定到容器 docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py docker run -d -p 127.0.0.1::5000 training/webapp python app.py#映射到指定地址的任意端口 docker run --link db:dbalias --name web training/webapp env#将容器的db的随机端口与容器web使用的端口相连 docker port CONTAINER_ID portnum#查看容器中的端口port对应主机的端口号 6.命令 Docker 的命令可以采用 docker-CMD 戒者 docker CMD 的方式执行。两者一致。 docker-attach依附到一个正在运行的容器中。 docker-build从一个 Dockerfile 创建一个镜像 docker-commit从一个容器的修改中创建一个新的镜像 docker-cp(1)从容器中复制文件到宿主系统中 docker-diff(1)检查一个容器文件系统的修改 docker-events从服务端获取实时的事件 docker-export导出容器内容为一个 tar 包 docker-history显示一个镜像的历叱 docker-images列出存在的镜像 docker-import导入一个文件(典型为 tar 包)路径戒目录来创建一个镜像 docker-info显示一些相关的系统信息 docker-inspect显示一个容器的底层具体信息。 docker-kill关闭一个运行中的容器 (包括迕程和所有资源) docker-load从一个 tar 包中加载一个镜像 docker-login注册戒登录到一个 Docker 的仏库服务器 docker-logout从 Docker 的仏库服务器登出 docker-logs获取容器的 log 信息 docker-pause暂停一个容器中的所有迕程 docker-port查找一个 nat 到一个私有网口的公共口 docker-ps列出容器 docker-pull从一个Docker的仏库服务器下拉一个镜像戒仏库 docker-push将一个镜像戒者仏库推送到一个 Docker 的注册服务器 docker-restart重吪一个运行中的容器 docker-rm删除给定的若干个容器 docker-rmi删除给定的若干个镜像 docker-run创建一个新容器,幵在其中运行给定命令 docker-save保存一个镜像为 tar 包文件 docker-search在 Docker index 中搜索一个镜像 docker-start启动一个容器 docker-stop终止一个运行中的容器 docker-tag为一个镜像打标签 docker-top查看一个容器中的正在运行的迕程信息 docker-unpause将一个容器内所有的迕程从暂停状态中恢复 docker-version输出 Docker 的版本信息 docker-wait阻塞直到一个容器终止,然后输出它的退出符 7.dockerfile 文件创建分层映像 第一步:在本地的当前目录下创建Dockerfile FROM ubuntu:test3 //使用ubuntu:test3作为基础映像 RUN mkdir work RUN echo "Hello docker!" >/work/lj //在该映像上加一层 第二步:编译生成一个新的映像 docker build -t="ubuntu:v1" /home/mepa/test //使用/home/mepa/test目录(该目录下最好只有一个Dockerfile文件)下的Dockerfile生成一个新的映像ubuntu:v1 第三步:运行新的映像ubuntu:v1 docker run -d -v /home/mapa/work:/work1 ubuntu:v1 //使用dockerfile生成的映像可以没有/bin/sh命令 1.docker与传统虚拟机的优势 a.启动快:docker的启动可以在秒级实现,而传统虚拟机需要分级 b.对系统资源的利用率高:一台主机可以同时允许数千个docker容器,而传统虚拟机一般只能运行几十个。传统的虚拟机运行10个不同的应用需要启动10个不同的虚拟机,而docker只需要启动10个隔离的应用即可。 c.运行效率高:Docker容器的运行不需要额外的hypervisor(中间件)支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。 d.更简单的管理:使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。 e.一次创建,随处运行 Docker底层的核心技术包括Linux上的名字空间( Namespaces)、控制组( Control groups)、Union文件系统( Union file systems)和容器格式( Container format)。传统的虚拟机通过在宿主主机中运行hypervisor来模拟一整套完整的硬件环境提供给虚拟机的 操作系统,实现了操作系统级的隔离,而docker是在操作系统的基础上实现的是进程级的隔离。 2.容器之间的网络连接 a.系统外部访问容器内部 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P或-p参数来指定端口映射。 从而可以使得互联网通过访问主机端口来访问容器 b.容器之间的访问 --link=CONTAINER_NAME:ALIAS选项会在创建容器的时候,添加一个其他容器的主机名到/etc/hosts文件中, 让新容器的进程可以使用主机名ALIAS就可以连接它。(容器在创建的时候,默认就已经通过docker0网桥互联了,--link只是给容器ip取一个别名) 如: $sudo docker run -d --name db training/postgres 不用向外映射任何端口 $sudo docker run -d -P--name web --link db:mydb ubuntu /bin/bash >ping mydb >cat /etc/hosts 当Docker服务器启动时,会自动在主机上创建一个docker0虚拟网桥,相当于一个软件交换机,可以在挂载到它的网口之间进行数据转发。 该软交换机有一个ip比如172.17.42.1/16,启动的每一个容器也有一个同一网段的ip。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。 Docker就创建了在主机和所有容器之间一个虚拟共享网络。 docker自动建立的网络模型如下:!()[https://github.com/liujin123/sundry/blob/master/docker_soft_switch.png?raw=true] >docker run -it --link pedantic_borg:myubunutu ubuntu /bin/sh #ping myubunutu PING myubunutu (172.17.0.3): 56 data bytes #可以看到myubunutu的ip地址 64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.187 ms 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.165 ms 其实不需要--link选项容器与容器之间也是可以ping通的,只是要先知道另外一个容器的ip,这个可以attach到容器中,然后在/etc/hosts文件中查看。 或者在本容器/etc/hosts中添加一个其它容器ip与主机名的映射,也可以通过主机名访问其它容器。 c.常用的与网络相关的命令 -bBRIDGEor--bridge=BRIDGE--指定容器挂载的网桥 --bip=CIDR--定制docker0的掩码 -HSOCKET...or--host=SOCKET...--Docker服务端接收命令的通道 --icc=true|false--是否支持容器之间进行通信 --ip-forward=true|false--本地linux系统转发本容器数据本 --iptables=true|false--禁止Docker添加本地系统的iptables规则 --mtu=BYTES--容器网络中的MTU 下面2个命令选项既可以在启动服务时指定,也可以Docker容器启动(dockerrun) 时候指定。在 Docker服务启动的时候指定则会成为默认值,后面执行dockerrun时可以覆盖设置的默认值。 --dns=IP_ADDRESS...--使用指定的DNS服务器 --dns-search=DOMAIN...--指定DNS搜索域 最后这些选项只有在dockerrun执行时使用,因为它是针对容器的特性内容。 -hHOSTNAMEor--hostname=HOSTNAME--配置容器主机名 --link=CONTAINER_NAME:ALIAS--添加到另一个容器的连接 --net=bridge|none|container:NAME_or_ID|host--配置容器的桥接模式 -pSPECor--publish=SPEC--映射容器端口到宿主主机 -Por--publish-all=true|false--映射容器所有端口到宿主主机 3.容器的访问控制 容器的访问控制主要通过linux的防火墙软件iptables进行管理实现。每个容器的虚拟网卡veth都需要连接到linux系统创建的docker0网桥上才能工作。 a.容器访问外部网络 容器访问外部网络需要本地linux系统的支持:网卡设置允许网络转发 $sysctlnet.ipv4.ip_forward #查看 net.ipv4.ip_forward=0 $sysctl-wnet.ipv4.ip_forward=1 #设置 /etc/init.d/procps.sh restart #生效 默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。 容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。 这是使用 iptables的源地址伪装操作实现的。 $sudo iptables -t nat -nL #查看主机的NAT(网络地址转换)规则。 ... ChainPOSTROUTING(policyACCEPT) targetprotoptsourcedestination MASQUERADEall--172.17.0.0/16!172.17.0.0/16 ... 其中,上述规则将所有源地址在 172.17.0.0/16网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。 MASQUERADE跟传统SNAT的好处是它能动态从网卡获取地址。容器允许外部访问,可以在 dockerrun时候通过 -p或 -P参数来启用。 不管用那种办法,其实也是在本地的 iptable的nat表中添加相应的规则。 $sudo iptables -t nat -nL ... ChainDOCKER(2references) target protopt sourcedestination DNATtcp--0.0.0.0/00.0.0.0 tcpdpt:49153to:172.17.0.2:80 b.容器之间的访问 (默认互联) ** 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到docker0网桥上。 ** 本地系统的防火墙软件--iptables是否允许通过。 * c.网桥 每个容器都有虚拟网卡ceth,而docker网桥只是将这些虚拟网卡桥接。 c1.默认网桥docker0 Docker服务默认会创建一个 docker0网桥。在内核层连通了所有的虚拟网卡,但是并没有连接到物理网卡,并且docker0网桥没有配置文件,要想桥接物理网卡,只能重新新建一个虚拟网桥。 每次创建一个新容器的时候, Docker从可用的地址段中选择一个空闲的IP地址分配给容器的eth0端口。使用本地主机上docker0接口的IP作为所有容器的默认网关。 >brctl show #显示网桥桥接了那些网卡 c2.自定义网桥 《docker技术入门与实践pdf》 在启动Docker服务的时候,使用-b BRIDGE或--bridge=BRIDGE 来指定使用的网桥,也可以修改配置文件。 自定义网桥是linux系统的功能,如果docker服务已经运行,那需要先停止服务,并删除旧的网桥。 [root@opnvz~]#brctlshow #显示linux主机上的网桥 bridgenamebridgeidSTPenabledinterfaces docker08000.56847afe9799noveth0889 $sudoservicedockerstop $sudoiplinksetdevdocker0down $sudobrctldel brdocker0 然后创建一个网桥bridge0。 $sudobrctladd brbridge0 $sudoipaddradd192.168.5.1/24devbridge0 $sudoiplinksetdevbridge0up 查看确认网桥创建并启动。 $ipaddrshowbridge0 配置Docker服务,默认桥接到创建的网桥上。 $echo'DOCKER_OPTS="-b=bridge0"'>>/etc/default/docker $sudoservicedockerstart c3.跨物理网络的容器为什么能通信? 本地系统上运行的虚拟机或容器在访问外网时与本地进程使用相同的一套主机端口,因而数据准确送达容器进程或本地主机进程。 容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。 这是使用iptables的源地址伪装操作实现的。互联网访问容器也是通过端口一一映射实现的。 d.ambassador 容器实现跨物理主机的容器间通信 《docker技术入门与实践pdf》 ambassador 容器提供C/S模型,可以让容器只存在本机的局域网,而使用ambassador 容器来提供网络互联。 4.联合文件系统 UnionFS 联合文件系统( UnionFS)是一种分层、 轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(uniteseveraldirectoriesintoa singlevirtualfilesystem)。联合文件系统是Docker镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。 5.数据卷 在容器中管理数据主要有两种方式:数据卷和数据卷容器 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性: *数据卷可以在容器之间共享和重用 *对数据卷的修改会立马生效 *对数据卷的更新,不会影响镜像 *卷会一直存在,直到没有容器使用 在用docker run命令的时候,使用-v标记来创建一个数据卷并挂载到容器里。在一次run中多次使用可以挂载多个数据卷 $sudo docker run -d --name web -v /webapp training/webapp python app.py 在容器中挂载一个数据卷 $sudo docker run -d --name web -v /src/webapp:/opt/webapp training/webapp python app.py 挂载一个主机目录作为数据卷 $sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash 挂载一个主机文件作为数据卷 数据卷容器:其实就是一个正常的容器, 专门用来提供数据卷供其它容器挂载的。 $sudo docker run -d --name web -v /dbdata --name dbdatatraining/db 专门被其它容器挂载:凡是存在数据卷的容器都可以被其它容器挂载 $sudo docker run -d --volumes-from dbdata --name db1training/postgres 挂载其它容器的数据卷 $sudo docker run -d --volumes-from db1 --name db2training/postgres 从db1挂载 从数据卷中迁移数据: $sudo docker run --volumes-fromdbdata-v $(pwd):/backup ubuntu tar cvf /backup/backup.tar 新建一个容器从而可以将数据备份到主机目录 本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1730861,如需转载请自行联系原作者

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

Android笔记:CoverFlow相关

====================效果一,修改getChildDrawingOrder方法================================= 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 // 重载视图显示顺序让左到中间显示,再到右到中间显示 protected int getChildDrawingOrder( int childCount, int i) { // long t = getSelectedItemId(); // int h = getSelectedItemPosition(); // if (i < childCount / 2) // { // return i; // } // return childCount - i - 1 + childCount / 2; // Reset the last position variable everytime we are starting a new // drawing loop if (i == 0 ) lastPosition = 0 ; int centerPosition = getSelectedItemPosition() - getFirstVisiblePosition(); if (i == childCount - 1 ) { return centerPosition; } else if (i >= centerPosition) { lastPosition++; return childCount - lastPosition; } else { return i; } } 修改后效果: ==============================参考资料=========================================== 1.Gallery重叠效果 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=97392&reltid=186440&pre_pos=8&ext= 2.Modifying Coverflow to use xml file http://stackoverflow.com/questions/16078716/modifying-coverflow-to-use-xml-file 3.使用Android自带Gallery组件实现CoverFlow,源码+解析 http://www.eoeandroid.com/thread-39709-1-1.html 4.Android实现CoverFlow效果 http://blog.csdn.net/jxsmallmouse/article/details/7732341 5.CoverFlow http://www.inter-fuser.com/2010/01/android-coverflow-widget.html http://www.inter-fuser.com/2010/02/android-coverflow-widget-v2.html 本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1290635,如需转载请自行联系原作者

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

Android笔记:音量、AudioManager

相关代码: 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 private AudioManager audioManager; // 音量管理器 private int maxVolume; // 最大音量 private int currentVolume; // 当前音量 //监听音量控制进度条 private void listenVolumeSeekBar() { audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); //音量管理器 maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); // 获得最大音量 currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); // 获得当前音量 mVolumesetting_seekBar.setMax(maxVolume); mVolumesetting_seekBar.setProgress(currentVolume); mVolumesetting_seekBar.setOnSeekBarChangeListener( new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.FLAG_ALLOW_RINGER_MODES); } }); } 本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1252250,如需转载请自行联系原作者

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

自学笔记:setTag、getTag

1.设置tag key的唯一性 官方的api文档:“The specified key should be an id declared in the resources of the application to ensure it is unique (see theID resource type). Keys identified as belonging to the Android framework or not associated with any package will cause anIllegalArgumentExceptionto be thrown.” 所以抛出IllegalArgumentException的原因就在于key不唯一,那么如何保证这种唯一性呢?定义一个final类型的int变量和硬编码一个值的方式都是行不通的。 如果只需要设置一个tag,那么直接调用setTag(Object tag)方法就可以轻松搞定,如果一定需要使用多个tag绑定,那么需要先在res/values/strings.xml中添加 <resources> <item type="id" name="tag_first"></item><item type="id" name="tag_second"></item> </resources> 使用的时候写成 imageView.setTag(R.id.tag_first,"Hello");imageView.setTag(R.id.tag_second,"Success"); 就可以了 本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1215468,如需转载请自行联系原作者

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

Android菜单(个人笔记)

Android系统提供三种菜单: 1.选项菜单(Option Menu) 1.1图标菜单(Icon Menu) 通过菜单键直接打开的是图标菜单,顾名思义,图标菜单就是能够同时显示文字和图标的菜单,最多支持6个子项,如果子项多于6个,则需要扩展菜单显示其它的子项。。哇哈哈 1.2扩展菜单(Expanded Menu) 扩展菜单是垂直的列表型菜单,仅在图标菜单子项多于6个时才出现,通过点击图标菜单最后的子项More才能打开。扩展菜单不能显示图标,但支持单选框和复选框;相反,图标菜单支持显示图标,但不支持单选框和复选框。 2.子菜单(Submenu) 子菜单是能够显示更加详细信息的菜单子项,Android采用了浮动窗体的形式显示菜单子项。吼吼。。 子期间不支持嵌套,也就是说不能够在子菜单中再使用子菜单。 3.快捷菜单(Context Menu) 为了能够在Android应用程序中使用选项菜单,必须重载Activity的onCreateOptionsMenu()函数,该函数在用户首次使用选项菜单时被调用,一般用来初始化菜单子项的相关内容,包括设置菜单子项自身的子项ID和组ID,菜单子项显示的文字和图片等信息。 如果希望打开菜单时,能够动态的添加、删除菜单子项,或修改菜单的标题、图标和可见性等内容,则需要重载onPrepareOptionsMenu()函数,onPrepareOptionsMenu()函数的返回值的含义与onCreateOptionsMenu()函数相同,返回true则显示菜单,否则不显示 本文转自华华世界 51CTO博客,原文链接:http://blog.51cto.com/mzh3344258/733342,如需转载请自行联系原作者

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

windows auzre 笔记-1

云计算方案特点: 1-按需获取自助式服务 2-广泛的网络访问 3-资源池 4-快速伸缩 5-可度量的服务 云服务类型: SAAS:一套完整的软件解决方案,比如说office 365 PAAS:一种托管自定义解决方案的服务平台 IAAS:一种在完全控制状态下运行虚拟服务器的方法 (提供了基础架构) 私有云(供应商提供): data access --------- 软件服务-----以下由云供应商提供 application ---------平台服务----以下由云供应商提供 runtime opertaion system vitrual machine ----- 基础架构服务---以下由云供应商提供 compute networking sotrage Micorsoft azure分类: 1-计算 :虚拟机,PAAS云服务,网站服务,移动服务 2-数据服务:存储,SQL ,备份,站点恢复 3-网络服务:虚拟网络,流量管理,express route 4-APP服务:媒体服务,活动目录,自动化,service bus,CDN Azure数据中心: 分布在全球(在中国由世纪互联代理) 由微软管理 模块化架构-高速,强冗余和地理复制 电源管理 azure fabric管理 Azure服务: 1-计算和网络 2-web 3-数据分析 4-存储和备份 5-媒体和CDN 6-混合集成 7-身份和访问管理 分组和归置服务 1-资源组,将服务器逻辑分组,在中国是没有资源组的 2-区域---将服务器归置到一个数据中心 3-地缘组----将服务器归置到数据中心中物理位置接近的服务器上 Azure门户http://manage.windowsazure.cn(CN Local)http://manage.windowsazure.com(internaltional) http://account.windowsazure.cn/subscriptions(auzre订阅) 在订阅界面中可以查看编辑订阅信息 流量统计,计费信息,编辑个人资料等 Azure powershell模块:\可以完成很多GUI完成不了的事情 mincorsoft web platform installerhttp://azure.microsoft.com/downloads Azure AD powershell模块\提供更多管理AD命令 需要microsoft在线服务登入助手http://aka.ms/aadposh 本文转自 bilinyee博客,原文链接: http://blog.51cto.com/ericfu/2047630 如需转载请自行联系原作者

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

Android开源:SlidingMenu笔记

SlidingMenu简介: SlidingMenu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面,能方便的进行各种操作.目前有大量的应用都在使用这一效果。如Evernote、Google+、Foursquare等,国内的豌豆夹,人人,360手机助手等都使用SlidingMenu的界面方案。 项目下载地址:https://github.com/jfeinstein10/SlidingMenu注意: SlidingMenu依赖于另一个开源项目ActionBarSherlock,所以需要将ActionBarSherlock添加作为SlidingMenu的库工程,否则会报资源找不到错误。然后再将SlidingMenu添加到自己的工程中去。 SlidingMenu集成常见错误: Jar mismatch! Fix your dependencies:引用的工程和自身工程以来的jar包版本不一致导致的冲突。确保SlidingMenu和ActionBarSherLock所使用的jar包版本一致 如果使用到ActionBarSherLock的相关api,可能报找不到getSupportActionBar等ActionBarSherLock的方法。原因是使用ActionBarSherLock的Activity需继承于SherlockActivity,修改SlidingMenu library中的SlidingFragmentActivity,让它继承于SherlockFragmentActivity,重新编译library导入。SlidingMenu 常用属性介绍: menu.setMode(SlidingMenu.LEFT);//设置左滑菜单 menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//设置滑动的屏幕范围,该设置为全屏区域都可以滑动 menu.setShadowDrawable(R.drawable.shadow);//设置阴影图片 menu.setShadowWidthRes(R.dimen.shadow_width);//设置阴影图片的宽度 menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu划出时主页面显示的剩余宽度 menu.setBehindWidth(400);//设置SlidingMenu菜单的宽度 menu.setFadeDegree(0.35f);//SlidingMenu滑动时的渐变程度 menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);//使SlidingMenu附加在Activity上 menu.setMenu(R.layout.menu_layout);//设置menu的布局文件 menu.toggle();//动态判断自动关闭或开启SlidingMenu menu.showMenu();//显示SlidingMenu menu.showContent();//显示内容 menu.setOnOpenListener(onOpenListener);//监听slidingmenu打开 关于关闭menu有两个监听,简单的来说,对于menu close事件,一个是when,一个是after menu.OnClosedListener(OnClosedListener);//监听slidingmenu关闭时事件 menu.OnClosedListener(OnClosedListener);//监听slidingmenu关闭后事件 左右都可以划出SlidingMenu菜单只需要设置 menu.setMode(SlidingMenu.LEFT_RIGHT);属性,然后设置右侧菜单的布局文件 menu.setSecondaryShadowDrawable(R.drawable.shadowright);//右侧菜单的阴影图片 使用Fragment实现SlidingMenu: 1.首先Activity继承自SlidingMenu包下的SlidingFragmentActivity 2. setContentView(R.layout.content_frame);//该layout为一个全屏的FrameLayout 3. setBehindContentView(R.layout.menu_frame);//设置SlidingMenu使用的布局,同样是一个全屏的FrameLayout 4.设置SlidingMenu左侧菜单的Fragment 1 2 3 4 5 setBehindContentView(R.layout.menu_frame); FragmentTransactiont= this .getSupportFragmentManager().beginTransaction(); leftMenuFragment= new MenuFragment(); t.replace(R.id.menu_frame,leftMenuFragment); t.commit(); MenuFragment其实就是一个Fragment,显示一个ListView然后点击ListView的每一项的时候,通知Activity切换不同的Fragment为了看清效果,我们新建5个Frament,分别是Fragment1, Fragment2, Fragment3, Fragment4, Fragment5在SlidingMenu中用ListView显示。设置主页面显示的Fragment: 1 2 3 4 5 6 7 8 9 10 11 if (savedInstanceState== null ){ //==null的时候新建Fragment1 contentFragment= new Fragment1(); } else { //不等于null,直接get出来 //不等于null,找出之前保存的当前Activity显示的Fragment contentFragment=getSupportFragmentManager().getFragment(savedInstanceState, "contentFragment" ); } //设置内容Fragment getSupportFragmentManager() .beginTransaction() .replace(R.id.content_frame,contentFragment) .commit(); 在Activity的onSaveInstanceState中保存当前显示的FragmentgetSupportFragmentManager().putFragment(outState, "contentFragment", contentFragment);设置SlidingMenu属性sm = getSlidingMenu();//如果只显示左侧菜单就是用LEFT,右侧就RIGHT,左右都支持就LEFT_RIGHTsm.setMode(SlidingMenu.LEFT_RIGHT);//设置菜单滑动模式,菜单是出现在左侧还是右侧,还是左右两侧都有sm.setShadowDrawable(R.drawable.shadow);//设置阴影的图片资源sm.setShadowWidthRes(R.dimen.shadow_width);//设置阴影图片的宽度//sm.setBehindWidth(200);//设置菜单的宽sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu划出时主页面显示的剩余宽度sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//设置滑动的区域 支持右侧划出菜单: //SlidingMenu可以同时支持划出左右两侧的菜单,互不冲突,而且动画优美,体验良好。 sm.setSecondaryMenu(R.layout.menu_frame2);//设置右侧菜单 sm.setSecondaryShadowDrawable(R.drawable.shadowright);//设置右侧菜单阴影的图片资源 //右侧SlidingMenu的Fragment getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame2, new SampleListFragment()).commit(); 设置ActionBar可以被点击: getSupportActionBar().setHomeButtonEnabled(true);//actionbar主按键可以被点击 getSupportActionBar().setDisplayHomeAsUpEnabled(true);//显示向左的图标 setSlidingActionBarEnabled(false);//左右两侧slidingmenu的fragment是否显示标题栏 切换主页面显示的Fragment: public void switchContent(Fragment f) { //给内容Fragment赋值,并在onSaveInstanceState时保存这个Fragment contentFragment = f; FragmentTransaction t = getSupportFragmentManager().beginTransaction(); t.replace(R.id.content_frame, f); t.commit(); sm.showContent(); 使用普通Activity实现SlidingMenu: 1 2 3 4 5 6 7 8 9 10 11 slidingMenumenu= new SlidingMenu( this ); //直接new,而不是getSlidingMenu menu.setMode(SlidingMenu.LEFT); menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); menu.setShadowDrawable(R.drawable.shadow); menu.setShadowWidthRes(R.dimen.shadow_width); menu.setBehindOffsetRes(R.dimen.slidingmenu_offset); menu.setBehindWidth( 400 ); //设置SlidingMenu菜单的宽度 menu.setFadeDegree( 0 .35f); menu.attachToActivity( this ,SlidingMenu.SLIDING_CONTENT); //必须调用 menu.setMenu(R.layout.menu_layout_left); //就是普通的layout布局 menu.setBehindCanvasTransformer(mTransformer); 相应SlidingMenu里的点击事件,因为SlidingMenu已经被包含在了Activity中了,所以直接findViewById(id),拿到view之后就可以进行相应的处理。 支持左右两侧都能划出菜单 menu.setSecondaryMenu(R.layout.menu_layout_right); menu.setSecondaryShadowDrawable(R.drawable.shadowright); 右侧菜单一样直接findViewById(id),拿到view之后就可以任意处理了 更换SlidingMenu的动画 SlidingMenu支持左滑或者右滑时定义不同的动画,包括拉伸,缩放,旋转等动画。就是在滑动的过程中,SlidingMenu如何出现的动画。 动画使用也很简单 首先定义CanvasTransformer mTransformer;变量: 1 2 3 4 5 6 7 mTransformer= new CanvasTransformer(){ @Override public void transformCanvas(Canvascanvas, float percentOpen){ float scale=( float )(percentOpen* 0.25 + 0.75 ); canvas.scale(scale,scale,canvas.getWidth()/ 2 ,canvas.getHeight()/ 2 ); } }; 然后将mTransformer对象设置给SlidingMenu即可,这个是缩放动画: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private void initSlidUpCanvasTransformer(){ mTransformer= new CanvasTransformer(){ @Override public void transformCanvas(Canvascanvas, float percentOpen){ canvas.translate( 0 ,canvas.getHeight()*( 1 -interp.getInterpolation(percentOpen))); } }; } private static Interpolatorinterp= new Interpolator(){ @Override public float getInterpolation( float t){ t-= 1 .0f; return t*t*t+ 1 .0f; } }; 拉伸动画: 1 2 3 4 5 6 mTransformer= new CanvasTransformer(){ @Override public void transformCanvas(Canvascanvas, float percentOpen){ canvas.scale(percentOpen, 1 , 0 , 0 ); } }); 参考资料: 1.Android开源项目SlidingMenu深入剖析 http://blog.csdn.net/t12x3456/article/details/12798157 本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1542072,如需转载请自行联系原作者

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

iOS开发学习笔记

1常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Builder(IB)中将视图拖拽到窗口上并将各种视图连接到插座变量和动作上, 这样它们就能以编程方式与代码交互。IB使用Nib文件储存GUI资源,同时适用于Cocoa和Carbon程序。在需要的时候,Nib文件可以被快速地载入内存。 2iOS的常用开发框架 2.1 Foundation框架,该框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组、字典和集合,还有其他功能,包括处理日期和时间、自动化的 内存管理、处理基础文件系统、存储(或归档)对象、处理集合数据结构(如点和长方形)等。 2.2 Cocoa框架,术语Cocoa(适合开发桌面应用程序)是指Foundation框架和Application Kit框架(窗口、按钮、列表等能够开发交互式图形应用程序)。术语Cocoa Touch(适合iPhone和iTouch的应用程序开发)是指Foundation框架和UIKit框架。 3iOS程序框架 3.1 典型的iOS程序包含一个Window(窗口)和几个UIViewController(视图控制器),每个UIViewController可以管理多高UIView(在iPhone里看到的、摸到的都是UIView, 可能是UITableView、UIWebView、UIImageView等)。这些UIView之间如何进行层次叠放、显示、隐藏、旋转、移动等都由UIViewController进行管理,而 UIViewcontroller之间的切换,通常情况是通过UINavigationController(当程序具有层次化的工作流时,比较适合)、UITabBarController(当应用程序需要分为几个 相对比较独立的部分时,比较适合,比如tab)或UISplitViewController(适合用于“主-从”界面的情况,比如左菜单,右明细)进行。 4MVC 4.1 MVC的处理过程:首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理;然后模型用业务逻辑来处理用户的请求并返回数据;最后控制器用相应的视图格式化 模型返回的数据,并通过表示层呈现给用户。 5创建并连接输出口和操作 在Assistant Edit模式下,将视图控件拖拽到包含控件ViewController.h的代码编辑器中,当鼠标位于@interface行下时松开。 创建IBOutlet,是指输出口,用于实例变量/属性; 创建IBAction,是指操作,用于事件。 本文转自SharkBin博客园博客,原文链接:http://www.cnblogs.com/SharkBin/p/5268086.html,如需转载请自行联系原作者

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

Android笔记:Wake Lock

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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 import android.app.Service; import android.content.Context; import android.os.PowerManager; /** *WakeLock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠, *可以被用户态程序和内核获得.这个锁可以是有超时的或者是没有超时的, *超时的锁会在时间过去以后自动解锁.如果没有锁了或者超时了,内核就 *会启动休眠的那套机制来进入休眠. * *一、关于intflags各种锁的类型对CPU、屏幕、键盘的影响: *1.PARTIAL_WAKE_LOCK:保持CPU运转,屏幕和键盘灯有可能是关闭的。 *2.SCREEN_DIM_WAKE_LOCK:保持CPU运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯 *3.SCREEN_BRIGHT_WAKE_LOCK:保持CPU运转,允许保持屏幕高亮显示,允许关闭键盘灯 *4.FULL_WAKE_LOCK:保持CPU运转,保持屏幕高亮显示,键盘灯也保持亮度 *5.ACQUIRE_CAUSES_WAKEUP:Normalwakelocksdon't *actuallyturnontheillumination.Instead,theycausetheilluminationto *remainononceitturnson(e.g.fromuseractivity).Thisflagwillforce *thescreenand/orkeyboardtoturnonimmediately,whentheWakeLockis *acquired.Atypicalusewouldbefornotificationswhichareimportantfor *theusertoseeimmediately. *6.ON_AFTER_RELEASE:fthisflagisset,theuser *activitytimerwillberesetwhentheWakeLockisreleased,causingthe *illuminationtoremainonabitlonger.Thiscanbeusedtoreduceflickerif *youarecyclingbetweenwakelockconditions. * *你能加两个以上的标志,这些仅能影响屏幕的行为。这些标志当组合中有一个PARTIAL_WAKE_LOCK时将没有效果。 * *二、权限获取要进行电源的操作需要在AndroidManifest.xml中声明该应用有设置电源管理的权限。 *<uses-permissionandroid:name="android.permission.WAKE_LOCK"/> *你可能还需要 *<uses-permissionandroid:name="android.permission.DEVICE_POWER"/> * *三、WakeLock的设置是Activiy级别的,不是针对整个Application应用的。 * **/ abstract class WakeLockService extends Service { private android.os.PowerManager.WakeLockmWakeLock; WakeLockService() { } /** *获取锁,保持屏幕亮度。Android中通过各种Lock锁对电源进行控制,需要注意的是加锁和解锁必须成对出现。 *一般使用:这个函数在Activity的onResume中被调用。releaseWakeLock()方法则是释放该锁,在Activity的onPause中被调用。 */ protected void acquireWakeLock() { if (mWakeLock== null ) { //通过PowerManager的newWakeLock((intflags,Stringtag)方法来生成WakeLock实例。 //intFlags指示要获取哪种WakeLock,不同的Lock对cpu、屏幕、键盘灯有不同影响。 PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE); mWakeLock=pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,getClass().getCanonicalName()); mWakeLock.setReferenceCounted( false ); mWakeLock.acquire(); } } protected void acquireWakeLock( long timeout) { if (mWakeLock== null ) { PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE); mWakeLock=pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,getClass().getCanonicalName()); mWakeLock.setReferenceCounted( false ); mWakeLock.acquire(timeout); } } /** *释放锁,显示的释放,如果申请的锁不释放系统就不会进入休眠。 */ protected void releaseWakeLock() { if (mWakeLock== null ||!mWakeLock.isHeld()) { mWakeLock.release(); mWakeLock= null ; } } } 本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1610983,如需转载请自行联系原作者

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

android151 笔记

13. 14 .什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service? 在Service的生命周期中,被回调的方法比Activity少一些,只有onCreate, onStart, onDestroy, onBind和onUnbind。 通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。 在Service的生命周期中,被回调的方法比Activity少一些,只有onCreate, onStart, onDestroy, onBind和onUnbind。 通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。 1 通过startService Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。 2 通过bindService Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind-> onDestroyed方法。 所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind-> onDestroyed方法。 需要注意的是如果这几个方法交织在一起的话,会出现什么情况呢? 一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又bindService,Service只被创建一次。 如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。 如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就stop不掉了,只能调用UnbindService, service就会被销毁 如果一个service通过startService 被start之后,多次调用startService 的话,service会多次调用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。 如果一个service通过bindService被start之后,多次调用bindService的话,service只会调用一次onBind方法。 多次调用unbindService的话会抛出异常。 15 . 不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放? 这个问题问的很山寨.默认不做任何处理,B里面的音乐都能播放. 遇到问题, 可以随机应变,灵活发挥,多考虑些细节,比如说这个题就可以这样说,说说你对startActivityForResult的理解() A开启B的时候,用startActivityForResult()方法, B返回的时候销毁了并且把播放的状态信息返回给A ,A继续播放音乐. 16 . 什么是IntentService?有何优点? 普通的service ,默认运行在ui main 主线程 Sdk给我们提供的方便的,带有异步处理的service类IntentService,里面的 OnHandleIntent()方法可以处理耗时的操作,OnHandleIntent()方法运行在子线城中。 17 .什么时候使用Service?Service是长期运行的,比如QQ就会有一个长期运行的Service来接受服务器的消息。他要一直运行让应用去调用或者保持保持与服务端的连接。Aidl也要经常用到Service,因为他要长期让第三方去调用。用Service经常要去绑定才能与他通信。 startForeground(id, notification) Messager.activity与service之间也可以通过消息进行交互。消息可以跨进程,不用使用aidl了。 拥有service的进程具有较高的优先级 官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。 1 . 如果service正在调用onCreate, onStartCommand或者onDestory方法,那么用于当前service的进程相当于前台进程以避免被killed。 2 . 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed. 3 . 如果客户端已经连接到service (bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。 4. 如果service可以使用startForeground( int , Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。(流氓软件可以起2个service,当一个service被杀死了另一个service可以把这个service启动,这样这个service就永远不会杀死。) 如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。 1 .Service的特点可以让他在后台一直运行,可以在service里面创建线程去完成耗时的操作. 2 .Broadcast receiver捕获到一个事件之后,可以起一个service来完成一个耗时的操作. 3 .远程的service如果被启动起来,可以被多次bind, 但不会重新create. 索爱手机X10i的人脸识别的service可以被图库使用,可以被摄像机,照相机等程序使用. 18 . 请描述一下Intent 和 Intent Filter。 Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。 通过Intent 可以实现各种系统组件的调用与激活. Intent filter: 可以理解为邮局或者是一个信笺的分拣系统… 这个分拣系统通过3个参数来识别 Action: 动作 view Data: 数据uri uri Category : 而外的附加信息 Action 匹配 Action 是一个用户定义的字符串,用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个 Action。在 AndroidManifest.xml 的 Activity 定义时可以在其 <intent-filter > 节点指定一个 Action 列表用于标示 Activity 所能接受的“动作”,例如: <intent-filter > <action android:name="android.intent.action.MAIN" /> <action android:name="cn.itcast.action" /> …… </intent-filter> 如果我们在启动一个 Activity 时使用这样的 Intent 对象: Intent intent = new Intent(); intent.setAction("cn.itcast.action" ); 那么所有的 Action 列表中包含了“cn.itcast”的 Activity 都将会匹配成功。 Android 预定义了一系列的 Action 分别表示特定的系统动作。这些 Action 通过常量的方式定义在 android.content. Intent中,以“ACTION_”开头。我们可以在 Android 提供的文档中找到它们的详细说明。 URI 数据匹配 一个 Intent 可以通过 URI 携带外部数据给目标组件。在 <intent-filter >节点中,通过 <data/> 节点匹配外部数据。 mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。如下: <data android:mimeType="mimeType" android:scheme="scheme" android:host="host" android:port="port" android:path="path"/> 电话的uri tel: 12345 http: // www.baidu.com 自己定义的uri itcast: // cn.itcast/person/10 如果在 Intent Filter 中指定了这些属性,那么只有所有的属性都匹配成功时 URI 数据匹配才会成功。 Category 类别匹配 <intent-filter > 节点中可以为组件定义一个 Category 类别列表,当 Intent 中包含这个列表的所有项目时 Category 类别匹配才会成功。 默认是DEFAULT 19 . Intent传递数据时,可以传递哪些类型数据? 1 .一般的基本数据类型 Intent .putextra() intent.getextra(); 2 .数据的uri, intent.setData() intent.getData(); 20 . 说说Activity,Intent,Service是什么关系 。 麦当劳和麦当娜的关系是什么关系? 这种问题,就讲下activity,讲一下service,说一下 通过intent去激活组件,传递数据. 说自己项目中有这样一个网络更新的功能,显示界面就用的activity, 后台有个service每隔半小时都去访问下服务器获取更新的数据… 开启服务用的是intent来开启 21 . 请描述一下Broadcast Receiver。 有很多广播接收者 ,系统已经实现了很多广播(开机广播,打电话广播,收短信广播)也可以自定义广播. 广播分两种 有序广播 无序广播,大家一起收到。 指定接收者的广播 . 是不可以被拦截掉的 <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> abortBroadcast(); 用于接收系统的广播通知, 系统会有很多sd卡挂载,手机重启,广播通知,低电量,来电,来短信等…. 手机卫士中自定义一个broadcast receiver <intent-filter android:> <action> sms_received </action> </intent-filter> 来获取短信到来的广播, 根据黑名单来判断是否拦截该短信. 画画板生成图片后,当从网上下载一个图片后要显示在默认的图库中的时候要发送一个sd挂载的通知,通知系统的gallery去获取到新的图片. Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+ Environment.getExternalStorageDirectory())); sendBroadcast(intent); 22 . 在manifest和代码中如何注册和使 用 broadcast receiver 。 设置广播接收者的优先级,设置广播接受者的action名字 等… 详细见工程代码. <intent-filter android:priority="1000"> <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> <receiver android:name=".SmsReceiver"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> <receiver android:name=".BootCompleteReceiver"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 23 . 请介绍下ContentProvider是如何实现数据共享的。 把自己的数据通过uri的形式共享出去,所以不会看到数据库表的字段结构,就会保证数据表的隐私性。 android 系统下 不同程序 数据默认是不能共享访问 需要去实现一个类去继承ContentProvider public class PersonContentProvider extends ContentProvider{ public boolean onCreate(){ // .. } query(Uri, String[], String, String[], String) insert(Uri, ContentValues) update(Uri, ContentValues, String, String[]) delete(Uri, String, String[]) } 24 . 请介绍下Android的数据存储方式。 文件: 访问权限. sdcard <data>/<data> 数据库:也是文件,.db文件, sqlite SharedPreference: <data>/<data>/ shared_preps 网络: socket tcp udp , http httpurlconnection 25 . 为什么要用ContentProvider?它和sql的实现上有什么差别? 屏蔽数据存储的细节,对用户透明,用户只需要关心操作数据的uri就可以了 不同app之间共享,操作数据 Sql也有增删改查的方法. 但是contentprovider 还可以去增删改查本地文件. xml文件的读取,更改, 网络数据读取更改 26 . 请介绍下Android中常用的五种布局。 FrameLayout(帧布局,做游戏做视频,一层层的盖住。底下是视频上面盖上一些快进暂停按钮),LinearLayout (线性布局,控件的层级比较多,绘制的时候耗时),AbsoluteLayout(绝对布局,不用做屏幕适配的时候,),RelativeLayout(相对布局,上下左右,控件之间的层级比较少,绘制的时间短),TableLayout(表格布局) FrameLayout 从屏幕的左上角开始布局,叠加显示, 实际应用 播放器的暂停按钮. LinearLayout 线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局 (android:orientation="vertical")和水平布局(android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。 AbsoluteLayout 绝对布局犹如div指定了absolute属性,用X,Y坐标来指定元素的位置android:layout_x="20px" android:layout_y="12px" qq斗地主 qq游戏大厅 800*480 800*480.apk fwvga 854*480 指定平板机型的游戏开发中经常用到绝对布局 widget 绝对布局 指定机型的平板游戏开发机顶盒开发。. 2.3 3.0 1 .界面布局 任务管理器 gridview 2 .手机 任务管理 listview lephone lepad RelativeLayout 相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有: 相对于某一个元素 android:layout_below="@id/aaa" 该元素在 id为aaa的下面 android:layout_toLeftOf="@id/bbb" 改元素的左边是bbb 相对于父元素的地方 android:layout_alignParentLeft="true" 在父元素左对齐 android:layout_alignParentRight="true" 在父元素右对齐 TableLayout <table> 表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素,设定他的对齐方式 android:gravity="" 。 每一个布局都有自己适合的方式,另外,这五个布局元素可以相互嵌套应用,做出美观的界面。 oa 自动化 生成报表 ,图标 表示 css div webview 27. 通过eclips的File Exlporer可以看见在data/system/packages.xml这个xml就是安卓应用的注册表,action和service都在里面,每次启动action的时候都会去这个里面找。 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5164978.html,如需转载请自行联系原作者

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

android150 笔记

1. 什么是Activity? 四大组件之一,一般的,一个用户交互界面对应一个activity,界面的容器。 setContentView() , 四大组件之一,一般的,一个用户交互界面对应一个activity,界面的容器。 setContentView() , // 要显示的布局 button.setOnclickLinstener{ } , activity 是Context的子类,同时实现了window.callback这个接口可以分发事件那么activity就可以处理事件和keyevent.callback这个接口就可以处理按键的事件, 可以处理与窗体用户交互的事件. Service也是Context的子类,没有实现window.callback和keyevent.callback接口就不能与用户交互。 我开发常用的的有FragmentActivitiy,ListActivity , PreferenceActivity ,TabAcitivty等… 如果界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity. 进度对话框的显示与销毁 2 . 请描述一下Activity 生命周期。 生命周期描述的是一个类 从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法..自己不能new因为自己new的自己不会启动。 在这个过程中 会针对不同的生命阶段会调用不同的方法 Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:oncreate ondestroy, onstop onstart ,onresume onpause 其实这些方法都是两两对应的,onCreate创建与onDestroy销毁; onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause; 这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢? 答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法; 如果被onDestroy了,则是调用onCreate方法。 最后讲自己项目中的经验,比如说手机卫士每次进入某个界面的时候都要看到最新的数据,这个刷新列表的操作 就放在onStart()的方法里面.这样保证每次用户看到的数据都是最新的. 多媒体播放, 播放来电话. onStop() 视频, 视频声音设置为0 , 记录视频播放的位置 mediaplayer.pause(); onStart() 根据保存的状态恢复现场. mediaplayer.start(); 在读文档的时候 还发现 activity还有两个方法 onPostResume() 和 OnPostCreate()这两个生命周期的方法,不过开发的时候没有用到过. 3 . 两个Activity之间跳转时必然会执行的是哪几个方法。 一般情况比如说有两个activity,分别叫A,B ,当在A里面激活B组件的时候, A 会调用 onPause()方法,然后B 调用onCreate() ,onStart(), OnResume() , 这个时候B覆盖了窗体, A会调用onStop()方法. 如果B呢 是个透明的,或者是对话框的样式, 就不会调用A的onStop()方法 4 . 横竖屏切换时候Activity的生命周期。 这个生命周期跟清单文件里的配置有关系 1 、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期 默认首先销毁当前activity,然后重新加载所有数据,加载网络数据。 2、设置Activity的android:configChanges="orientation|keyboardHidden|screenSize" 时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法,不会自己把自己杀死再重新创建, 游戏开发中, 屏幕的朝向都是写死的. 5 . 如何将一个Activity设置成窗口的样式。 可以自定义一个activity的样式 android:theme="@android:style/Theme.Dialog" ,也可以定义一个透明的Activity然后在上面定义一个dialog. 6 . 你后台的Activity被系统 回收怎么办?如果后台的Activity由于某原因被系统回收可了,如何在被系统回收之前保存当前状态? 除了在栈顶的activity,其他的activity都有可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的可能性越大. protected void onSaveInstanceState(Bundle outState) { // outState保存在内存的某个地方,所以可以恢复。Word就是隔一段时间保存一下。 super .onSaveInstanceState(outState); outState.putLong("id", 1234567890 ); } public void onCreate(Bundle savedInstanceState) { // 判断 savedInstanceState是不是空. // 如果不为空就取出来 super .onCreate(savedInstanceState); } 7 .如何退出Activity?如何安全退出已调用多个Activity的Application? Activity是基于栈的,一个应用打开多个Activity都会存放在栈中,退出的时候要从栈中从顶到底一个个的销毁所有的Activity。一般软件都是连续按2次返回键就退出了。 退出activity 直接调用 finish () 方法 . // 用户点击back键 就是退出一个activity 退出activity 会执行 onDestroy()方法 . 1 、抛异常强制退出: 该方法通过抛异常,使程序Force Close。 验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。 100/0 // 安全结束进程 android.os.Process.killProcess(android.os.Process.myPid()); 2 、记录打开的Activity: 每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。 List<Activity> lists ; 在public class MyApplication extend application{} 全集的环境里面 lists = new ArrayList<Activity> (); lists.add( this ); for (Activity activity: lists) { activity.finish(); } ondestory lists.remove( this ); 3 、发送特定广播: 在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。 // 给某个activity 注册接受接受广播的意图 registerReceiver(receiver, filter) // 如果过接受到的是 关闭activity的广播 就调用finish()方法 把当前的activity finish()掉 4 、递归退出 在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。 上面是网上的一些做法. 其实 可以通过 intent的flag 来实现.. intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity,然后在新的activity的oncreate方法里面 finish掉所有的Activity。. 讲一讲你对activity的理解 把上面的几点用自己的心得写出来 8. service是否在main thread中执行, service里面是否能执行耗时的操作? 默认情况,如果没有显示的指定service所运行的进程, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面 ,Service运行在主线程所以主线程不能执行耗时操作,Service耗时操作时间是20秒Activity是5秒brodcast是10秒。 service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 ) 在子线程中执行 new Thread(){}.start(); Thread.currentThread().getName(); 特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让service在另外的进程中执行 9 . 两个Activity之间怎么传递数据? 基本数据类型可以通过. Intent 传递数据 extras.putDouble(key, value) intent.putExtra(name, value) // 通过intent putExtra 方法 基本数据类型 都传递 intent.getStringExtra("key","value" ); intent.getBooleanExtra("key","value" ) Bundle bundle = new Bundle(); bumdle.putShort(key, value); intent.putExtras(bumdle); intent.putExtras(bundle) 除了基本数据类型还可以传递实现了Serializable 接口的对象,原理是让对象实现 implements Serializable 接口然后把对象存放到文件上来传递. 让类实现Serializable 接口,然后可以通过 ObjectOutputStream // 对象输出流 传递过去。 File file = new File("c:\1.obj" ); FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); Student stu = new Student(); oos.writeObject(stu); // 从文件中把对象读出来 ObjectInputStream ois = new ObjectInputStream(arg0); Student stu1 = (Student) ois.readObject(); 还可以传递实现了Parcelable接口的对象,他的原理是通过内存来传递,Bitmap传递图片的时候就是这么传递的, 文件/ 网络 intent.setData(Uri) Uri.fromFile(); // 大图片的传递不能通过bitmap传递,只能通过图片的uri传递然后他们自己去加载图片。 10 . 怎么让在启动一个Activity是就启动一个service? 在activity的onCreate()方法里面 startService();service没有栈,创建Activity要创建栈。 11 .同一个程序,但不同的Activity是否可以放在不同的Task任务栈中? Singleinstance 运行在另外的单独的任务栈里面 比方说在激活一个新的activity时候, 给intent设置flag Intent的flag添加FLAG_ACTIVITY_NEW_TASK 这个被激活的activity就会在新的task栈里面… Intent intent = new Intent(A. this,B. class ); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 12 . Activity怎么和service绑定,怎么在activity中启动自己对应的service? startService() 一旦被创建 与调用着无关 没法使用service里面的方法,调用Service的oncreat()和onStart()方法, bindService () 把service 与调用者绑定 ,如果调用者被销毁, service会销毁,调用service的onCraet()onBind()方法不会走onStart()方法。 startService()和bindService ()同时调用会调用oncreat(),onStart(),onBind().销毁service的时候会调用StopService()和Unbind()方法。 bindService() 我们可以使用service 里面的方法 bindService(). 让activity能够访问到 service里面的方法 构建一个intent对象, Intent service = new Intent( this,MyService. class ); 通过bindService的方法去启动一个服务, bindService(intent, new MyConn(), BIND_AUTO_CREATE); ServiceConnection 对象(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE. private class myconn implements ServiceConnection { public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub // 可以通过IBinder的对象 去使用service里面的方法 } public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } } 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5164594.html,如需转载请自行联系原作者

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

SWIFT学习笔记01

1、Swift。用来推断option是不是nil,相当于OC的 if(option) if let name = option{ greeting = “if=====“ }else{ greeting = "else===" } 2、执行switch中匹配到的子句之后。程序会退出switch语句,并不会继续向下执行,所以不须要在每一个子句结尾写break。 3、//使用..创建的范围不包括上界,假设想包括的话须要使用...,集合上,就是[)与[]的关系 for i in 0..3{ println("i===\(i)")//仅仅经历0,1,2三次循环 } 4、//传入数组參数 func sumOf(numbers:Int...) -> Int{ var sum = 0 for number in numbers{ sum += number } return sum } 5、//函数嵌套,函数里面定义并使用函数 func returnFifteen() -> Int{ var y = 10 func add(){ y+=5 } add() return y } 6、处理变量的可选值时。你能够在操作(比方方法、属性和子脚本)之前加? 。假设?之前的值是nil,? 后面的东西都会被忽略。而且整个表达式返回nil。否则,?之后的东西都会被执行。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5180947.html,如需转载请自行联系原作者

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

学习笔记 十六 : Docker

一 docker简介 docker是一个轻量级的,运行在用户内核的一组进程,与主机系统想隔离。它有自己的进程,文件系统和其它资源,它可以和其它主机共享物理主机内核。 二 安装配置 yum install docker systemctl start docker systemctl enable docker docker pull registry.access.redhat.com/redhat/rhel7 docker load -i rhel-server-docker-7.0.tar.gz docker images docker run -i -t --rm rhel7 cat /etc/hosts docker ps -a docker start -ai silly_fermi3 2.创建docker镜像 docker run -i rhel7 bash -c "yum install -y httpd;" docker ps -l docker commit -m "RHEL7+httpd" dreamy_goodall1 rhel_httpd docker images docker run -p 8080:80 -d rhel_httpd /usr/sbin/httpd -DFOREGROUND yum install docker-registry systemctl start docker-registry systemctl enable docker-registry firewall-cmd --add-port=5000/tcp firewall-cmd --add-port=5000/tcp --permanent docker tag rhel_httpd registry.example.com:5000/usr/httpd docker push registry.example.com:5000/user/httpd 三 案例 3.1 docker 私有仓库搭建 3.2 docker 发布一个web应用 3.3 docker 发布一个mysql服务 3.4 docker高可用 本文转自 woshiwei201 51CTO博客,原文链接:http://blog.51cto.com/chenwei/1841979

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

android学习笔记(1)

1.android概念 android是一个软件合集,包括操作系统,中间件和关键应用程序.(取自android sdk所带的文档) 2.android的体系结构 官方给出来的体系结构如下: 可以看到,自顶向下,android体系结构分为4层:应用程序层,框架层,库与运行时层,linux内核层. 应用程序 我们自己开发出来的程序属于这一层.应用程序使用java编程语言来写. 应用程序框架 提供了一些api,有很好的复用性. 库与运行时 库是一些基本的程序包(C/C++实现);运行时和java的运行时类似. linux内核 提供了操作系统所需的最基本的东西(包括一些驱动) 3.android历史 2005年Google收购Android公司 2007年Google联合总共34家公司成立开放手机联盟(open handset alliance,OHA) 2008年9月22日,Google第一款手机T-Mobile G1面世 2009年2月,android sdk 1.1发布 本文转自leipei博客园博客,原文链接:http://www.cnblogs.com/leipei2352/archive/2011/08/01/2124002.html,如需转载请自行联系原作者

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

7、yum 学习笔记

Linux的程序包管理: 软件包的组成部分: 二进制程序 /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin 库 lib, /usr/lib, /lib64, /usr/lib64, /usr/local/lib, /usr/local/lib64 /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf 配置文件 /etc 帮助文件 man文件, info文件, README, INSTALL, ChangeLog man COMMAND 到某路径下查找与命令名同名的通常以.gz结尾的压缩文件的名字 /usr/share/man/ ldd命令: 查看应用所依赖的共享库 ldd [options] FILE... rpm包的使用: rpm包命名格式: 源程序:name-version.tar.{gz|bz2|xz} version: major.minor.release rpm包:name-version-release.arch.rpm release:通常包含rpm的制作发行号,还包含适用的OS bash-4.3.2-2.el6.x86_64.rpm 来源合法性验正: 源程序:通过md5或sha1校验码验正; rpm包:发行商提供的合法性是可信的 验正包完整性:校验码 验正来源合法:公钥 获取rpm包的途径: 1、发行商的光盘或站点服务器 以CentOS为例: http://mirrors.163.com http://mirrors.sohu.com 2、http://rpmfind.net 3、http://rpm.pbone.net rpm包管理:安装 # rpm -ivh [install-options] /path/to/rpm_package 安装软件包,显示安装进度 [install-options] --test 仅测试,不真正执行安装过程 --nodeps 忽略依赖关系 --replacepkgs 重新安装 原来的配置文件不会被覆盖,新安装的配置文件将会重命名为以.rpmnew为后缀的文件 rpm包管理:卸载 #rpm -e [install-options] package_name 卸载软件包 [install-options] --nodeps 忽略依赖关系 rpm包管理:查询 #rpm -qa 查询所有已经安装的包 #rpm -q package_name 查询某单个包是否安装 #rpm -qi package_name 查询包的描述信息 #rpm -ql package_name 查询包安装之后在当前系统生成文件列表 #rpm -qd package_name 查询包安装后生成的帮助文档 #rpm -qc package_name 查询包安装后生成的配置文件 #rpm -qf /path/to/somefile 查询某文件是哪个包安装生成的 #rpm -q --scripts package_name 查询包相关的脚本 脚本有四类: preinstall 安装前脚本 postinstall 安装后脚本 preuninstall 卸载前脚本 postuninstall 卸载后脚本 查询尚未安装的rpm包文件的相关信息: #rpm -pqi /path/to/package_file 查询包的描述信息 #rpm -pql /path/to/package_file 查询包安装之后在当前系统生成文件列表 #rpm -pqd /path/to/package_file 查询包安装后生成的帮助文档 #rpm -pqc /path/to/package_file 查询包安装后生成的配置文件 rpm包之升级: #rpm -Uvh [install-options] /path/to/package_file 升级或安装 #rpm -Fvh [install-options] /path/to/package_file 升级 [install-options] --nodeps 忽略依赖关系 --force 强行安装 rpm包管理:检查包安装后生成的文件是否被修改过; #rpm -V package_name S file Size differs M Mode differs (includes permissions and file type) 5 digest (formerly MD5 sum) differs D Device major/minor number mismatch L readLink(2) path mismatch U User ownership differs G Group ownership differs T mTime differs P caPabilities differ rpm包管理:检验来源合法性和软件包完整性 包完整性:通过单向加密机制(md5|sha1) 来源合法性:通过公钥加密机制(RSA) 导入制作者的公钥,CentOS发行版的公钥在iso文件中; 导入命令:rpm --import /path/to/gpg-key-file #pm -K --nosignature /path/to/package_file 只检查完整性,不检查来源合法性 #pm -K --nodigest /path/to/package_file 不检查完整性,只检查来源合法性 #pm -K /path/to/package_file 既检查完整性,又检查来源合法性 rpm包管理:数据库重建 数据库:/var/lib/rpm/ #rpm --initdb 初始化,如果事先不存在一个数据库,则新建之; #rpm --rebuilddb 重建,直接重建数据库,会覆盖原有的库; yum客户端: 1、配置文件:指定各可用的yum仓库; 2、缓存元数据:yum会到各可用yum仓库获取元数据,并缓存至本地; 3、分析元数据:根据具体操作请求完成元数据分析, 可能包括检查依赖关系、文件列表等信息; 4、执行具体操作: 客户端配置文件指定对应服务器访问方式: ftp ftp://server/path/to/repo http http://server/path/to/repo nfs nfs://server/nfs_path file file:///path/to/repository 要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中: /etc/yum.conf /etc/yum.repos.d/*.repo 配置文件格式:由两段组成,类似windows的ini配置文件 [main] :主配置段 [repo] :仓库配置段 配置repo: [repo_ID] name=String baseurl=仓库的访问路径 enabled={1|0} gpgcheck={1|0} gpgkey=公钥文件(可以在本地,也可是服务器端路径) cost=定义此仓库开销,默认为1000 [base] name=CentOS 6.5 X86_64 relase baseurl=http://172.16.0.1/cobbler/ks_mirror/centos-6.5-x86_64/ enabled=1 gpgcheck=1 gpgkey=http://172.16.0.1/cobbler/ks_mirror/centos-6.5-x86_64/RPM-GPG-KEY-CentOS-6 yum的各命令: # yum repolist 列出所有可用yum repo #yum clean all 清理缓存 #yum list [all|installed|available] 列出[所有的安装包|已安装包|可安装包] # yum info package_name 列出包的描述信息 # yumwhatprovides|provides /path/to/somefile 查询某文件是由哪个包安装生成的 # yuminstall package_name 安装指定的程序包 # yum reinstall package_name 重新安装指定的程序包 # yumerase package_name 卸载指定的程序包 # yumcheck-update 检查可升级的包 # yumupdate package_name 升级指定的程序包 # yum downgrade package_name 降级指定的程序包 # yum grouplist 列出所有包组 # yum groupinfo "group_name" 显示包组信息 # yum groupinstall "group_name" 安装指定的包组 # yum groupremove "group_name" 卸载指定的包组 如果系统为CentOS 5,常用的开发包组为“Development Tools”和“Development Libraries” 如果系统为CentOS 6,常用的开发包组为“Development Tools”和“Server Platform Development” 安装本地包: # yum install /path/to/package_file 手动禁止检查来源及完整性:--nogpgcheck # yum --nogpgcheck install /tmp/zsh-2.3.1-2.el6.x86_64.rpm 练习:安装相关的包组,确保如下命令可执行 # gcc --version gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. #yum -y groupinstall "Development tools" "Server Platform Development" yum repository: 文件服务器 repodata/: repomd.xml: 测试实现yum repository的配置: 1、准备文件服务器;使用httpd为例,请事先确保已经安装httpd程序包; 2、在/var/www/html目录,使用一个目录来保存准备制作成为yum仓库的所有rpm包; # cd /var/www/html # lftp 172.16.0.1/pub/Sources/6.x86_64 # lftp: > mirror openstack # bye 3、创建yum仓库 # rm -rf /var/www/html/openstack/repodata # createrepo /var/www/html/openstack 4、启动httpd服务 # service httpd start 5、配置使用自建的yum仓库 [openstack] name=Openstack Repository baseurl=http://172.16.100.7/openstack/ enabled=1 gpgcheck=0 6、配置好epel的yum源 7、测试使用 # yum install openstack-keystone 程序包管理之编译安装: 源程序: 项目工程:把代码分散于多个源代码文件 GNU/make autoconf: configure脚本 检查编译环境是否编译需求,并定义当前程序编译时启用哪个特性或功能,以及安装路径的定义等等; 结果:会根据Makefile.in文件生成makefile文件 automake: Makefile.in文件 用于结合configure脚本生成makefile文件 makefile文件是make命令的配置文件 编译安装的步骤: 1、拿到源代码,并解压: # tar xf package-version.tar.{gz|bz2|xz} 注意:展开后的目录名通常为package-version 2、切换至源码目录中 # cd package-version 3、执行configure脚本 # ./configure 4、编译 # make 5、安装 # make install configure脚本的通用功能: 我们需要定义的配置: 1、指定安装路径: --prefix=/usr/local/package_name --sysconfdir=/etc/package_name 2、指定启用/禁用的特性: --enable-feature: 例如--enable-fpm --disable-feature: 例如 --disable-socket 3、指定所依赖功能、程序或文件 --with-function:启用某功能 --without-function:禁用某功能 不同的程序,其configure脚本功能不同,要获取帮助: ./configure --help 练习: 1、编译安装nginx, 并启动之; 2、编译安装axel,并试用之; 3、编译安装httpd,并启动之; /usr/local/apache/bin 二进制程序: # vim /etc/profile.d/apache.sh PATH=/usr/local/apache/bin:/usr/local/apache/sbin:$PATH export PATH 头文件输出给系统: # ln -sv /usr/local/apache/include /usr/include/httpd 库文件输出: # vim /etc/ld.so.conf.d/httpd.conf /usr/local/apache/lib 让系统重新生成库文件路径缓存 # ldconfig 导出man文件: # vim /etc/man.config MANPATH /usr/local/apache/man 本文转自开源殿堂 51CTO博客,原文链接:http://blog.51cto.com/kaiyuandiantang/1942716,如需转载请自行联系原作者

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

Hadoop学习笔记

第一个hands-on入门程序: 参考 http://blog.csdn.net/sim_szm/article/details/12578055 搭建环境并跑WordCount程序,区别是我安装的是最新的hadoop版本0.23.11,JDK我使用的是Sun JDK,Linux使用的是国产的Kylin。 问题一:Error: JAVA_HOME is not set and could not be found. 解决方案: /etc/profile 文件中export JAVA_HOME ${HADOOP_HOME}/libexec/hadoop-config.sh 显式export JAVA_HOME ${HADOOP_HOME}/etc/hadoop/yarn-env.sh显式export JAVA_HOME 问题二:NameNode 没有启动 解决方案: 删除core-site.xml文件中配置的tmp目录 运行 hadoop namenode -format 命令 再运行sbin目录下的start-dfs.sh脚步启动NameNode和datanode 问题三:为何需要SSH 解决方案:Hadoop集 群成员的通讯机制都是使用SSH,即使是单机环境,内部脚本也会运行 ssh localhost进行处理,所以安装SSH是必须的。 本文转自sarchitect 51CTO博客,原文链接:http://blog.51cto.com/stevex/1535193,如需转载请自行联系原作者

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

docker学习笔记(1)

(1)Docker介绍 关于Docker的介绍,我就不列举出来了。到百度、谷歌搜索。非常多介绍文章。以下我给出官网的介绍:https://www.docker.com/whatisdocker/ (2)体验Docker Docker官网提供了一个体验的交互教程:https://www.docker.com/tryit/ 想要尝尝鲜的能够去试一试。对docker有个大概了解。 (3)Ubuntu下Docker的安装 不同系统下docker的安装有些不一样,以下我是在ubuntu14.04 x64系统下安装。Docker官方推荐最佳的系统是Ubuntu x64。 $ sudo apt-get update $ sudo apt-get install docker.io $ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker $ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.i 假设想要使用最新的Docker,要检查APT系统能处理https,文件 /usr/lib/apt/methods/https 应该存在,假设不存在。则须要安装包 apt-transport-https apt-get update apt-get install apt-transport-https 然后。加入docker repositor $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21 $ sudo sh -c "echo deb https://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list" $ sudo apt-get update $ sudo apt-get install lxc-docker 到这里,docker安装完毕,要检验docker是否成功安装,能够输入以下命令检查: $ sudo docker run -i -t ubuntu /bin/bas 备注:其它操作系统。如Centos、Debian的安装见官网教程:https://docs.docker.com/installation/#installation (4)经常使用命令 在上面的安装完毕后。在终端命令行下输入:docker,会列出非常多命令,以下我列举几个最经常使用的命令。 A、docker images--------------查看images B、docker ps--------------------查看正在执行的container C、docker pull ----------------下载image活repository D、docker commit------------创建新的image E、docker rm-------------------删除container F、docker rmi-------------------删除image G、docker run-----------------在新的container中执行image或command (5)在docker下安装ubuntu A、docker pull ubuntu:14.04 这个命令表示下载ubuntu 14.04版镜像 下载完毕后。我们能够输入docker images查看全部镜像。能够看到我们刚刚下载的ubuntu镜像。 B、执行ubuntu 14.04 镜像 docker run -i -t ubuntu:14.04 输入docker run命令能够查看run下的參数意义。成功执行后,我们会进入例如以下的终端显示界面: b2a2e188ae57表示HOSTNAME。这里你执行的结果可能和我不一样,以下你就能够在这个ubuntu系统下操作。 C、保存操作记录 在进入到虚拟系统后。我们在里面做一些操作,比如在根文件夹下创建一个test.txt文件。 touch test.txt。 然后退出系统:exit。 在下次我们再次执行这个系统时,会发如今根文件夹下不存在test.txt,也就是说我们之前的操作没有保存。要想保存在虚拟系统里的操作。要用到docker commit命令 在我们运行了touch test.txt创建了文件后,使用exit退出系统。 然后输入:docker commit b2a2 ubuntu:14.04,这里b2a2是之前执行的image的标示ID。不用输入所有。仅仅需4个左右字符就可以。 这个命令表示将之前对镜像的操作保存到ubuntu:14.04下。也就是我们执行的镜像,下次再次执行docker run -t -i ubuntu:14.04,就能够看到根文件夹下的test.txt文件。假设想对保存到新的镜像。仅仅需将ubuntu:14.04改成你想要的名称就可以。 如:docker commit b2a2 myubuntu,输入docker iamges。就能够看到myubuntu,当然之前的ubuntu:14.04还在。 參考: (1)https://docs.docker.com/installation/#installation 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5227674.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Sublime Text

Sublime Text

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册