首页 文章 精选 留言 我的

精选列表

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

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,如需转载请自行联系原作者

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

vSphere笔记01~02

Vmware vsphere 虚拟化 云和大数据的底层!!!! 分类 1.开源:openstack:Linux:难(无图形化) nosqleasystack公司 2.企业版本:vsphere sdn!!!(基于openstack) vsphere套件6.5 esxi主机(vkernel) 装在物理服务器 基于Linux的系统(裁剪版)(严格意义上就叫系统而不叫操作体统) !!!!物理机——esxi——vm——os——app(openstack省掉了os) client web client Windows client vcenter 数据中心虚拟化需要 装在os上(有要求) DC域控制器(依赖)(Windows创造) 部署高级特性 vmotion:迁移HA高可用性:测量服务器性能使用率FT容错(镜像) sso hp公司 登录单点认证 清单服务器(任务服务器) 转换器:物理服务器的系统变虚拟机 vipsan vsphere 拓扑和网络 client管理esxiserver 容器的嵌套关系 端口组(类似vlan) vm-network vss虚拟标准交换机(包含端口组虚拟机 物理网卡) vds虚拟分布式交换机(需要vcenter高级特性) 作用:简化vss部署类似vtp 、简化端口组的管理 最底层物理,上面几层全是虚拟化 有时,vcenter上再装esxi,,,, 存储 sds!!!! nas网络区域存储(已经淘汰) ipsan IP存储 Linux中:lvm逻辑卷管理:pv物理卷(硬盘)vg卷组lv逻辑卷 DC 域控制器 域:计算机组成的可信任网络 域的结构 workstation创建esxi虚拟机,选择桥接模式::虚拟机和外机在同一网段!! 然后在外机上通过vsphereclient链接esxiserver!!!! vcenter部署流程 也是esxi? Dns 正向和反向的域名查找 udp dc vcenter上常规配置:(client(openfiler)远程登录vcenter主机?) 1.创建数据中心 2.添加esxi主机进入数据中心 3.利用ipsan实现共享存储 选择物理卷,添加逻辑卷文件系统:scasi esxi主机设置链接ipsan的接口 消耗物理接口1用于ipsan的连接 vcenter上设置存储适配器

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

Android Animation学习笔记

关于动画的实现,Android提供了Animation,在Android SDK介绍了2种Animation模式: 1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画; 2. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。 动画类型 下面先来看看Android提供的动画类型。Android的animation由四种类型组成 在XML文件中: alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 在Java 源码中定义了相应的类,可以使用这些类的方法来获取和操作相应的属性: AlphaAnimation渐变透明度动画效果 ScaleAnimation渐变尺寸伸缩动画效果 TranslateAnimation画面转换位置移动动画效果 RotateAnimation画面转移旋转动画效果 Tween Animation 一个tween动画将对视图对象中的内容进行一系列简单的转换(位置,大小,旋转,透明性)。如果你有一个文本视图对象,你可以移动它,旋转它,让它变大或让它变小,如果文字下面还有背景图像,背景图像也会随着文件进行转换。 使用XML来定义Tween Animation 动画的XML文件在工程中res/anim目录,这个文件必须包含一个根元素,可以使<alpha><scale> <translate> <rotate>插值元素或者是把上面的元素都放入<set>元素组中,默认情况下,所以的动画指令都是同时发生的,为了让他们按序列发生,需要设置一个特殊的属性startOffset。动画的指令定义了你想要发生什么样的转换,当他们发生了,应该执行多长时间,转换可以是连续的也可以使同时的。例如,你让文本内容从左边移动到右边,然后旋转180度,或者在移动的过程中同时旋转,没个转换需要设置一些特殊的参数(开始和结束的大小尺寸的大小变化,开始和结束的旋转角度等等,也可以设置些基本的参数(例如,开始时间与周期),如果让几个转换同时发生,可以给它们设置相同的开始时间,如果按序列的话,计算开始时间加上其周期。 Tween Animation共同的节点属性 属性[类型] 功能 备注 Duration[long] 属性为动画持续时间 时间以毫秒为单位 fillAfter [boolean] 当设置为true ,该动画转化在动画结束后被应用 fillBefore[boolean] 当设置为true ,该动画转化在动画开始前被应用 interpolator 指定一个动画的插入器 有一些常见的插入器 accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 repeatCount[int] 动画的重复次数 RepeatMode[int] 定义重复的行为 1:重新开始 2:plays backward startOffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画 zAdjustment[int] 定义动画的Z Order的改变 0:保持Z Order不变 1:保持在最上层 -1:保持在最下层 表二 XML节点 功能说明 alpha 渐变透明度动画效果 <alpha android:fromAlpha=”0.1″ android:toAlpha=”1.0″ android:duration=”3000″ /> fromAlpha 属性为动画起始时透明度 0.0表示完全透明 1.0表示完全不透明 以上值取0.0-1.0之间的float数据类型的数字 duration为动画持续时间,ms单位 toAlpha 属性为动画结束时透明度 表三 scale 渐变尺寸伸缩动画效果 <scale android:interpolator= “@android:anim/accelerate_decelerate_interpolator” android:fromXScale=”0.0″ android:toXScale=”1.4″ android:fromYScale=”0.0″ android:toYScale=”1.4″ android:pivotX=”50%” android:pivotY=”50%” android:fillAfter=”false” android:startOffset=“700” android:duration=”700″ android:repeatCount=”10″ /> fromXScale[float] fromYScale[float] 为动画起始时,X、Y坐标上的伸缩尺寸 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 toXScale [float] toYScale[float] 为动画结束时,X、Y坐标上的伸缩尺寸 pivotX[float] pivotY[float] 为动画相对于物件的X、Y坐标的开始位置 属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置 表四 translate 画面转换位置移动动画效果 <translate android:fromXDelta=”30″ android:toXDelta=”-80″ android:fromYDelta=”30″ android:toYDelta=”300″ android:duration=”2000″ /> fromXDelta toXDelta 为动画、结束起始时 X坐标上的位置 fromYDelta toYDelta 为动画、结束起始时 Y坐标上的位置 表五 rotate 画面转移旋转动画效果 <rotate android:interpolator=”@android:anim/accelerate_decelerate_interpolator” android:fromDegrees=”0″ android:toDegrees=”+350″ android:pivotX=”50%” android:pivotY=”50%” android:duration=”3000″ /> fromDegrees 为动画起始时物件的角度 说明 当角度为负数——表示逆时针旋转 当角度为正数——表示顺时针旋转 (负数from——to正数:顺时针旋转) (负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转) toDegrees 属性为动画结束时物件旋转的角度 可以大于360度 pivotX pivotY 为动画相对于物件的X、Y坐标的开始位 说明:以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置 下面给出一个完整的XML定义(SDK提供) <set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="700" /> <set android:interpolator="@android:anim/decelerate_interpolator"> <scale android:fromXScale="1.4" android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" android:fillBefore="false" /> <rotate android:fromDegrees="0" android:toDegrees="-45" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" /> </set> </set> Tween Animation如何使用 使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件 //main.xml中的ImageView ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); //加载动画 Animation hyperspaceJumpAnimation =AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); //使用ImageView显示动画 spaceshipImage.startAnimation(hyperspaceJumpAnimation); 如何在Java代码中定义动画 //在代码中定义 动画实例对象 private Animation myAnimation_Alpha; private Animation myAnimation_Scale; private Animation myAnimation_Translate; private Animation myAnimation_Rotate; //根据各自的构造方法来初始化一个实例对象 myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f); interpolator的解释 interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。 Interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了几个 Interpolator 子类,实现了不同的速度曲线,如下: AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速 AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速 CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线 DecelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始减速 LinearInterpolator 在动画的以均匀的速率改变 Frame Animation Frame Animation是顺序播放事先做好的图像,跟电影类似。不同于animation package, Android SDK提供了另外一个类AnimationDrawable来定义、使用Frame Animation。 Frame Animation可以在XML Resource定义(还是存放到res\anim文件夹下),也可以使用AnimationDrawable中的API定义。由于Tween Animation与Frame Animation有着很大的不同,因此XML定义的格式也完全不一样,其格式是:首先是animation-list根节点,animation-list根节点中包含多个item子节点,每个item节点定义一帧动画,当前帧的drawable资源和当前帧持续的时间。下面对节点的元素加以说明: XML属性 说明 drawable 当前帧引用的drawable资源 duration 当前帧显示的时间(毫秒为单位) oneshot 如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。 variablePadding If true, allows the drawable’s padding to change based on the current state that is selected. visible 规定drawable的初始可见性,默认为flase; 下面就给个具体的XML例子,来定义一帧一帧的动画: <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <item android:drawable="@drawable/rocket_thrust1" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust2" android:duration="200" /> <item android:drawable="@drawable/rocket_thrust3" android:duration="200" /></animation-list> 上面的XML就定义了一个Frame Animation,其包含3帧动画,3帧动画中分别应用了drawable中的3张图片:rocket_thrust1,rocket_thrust2,rocket_thrust3,每帧动画持续200毫秒。 然后我们将以上XML保存在res/anim/文件夹下,命名为rocket_thrust.xml,显示动画的代码: AnimationDrawable rocketAnimation;public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image); rocketImage.setBackgroundResource(R.anim.rocket_thrust); rocketAnimation = (AnimationDrawable) rocketImage.getBackground();}public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { rocketAnimation.start(); return true; } return super.onTouchEvent(event);} 代码运行的结果:3张图片按照顺序的播放一次. 有一点需要强调的是:启动Frame Animation动画的代码rocketAnimation.start();不能在OnCreate()中,因为在OnCreate()中AnimationDrawable还没有完全的与ImageView绑定,在OnCreate()中启动动画,就只能看到第一张图片。这里实在拖曳事件中实现的。 下面,阅读Android SDK中对AnimationDrawable的介绍,有个简单的了解: AnimationDrawable 获取、设置动画的属性 int getDuration() 获取动画的时长 int getNumberOfFrames() 获取动画的帧数 boolean isOneShot() Void setOneShot(boolean oneshot) 获取oneshot属性 设置oneshot属性 void inflate(Resurce r,XmlPullParser p, AttributeSet attrs) 增加、获取帧动画 Drawable getFrame(int index) 获取某帧的Drawable资源 void addFrame(Drawable frame,int duration) 为当前动画增加帧(资源,持续时长) 动画控制 void start() 开始动画 void run() 外界不能直接掉调用,使用start()替代 boolean isRunning() 当前动画是否在运行 void stop() 停止当前动画 本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2010/01/11/1644482.html,如需转载请自行联系原作者

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

Android Service学习笔记

一 什么是Service 服务是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序进程的上下文(context)里面,这取决于自身的需要。其它的组件可以绑定到一个服务(Service)上面,通过远程过程调用(RPC)来调用这个方法。例如媒体播放器的服务,当用户退出媒体选择用户界面,仍然希望音乐依然可以继续播放,这时就是由服务(service)来保证当用户界面关闭时音乐继续播放的。 它跟Activity的级别差不多,但是他不能自己运行,需要通过某一个Activity或者其他Context对象来调用,Context.startService()和Context.bindService()。两种启动Service的方式有所不同。这里要说明一下的是如果你在Service的onCreate或者onStart做一些很耗时间的事情,最好在Service里启动一个线程来完成,因为Service是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情。什么时候需要Service呢?比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等。 二 如何使用Service 1.第一种是通过调用Context.startService()启动,调用Context.stopService()结束,startService()可以传递参数给Service。 2.第二种方式是通过调用Context.bindService()启动,调用Context.unbindservice()结束,还可以通过ServiceConnection访问Service。 二者可以混合使用,比如说我可以先startService再bindservice。 三 service生命周期 startService后,即使调用startService的进程结束了,Service仍然还存在,直到有进程调用stopService,或者Service自己自杀(stopSelf())。bindService后,Service就和调用bindService的进程同生共死了,也就是说当调用bindService的进程死了,那么它bind的Service也要跟着被结束,当然期间也可以调用unbindservice让Service结束。 两种方式混合使用时,比如说你startService了,我bindService了,那么只有你stopService了而且也unbindservice了,这个Service才会被结束。 Android系统将会尝试保留那些启动了的或者是绑定了服务的进程。如果该服务正在进程的onCreate(), onStart(),或者onDestroy()这些方法中执行时,那么主进程将会成为一个前台进程,以确保此代码不会被停止。如果服务已经开始,那么它的主进程会就重要性而言低于所有可见的进程但高于不可见的进程,由于只有少数几个进程是用户可见的,所以只要不是内存特别低,该服务不会停止.。如果有多个客户端绑定了服务,只要客户端中的一个对于用户是可见的,即认为该服务可见。 如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。 stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。 所以调用startService的生命周期为:onCreate --> onStart(可多次调用) --> onDestroy 使用context.bindService()启动Service会经历: context.bindService()->onCreate()->onBind()->Service running onUnbind() -> onDestroy() ->Service stop onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。 所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。 所以,在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。 本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2010/06/14/1758336.html,如需转载请自行联系原作者

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

Python 学习笔记 - Memcached

Memcached是一个分布式内存对象缓存系统,他把数据缓存在内存里面来减少对数据库的访问,从而提高动态网页的访问速度。他的基本结构是key/value(键值对)。下面看看在Python里面如何使用。 首先来安装一下服务器端,豆子直接在一个CentOS7的机器上安装 [root@sydnagios~]#yuminstallmemcachedLoadedplugins:fastestmirror,langpacksRepodataisover2weeksold.Installyum-cron?Orrun:yummakecachefastbase|3.6kB00:00epel/x86_64/metalink|2.0kB00:00epel|4.3kB00:00extras|3.4kB00:00updates|3.4kB00:00(1/5):epel/x86_64/group_gz|170kB00:00(2/5):epel/x86_64/updateinfo|671kB00:00 然后服务器端跑起来,这个里面我指定的端口是12000,因此如果有防火墙别忘记打开对应端口 [root@sydnagios~]#memcached-d-m10-uroot-l10.2.1.107-p12000-c256-P/tmp/memcached.pid 参数说明: - d 是启动一个守护进程 - m 是分配给Memcache使用的内存数量,单位是MB - u 是运行Memcache的用户 - l 是监听的服务器IP地址 - p 是设置Memcache监听的端口,最好是 1024 以上的端口 - c 选项是最大运行的并发连接数,默认是 1024 ,按照你服务器的负载量来设定 - P 是设置保存Memcache的pid文件 打开防火墙端口 firewall-cmd--add-port=12000/tcp--permanent 接下来安装Python的客户端模块 从这里下载https://pypi.python.org/pypi/python-memcached 解压拷贝到sys.path对应的目录,就能直接用了 看看第一个例子,可以通过set来设置数据,get来获取数据。里面debug是为了显示错误的 生产环境里面不要用 #!/usr/bin/envpython#-*-coding:utf-8-*-#AuthorYuanLiimportmemcachemc=memcache.Client(['10.2.1.107:12000'],debug=True)mc.set("foo","bar")mc.add("name","John")print(mc.get('foo'))print(mc.get('name'))-----------barJohn memcached的第二个特点是他默认支持集群,原理是内存里面创建一个主机的列表;每个主机有一个权重,权重的数目和主机在列表里面出现的数目成正比。通过算法可以决定把键值对放在哪个服务器的内存里面。 例2 mc=memcache.Client([('1.1.1.1:12000',1),('1.1.1.2:12000',2),('1.1.1.3:12000',1)],debug=True)mc.set('k1','v1') 除了get和set以外,他还具有以下常用函数 add添加一条键值对,如果已经存在的 key,重复执行add操作异常 replacereplace 修改某个key的值,如果key不存在,则异常 set 和 set_multi set 设置一个键值对,如果key不存在,则创建,如果key存在,则修改set_multi 设置多个键值对,如果key不存在,则创建,如果key存在,则修改 delete 和 delete_multi delete 在Memcached中删除指定的一个键值对delete_multi 在Memcached中删除指定的多个键值对 append 和 prepend append 修改指定key的值,在该值 后面 追加内容prepend 修改指定key的值,在该值 前面 插入内容 decr 和 incr incr 自增,将Memcached中的某一个值增加 N ( N默认为1 )decr 自减,将Memcached中的某一个值减少 N ( N默认为1 ) gets 和cas 这个组合可以避免脏数据的产生,如果在gets数据,和cas数据回去这个过程中有其他用户执行了get,那么则不允许修改

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

Storm Ack框架笔记

Storm利用Acker Bolt节点跟踪消息,当Spout发送出去的消息以及这些消息所衍生出来的消息均被处理后,Spout将受到对应于该消息的Ack。实现要点: 1、Storm中每条发送出去的消息都会对应一个随机的消息ID。 2、Spout发送消息后,将向Acker Bolt发送一条消息,该消息内容为<RootId,消息ID>,Acker bolt将为该消息创建一条跟踪项。 3、Bolt产生要发送的消息时,会计算每条新消息的消息ID,并将消息ID发送至Acker Bolt,Acker Bolt对消息ID进行异或后存储。于是,Storm对新发送的消息进行了跟踪。 4、Blot对输入的消息进行Ack时,也会将该消息ID发送到Acker Bolt,Acker Bolt对每条消息ID进行异或存储,由于该消息在被发送时,已经向Acker Bolt发送过消息ID,之后再被Acker时又再次发送该消息ID。根据异或的语义,这相当于对该消息的跟踪结束。 5、Acker Bolt在更新某一个消息的跟踪值时,若发现其跟踪值变为零,则向Spout节点发送消息,表明Spout发送的这条消息已经被成功处理。 6、若Spout在发送消息时未指定用于消息跟踪的ID,系统则不对消息进行跟踪,Blot新产生的消息并不会被单独跟踪。 7、Spout的每条消息以及由该消息演化而来的所有消息的跟踪负载为16个字节,8个字节的根消息ID以及8个字节的消息跟踪值AckValue.但是,由于Storm中采用HashMap对其进行存储,在32位的JVM中,每条消息至少需要20个字节的额外负载,故一条消息的跟踪需要40个字节左右的负载。 (一)1与2中,Spout发送T1到Bolt1,发送T2到Bolt2.T1和T2具有相同的内容,但表示不同的备份,每条消息都会对应一个ID,消息T1的anchors为<RootId,T1>,消息T2的anchors为<RootId,T2> (二)3中,Spout在Acker Bolt中注册了一条记录RootId=T1^T2。 (三)4与6中,Bolt1发送新的消息T3、T4、T5到Blot3,同时对输入的消息进行Ack操作,消息内容为<RootId,T1^T3^T4^T5>,此时,Acker Bolt中的跟踪项为<RootId,T1^T2^T1^T3^T4^T5=>T2^T3^T4^T5>。 (四)在5中,Bolt2对输入的消息T2进行Ack操作,它没有产生新的消息,发送到Acker Bolt的消息为<RootId,T2>,T2异或后消失。 (五)在7中,Blot3对输入的消息进行Ack操作,发送的消息为<RootId,T3^T4^T5>,此时Acker Bolt中的跟踪项为<RootId,T3^T4^T5^T3^T4^T5 =>0> (六)Acker Bolt发现RootId对应的值为零,它认为该RootId对应的消息以及所有衍生出来的消息均已经被成功处理,于是它向Spout发送消息,而Spout将调用Ack回调方法。 那么每条被处理的消息必须进行Ack或者Fail操作,否则,虽然有超时机制可以对过期消息进行清空,但可能导致消息不断重传。(所以项目中每次进入bolt都有唯一性过滤?) 参考:《Storm 源码分析》

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

docker app 打包笔记

docker介绍 https://www.docker.io/ 我的需求 此次希望将要发布的app和执行环境进行打包, app使用python django开发。 这次我打算打包的步骤为: 自己制作docker的base image 配置app执行环境 将制作好的容器导出成文件,用于其他机器的导入 开始执行 制作base image 首先我们先提取一个最小的rootfs, 我现在使用的系统是ubuntu12.04, 我想制作一个12.04的也就是precise的rootfs: sudo debootstrap precise ubuntu #precise 为 /usr/share/debootstrap/scripts 下存在的debootstrap script #ubuntu 就是当前目录下的一个目录 制作过程比较长,制作完成后我们来把它导入到docker中成为一个image: tar -C ubuntu -c . | sudo docker import - ubuntu 完成后我们就制作好了一个docker的base image, 我们可以同做下面这个命令来查看: sudo docker images 配置app环境 首先我要把app代码拷进容器中,这个是可以通过dockerfile 中的ADD来做的,不过我还没有仔细看dockerfile,就先手动通过qiniu上传在下载到运行中的容器中的. 首先我们要用docker使用我们前面制作好的image跑起一个shell sudo docker run -i -t ubuntu bash => root@210ae349a593:/# 然后我们就可以在这个启动中的bash中来执行我们的常用操作了,我把上传的代码wget下来到/docker_app, 对我把它放在了启动的容器的根目录下的docker_app,现在我要安装我app的依赖。 我先手动wget下来python的setuptools和pip,手动安装好.因为依赖中有MySQL-python,如果要用pip来安装的话要编译,编译的话需要安装mysql的一些lib,会使image变大,所以直接用apt-get安装了二进制的,并在requirments.txt中删掉了MySQL-python. 因为依赖中还有一个Pillow需要编译,所以忍痛装上的gcc和python-dev. 然后在docker_app目录下 pip install -r requirments.txt -i http://pypi.douban.com/simple 修改app配置文件中的数据库的地址,我们要查看我们本机docker0虚拟网卡的ip, 我机器的显示是: ifconfig => docker0 Link encap:Ethernet HWaddr 76:71:61:ca:84:1b inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::c10:64ff:fe74:c0c6/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:617463 errors:0 dropped:0 overruns:0 frame:0 TX packets:678907 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:56062519 (56.0 MB) TX bytes:267105247 (267.1 MB) 所以我就把数据库ip改成 172.17.42.1, ok,环境配置好的,我们保持这个shell session,然后打开另一个shell session执行以下命令查看现在运行的这个容器的id: sudo docker ps => CONTAINER ID IMAGE .... 210ae349a593 ubuntu:latest .... 然后我们将这个容器commit 成 docker_app: sudo docker commit 210ae349a593 docker_app 我们再次执行sudo docker images, 就会发现我们生成的 docker_app 的image 下面我们 exit 刚才我们配置环境的那个 shell, 来测试一下我们配置的环境的image. sudo docker run -i -t -d -p 8000:8000 docker_app python /docker_app/manage.py runserver 0.0.0.0:8000 这样我们就把本地8000端口和任务容器的8000端口做了映射,接下来我们就可以在本地浏览器上访问我们http://127.0.0.1:8000来访问我们的应用了, 我们还可以查看容器的输出日志,容器id为我们sudo docker ps出来的CONTAINER ID: sudo docker logs -f <容器id> => Validating models... 0 errors found March 27, 2014 - 14:14:10 Django version 1.6.1, using settings 'app.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C. 导出我们制作好的image docker 本身是有push 来上传的 index.docker.io 的,使用是用pull来拉取,但是由于在天朝,网络不给力。所以就导出成文件吧,docker官方也有给出自建image server的方案,貌似项目还不太成熟,以后再研究. 现在我们 docker ps 出刚才运行的那个容器的 id, 将它导出 sudo docker export <容器id> > docker_app.tar 完成后我们刚才制作的容器就导出成了 docker_app.tar 文件, 以后在其他机器部署的时候执行导入 cat docker_app.tar | sudo docker import - docker_app 管道后面的 docker_app 为导入后image命名,自己指定

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

深度学习入门笔记系列 ( 七 ) ——循环神经网络(RNN)学习笔记

1.引言 在传统的神经网络模型中 ,是从输入层到隐含层再到输出层 ,层与层之间是全连接的 ,每层之间的节点是无连接的 。但是这种普通的神经网络对于很多问题却无能无力 。例如 ,你要预测句子的下一个单词是什么 ,一般需要用到前面的单词 ,因为一个句子中前后单词并不是独立的 。于是乎 ,我们就名正言顺的引出了这篇文章的 RNN 。 2.什么是RNN RNN(Recurrent Neural Networks)翻译为循环神经网路 ,与传统神经网络模型对比 ,RNN 一个序列当前的输出与前面的输出也有关 。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中 。重点的讲就是 ,隐藏层之间的节点之间是有连接的 ,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出 。 例如上图 ,中间A表示隐含层 ,能够看出来从左到右的序列中 ,隐含层输入不仅包括输入层还有上一个序列的隐含层输出 。 3.RNN 能干些啥 理论上 ,RNN 能够对任何长度的序列数据进行处理 。但是在实践中 ,为了降低复杂性往往假设当前的状态只与前面的几个状态相关 ,下图便是一个典型的RNN : 坦白讲 ,小詹对 RNN 只知道基础概念 ,用的很少很少 。因为个人感觉 RNN 更多的应用到 NLP 即自然语言处理中 ,如如词向量表达 、语句合法性检查 、词性标注 。与之相对的 ,在计算机视觉领域 ,可能 CNN 及其变种使用的更为频繁 ,但是 RNN 也并非无用武之地 。 RNN 可以应用的领域大致有 : ●语言模型与文本生成(Language Modeling and Generating Text) ●机器翻译(Machine Translation) ●语音识别(Speech Recognition) ●图像描述生成 (Generating Image Descriptions) 4.LSTM网络 和 CNN 一样 ,基础的 RNN 网络也存在很多改进和拓展 ,相信大家听到比较多的是 LSTM(Long Short Term Memory)。 它与一般的 RNN 结构本质上并没有什么不同 ,只是使用了不同的函数去去计算隐藏层的状态 。在 LSTM 中 ,i 结构被称为 cells ,可以把 cells 看作是黑盒用以保存当前输入 xt 之前的保存的状态 ht−1 ,这些 cells 更加一定的条件决定哪些 cell 抑制哪些 cell 兴奋 。它们结合前面的状态 、当前的记忆与当前的输入 。已经证明 ,该网络结构在对长序列依赖问题中非常有效 。 原文发布时间为:2018-09-4 本文作者:小詹 本文来自云栖社区合作伙伴“小詹学Python”,了解相关信息可以关注“小詹学Python”。

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

shell总结笔记——关于变量

BASH:主要的优点: 命令编修能力; 命令与文件补全功能; 命令别名设置功能; 工作控制、前景背景控制; 程序化脚本; 万用字符; 1、什么是变量? 1、 让某一个特定的字符串代表不固定的内容。2、 变量就是让一组文字或符号等来取代一些设置,或者是一串保留的数据。3、变量的格式:变量名=变量内容(变量名一般设置为大写字母,专业一些)。 设置变量的规则:1、 变量与变量内容以一个等号“=”来链接;2、 等号两边不能直接接空白字符;3、 变量名称只能是英文字母与数字,但是开头字符不能是数字;4、 变量内容若有空白字符可以使用双引号,或单引号讲变量内容结合起来。双引号内的特殊字符如$等,可以保有原本的特性;单引号内的特殊字符则仅作为一般字符(纯文本)。5、 可用转义符“\”将特殊符号变成一般字符;6、 在一串指令的执行中,还需要借由其他额外的指令所提供的信息时,可以使用反撇号,而不是单引号。7、 若该变量需要在其他子程序执行,则需要一export来使自定义变量变成环境变量。8、 通常大写字符为系统默认变量,自行设置变量可以使用小写字符,方便判断;9、 取消变量的方法为使用unset: “unset 变量名称”例如取消myname的设置:unset myname。 有关shell变量定义、赋值及变量输出加单引号、双引号、反引号与不加引号的简要说明,如下表所示: 建议: 在脚本中定义普通字符串变量时,应尽量把变量的内容用双引号括起来;单纯数字的变量内容可以不加引号;希望变量的内容原样输出时需要加单引号;希望变量值引用命令并获取命令的结果时就用反单引号或$( )。env命令——查询环境变量。random命令:随机产生的数字是在0——32768之间。 set命令:查询的是所有的变量,包括环境变量和自定义变量。 $:代表的是当前shell的PID号,如echo $$; ?:代表的是上一个指令的回传值,如echo $? 自定义变量与环境变量最大的区别是:该变量是否会被子程序(子shell)继续使用。 各种变量定义的作用域: 环境变量=全域变量 自定义变量=区域变量 关于系统中的环境变量解释: PS1——系统特定变量名 其中PS1这个变量需要解释下,其他可以自行看懂,PS1可用的选项如下: \d :可显示出“星期月日”的日期格式,如:"Mon Feb 2" \H :完整的主机名称。举例来说,我的练习机为“study.centos.vbird” \h :仅取主机名称在第一个小数点之前的名字,如我主机则为“study”后面省略 \t :显示时间,为 24 小时格式的“HH:MM:SS” \T :显示时间,为 12 小时格式的“HH:MM:SS” \A :显示时间,为 24 小时格式的“HH:MM” \@ :显示时间,为 12 小时格式的“am/pm”样式 \u :目前使用者的帐号名称,如“dmtsai”; \v :BASH 的版本信息,如我的测试主机版本为 4.2.46(1)-release,仅取“4.2”显示 \w :完整的工作目录名称,由根目录写起的目录名称。但主文件夹会以 ~ 取代; \W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。 #:下达的第几个指令。 \$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 用法示例: [root@localhost ~]# PS1='[\u@\h\w\A#\#]\$' #添加上面的一些选项 [root@localhost~13:07#5]#cd /etc #多执行两下命令 [root@localhost/etc13:07#6]#cd /boot [root@localhost/boot13:07#7]#exit #可以发现,执行PS1这个变量并结合一些选项的使用,可以暂时改变命令提示符的变化, #并且后面的数字会每执行一次,就增加一个数,这是\#的作用 设置变量的方式1 [root@localhost ~]# path=$PATH #先自定义一个变量,引用“PATH”的值,用“path”变量做测试 [root@localhost ~]# echo $path #输出进行确认下 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@localhost ~]# echo ${path#/*local/sbin:} #试着删除一个 /usr/local/bin:/usr/sbin:/usr/bin:/root/bin #在上面的命令中,“$”是关键字,用在这种删除模式所必须存在的; #“path”就是原本的变量名称; #“#”代表从变量内容的最前面开始向右删除,且只删除最短的那个; #“/*local/sbin:”代表要被删除的部分,由于“#”代表从前面开始删除, #所以这里就从“/”写起,并且可以使用“*”这个万用字符,可以代表任意内容。 #但这条命令并没有改变“path”变量的内容,可以将“echo”换为“path=”即可直接改变变量内容。 #如下: [root@localhost ~]# path=${path#/*local/sbin:} [root@localhost ~]# echo $path /usr/local/bin:/usr/sbin:/usr/bin:/root/bin #这就将原本的变量值更改成功了。 关于其他的更改方式,参考上面的表格即可咯! (2) 示例1——测试一下是否存在username这个变量,若不存在则赋值username为root。 [root@localhost ~]# echo $username #查看username变量是否存在 [root@localhost ~]# username=${username-root} #如果变量内容不存在就赋值为root [root@localhost ~]# echo $username #变量不存在,所以将它赋值了root root [root@localhost ~]# username='lv jian zhao' #那么现在给它赋值 [root@localhost ~]# username=${username-root} #再次使用这个,表示如果值不存在,则将它赋值为root [root@localhost ~]# echo $username #再次输出,会发现还是我们手工赋的值,并没有给它赋值为root lv jian zhao #从上面可以看出“-”号的作用,就是如果值不存在,就给它赋值“-”号后面的值,若存在,则放弃。 示例2——若username未设置或为空字串,则将username内容设置为root [root@localhost ~]# username="" #将username设置为空字串 [root@localhost ~]# username=${username-root} #若值不存在,则赋值为root [root@localhost ~]# echo $username #输出该变量,会发现还是空的,因为username的值是存在的,只不过是空字串而已,所以并没有赋值为root [root@localhost ~]# username=${username:-root} #使用“:-”试试 [root@localhost ~]# echo $username #会发现已经赋值为root了 root #说明:“:-”的作用就是如果值为空或是未设置,都能被后面的内容替换。 设置变量的方式2 环境变量一般是指用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行。Shell通过环境变量来确定登录用户名、命令路径、终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、Shell脚本和各类应用。环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,因此,如果希望永久保存环境变量,可在用户家目录下的.bash_profile或.bashrc(非用户登录模式特有,例如远程文件中,或者全局配置/etc/bashrc(非用户登录模式特有,例如远程SSH)或/etc/profile文件中定义。在将环境变量放入上述的文件中后,每次用户登录时这些变量都将被初始化。按照系统规范,所有环境变量的名字均采用大写形式。在将环境变量应用于用户进程程序之前,都应该用export命令导出定义,例如:正确的环境变量定义方法为export OLDGIRL=1。有一些环境变量,比如HOME、PATH、SHELL、UID、USER等,在用户登录之前就已经被/bin/login程序设置好了。通常环境变量被定义并保存在用户家目录下的.bash_profile文件或全局的配置文件/etc/profile中,具体的环境变量说明请参考下表:在查看设置的变量时,有3个命令可以显示变量的值:set、env和declare(替代早期的typeset)。set命令输出所有的变量,包括全局变量和局部变量;env命令只显示全局变量;declare命令输出所有的变量、函数、整数和已经导出的变量。set-o命令显示bash Shell的所有参数配置信息。查看举例: [root@localhost ~]# env | tail #使用env命令进行查看全局变量 [root@localhost ~]# set -o #使用set -o查看bash shell的所有参数配置信息 设置环境变量的方式 如果想要设置环境变量,就要在给变量赋值之后或在设置变量时使用export命令,具体设置见下文的示例。其实,除了export命令,带-x选项的declare内置命令也可以完成同样的功能(注意:此处不要在变量名前面加$):export命令和declare命令的格式如下: ①export 变量名=value②变量名=value ; export 变量名③declare -x 变量名=value #以上就是三种设置环境变量的三种方法 上面设置的全局变量只是临时设置的,重启系统后,就失效了,那么可以将变量写入以下几个文件其中之一即可,使其永久生效: 1、只对用户的环境变量配置 [lv@localhost ~]$ ls ~/.bashrc ~/.bash_profile #对于用户的环境变量设置,比较常见的是用户家目录下的这两个目录,推荐写入第一个文件“.bashrc” 2、全局环境变量的配置常见的全局环境变量的配置文件如下: /etc/profile /etc/bashrc #推荐在此文件中优先设置 /etc/profile.d/ 环境变量总结 环境变量的定义: 变量名通常要大写; 变量可以在自身的shell及子shell中使用; 常用export来定义环境变量; 数字内容的变量定义可以不加引号,其他没有特殊要求的字符串等定义最好都加上双引号;如果真的需要原样输出就加单引号;定义变量加双引号是最常见的使用场景; 如果需要获取命令结果赋值给变量,则可以使用反撇号``(tab键上面的那个按键)或者括号“()”将命令字括起来; 执行env默认可以显示所有的环境变量名称及对应的值; 输出时用“echo $变量名”,取消时用“unset 变量名”; 书写crond定时任务时要注意,脚本要用到环境变量最好现在所执行的shell脚本中重新定义; 如果希望环境变量永久生效,则可以将其放在用户环境变量文件或全局环境变量文件里; 环境变量初始化与对应文件的生效顺序:在登录Linux系统并启动一个bash shell时,默认情况下bash会在若干个文件中查找环境变量的设置这些文件,这些文件可统称为系统环境文件。bash检查的环境变量文件的情况取决于系统运行shell的方式。系统运行shell的方式一般有3种:①通过系统用户登录后默认运行的shell;②非登录交互式运行shell;③执行脚本运行非交互式shell。 用户登录系统后首先会加载/etc/profile全局环境变量文件,这是Linux系统上默认的shell主环境变量文件,系统上每个用户登录都会加载这个文件。 当加载完/etc/profile文件后,才会执行/etc/profile.d目录下的脚本文件,这个目录下的脚本文件有很多,例如:系统的字符集设置(/etc/sysconfig/il8n)等。 之后开始运行$HOME/.bash_profile(用户环境变量文件),在这个文件中,又会去找$HOME/.bashrc(用户环境变量文件),如果有,则执行,如果没有,则不执行。在$HOME/.bashrc文件中又会去找/etc/bashrc(全局环境变量文件),如果有,则执行,如果没有,则不执行。 如果用户的shell不是登录时启动的(比如手动敲下bash时或者其他不需要输入密码的登录及远程连接情况),那么这种非登录shell只会加载$HOME/.bashrc,并会去找/etc/bashrc文件。因此如果希望在非登录shell下也可以督导设置的环境变量等内容,就需要将变量设定等写入$HOME/.bashrc或者/etc/bashrc,而不是$HOME/.bash_profile或/etc/profile。 ———————— 本文至此结束,感谢阅读 ————————

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Rocky Linux

Rocky Linux

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

WebStorm

WebStorm

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

用户登录
用户注册