首页 文章 精选 留言 我的

精选列表

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

数据分析学习笔记

row_number() row_number() over(partition by col1[, col2…] order by col1 [asc|desc][, col2[asc|desc]…]) 函数说明: 可以用于开窗,排序,计数,返回当前窗口的排序值。 参数说明:partition by col1[, col2..]:指定开窗口的列。 order by col1 [asc|desc], col2[asc|desc]:指定结果返回时的排序的值。 WM_CONCAT 函数声明:string wm_concat(string separator, string str) 函数说明:该函数用指定的 spearator 做分隔符,链接 str 中的值。可以用于多行变一行。 参数说明:separator:String 类型常量,分隔符。其他类型或非常量将引发异常。str:String 类型,若输入为 Bigint,Double 或者 Datetime 类型,会隐式转换为 String 后参与运算,其它类型报异常。返回值:返回 String 类型。

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

Docker学习笔记之compose

一、compose compose 作用 你的应用可能需要很多个服务,比如web服务,数据库服务,缓存服务等等。我们可以把这些服务放到单独的容器里面,如果手工去配置这些服务会有些麻烦,docker compose可以帮我们解决这个问题。 我们可以创建一个compose文件,在这个文件上面描述你都需要哪些服务,服务使用什么镜像、数据卷、网络等等,然后再用一条命令就可以管理、启动所有的服务。 compose 文件 compose文件用的yml格式,docker规定了一些指令,使用它们可以去设置对应的东西,它主要分为了3个区域: services:是服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等; networks:是应用的网络,在它下面可以定义应用的名字、使用的网络类型等等; volumes:是数据卷,在它下面可以定义的数据卷(名字等等),然后挂载到不同的服务下去使用; 二、Services 先创建一个文件夹beck-docker,并在里面新建docker-compose.yml文件,然后使用version指定一下compose使用的版本号。 定义服务 在应用里需要定义的服务,可以放到services下面。比如,我们去定义一个dog的服务,使用nginx镜像,指定主机上的8080端口映射到容器中得80端口,也就是nginx的http的访问端口。 version:'2' services: dog: image:nginx ports: -"8080:80" 以同样的方式,定义一个cat的服务,同样使用nginx镜像,然后指8081端口对应80端口。 version:'2' services: dog: image:nginx ports: -"8080:80" cat: image:nginx ports: -"8081:80" 需要注意的是,cat与dog要在同一个级别,还有ports是个数组,可以指定多个端口映射关系。 启动服务 定义好服务以后,在项目的目录启动这些服务,可以执行: docker-composeup 这样会启动,在compose文件下定义的所有服务。由于这是第一次启动这个服务,所以可以看到它是creating,也就是去创建相关的东西。首先会创建这个服务使用的网络,这里是叫做「beckdocker_default」的网络,然后是dog和cat的服务,这些网络和服务的名字,默认会加上一个前缀,由于在创建应用的时候没有指定名字,所以会默认使用项目目录的名字,后面还有一个数字的后缀。最后会有一个「Attaching to …」,将网络应用到服务上。 启动成功后,在浏览器访问一下。8080对应的是dog的服务,8081是cat的服务。 回到终端,可以看到服务的访问日志,日志的开头会有服务的名字,标志着日志是从哪个服务来的: 如果希望服务在后台运行,可以使用-d选项(也就是detach): docker-composeup-d 服务的生命周期 查看正在运行的服务 docker-composeps 停止一个服务 docker-composestop[服务名] 如果后面不加服务名,会停止所有的服务。 启动某一个服务 docker-composestart[服务名] 如果后面不加服务名,会启动所有的服务。 查看服务运行的log docker-composelogs-f 加上-f选项,可以持续跟中服务产生的log。 进入服务容器中 docker-composeexecdogbash 删除服务 docker-composerm 注意这个docker-compose rm不会删除应用的网络和数据卷。查看一下网络,可以看到应用创建的网络「beckdocker_default」,如果要删除所有的这些,可以使用: docker-composedown 会提示我们删除网络 beckdocker_default。 三、Networks 网络决定了服务之间以及服务和外界之间如何去通信,在执行docker-compose up的时候,docker会默认创建一个默认的网络,创建的服务也会默认地属于这个默认网络。服务和服务之间,可以使用服务的名字进行通信。也可以自己创建网络,并将服务属于到这个网络之中,这样服务之间可以相互通信,而外界就不能够与这个网络中的服务通信,可以保持隔离性。 下面登录dog服务去连接cat服务,登录到cat服务连接dog服务: 可以通过服务的名称进行连接。 自定义网络 1、在networks中先定义一个名为animal,类型为bridge的网络: version:'2' services: dog: image:nginx ports: -"8080:80" cat: image:nginx ports: -"8081:80" networks: animal: driver:bridge 2、让dog和cat服务使用这个网络: **version:'2' services: dog: image:nginx ports: -"8080:80" networks: -"animal" cat: image:nginx ports: -"8081:80" networks: -"animal" networks: animal: driver:bridge 3、再增加一个叫pig的服务,使用默认网络,来体现于自定义网络的隔离性: version:'2' services: dog: image:nginx ports: -"8080:80" networks: -"animal" cat: image:nginx ports: -"8081:80" networks: -"animal" pig: image:nginx ports: -"8082:80" networks: -"default" networks: animal: driver:bridge 4、重新启动应用 5、登录cat服务,尝试去连接dog服务和pig服务: 因为cat与dog同在animal网络,所以可以通过名字连接,而pig在default网络中,所以不能。 四、Volumes 在compose文件中,还可以指定一些有名字的数据卷,让服务去使用。方法是:在与networks同级的地方,添加volumes,接着是数据卷的名字,下面使用driver去指定数据卷的类型。 定义好数据卷后,就将这个数据卷交给一个服务去使用。可以用volumes给服务指定需要使用的数据卷: dog: ... volumes: -nest:/mnt 以dog服务为例,volumes下指定使用的数据卷,冒号左边是数据卷名称,冒号右边是挂载到的docker对应目录位置。接着给cat服务也添加同样的数据卷。 回到终端,执行docker-compose up -d,下面测试一下数据卷: 因为cat与dog服务都使用nest的数据卷,所以在dog中/mnt目录下创建的data1,在cat服务的/mnt目录下可以看到。 指定位置的数据卷 dog和cat都是一个web服务,现在我想将主机的某一个位置当做是服务的一个内容,那么我们可以去创一个指定位置的数据卷。首先可以在当前目录,创建./app/web文件夹,在里面创建个index.html。 编辑内容: 内容编辑好后,就给dog与cat服务指定数据卷,冒号左边是主机上的目录,冒号右边是服务内挂载的目录: 说明:/usr/share/nginx/html 目录是nginx默认主机的根目录,也就是nginx欢迎界面的目录。 本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/1854570,如需转载请自行联系原作者

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

openstack学习笔记十一 Nova

计算节点 跑虚拟机 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 [root@hequan~] #yuminstallopenstack-nova.noarchopenstack-nova-api.noarchopenstack-nova-conductor.noarch openstack-nova-novncproxy.noarchopenstack-nova-scheduler.noarchopenstack-nova-console.noarch ##控制节点 [root@hequan~] #yuminstallopenstack-nova-compute.noarch##计算节点 keystoneuser-create--namenova--passhequan keystoneuser-role-add--usernova--roleadmin--tenantservices keystoneservice-create--namenova-- type compute--descriptionnova |7708b5c40aec4cf3b59d6d84596a5f6b|nova|compute|OpenstackComputeService| |017bdbf9f335436cbd7f65fe74089b28|nova_ec2|ec2|EC2Service| |4f7b60427d304fd89658f4f8c23dd708|novav3|computev3|OpenstackComputeServicev3| +----------------------------------+-----------+-------------------------------------------------+-------------------------------------------------+--------------------------------------------+----------------------------------+ | id |region|publicurl|internalurl|adminurl|service_id| +----------------------------------+-----------+-------------------------------------------------+-------------------------------------------------+--------------------------------------------+----------------------------------+ |0bda7145ebc944a99112c53e97362fa1|RegionOne|http: //115 .29.107.17:8774 /v2/ %(tenant_id)s|http: //115 .29.107.17:8774 /v2/ %(tenant_id)s|http: //115 .29.107.17:8774 /v2/ %(tenant_id)s|7708b5c40aec4cf3b59d6d84596a5f6b| |731be711c3be4497b57c8751ce111986|RegionOne|http: //115 .29.107.17:8773 /services/Cloud |http: //115 .29.107.17:8773 /services/Cloud |http: //115 .29.107.17:8773 /services/Admin |017bdbf9f335436cbd7f65fe74089b28| |7ec9cb12959f4bedb7e0757c79b636fd|RegionOne|http: //127 .0.0.1:8774 /v3 |http: //127 .0.0.1:8774 /v3 |http: //127 .0.0.1:8774 /v3 |4f7b60427d304fd89658f4f8c23dd708| keystoneendpoint-create--service- id --publicul '' --internalurl '' --adminurl '' openstack-db--init--servicenova--passwordhequan--root123456 [root@hequan~] #ls-ld/var/log/nova/ drwxr-x---2novaroot40967月2300:08 /var/log/nova/ [root@hequan~] #chownnova.nova/var/log/nova/-R [root@hequannova(keystone_admin)] #mvnova.confnova.conf.bak [root@hequannova(keystone_admin)] #systemctllist-unit-files|grepnova openstack-nova-api.serviceenabled openstack-nova-cert.serviceenabled openstack-nova-compute.serviceenabled openstack-nova-conductor.serviceenabled openstack-nova-console.servicedisabled openstack-nova-consoleauth.serviceenabled openstack-nova-metadata-api.servicedisabled openstack-nova-novncproxy.serviceenabled openstack-nova-scheduler.serviceenabled openstack-nova-xvpvncproxy.servicedisabled vncserver_proxyclient_address=115.29.107.17 ##改成本机的IP vim nova.conf 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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 [DEFAULT] internal_service_availability_zone=internal default_availability_zone=nova novncproxy_host=0.0.0.0 novncproxy_port=6080 notify_api_faults=False state_path= /var/lib/nova report_interval=10 enabled_apis=ec2,osapi_compute,metadata ec2_listen=0.0.0.0 ec2_listen_port=8773 ec2_workers=1 osapi_compute_listen=0.0.0.0 osapi_compute_listen_port=8774 osapi_compute_workers=1 metadata_listen=0.0.0.0 metadata_listen_port=8775 metadata_workers=1 compute_manager=nova.compute.manager.ComputeManager service_down_time=60 rootwrap_config= /etc/nova/rootwrap .conf volume_api_class=nova.volume.cinder.API auth_strategy=keystone use_forwarded_for=False heal_instance_info_cache_interval=60 reserved_host_memory_mb=512 cpu_allocation_ratio=16.0 ram_allocation_ratio=1.5 network_api_class=nova.network.neutronv2.api.API default_floating_pool=public force_snat_range=0.0.0.0 /0 metadata_host=115.29.107.17 dhcp_domain=novalocal security_group_api=neutron scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,CoreFilter scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler compute_driver=libvirt.LibvirtDriver vif_plugging_is_fatal=True ##修改False如果有报错实例执行请求失败 vif_plugging_timeout=300 ##修改为0 firewall_driver=nova.virt.firewall.NoopFirewallDriver force_raw_images=True debug=False verbose=True log_dir= /var/log/nova use_syslog=False syslog_log_facility=LOG_USER use_stderr=True notification_topics=notifications rpc_backend=rabbit amqp_durable_queues=False sql_connection=mysql: //nova :hequan@115.29.107.17 /nova image_service=nova.image.glance.GlanceImageService lock_path= /var/lib/nova/tmp osapi_volume_listen=0.0.0.0 vncserver_proxyclient_address=115.29.107.17 ##修改本机地址 vnc_keymap=en-us vnc_enabled=True vncserver_listen=0.0.0.0 novncproxy_base_url=http: //115 .29.107.17:6080 /vnc_auto .html [api_database] [barbican] [cells] [cinder] catalog_info=volumev2:cinderv2:publicURL [conductor] [cors] [cors.subdomain] [database] [ephemeral_storage_encryption] [glance] api_servers=115.29.107.17:9292 [guestfs] [hyperv] [image_file_url] [ironic] [keymgr] [keystone_authtoken] auth_uri=http: //115 .29.107.17:5000 /v2 .0 identity_uri=http: //115 .29.107.17:35357 admin_user=nova admin_password=hequan admin_tenant_name=services [libvirt] virt_type=qemu inject_password=False inject_key=False inject_partition=-1 live_migration_uri=qemu+tcp: //nova @%s /system cpu_mode=none vif_driver=nova.virt.libvirt.vif.LibvirtGenericVIFDriver [matchmaker_redis] [matchmaker_ring] [metrics] [neutron] service_metadata_proxy=True metadata_proxy_shared_secret=hequan url=http: //115 .29.107.17:9696 admin_username=neutron admin_password=hequan admin_tenant_name=services region_name=RegionOne admin_auth_url=http: //115 .29.107.17:5000 /v2 .0 auth_strategy=keystone ovs_bridge=br-int extension_sync_interval=600 timeout=30 default_tenant_id=default [osapi_v21] [oslo_concurrency] [oslo_messaging_amqp] [oslo_messaging_qpid] [oslo_messaging_rabbit] kombu_reconnect_delay=1.0 rabbit_host=115.29.107.17 rabbit_port=5672 rabbit_hosts=115.29.107.17:5672 rabbit_use_ssl=False rabbit_userid=guest rabbit_password=guest rabbit_virtual_host=/ rabbit_ha_queues=False heartbeat_timeout_threshold=0 heartbeat_rate=2 [oslo_middleware] [rdp] [serial_console] [spice] [ssl] [trusted_computing] [upgrade_levels] [vmware] [vnc] [workarounds] [xenserver] [zookeeper] [osapi_v3] enabled=False 1 2 3 4 5 6 7 8 9 10 11 12 [root@hequan~] #nova-manageservicelist [root@hequan~(keystone_admin)] #novahost-list +---------------+-------------+----------+ |host_name|service|zone| +---------------+-------------+----------+ |hequan.lol|consoleauth|internal| |hequan.lol|scheduler|internal| |hequan.lol|conductor|internal| |hequan.lol|compute|nova| |hequan.lol|cert|internal| [root@hequan~] #systemctlis-activelibvirtd.service active 本文转自 295631788 51CTO博客,原文链接:http://blog.51cto.com/hequan/1832697,如需转载请自行联系原作者

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

MyBatis For .NET学习笔记:开篇

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

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

Android学习笔记--广播机制

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

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

Jenkins学习笔记 系列1

首先说下Jenkins能干什么?说下两个典型的应用场景。 Git/Repo + Gerrit + Jenkins 打造强大的Android持续集成环境。用户上传代码到Gerrit进行code review和入库,用户上传代码操作和入库都可以触发Jenkins获取代码进行自动构建。Jenkins也可以定时构建,构建结果可以通过邮件自动发 送给相关人员。当然用户提交代码到Gerrit时,Gerrit也会自动发邮件给具有代码检视权限的人员。 ##备注: repo介绍: Android使用Git作为代码管理工具,开发了Gerrit进行代码审核以便更好的对代码进行集中式管理,还开发了Repo命令行工具,对Git部分命令封装,将百多个Git库有效的进行组织。 Gerrit介绍: 一种免费、开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。它使用Git作为底层版本控制系统。 关于git操作代码的一些操作: git add git commit 若需要将代码向本地仓库递交,则通过git add将文件加入索引区,再通过git commit方法可真正的将代码递交入库。 git push 若功能开发好后,需要将本地代码共享给项目组中的其他成员,若通过git push命令将本地已入库的代码向远程仓库合入 2. SVN/Git + Jenkins 以apk代码为例,Jenkins可以监测SVN/Git等代码配置库,一旦有人提交代码,就会自动获取代码进行构建,构建结果可以通过邮件在内的多种方式通知人员。 本文转自Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1597340,如需转载请自行联系原作者

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

Android学习笔记--Activity初步

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

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

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

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

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

Web Service学习笔记(1)

Web Service的宗旨是创建不需要用户界面就能与其他应用程序交互的Web应用程序。 举例说明它的优点,假如你正在为一家股票投资公司创建网站,你并不需要把不同证劵交易所得数据库与自己的后台数据库进行整合,因为你的应用程序可以使用Web Service,并使用XML格式交换数据。 Web Service是松耦合的,它与服务器端和客户端使用的操作系统、编程语言都无关。假如你既拥有客户端又有服务器端的访问和管理权,这种情况更适合用.NET的Remoting技术,而不是Web service。 创建Web Service必须保证的是,服务器端和客户端都要支持HTTP、SOAP(简单对象访问协议)和XML等行业标准协议。 Web Service是如何工作的 Web Service允许两个程序之间交换XML文档。在这个架构的顶层,微软实现了一个远程过程调用(Remote Procedure Call,PRC)模型。 Web Service架构包括以下特性: 1。WebServcie的服务器端和客户端应用程序都能够连接到互联网。 2。用于进行通信的数据格式必须遵守相同的开放标准,并且在大多数情况下,这个标准几乎总是SOAP。 3。客户端和服务器端的系统是松耦合的。即Web Service不关心客户端和服务器端所使用的操作系统、对象模型或者编程语言。只要Web Service和使用Web Service的应用程序都能够发送和接收遵守适当协议标准的消息即可。 下图为Web Service流程的逻辑架构 如图所示,一个Web Service使用着会向Web Service发出一个调用请求。使用者会认为它通过Internet直接和Web Service进行交流,当然这实际上是个幻象。实际上,真正的调用由代理类完成。代理类对于Web Service使用者来说是一个本地类。代理会处理所有的负责的复杂架构,包括通过Internet发送请求道服务器、从web Service取回结果并呈现给Web Service使用者。 由于代理类在之前已在消费程序中注册,所有一切工作才可以顺利进行。注册有开发消费程序的程序员完成。 开发Web Service 开发Web Service的流程与开发网页的流程近乎一致: 1。所有构成网页和服务的源文件都是文本文件,它们可以使用任何文本编辑器创建和修改。而类文件可以在控制台命令行中通过命令工具进行编译。 2。可以在vs2005及以上版本中创建网页和Web Service 3。网页和Web Service既可以使用代码隐藏模型,也可以使用内联编码(inline coding)模型。Web Service中不需要使用代码隐藏技术,因为Web Service并不包括任何可视化内容。 4。网页和Web Service都充分利用了CLR和.NET Framework。 .aspx文件用于定义网页,而.asmx文件用于定Web Service,我们可以吧Web Service想象成类,类中的一些方法通过Internet被暴露给客户端。 代理 客户端应用程序如果使用Web Service,必须先创建一个代理。代理是要调用的真正代码的替身,它负责在机器边界引导调用。在代理在客户端应用程序中注册后,客户端应用程序调用方法就如调用本地对象一样。代理接受该调用,并以适当格式封装调用,然后以SOAP请求发送调用到服务器。当服务器返回SOAP包给客户端后,代理会对包进行解密,并且如同从本地对象的方法返回数据一样将其返回给客户端应用程序。如下图所示: 协议与标准(HTTP、XML、SOAP) HTTP:TCP/IP协议的最上层是超文本传输协议(HTTP)。它是用于在网络之间使用服务器和浏览器实现通讯,主要包括在服务器和浏览器建立连接,并将HTML传输到客户端浏览器。当客户端向服务器发送HTTP请求后,服务器就开始处理请求。通常,会返回HTML页面,然后通过浏览器呈现。然而对Web Service而言,服务器返回的是SOAP消息,消息中包含了被调用的Web Service方法的返回数据。 HTTP请求从请求的浏览器出传递名称和值到服务器,这种请求包括GET和POST两种。 GET请求中,名称和值会被附加到url上,数据是未加密的。当所有需要传递的数据可以使用名称和值成对表示,而且只需要传递少量字段,字段长度较短时,比较适合GET请求。另外,如果不需考虑安全问题时,也可以使用GET。 POST请求中,配对的名称和值是作为请求消息的一部分发送的。当有大量字段或者参数很长时,适合使用POST请求。从安全方面看,POST比GET更安全,因为POST请求可以被加密。和GET请求一样,POST请求无法传递复杂的数据类型(如类、结构体和DataSet)。 XML:是有W3C公布的开放标准的一种描述数据的方法。 XML和HTML十分类似。不同的是HTML使用的是预定义元素,这些元素规定了HTML在浏览器中如何显示,而XML的元素则是由开放人员自己定义的,所以几乎所有的数据都可以表示。制定XML的目的是为了使其成为一种平台无关、语言无关的标准。 XML架构(Schema)是用于定义元素已经XML文档中或者许多XML之间元素与元素之间关联的文件。在架构中将指定元素名称和内容类型。HTML与XML的显著差别:大多数HTML读取器有很好的容错能力,而XML读取器则完全不同,所以XML文件的格式必须正确。另外,XML元素都是小写的。 SOAP:(simple object access protocol,简单对象访问协议)是一种用于控制数据交换的XML语法。它是简单的、轻量级的信息交换协议。SOAP消息有消息内容和一个或多个头模块组成,并且封装在SOAP envelope中。 SOAP使用XML语法来格式化内容。在设计上,SOAP尽可能简单并且提供最小化的功能。 SOAP不需HTTP的GET和POST,它不受“名称/值”对的限制,我们可以使用它来发送复杂的对象,包括DataSet、类和其他对象。 SOAP的缺点:SOAP消息十分冗长,因此如果存在带宽或者传输性能的问题,建议使用POST或GET。 本文转自xshf12345 51CTO博客,原文链接:,http://blog.51cto.com/alexis/573704 如需转载请自行联系原作者

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

Android学习笔记--创建Dialog

创建Dialog 1.分类 (1)AlertDialog.它能够管理0个`1个`2个`3个按钮和一个包含radio或者checkbox的可选项列表. (2)ProgressDialog.一个用于显示进度圈或者进度条的dialog,继承自AlertDialog,所以它也支持按钮. (3)DatePickerDialog.用于让用户选择日期的dialog. (4)TimePickerDialog.用于让用户选择时间的dialog. 如果你需要定义自己的dialog,只需要继承dialog或者上面提到四个组件之一, 并且为新的dialog定义自己的布局就可以了. 2.显示dialog (1)一个dialog总是作为某个Activity的一部分被创建和显示.创建dialog当然是在Activity的onCreateDialog方法里做了,但是在创建不同用途的dialog却有章可循,推荐的方式是使用switch...case...结构.比如一个游戏里可能需要暂停和结束两种dialog,那我们的示例代码如下: static final int DIALOG_PAUSED_ID = 0; static final int DIALOG_GAMEOVER_ID = 1; protected Dialog onCreateDialog(int id) { Dialog dialog; switch(id) { case DIALOG_PAUSED_ID: // do the work to define the pause Dialog break; case DIALOG_GAMEOVER_ID: // do the work to define the game over Dialog break; default: dialog = null; } return dialog; } (2)当你想显示一个dialog的时候,使用showDialog(int id),参数id是你要显示的dialog的ID. (3)如果想在每次打开dialog的时候显示的内容有所不同,你应该考虑使用onPrepareDialog(int,Dialog)方法.它会在每次打开dialog时被调用,而不是像 onCreateDialog那样只在创建时被调用. (4)注意:如果你在onCreateDialog方法之外创建一个dialog,它不会默认被绑定到当前的Activity,但是你可以通过setOwnerActivity(Activity)方法来强制绑定. 3.关闭dialog (1)当你打算关闭一个dialog时,在dialog对象上调用dismiss()方法或者直接在Activity里调用dismissDialog(int)方法都可以达到这个目的. 实际上他俩是完全一样的,下面是dismissDialog方法的代码: public final void dismissDialog(int id) { if (mManagedDialogs == null) { throw missingDialog(id); } final Dialog dialog = mManagedDialogs.get(id); if (dialog == null) { throw missingDialog(id); } dialog.dismiss(); } (如果你正在使用onCreateDialog(int)方法管理你所有的dialog的状态),每次使用dismissDialog(int)方法关闭dialog时,Activity还会保留此dialog的状态.如果你确信不再需要已经关闭的dialog对象或者清除先前的状态对你的程序非常重要,那么你应该使用removeDialog(int),它会清除所有指向这个dialog对象的引用并且关闭它(如果这个dialog正在显示的话).下面是removeDialog方法的代码: public final void removeDialog(int id) { if (mManagedDialogs == null) { return; } final Dialog dialog = mManagedDialogs.get(id); if (dialog == null) { return; } dialog.dismiss(); mManagedDialogs.remove(id);//这句做了些什么呢,还没仔细看 } (2)使用dismiss listeners 如果想在关闭dialog的时候执行某些程序,那你应该考虑使用DialogInterface.OnDismissListener.使用方法如下代码所示: Dialog dialog = new Dialog(this); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { public void onDismiss(DialogInterface dialog) { // write your performance here } }); dialog也有cancel状态,这是一种较特殊的情况.当用户点击"返回","取消"或者程序里明确调用了dialog.cancel()方法时发生.注意,这个时候, 先前注册的OnDismissListener仍然会被通知(即触发调用).如果你想发出明确的取消通知(而不是简单的关闭),那你就应该使用setOnCancelListener()方法注册一个DialogInterface.OnCancelListener来做这件事. 4.创建一个AlertDialog AlertDialog类继承于 Dialog 类.它是系统推荐的方式,能够构造出用户界面上的大多数dialog.有如下任何一个需求时,你应该考虑使用它: 显示一行标题文本; 显示一段文本消息; 让用户选择由一个`两个或者三个按钮代表的操作; 显示一个可选项列表(checkbox button或者radio button) AlertDialog.Builder子类用来创建一个AlertDialog.首先使用new AlertDialog.Builder(this)来创建一个Builder对象,然后使用它的公有 接口方法设置AlertDialog的所有属性.完成后可以通过builder.create()来得到新创建的dialog.下面是使用AlertDialog.Builder类来创建不同的AlertDialog的方法: (1)带button的Dialog AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Are you sure you want to exit?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MyActivity.this.finish(); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); 注意:这里的按钮有三类setPositiveButton,setNegativeButton,setNeutralButton, 每一类只允许添加一次, 也就是最多三个按钮.按钮的种类 名称只是帮助我们区分对待它们,与它们的实际功能(由我们自己在onClick方法里定义)无关. (2)添加一个列表 这个比较简单,给出代码示例 final CharSequence[] items = {"Red", "Green", "Blue"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Pick a color"); builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); } }); AlertDialog alert = builder.create(); (3)添加checkbox 和 radio 按钮 在dialog里创建多选和单选列表应分别使用setMultiChoiceItems()和setSingleChoiceItems()方法.下面是创建一个单选项列表的代码: final CharSequence[] items = {"Red", "Green", "Blue"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Pick a color"); builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); } }); AlertDialog alert = builder.create(); 其中,setSingleChoiceItems()方法里第二个参数的意思是默认时选中哪一项,-1表示默认不选中任何一项. 注意:这样的情况下,用户可能希望这些值能被记忆并且恢复.要持久化存储这些选项的值,须借助android的数据存取技术. (4)创建ProgressDialog ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", "Loading. Please wait...", true); 第一个参数为应用程序的Context(上下文);第二个参数为dialog的title;第三个参数是要显示的消息文本;the last parameter is whether the progress is indeterminate. ProgressDialog的默认样式是一个旋转的轮子.如果要创建一个能显示即时进度的工具条,需要更多一点的代码: ProgressDialog progressDialog; progressDialog = new ProgressDialog(mContext); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage("Loading..."); progressDialog.setCancelable(false); 这个代码在我测试的时候不能直接运行,会报出以下异常: E/AndroidRuntime( 278): Uncaught handler: thread main exiting due to uncaught exception E/AndroidRuntime( 278): android.view.WindowManager$BadTokenException: Unable to add window -- token 解决办法是把第二行换成下面这样就可以了: progressDialog = new ProgressDialog(DialogActivity.this);//这里要写程序中Activity的名字 (5)创建自定义的Dialog 根据使用基类的不同可以分作两类: 使用Dialog类构造; 使用AlertDialog类构造 两种类别的不同在于,前者的Title不能为空.如果你不设置title里的文字,它占据的空间会空着,这样显然不美观.而用后面一种方法就不会出现这种问题,不设置title,Dialog里就不显示,不影响美观.所以,还是回到那句话,更推荐使用AlertDialog组件. 5.接口收集 (1)Activity里与其相关的方法: protected Dialog onCreateDialog(int id) protected void onPrepareDialog(int id, Dialog dialog) public final void showDialog(int id) public final void dismissDialog(int id) public final void removeDialog(int id) (2)android.content.DialogInterface: interface OnCancelListener interface OnDismissListener interface OnShowListener interface OnClickListener interface OnMultiChoiceClickListener interface OnKeyListener (3)/android-src/frameworks/base/core/java/android/app/Dialog.java类及其子类里的所有方法 本文转自chainli 51CTO博客,原文链接:http://blog.51cto.com/lichen/495174,如需转载请自行联系原作者

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

Android学习笔记--Service初步

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

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

Android学习笔记--Scoket编程

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

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

Android学习笔记--程序调试

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

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

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部分的功能。

用户登录
用户注册