首页 文章 精选 留言 我的

精选列表

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

OpenStack(Kilo版本)基础架构学习笔记

一、OpenStack项目简介 OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。 OpenStack项目是一个开源的云计算平台,支持所有类型的云环境。项目的目标是提供实施简单、可扩展性强、标准统一的云计算管理平台。 通常作为一个基础设施即服务(IAAS)解决方案,OpenStack开源云操作系统中心控制大量的计算、存储和网络资源。通过管理员授权用户通过WEB界面提供资源管理,各个服务之间的通过API通信,各个模块之间通过消息队列通信。 图1.1. OpenStack免费云操作系统 下面表格列出了OpenStack服务列表。 表1.1. OpenStack服务列表 二、OpenStack历史版本 OpenStack的每个主版本系列以字母表顺序(A~Z)命名,以年份及当年内的排序做版本号,从第一版的Austin(2010.1)到目前最新的稳定版Kilo(2015.1),共经历了11个主版本。而版本Liberty和Mitaka正在开发中。 三、OpenStack概念架构 下面图是OpenStack官方提供的OpenStack架构图。该架构由OpenStack网络,可选的块存储和面向对象存储服务器组成的三个节点的架构组成。 图1.2. OpenStack架构图 架构示例: OpenStack Neutron网络的示例架构,至少需要下面三个节点: 1)控制节点(Controller node)运行身份认证服务,镜像服务,管理部分计算和网络服务,运行网络插件以及仪表板。它还包括一些支持服务,例如 SQL 数据库、消息队列和网络时间协议(NTP)。 2)网络节点(Network node)运行 Networking 插件和一些代理,并提供switching、routing、NAT 和 DHCP 服务。这个节点还处理外部(Internet) 租户虚拟机实例的连接。 3)计算节点(Compute node)运行hypervisor 管理程序,Compute 使用 KVM 作为默认的hypervisor。计算节点也可以运行Networking 插件和代理,它们连接租户网络到虚拟机上并提供防火墙(security groups) 服务。 四、OpenStack Networking(neutron)架构最小硬件配置。 图1.3. OpenStack Neutron架构最小硬件配置 五、OpenStack Networking(neutron)架构网络配置 图1.4. OpenStack Neutron架构网络配置 六、OpenStack Networking(neutron)架构服务部署 图1.5. OpenStack Neutron架构服务配置 备注: 1)OpenStack官方文档: http://docs.openstack.org/kilo/install-guide/install/apt/content/ 2)OpenStack历史版本: https://wiki.openstack.org/wiki/Releases 3)本博客测试的版本都是OpenStack Kilo版本。 本文转自 sfzhang 51CTO博客,原文链接:http://blog.51cto.com/sfzhang88/1688452,如需转载请自行联系原作者

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

openstack学习笔记:Kvm基础实验环境

系统:centos7.1 安装环境:桌面环境、kvm基础服务 一、关闭selinux 1 2 [root@localhost~] #setenforce0 [root@localhost~] #sed-i's/enforcing/disabled/g'/etc/selinux/config 二、关闭iptables 1 2 [root@localhost~] #systemctlstopfirewalld [root@localhost~] #systemctldisablefirewalld 三、确认服务器cpu是否支持虚拟化 1 2 3 4 5 6 7 8 9 [root@localhost~] #grep-o'vmx\|svm'/proc/cpuinf vmx vmx vmx vmx vmx vmx vmx vmx 四、安装桌面 1、已经安装的软件以及可以安装的软件 2、安装图形桌面 1 [root@localhost~] #yum-ygroupinstall"XWindowSystem""GNOMEDesktop" 3、安装vncserver 1 [root@localhost~] #yum-yinstalltigervnc-server 4、配置vnc 1 2 3 4 5 6 7 8 9 10 [root@localhost~] #vncserver Youwillrequireapasswordtoaccessyourdesktops. Password: Verify: xauth: file /root/ .Xauthoritydoesnotexist New 'localhost.localdomain:1(root)' desktopislocalhost.localdomain:1 Creatingdefaultstartupscript /root/ .vnc /xstartup Startingapplicationsspecified in /root/ .vnc /xstartup Log file is /root/ .vnc /localhost .localdomain:1.log 5、使用vnc连接测试 五、安装kvm 1、安装kvm依赖包 1 2 3 4 [root@localhost~] #yum-yinstallqemu-kvmlibvirtvirt-installbridge-utilsvirt-manager [root@localhost~] #lsmod|grep kvmkvm_intel1480810 kvm4611261kvm_intel 2、启动libvirt服务 1 2 [root@localhost~] #systemctlstartlibvirtd [root@localhost~] #systemctlenablelibvirtd 这样就可以创建kvm虚拟机了 本文转自 wangpengtai 51CTO博客,原文链接:http://blog.51cto.com/wangpengtai/1953235,如需转载请自行联系原作者

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

android学习之-简单对话框

主类 packagesucre.android; importandroid.app.Activity; importandroid.app.AlertDialog; importandroid.content.DialogInterface; importandroid.os.Bundle; importandroid.view.View; importandroid.widget.Button; /** *创建一个简单的对话框 *@authorqiaolei * */ publicclassEX03_12extendsActivity{ privateButtonbt; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); bt=(Button)findViewById(R.id.mButton); bt.setOnClickListener(newButton.OnClickListener(){ publicvoidonClick(Viewv){ //创建一个对话框 newAlertDialog.Builder(EX03_12.this) //设置标题 .setTitle(R.string.app_about) //设置对话内容 .setMessage(R.string.app_about_msg) //设置按钮 .setPositiveButton(R.string.str_ok,newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog,intwhich){ //点击确定后要执行的一些内容,这里选择直接结束 finish(); } }).show(); } }); } } 本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/743340,如需转载请自行联系原作者

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

Android开发学习笔记:浅谈Content Provider

一.Content Provider的概念介绍 Content Providers是所有应用程序之间数据存储和检索的桥梁,它使得各个应用程序之间实现数据共享。是应用程序间共享数据的唯一途径。Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。其中包括添加,删除,查询,更新等操作。 在Content Provider使用过程中,还需要借用ContentResolver对象间接来操作ContentProvider来获取数据。ContentResolver通过应用程序的getContentResolver()方法获得。一般情况下,ContentResolver是单实例的,但是可以有多个ContentResolver在不用的应用程序和不同的进程之间和ContentResolver交互。 二.Content Provider的简介 1.Content Provider的常用方法 //查询 query(Uri,String[],String,String[],String); //插入 insert(Uri,ContentValues); //更新 update(Uri,ContentValues,String,String[]); //删除 delete(Uri,String,String[]); //获得MIME数据类型 getType(Uri); 2.数据模型 Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 "_ID" 数值字段,改字段唯一标识一条数据。 _ID NUMBER NUMBER_KEY LABEL NAME TYPE 13 (425) 555 6677 425 555 6677 Kirklandoffice Bully Pulpit TYPE_WORK 44 (212) 555-1234 212 555 1234 NY apartment Alan Vain TYPE_HOME 45 (212) 555-6657 212 555 6657 Downtown office Alan Vain TYPE_MOBILE 53 201.555.4433 201 555 4433 Love Nest Rex Cars TYPE_HOME 3.URI URI,每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。Content Provider就是通过URI对象来共享其数据的。 URI的格式图如下: 各个部分的组成: A:标准前缀,是固定的,"content://"是用来标识数据是由Content Provider管理的 schema。 B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称 C:需要访问的数据字段名称。 D:如果URI中包含表示需要获取的记录的_ID;如何有D部分,则就返回该_ID对应的数据,否则表示返回整张表的数据 三.Content Provider实例 Anroid系统自带的Content Provider对象 获得系统联系人信息(姓名和手机号码)的例子 MainActivity.java packagecom.lingdududu.provide; importandroid.app.Activity; importandroid.os.Bundle; importandroid.provider.ContactsContract; importandroid.provider.ContactsContract.PhoneLookup; importandroid.database.Cursor; importandroid.graphics.Color; importandroid.widget.TextView; importandroid.content.ContentResolver; publicclassMainActivityextendsActivity{ publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); TextViewtv=newTextView(this); Stringstring=getQueryData(); //设置文本的颜色 tv.setTextColor(Color.BLUE); //设置TextView显示的内容 tv.setText(string); //设置文本字体的大小 tv.setTextSize(30.0f); //显示到屏幕 setContentView(tv); } publicStringgetQueryData(){ Stringstring=""; //得到ContentResolver对象 ContentResolvercr=getContentResolver(); //取得电话本中开始一项的光标 Cursorcursor=cr.query(ContactsContract.Contacts.CONTENT_URI,null, null,null,null); //向下移动光标 while(cursor.moveToNext()){ //取得联系人名字 intnameFieldColumnIndex=cursor .getColumnIndex(PhoneLookup.DISPLAY_NAME); Stringcontact=cursor.getString(nameFieldColumnIndex); //取得电话号码 StringContactId=cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts._ID)); Cursorphone=cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=" +ContactId,null,null); while(phone.moveToNext()){ StringPhoneNumber=phone .getString(phone .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); string+=(contact+":"+PhoneNumber+"\n"); } } cursor.close(); returnstring; } } 注意:记得在AndroidManifest.xml加上17行的权限声明 <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.lingdududu.provide" android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="10"/> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> <uses-permissionandroid:name="android.permission.READ_CONTACTS"/> </manifest> 通讯录中联系人的信息: 效果图: 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/667264

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

Android开发学习笔记:Activity的简介

1.Activity的概念介绍 Activity是Android组件中最基本也是最常用的一种组件,在一个Android应用中,一个Activity通常就是一个单独的屏幕。每一个Activity都被实现为一个独立的类,并且继承于Activity这个基类。 activity类处于android.app包中,继承体系如下: 1.java.lang.Object 2.android.content.Context 3.android.app.ApplicationContext 4.android.app.Activity 2.Activity的创建 Activity提供了和用户交互的可视化界面。创建一个Activity一般是继承Activity(也可以是LisActivity,MapActivity等),覆盖Activity的onCreate( )方法,在该方法中调用setContentView( )方法来展示要显示的视图,调用findViewById( )方法实例化组件。注意Activity只有在清单文件中声明才能使用。 3.Activity的应用实例 3.1两个Activity之间的切换 要做到两个Activity之间的切换(也就是从一个Activity启动另一个Activity),可以使用startActivity( )方法或者startActivityForResult( ) (能够返回结果)。这两个方法要传递的参数是组件Intent。 下面的实例是MainActivity和SecondActivity之间的切换: main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello1" /> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="转到SecondActivity" /> </LinearLayout> second.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello2" /> <Button android:id="@+id/secondBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回" /> </LinearLayout> MainActivity.java packagecom.android.test.activity; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; publicclassMainActivityextendsActivity{ privateButtonbtn; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); btn=(Button)findViewById(R.id.btn); //响应按钮btn事件 btn.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //显示方式声明Intent,直接启动SecondActivity Intentit=newIntent(MainActivity.this,SecondActivity.class); //启动Activity startActivity(it); } }); } } SecondActivity.java packagecom.android.test.activity; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; publicclassSecondActivityextendsActivity{ privateButtonsecondBtn; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.second); secondBtn=(Button)findViewById(R.id.secondBtn); //响应按钮secondBtn事件 secondBtn.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //显示方式声明Intent,直接启动MainActivity Intentintent=newIntent(SecondActivity.this,MainActivity.class); //启动Activity startActivity(intent); } }); } } AndroidManifest.xml清单文件,16~18行为SecondActivity在清单文件里的声明 <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.android.test.activity" android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="10"/> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activityandroid:name=".SecondActivity" android:label="@string/app_name"> </activity> </application> </manifest> 效果图: 3.2.Activity之间传递数据 在Android开发中不同的Activity之间要传递数据,就需要用到对象Bundle,讲要传递的信息封装在该对象里面,并通过Intent对象传递到另一个Intent中。 下面的实例在MainActivity中输入用户名数据,并将该用户名传递给SecondActivity: main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <EditText android:id="@+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入用户名" /> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确定" /> </LinearLayout> second.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/secondTxt" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> strings.xml <?xmlversion="1.0"encoding="utf-8"?> <resources> <stringname="hello">MainActivity</string> <stringname="app_name">ActivityDemo</string> <stringname="app_name1">SecondActivity</string> </resources> MainActivity.java packagecom.android.test.activity; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.EditText; publicclassMainActivityextendsActivity{ privateButtonbtn; privateEditTexttxt; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); btn=(Button)findViewById(R.id.btn); txt=(EditText)findViewById(R.id.txt); //响应按钮btn事件 btn.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //获得用户名字符串 StringuseName=txt.getText().toString(); //声明Bundle对象 Bundledata=newBundle(); //讲用户名信息添加到Bundle data.putString("useName",useName); //显示方式声明Intent,直接启动SecondActivity Intentit=newIntent(MainActivity.this,SecondActivity.class); //为Intent添加Bundle it.putExtras(data); //启动Activity startActivity(it); } }); } } SecondActivity.java packagecom.android.test.activity; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.widget.TextView; publicclassSecondActivityextendsActivity{ privateTextViewsecondTxt; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.second); //获得Intent Intentit=getIntent(); //从Intent中获得Bundle对象 Bundlebundle=it.getExtras(); //从Bundle中获得那么 Stringname=bundle.getString("useName"); secondTxt=(TextView)findViewById(R.id.secondTxt); secondTxt.setText(name); } } AndroidManifest.xml清单文件 <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.android.test.activity" android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="10"/> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activityandroid:name=".SecondActivity" android:label="@string/app_name1"> </activity> </application> </manifest> 效果图: 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/636587

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

Android开发学习笔记:圆角的Button

在res目录下的drawable-mdpi建立xml文件shape.xml,如下图所示: shape.xml <?xmlversion="1.0"encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!--填充的颜色--> <solidandroid:color="#FFFFFF"/> <!--设置按钮的四个角为弧形--> <!--android:radius弧形的半径--> <cornersandroid:radius="5dip"/> <!--padding:Button里面的文字与Button边界的间隔--> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> main.xml 在android:background="@drawable/shape"就使用了shape.xml资源 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/roundButton" android:text="圆角按钮" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/shape" /> </LinearLayout> strings.xml <?xmlversion="1.0"encoding="utf-8"?> <resources> <stringname="hello">HelloWorld,RoundButtonDemoActivity!</string> <stringname="app_name">RoundButtonDemo</string> </resources> RoundButtonDemoActivity.java packagecom.android.RoundButtonDemo.activity; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.Toast; publicclassRoundButtonDemoActivityextendsActivity{ ButtonroundButton; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); roundButton=(Button)findViewById(R.id.roundButton); //使用匿名类注册Button事件 roundButton.setOnClickListener(newOnClickListener() { publicvoidonClick(Viewv) { Toast.makeText(RoundButtonDemoActivity.this,"你点击了圆角按钮",Toast.LENGTH_LONG).show(); } }); } } 效果图: 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/630051

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

IOS学习——UI基础UIWindow、UIView(五)

在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow、UIView来实现内容显示。 UIWindow: UIWindow对象是所有UIView的根视图,管理和协调的应用程序的显示、分发事件给View。UIWindow类是UIView的子类,可以看作是特殊的UIView。一般应用程序只有一个UIWindow对象,即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。UIWindow初始化在appDeleDgate里面的 didFinishLaunchingWithOptions方法。 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible];//显示出UIWindow UIView: UIView类继承自UIResponder,负责在屏幕上 定义一个矩形区域,视图用于展示界面及响应用户界面交互。每个视图对象都要负责渲染视图区域的内容,并响应该区域中发生的操作事件。 除了显示内容和处理事件之外,视图可以嵌套并管理子视图。子视图是指嵌入到另一视图对象内部的视图对象,而被嵌入的视图对象是父视图。视图添加到window中就会显示出来,iOS中是怎么实现视图显示的,看下面的代码: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; CGRect rect=[UIScreen mainScreen].applicationFrame; NSLog(@"NSScreen application %@",NSStringFromCGRect(rect)); CGRect rect2=[UIScreen mainScreen].bounds; NSLog(@"NSString mainScreen %@",NSStringFromCGRect(rect2)); NSLog(@"iOS_didFinishLaunchingWithOptions"); UIView *view1=[[UIView alloc]initWithFrame:CGRectMake(60, 50, 200, 100)]; view1.backgroundColor=[UIColor greenColor]; [self.window addSubview:view1]; [view1 release]; UIView *view2=[[UIView alloc]initWithFrame:CGRectMake(60, 100, 200, 200) ]; view2.alpha=0.5; view2.backgroundColor=[UIColor cyanColor]; [self.window addSubview:view2]; UIView *view3=[[UIView alloc]initWithFrame:CGRectMake(100, 50, 60, 50)]; view3.backgroundColor=[UIColor colorWithRed:25/255.0 green:60/255.0 blue:150/255.0 alpha:1.0]; [view2 addSubview:view3]; [view3 release]; [view2 release]; [self.window makeKeyAndVisible]; return YES; } 上面添加了三个视图,view1、view2、view3,view3嵌套在view2中。 /** * @author 张兴业 * http://blog.csdn.net/xyz_lmn * iOS入门群: 83702688 * android开发进阶群: 241395671 * 我的新浪微博: @张兴业TBOW */ 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230735,如需转载请自行联系原作者

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

学习OpenStack之 (2):Cinder LVM 配置

0。背景 OpenStack 中的实例是不能持久化的,cinder服务重启,实例消失。如果需要挂载 volume,需要在 volume 中实现持久化。Cinder提供持久的块存储,目前仅供给虚拟机挂载使用。它并没有实现对块设备的管理和实际服务,而是为后端不同的存储结构提供了统一的接口,不同的块设备服务厂商在 Cinder 中实现其驱动支持以与 OpenStack 进行整合。它通过整合后端多种存储,用API接口为外界提供存储服务。主要核心是对卷的管理,允许都卷、类型和快照进行处理。 Cinder存储分为本地块存储、分布式块存储和SAN存储等多种后端存储类型: 1. 本地存储: 默认通过LVM支持Linux 2. SAN存储: (1)通过NFS协议支持NAS存储,比如Netapp (2)通过添加不同厂商的制定driver来为了支持不同类型和型号的商业存储设备,比如EMC,IBM的存储。 在https://wiki.openstack.org/wiki/CinderSupportMatrix可以看到所支持的厂商存储列表。 3. 分布式系统:支持sheepdog,ceph,和IBM的GPFS等 对于本地存储,cinder-volume 默认使用 LVM 驱动,该驱动当前的实现需要在主机上事先用 LVM 命令创建一个的卷组 , 当该主机接受到创建卷请求的时候,cinder-volume 在该卷组 上创建一个逻辑卷, 并且用 openiscsi 将这个卷当作一个 iscsi tgt 给输出.还可以将若干主机的本地存储用 sheepdog 虚拟成一个共享存储,然后使用 sheepdog 驱动。 1. Cinder LVM配置 在cinder配置文件中,默认的backend lvmdriver是通过LVM来使用本地存储: [lvmdriver-1]volume_group = stack-volumes-lvmdriver-1volume_driver = cinder.volume.drivers.lvm.LVMISCSIDrivervolume_backend_name = lvmdriver-1 volume_group 指定Cinder使用的 volume group。在devstack默认安装时其名称是stack-volumes-lvmdriver-1;在实际部署cinder的时候其默认名称是cinder-volumes。 volume_driver 指定driver类型. Cinder目前支持两种传输协议,iSCSI and iSER。 iSCSI的话,将其值设为cinder.volume.drivers.lvm.LVMISCSIDriver; iSER的话,将其值设为cinder.volume.drivers.lvm.LVMISERDriver。 LVM是cinder.volume.drivers.lvm.LVMISCSIDriver volume_backend_name 是backend name,在创建volume的时候可选择。 如果名字为stack-volumes-lvmdriver-1的volume group不存在,创建volume后其状态将为error,在cinder c-vol日志中可看到如下错误: Exception during message handling: Unexpected error while running command.Command: NoneExit code: -Stdout: u'Unexpected error while running command.\nCommand: sudo cinder-rootwrap /etc/cinder/rootwrap.conf lvcreate -n volume-f3aef3b9-1a71-41d4-956e-a00044544b74 stack-volumes-lvmdriver-1 -L 1g\nExit code: 5\nStdout: u\'\'\nStderr: u\' Volume group "stack-volumes-lvmdriver-1" not found\\n\''Stderr: None 可参考我的博文http://www.cnblogs.com/sammyliu/p/4157491.html来配置LVM。 3. Cinder使用LVM 成功创建一个Cinder volume后,可以在VG中看到新创建的logical volume: root@dev:/home/s1# lvdisplay /dev/stack-volumes-lvmdriver-1/volume-02f986b0-418f-4f84-a5ec-7af61f5d5293--- Logical volume ---LV Name /dev/stack-volumes-lvmdriver-1/volume-02f986b0-418f-4f84-a5ec-7af61f5d5293VG Name stack-volumes-lvmdriver-1LV UUID 9oESr2-4V7f-qp22-F5te-hF2v-DWoy-EshtnNLV Write Access read/writeLV Status available# open 0LV Size 1.00 GiBCurrent LE 256Segments 1Allocation inheritRead ahead sectors auto- currently set to 256Block device 252:0 4. 使用多个backend/添加新的LVM backend (1)创建新的volume group vg3 (1)修改cinder.conf,添加下面行: enabled_backends=lvmdriver-1,lvmdriver-2 [lvmdriver-2]volume_group = vg3volume_driver = cinder.volume.drivers.lvm.LVMISCSIDrivervolume_backend_name = lvmdriver4vg3 注意: cinder-volume服务不监控该配置文件,除了在启动的时候读取该文件以外。因为在修改该文件后你需要重启该服务:`service cinder-volume restart`. (3)创建新的的volume type type-test s1@dev:~/devstack$ cinder type-create type-test+--------------------------------------+---------------+| ID | Name |+--------------------------------------+---------------+| 764480d1-7614-4a63-ba33-924d65765534 | type-test|+--------------------------------------+---------------+ (4) 设置volume type的backend name cinder type-key type-test set volume_backend_name=lvmdriver4vg3 注意: 只有一个backend的时候,除了配置volume group外,不需要添加别的配置信息,创建volume的时候也不需要选择volume type。 当有多个backend的时候,你需要使用volume-type来将volume创建到指定的backend中。一个volume-type可以有几个backend,这时候the capacity scheduler 会自动选择合适的backend来创建volume。 如果定义了volume type,但是cinder.conf中没有定义volume backend,那么cinder scheduler将找不到有效的host来创建volume了。 (5)可以在Horizen中选择新的type type-test来创建volume了 5. 遇到的问题: (1) 在选择一个volume type创建volume时失败, 症状:日志中有No valid host was found. No weighed hosts available 错误 分析:查看volume host: s1@dev:~/devstack$ cinder-manage service list STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION from (pid=4488) _check_effective_sql_mode /usr/local/lib/python2.7/dist-packages/oslo/db/sqlalchemy/session.py:509 Binary Host Zone Status State Updated At cinder-scheduler dev nova enabled :-) 2014-12-12 16:11:54 cinder-volume dev@lvmdriver-1 nova enabled :-) 2014-12-12 16:11:56 原因:cinder-volume的host少了一个对应第二个vg的一个。应该是添加第二个backend后配置没生效。 解决:按照先后顺序重启cinder-scheduler 和 cinder-volume 服务。创建volume错误消失。 (2) Volume一直处于creating状态。cinder-volume log中有如下错误: Returning exception create_volume() got an unexpected keyword argument 'source_replicaid' to caller 原因:controller上和storage node上cinder版本不一致。 解决:在两个node上首先卸载cinder,然后执行命令echo "debhttp://ubuntu-cloud.archive.canonical.com/ubuntu" "trusty-updates/juno main" > /etc/apt/sources.list.d/cloudarchive-juno.list,再安装cinder。确认cinder的版本一致。 1 apt-get install package=version 命令。 本文转自SammyLiu博客园博客,原文链接:http://www.cnblogs.com/sammyliu/p/4159147.html,如需转载请自行联系原作者

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

iOS学习——ios搭建开发环境(一)

好久就想试水IOS开发了,由于开发环境限制,一直局限于理论和虚拟机,近来入手了MacBook Pro,也来尝尝鲜,笔者也是现学现总结,如果有不足,请指正。 IOS开发必备MAC OS X 另加一部iPhone手机,windows操作系统也可以开发,需要安装虚拟机,安装虚拟机请参考Windows 7下虚拟机安装MAC。笔者的开发硬件配置:MacBook Pro+iphone 3gs,手机有点落后了。 我们来看一下MAC下建立iOS开发环境: 首先进入官网https://developer.apple.com,这也是任何程序入门必走的一步,进入官网找到iOS Dev Center,下图 图一(iOS Dev Center) 点击进入。进入后,如果没有登录,会有Sign In的提示,使用注册的帐号登录即可,如果没有帐号,可自行注册。登录后会显示iOS开发的资源(图三)。 图二(提示登录) 在资源里面看到Downloads,点击会引导到下载Xcode,Xcode是开发iOS必备的开发工具,当前最新版本是4.6.2。 这个文件大约1.8G.下载需要一段时间。下载完成点击即可完成安装。 /** * @author 张兴业 * http://xyzlmn.blog.51cto.com/ * android开发进阶群: 241395671 * 我的新浪微博: @张兴业TBOW 本文转自xyz_lmn51CTO博客,原文链接: http://blog.51cto.com/xyzlmn/1229513 ,如需转载请自行联系原作者

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

android学习之-Style样式的定义

这个例子主要是写了配置文件,main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/str_text_view1" style="@style/StyleText1" android:gravity="center_vertical|center_horizontal" /><!--水平垂直居中对齐--> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/str_text_view2" style="@style/StyleText2" android:gravity="center_vertical|center_horizontal" /> </LinearLayout> 定义要用到的样式style.xml <?xmlversion="1.0"encoding="UTF-8"?> <resources> <stylename="StyleText1"> <itemname="android:textSize">18sp</item> <itemname="android:textColor">#EC9237</item> </style> <stylename="StyleText2"> <itemname="android:textSize">14sp</item> <itemname="android:textColor">#FF7F7C</item> <itemname="android:fromAlpha">0.0</item> <itemname="android:toAlpha">0.0</item> </style> </resources> 有没有发现style.xml的定义方式与color.xml很相似呢,引一下color.xml的定义 <?xmlversion="1.0"encoding="UTF-8"?> <resources> <colorname="white">#ffffff</color> <colorname="black">#000000</color> <drawablename="red">#ff0000</drawable> <drawablename="blue">#0000ff</drawable> </resources> 对比一下可以更深的加强记忆,其它的代码还是见附件 本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/742957,如需转载请自行联系原作者

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

机器学习之条件随机场(CRF)

什么是CRF CRF即条件随机场(Conditional Random Fields),是在给定一组输入随机变量条件下另外一组输出随机变量的条件概率分布模型,它是一种判别式的概率无向图模型,既然是判别式,那就是对条件概率分布建模。 CRF较多用在自然语言处理和图像处理领域,在NLP中,它是用于标注和划分序列数据的概率化模型,根据CRF的定义,相对序列就是给定观测序列X和输出序列Y,然后通过定义条件概率P(Y|X)来描述模型。 CRF的输出随机变量假设是一个无向图模型或者马尔科夫随机场,而输入随机变量作为条件不假设为马尔科夫随机场,CRF的图模型结构理论上可以任意给定,但我们常见的是定义在线性链上的特殊的条件随机场,称为线性链条件随机场。 概率无向图模型 前面说到CRF的输出随机变量是一个概率无向图模型,那么现在看看该模型。 概率无向图模型是由无向图表示的联合概率分布,假设联合概率分布P(Y)通过无向图来表示,则在图中节点表示随机变量,边表示随机变量之间的依赖关系,联合概率分布P(Y)满足马尔科夫性则称其为概率无向图模型,或者是马尔科夫随机场。 如下图,图是一个由节点和边组成的结构体,无向是指边没有方向,整个图记作G=(V,E),其中V为节点的集合,E为边的集合。 每个节点v对应一个随机变量Yv,于是Y=Yv|v∈V,在观察序列X的条件下,每个随机变量Yv都满足马尔科夫特性,即 P(Yv|X,Yw)=p(Yv|X,Yw,w∼v) ,其中w∼v表示w和v是图G中邻近的两个节点。 线性链条件随机场 无向图的结构理论上可以是任意的,但在NLP中对于标记处理问题,对其建模主要用最简单最普通的链式结构,即线性链条件随机场。如下图,可以看到节点为线性链结构,节点对应了序列Y的元素,而观察序列X不做任何独立性假设,但X序列的结构也可以是线性链结构。 综上所述,设有线性链结构的随机变量序列 X=(X1,X2,...,Xn),Y=(Y1,Y2,...,YN),在给定观察序列X的条件下,随机变量序列Y的条件概率分布为P(Y|X),若其满足马尔科夫特性,即 P(Yi|X,Y1,Y2...Yn)=P(Yi|X,Yi−1,Yi+1),这时P(Y|X)则为线性链条件随机场。 概率的定义 在线性链条件随机场中,在给定的观察序列X情况下,某个特定序列Y的概率为P(Y|X),根据定义有, P(Y|X)=exp(∑i,kλktk(Yi−1,Yi,X,i)+∑i,lμlsl(Yi,X,i)) 其中,tk(Yi−1,Yi,X,i)表示转移函数,表示在序列X下序列Y在位置i-1及i对应的值转移概率,而sl(Yi,X,i)表示状态函数,表示在序列X下序列Y在位置i对应的值概率。另外λk,μl分别为两个函数的权重。 转移函数和状态函数都称为特征函数,特征函数一般取值0或1,满足特征函数的则为1,否则为0。比如下面的转移函数,只有当Yi−1,Yi满足一定的条件时才为1,否则为0。 tk(Yi−1,Yi,X,i)={1,0,conditionsaboutYi−1,Yiotherwise 如果我们令sl(Yi,X,i)=sl(Yi−1,Yi,X,i),则转移函数和状态函数可以统一由特征函数表示,对特征在各个位置i求和,有 Fk(Y,X)=∑ni=1fk(Yi−1,Yi,X,i) 最后再加上归一化,最终条件随机场的条件概率为, P(Y|X)=1Z(X)exp(∑Kk=1λkFk(Y,X)) 其中, Z(X)=∑yexp(∑Kk=1λkFk(Y,X)) 如何训练CRF 训练CRF主要就是要训练特征函数的权重,对于训练集(x1,y1),(x2,y2),...,(xn,yn),采用极大似然估计法计算权重参数,条件概率的对数似然函数为: L(λ)=∑x,yp~(x,y)∑ni=1(∑Kk=1λkfk(yi−1,yi,x,i))−∑xp~(x)logZ(x) 其中p~(x,y)为训练样本集中xy的经验概率,它等于xy同时出现的次数除以样本空间容量;p~(x)为训练样本集中x的经验概率,它等于x出现的次数除以样本空间容量。 然后对λ求导,令其为0再求解出λ,即得到解。因为极大似然估计法不一定能得到一个近似解,所以需要利用一些迭代技术来确定参数,比如GIS或IIS算法,这里不再深入。 啥时考虑CRF 如果信息是与时间或空间的前后有关联时要考虑到CRF。 以下是广告 ========广告时间======== 鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。 为什么写《Tomcat内核设计剖析》 ========================= 欢迎关注:

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

特殊权限-SUID,SGID,Sticky 学习笔记

SUID : 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者 chmod u+s FILENAME (添加 SUID 权限) chmod u-s FILENAME (除去SUID 权限) 如果 FILE 本身原来就有执行权限,则 SUID 显示为 s ; 否则显示 S; passwd 命令默认具有 SUID 权限 SGID :运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者 (目录有SGID权限后,在该目录下创建文件目录时,创建后的属组为目录自身的属组,) chmod g+s FILENAME (添加 SGID 权限) chmod g-s FILENAME (除去 SGID 权限) Sticky : 在一个公共目录,每个用户都可以创建文件,删除自己的文件,但不能删除别人的文件 chmod o+t DIR (添加 Sticky 权限) chmod o-t DIR (删除 Sticky 权限) 权限表示 SUID : 4 SGID : 2 Sticky : 1 chmod 1755 /tmp/test #test具有 755 权限 ( 1 : 具有 Sticky 权限 ) chmod 3755 /tmp/test #test具有 755 权限 ( 2 : 具有 SGID 权限 + 1 : 具有 Sticky 权限 ) chmod 5755 /tmp/test #test具有 755 权限 ( 4 : 具有 SUID 权限 + 1 : 具有 Sticky 权限 ) SUID : 实例测试 让一个普通用户对指定文件具有原本没有的查看权限 (user1用户可以查看 /etc/shadow 文件) 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@nono~] #useradduser1#添加用户user1 [root@nono~] #passwduser1 [root@nono~] #ls-l/etc/shadow#查看/etc/shadow文件,权限为000,所以除root用户都不能查看 ----------.1rootroot10537月309:54 /etc/shadow [root@nono~] #su-user1#切换到user1用户,应为/etc/ [user1@nono~]$ cat /etc/shadow #user1用户没有权限查看 cat : /etc/shadow :权限不够 [root@beiyong2~] #chmodu+s/bin/cat#将/bin/cat命令添加SUID命令,则cat命令的执行者为文件自身的属主,而不是启动者 [root@beiyong2~] #ls-l/bin/cat#SUID命令添加成功(若/bin/cat本身就有执行权限,添加SUID命令后,显示为s否则为S) -rwsr-xr-x.1rootroot4856810月152014 /bin/cat [user1@beiyong2~]$ cat /etc/shadow #user1可以查看 bin:*:15980:0:99999:7::: daemon:*:15980:0:99999:7::: SGID : 实例测试 三个用户可以在同一目录中,创建文件目录,并互相修改文件内容 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 [user1@beiyong2~]$ tail -5 /etc/passwd #当前系统中有三个用户 user1:x:500:500:: /home/user1 : /bin/bash hbase:x:501:501:: /home/hbase : /bin/bash hadoop:x:502:502:: /home/hadoop : /bin/bash [root@beiyong2tmp] #mkdirproject#在/tmp目录中创建新目录/project [root@beiyong2tmp] #groupadddevelopteam#添加developteam用户组 [root@beiyong2tmp] #chown-R:developteam/tmp/project#将/tmp/project目录的属组改为developteam [root@beiyong2tmp] #ls-ldproject drwxr-xr-x.2rootdevelopteam40967月902:15project [root@beiyong2tmp] #usermod-a-Gdevelopteamuser1#分别将三个用户的附加组改为developteam [root@beiyong2tmp] #usermod-a-Gdevelopteamhadoop [root@beiyong2tmp] #usermod-a-Gdevelopteamhbase [root@beiyong2project] #ls-ld#查看project目录的权限,属组没有写权限,则添加 drwxr-xr-x.2rootdevelopteam40967月902:15. [root@beiyong2project] #chmodg+w/tmp/project [root@beiyong2project] #ls-ld drwxrwxr-x.2rootdevelopteam40967月902:15. [root@beiyong2project] #ll#分别用三个账号在/tmp/project目录中创建文件(a.*),没有权限编辑其他人的文件 -rw-rw-r--.1hadoophadoop07月902:33a.hadoop -rw-rw-r--.1hbasehbase07月902:34a.hbase -rw-rw-r--.1user1user107月902:33a.user1 [root@beiyong2~] #chmodg+s/tmp/project#给/tmp/project目录添加SGID权限 [root@beiyong2~] #ls-ld/tmp/project drwxrwsr-x.2rootdevelopteam40967月902:34 /tmp/project [root@beiyong2project] #ll#添加SGID权限后,用三个用户分别在/tmp/project目录下创建文件(b.*) 总用量0 -rw-rw-r--.1hadoophadoop07月902:33a.hadoop -rw-rw-r--.1hbasehbase07月902:34a.hbase -rw-rw-r--.1user1user107月902:33a.user1 -rw-rw-r--.1hadoopdevelopteam07月902:37b.hadoop -rw-rw-r--.1hbasedevelopteam07月902:37b.hbase -rw-rw-r--.1user1developteam07月902:37b.user1 三个用户创建的文件,属组均为developteam,故可以互相编辑删除对方文件 Sticky : 实例测试 同一目录下用户可以创建文件并互相修改,但不能删除对方的文件 1 2 3 4 5 [root@beiyong2project] #chmodo+t/tmp/project#给/tmp/project添加Sticky权限,(原有执行权限t,否则T) [root@beiyong2project] #ls-ld drwxrwsr-t.2rootdevelopteam40967月902:42. [hadoop@beiyong2project]$ rm -rfa.hbase #用hadoop用户身份去删除hbase用户的文件,删除失败(只能删除自己的文件目录) rm :无法删除 "a.hbase" :不允许的操作 完毕~~~ 本文转自 mlwzby 51CTO博客,原文链接:http://blog.51cto.com/aby028/1814364

资源下载

更多资源
优质分享App

优质分享App

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

腾讯云软件源

腾讯云软件源

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

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文件系统,支持十年生命周期更新。

用户登录
用户注册