首页 文章 精选 留言 我的

精选列表

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

几个Python小案例,爱上Python编程!

Python是一种面向对象的解释型编程语言,源代码与解释器CPython遵守GPL协议,Python语法简洁清晰。 语法简洁清晰,那么我们用少量的Python代码能做哪些有趣的东西?温馨提示:文末必看。 一、画爱心表白 1、图形都是由一系列的点(X,Y)构成的曲线,由于X,Y满足一定的关系,所以我们就可以建立模型,建立表达式expression,当满足时,两个for循环(for X in range;for Y in range)就会每行每列的打印。 2、Python代码与注释: 理清思路一行代码实现: 看上去是三行,在IDE中写作一行Python代码即可实现,如图: 此图为静态图,效果并不如意,那么我们把它做成动态图并实现图文表白如何?(可自行更改字母内容) 更改后代码如下: 二、快递查询工具 1、此Python小项目需要用到json与requests两个库,还需调用API。 2、代码注解: 3、查询效果: 三、Python爬虫入门级别教程之图片爬取 1、很多因为兴趣而学习Python的朋友大多是看到别人爬取视频、图片吧,我是以前看到别人爬取小电影,我才有动力学的。 2、Python代码: 3、效果图 四、佛祖镇楼 代码有点那个......但是效果是出来了。同理,可画其它的图形,这个需要你自己的想象力。 五、做动画手绘 示例: 源代码: 六、(压轴)连连看暴力辅助 连连看我相信大家都有玩过,不多介绍。要完成它的辅助,首先我们能想到的有哪些? 图像识别,鼠标模拟。图像识别可不一定要什么难度很高的算法。OpenCV这个神级框架,轻松帮我们搞定了,要善于利用工具。 由python win32的API就可以实现鼠标模拟点击。 想破解QQ的连连看,必须config.py里的配置改成QQ连连看对应的配置,但配置是什么我不会说出来。假如你能够靠自己做出来,偷着乐就好了,不要宣扬,假如说你一定要张牙舞爪的到处显摆... 我的确也不会说啥,毕竟小编也正在这样做。 源代码: 需要视频资料的软件的可以在评论区留言

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

区块链天堂:怀俄明州案例

议员Tyler Lindholm是怀俄明州圣丹斯的农场主,亦是怀俄明州众议院共和党成员。怀俄明州原住民Caitlin Long曾经是Symbiont总裁兼主席,曾是摩根士丹利董事总经理。 怀俄明州将张开双臂欢迎区块链社区。 怀俄明州区块链联盟(Wyoming Blockchain Coalition)是个草根团体,已经在通过一揽子立法草案的努力中积累相当多的动能,会给区块链社区及怀俄明州带来显著利益。 一揽子区块链法案将在二月份国会会议期间提出,为怀俄明州打造两个特点,使其尤其吸引区块链行业:零企业所得税或专利税,强化该州注册有限责任公司的隐私法管理。 公司不需要将实体转移到怀俄明州也可以获得优势,就像特拉华州企业不需要设置在该州。但是企业想要搬去那里也是有理由的。比如,怀俄明州首府夏延巨大的光纤宽带和廉价电力已经吸引了大型数据中心在这里

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

MapReduce的手机流量统计的案例

1.程序需要的材料 文件中各个字段的含义,其中第6,7,8,9是要统计的流量相关的字段. 文件内容: 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200 13826544101 5C-0E-8B-C7-F1-E0:CMCC 120.197.40.4 4 0 264 0 200 13926435656 20-10-7A-28-CC-0A:CMCC 120.196.100.99 2 4 132 1512 200 13926251106 5C-0E-8B-8B-B1-50:CMCC 120.197.40.4 4 0 240 0 200 18211575961 94-71-AC-CD-E6-18:CMCC-EASY 120.196.100.99 iface.qiyi.com 视频网站 15 12 1527 2106 200 84138413 5C-0E-8B-8C-E8-20:7DaysInn 120.197.40.4 122.72.52.12 20 16 4116 1432 200 13560439658 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 18 15 1116 954 200 15920133257 5C-0E-8B-C7-BA-20:CMCC 120.197.40.4 sug.so.360.cn 信息安全 20 20 3156 2936 200 13719199419 68-A1-B7-03-07-B1:CMCC-EASY 120.196.100.82 4 0 240 0 200 13660577991 5C-0E-8B-92-5C-20:CMCC-EASY 120.197.40.4 s19.cnzz.com 站点统计 24 9 6960 690 200 15013685858 5C-0E-8B-C7-F7-90:CMCC 120.197.40.4 rank.ie.sogou.com 搜索引擎 28 27 3659 3538 200 15989002119 E8-99-C4-4E-93-E0:CMCC-EASY 120.196.100.99 www.umeng.com 站点统计 3 3 1938 180 200 13560439658 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 15 9 918 4938 200 13480253104 5C-0E-8B-C7-FC-80:CMCC-EASY 120.197.40.4 3 3 180 180 200 13602846565 5C-0E-8B-8B-B6-00:CMCC 120.197.40.4 2052.flash2-http.qq.com 综合门户 15 12 1938 2910 200 13922314466 00-FD-07-A2-EC-BA:CMCC 120.196.100.82 img.qfc.cn 12 12 3008 3720 200 13502468823 5C-0A-5B-6A-0B-D4:CMCC-EASY 120.196.100.99 y0.ifengimg.com 综合门户 57 102 7335 110349 200 18320173382 84-25-DB-4F-10-1A:CMCC-EASY 120.196.100.99 input.shouji.sogou.com 搜索引擎 21 18 9531 2412 200 13925057413 00-1F-64-E1-E6-9A:CMCC 120.196.100.55 t3.baidu.com 搜索引擎 69 63 11058 48243 200 13760778710 00-FD-07-A4-7B-08:CMCC 120.196.100.82 2 2 120 120 200 13823070001 20-7C-8F-70-68-1F:CMCC 120.196.100.99 6 3 360 180 200 13600217502 00-1F-64-E2-E8-B1:CMCC 120.196.100.55 18 138 1080 186852 200 二.程序: 1 package mapreducejob; 2 3 /** 4 * 老师给的元数据信息如下: 5 * 1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200 6 * 1363157995052 13826544101 5C-0E-8B-C7-F1-E0:CMCC 120.197.40.4 4 0 264 0 200 7 * 1363157991076 13926435656 20-10-7A-28-CC-0A:CMCC 120.196.100.99 2 4 132 1512 200 8 * 第六个字段是上行数据包数. 9 * 第七个字段是下行数据包数 10 * 第八个是上行总流量 11 * 第九个是下行总流量 12 */ 13 14 import java.io.DataInput; 15 import java.io.DataOutput; 16 import java.io.IOException; 17 18 import org.apache.hadoop.conf.Configuration; 19 import org.apache.hadoop.fs.Path; 20 import org.apache.hadoop.io.LongWritable; 21 import org.apache.hadoop.io.Text; 22 import org.apache.hadoop.io.Writable; 23 import org.apache.hadoop.mapreduce.Job; 24 import org.apache.hadoop.mapreduce.Mapper; 25 import org.apache.hadoop.mapreduce.Reducer; 26 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 27 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 28 29 public class TrafficApp { 30 31 public static void main(String[] args) throws Exception { 32 Job job = Job.getInstance(new Configuration(), 33 TrafficApp.class.getSimpleName()); 34 job.setJarByClass(TrafficApp.class);// 通过jar包运行. 35 36 FileInputFormat.setInputPaths(job, args[0]);// 数据输入,指定数据源 37 38 job.setMapperClass(MyMapper.class);// 给job设置map 39 job.setMapOutputKeyClass(Text.class); 40 job.setMapOutputValueClass(TrafficWritable.class); 41 42 job.setReducerClass(MyReducer.class); 43 job.setOutputKeyClass(Text.class); 44 job.setOutputValueClass(TrafficWritable.class); 45 46 FileOutputFormat.setOutputPath(job, new Path(args[1])); 47 48 job.waitForCompletion(true);// 在集群中运行 49 } 50 51 public static class MyMapper extends 52 Mapper<LongWritable, Text, Text, TrafficWritable> { 53 // 这四个参数分别是<k1,v1>和<k2,v2> 54 // k1代表的是字节的偏移量,v1是原始数据. k2是手机号.v2是每一次的通话流量 55 Text k2 = new Text();// new 一个作为k2手机号. 56 TrafficWritable v2 = new TrafficWritable();// new 一个作为v2 57 58 @Override 59 protected void map( 60 LongWritable key, 61 Text value, 62 Mapper<LongWritable, Text, Text, TrafficWritable>.Context context) 63 throws IOException, InterruptedException { 64 String line = value.toString(); 65 String[] splited = line.split("\t");// 以制表符作为拆分符得到一个字节数组. 66 // 通过原始数据文件可以看到这个里面有11个字段,所以这个拆分的数组长度为11 67 k2.set(splited[1]);// k2是手机号,在这个数组中是第二个. 68 v2.set(splited[6], splited[7], splited[8], splited[9]);// v2是代表四个流量 69 // 对应这个被拆分数组的第6,7,8,9个. 70 context.write(k2, v2); 71 } 72 73 } 74 75 public static class MyReducer extends 76 Reducer<Text, TrafficWritable, Text, TrafficWritable> { 77 // 四个参数分别是<k2,v2> <k3,v3> 78 // k2是手机号,v2是流量TrafficWritable k3是手机号,v3是流量汇总. 79 TrafficWritable v3 = new TrafficWritable(); 80 81 @Override 82 protected void reduce( 83 Text k2, 84 Iterable<TrafficWritable> v2s, 85 Reducer<Text, TrafficWritable, Text, TrafficWritable>.Context context) 86 throws IOException, InterruptedException { 87 // reduce方法的第一个形参是k2,第二个形参是v2s,第三个形参是一个context上下文 88 // v2s是流量集合.我们在reduce方法中要做的就是把v2汇总起来变成v3. 89 long t1 = 0L; 90 long t2 = 0L; 91 long t3 = 0L; 92 long t4 = 0L; 93 for (TrafficWritable v2 : v2s) { 94 t1 += v2.t1; 95 t2 += v2.t2; 96 t3 += v2.t3; 97 t4 += v2.t4; 98 } 99 v3.set(t1, t2, t3, t4);//构造v3 100 context.write(k2, v3); 101 } 102 103 } 104 105 /** 106 * 针对流量设置一个流量类. 第六个字段是上行数据包数. 第七个字段是下行数据包数. 第八个是上行总流量. 第九个是下行总流量 107 * 108 */ 109 static class TrafficWritable implements Writable { 110 // 这个类是流量统计类,这个类包含了该手机号的上传和下载的流量 111 // 在MapReduce中的键值对中代表的是v3,有四列组成. 112 long t1; 113 long t2; 114 long t3; 115 long t4; 116 117 // 再搞一个无产的构造函数,否则容易出错 118 public TrafficWritable() { 119 } 120 121 public void set(long t1, long t2, long t3, long t4) { 122 // 赋值的方法,这个地方是传入的long类型. 123 this.t1 = t1; 124 this.t2 = t2; 125 this.t3 = t3; 126 this.t4 = t4; 127 } 128 129 public void set(String t1, String t2, String t3, String t4) { 130 // 赋值的方法,这个地方是传入的String类型. 131 this.t1 = Long.parseLong(t1); 132 this.t2 = Long.parseLong(t2); 133 this.t3 = Long.parseLong(t3); 134 this.t4 = Long.parseLong(t4); 135 } 136 137 public void readFields(DataInput in) throws IOException { 138 // 四列都通过in.readLong()读进来. 139 this.t1 = in.readLong(); 140 this.t2 = in.readLong(); 141 this.t3 = in.readLong(); 142 this.t4 = in.readLong(); 143 } 144 145 public void write(DataOutput out) throws IOException { 146 // 这个对象有四列,必须要把四列都给写出去. 147 out.writeLong(t1); 148 out.writeLong(t2); 149 out.writeLong(t3); 150 out.writeLong(t4); 151 } 152 153 public String toString() { 154 // 在Reduce阶段会用到这个方法,否则输出的是哈希编码 155 return this.t1 + "\t" + this.t2 + "\t" + this.t3 + "\t" + this.t4; 156 } 157 } 158 159 } //=============================================================== 代码二: 1 package mapreduce; 2 3 import java.io.DataInput; 4 import java.io.DataOutput; 5 import java.io.IOException; 6 7 import org.apache.hadoop.conf.Configuration; 8 import org.apache.hadoop.fs.Path; 9 import org.apache.hadoop.io.LongWritable; 10 import org.apache.hadoop.io.Text; 11 import org.apache.hadoop.io.Writable; 12 import org.apache.hadoop.mapreduce.Job; 13 import org.apache.hadoop.mapreduce.Mapper; 14 import org.apache.hadoop.mapreduce.Partitioner; 15 import org.apache.hadoop.mapreduce.Reducer; 16 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 17 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 18 19 public class TrafficApp { 20 public static void main(String[] args) throws Exception { 21 Job job = Job.getInstance(new Configuration(), TrafficApp.class.getSimpleName()); 22 job.setJarByClass(TrafficApp.class); 23 24 FileInputFormat.setInputPaths(job, args[0]); 25 26 job.setMapperClass(TrafficMapper.class); 27 job.setMapOutputKeyClass(Text.class); 28 job.setMapOutputValueClass(TrafficWritable.class); 29 30 job.setNumReduceTasks(2);//设定Reduce的数量为2 31 job.setPartitionerClass(TrafficPartitioner.class);//设定一个Partitioner的类. 32 /* 33 *Partitioner是如何实现不同的Map输出分配到不同的Reduce中? 34 *在不适用指定的Partitioner时,有 一个默认的Partitioner. 35 *就是HashPartitioner. 36 *其只有一行代码,其意思就是过来的key,不管是什么,模numberReduceTasks之后 返回值就是reduce任务的编号. 37 *numberReduceTasks的默认值是1. 任何一个数模1(取余数)都是0. 38 *这个地方0就是取编号为0的Reduce.(Reduce从0开始编号.) 39 */ 40 41 job.setReducerClass(TrafficReducer.class); 42 job.setOutputKeyClass(Text.class); 43 job.setOutputValueClass(TrafficWritable.class); 44 45 FileOutputFormat.setOutputPath(job, new Path(args[1])); 46 job.waitForCompletion(true); 47 } 48 49 public static class TrafficPartitioner extends Partitioner<Text,TrafficWritable>{//k2,v2 50 51 @Override 52 public int getPartition(Text key, TrafficWritable value,int numPartitions) { 53 long phoneNumber = Long.parseLong(key.toString()); 54 return (int)(phoneNumber%numPartitions); 55 } 56 57 } 58 59 60 /** 61 * 第一个参数是LongWritable类型是文本一行数据开头的字节数 62 * 第二个参数是文本中的一行数据 Text类型 63 * 第三个参数是要输出的手机号 Text类型 64 * 第四个参数是需要我们自定义的流量类型TrafficWritable 65 * @author ABC 66 * 67 */ 68 public static class TrafficMapper extends Mapper<LongWritable, Text, Text, TrafficWritable>{ 69 Text k2 = new Text(); 70 TrafficWritable v2 = null; 71 @Override 72 protected void map(LongWritable key,Text value, Mapper<LongWritable, Text, Text, TrafficWritable>.Context context) 73 throws IOException, InterruptedException { 74 String line = value.toString(); 75 String[] splited = line.split("\t"); 76 77 k2.set(splited[1]);//这个值对应的是手机号码 78 v2 = new TrafficWritable(splited[6], splited[7], splited[8], splited[9]); 79 context.write(k2, v2); 80 } 81 82 } 83 84 public static class TrafficReducer extends Reducer <Text, TrafficWritable, Text, TrafficWritable>{ 85 @Override 86 protected void reduce(Text k2,Iterable<TrafficWritable> v2s, 87 Reducer<Text, TrafficWritable, Text, TrafficWritable>.Context context) 88 throws IOException, InterruptedException { 89 //遍历v2s 流量都这个集合里面 90 long t1 = 0L; 91 long t2 = 0L; 92 long t3 = 0L; 93 long t4 = 0L; 94 95 for (TrafficWritable v2 : v2s) { 96 t1 += v2.getT1(); 97 t2 += v2.getT2(); 98 t3 += v2.getT3(); 99 t4 += v2.getT4(); 100 } 101 TrafficWritable v3 = new TrafficWritable(t1, t2, t3, t4); 102 context.write(k2, v3); 103 } 104 } 105 106 public static class TrafficWritable implements Writable{ 107 private long t1; 108 private long t2; 109 private long t3; 110 private long t4; 111 //写两个构造方法,一个是有参数的构造方法,一个是无参数的构造方法. 112 //必须要有 一个无参数的构造方法,否则程序运行会报错. 113 114 public TrafficWritable(){ 115 super(); 116 } 117 118 public TrafficWritable(long t1, long t2, long t3, long t4) { 119 super(); 120 this.t1 = t1; 121 this.t2 = t2; 122 this.t3 = t3; 123 this.t4 = t4; 124 } 125 //在程序中读取文本穿过来的都是字符串,所以再搞一个字符串类型的构造方法 126 public TrafficWritable(String t1, String t2, String t3, String t4) { 127 super(); 128 this.t1 = Long.parseLong(t1); 129 this.t2 = Long.parseLong(t2); 130 this.t3 = Long.parseLong(t3); 131 this.t4 = Long.parseLong(t4); 132 } 133 134 public void write(DataOutput out) throws IOException { 135 //对各个成员变量进行序列化 136 out.writeLong(t1); 137 out.writeLong(t2); 138 out.writeLong(t3); 139 out.writeLong(t4); 140 } 141 142 public void readFields(DataInput in) throws IOException { 143 //对成员变量进行反序列化 144 this.t1 = in.readLong(); 145 this.t2 = in.readLong(); 146 this.t3 = in.readLong(); 147 this.t4 = in.readLong(); 148 } 149 150 public long getT1() { 151 return t1; 152 } 153 154 public void setT1(long t1) { 155 this.t1 = t1; 156 } 157 158 public long getT2() { 159 return t2; 160 } 161 162 public void setT2(long t2) { 163 this.t2 = t2; 164 } 165 166 public long getT3() { 167 return t3; 168 } 169 170 public void setT3(long t3) { 171 this.t3 = t3; 172 } 173 174 public long getT4() { 175 return t4; 176 } 177 178 public void setT4(long t4) { 179 this.t4 = t4; 180 } 181 182 @Override 183 public String toString() { 184 return t1 + "\t" + t2 + "\t" + t3 + "\t" + t4 ; 185 } 186 187 } 188 } 本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6260491.html,如需转载请自行联系原作者

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

Android WindowManager$BadTokenException异常应对案例

Android利用ActivityGroup加载子Activity,子Activity调用对话框,弹出: ERROR/AndroidRuntime(10104): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@45a58ee0 is not valid; is your activity running? 原因分析: 因为new对话框的时候,参数content 指定成了this,即指向当前子Activity的content。但子Activity是动态创建的,不能保证一直存在。其父Activity的content是稳定存在的,所以有下面的解决办法。 解决办法: 将content替换为getParent()即可。 希望对碰到类似问题的同学有帮助。 本文转自Kai的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/archive/2011/08/04/2127813.html,如需转载请自行联系原作者。

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

Android--Xutils3源码案例调试

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/77842358 下载网址:https://github.com/wyouflf/xUtils3 第一步:新建一个自己的工程; 第二步:点File->New->Import Module,选择自己下载好的xutils3,目录为:D:\adtext\xUtils3-master\sample 第三步:修改库xutils的build.gradle,屏蔽无用代码,将versionName的值改为版本号,修改; apply plugin: 'com.android.library' //apply plugin: 'com.github.dcendents.android-maven' //apply plugin: 'com.jfrog.bintray' // //def siteUrl = 'https://github.com/wyouflf/xUtils3' //def gitUrl = 'https://github.com/wyouflf/xUtils3.git' //group = "org.xutils" //version = "3.5.0" android { compileSdkVersion 25 buildToolsVersion '25.0.0' defaultConfig { minSdkVersion 14 targetSdkVersion 25 versionCode 20170405 versionName "3.5.0" } buildTypes { debug { minifyEnabled false debuggable true } release { minifyEnabled false debuggable true } } sourceSets { main { jniLibs.srcDirs = ['libs'] java.srcDirs = ['src/main/java'] } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_6 targetCompatibility JavaVersion.VERSION_1_6 } } //install { // repositories.mavenInstaller { // // This generates POM.xml with proper parameters // pom { // project { // packaging 'aar' // name 'xUtils' // description 'android orm, bitmap, http, view inject... ' // // #CONFIG# // project title // url siteUrl // // Set your license // licenses { // license { // name 'The Apache Software License, Version 2.0' // url 'http://www.apache.org/licenses/LICENSE-2.0.txt' // } // } // developers { // developer { // id 'wyouflf' // // #CONFIG# // your user id (you can write your nickname) // name 'lei.jiao' // // #CONFIG# // your user name // email 'wyouflf@qq.com' // // #CONFIG# // your email // } // } // scm { // connection gitUrl // developerConnection gitUrl // url siteUrl // } // } // } // } //} //task sourcesJar(type: Jar) { // from android.sourceSets.main.java.srcDirs // classifier = 'sources' //} //task javadoc(type: Javadoc) { // options.encoding = "UTF-8" // source = android.sourceSets.main.java.srcDirs // classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) //} //task javadocJar(type: Jar, dependsOn: javadoc) { // classifier = 'javadoc' // from javadoc.destinationDir //} //artifacts { // archives javadocJar // archives sourcesJar //} //Properties properties = new Properties() //properties.load(project.rootProject.file('local.properties').newDataInputStream()) //bintray { // user = properties.getProperty("bintray.user") // key = properties.getProperty("bintray.apikey") // configurations = ['archives'] // pkg { // repo = "maven" // name = "xUtils" // // #CONFIG# project name in jcenter // websiteUrl = siteUrl // vcsUrl = gitUrl // licenses = ["Apache-2.0"] // publish = true // } //}第四步:修改xutils_sample的 build.gradle,修改红色字体的版本号,要与自己app的build.gradle版本号一致; apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion '25.0.0' defaultConfig { applicationId "org.xutils.sample" minSdkVersion 14 targetSdkVersion 22 // 不使用api23的动态权限策略 versionCode 1 versionName "1.0" } signingConfigs { debugConfig { storeFile file("debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } } buildTypes { release { debuggable false minifyEnabled true signingConfig signingConfigs.debugConfig proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support:support-v4:25.3.1' compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.android.support:design:25.3.1' compile project(':xutils') } 第五步:将xutils库作为工程添加到自己app的build.gradle中,在File->Project Structure中选择APP,然后library中添加 初始化时导入: import org.xutils.x;

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

案例研究:构建DreamHost的OpenStack云

企业采用云计算最引人注目的优势之一就是不再为那些底层硬件所困扰,可以在任何地方或任何时候使用虚拟机,更好地为业务服务。企业不再需要通过预估来确定能够满足未来需求的CPU,内存,硬盘的数量。如果预测不成功,也不需要受到这些决定的约束。内部IT团队不再需要安装和维护这些基础架构。 相反,使用云计算中的虚拟机,以往数据中心的硬件的细节可以通过简单的点击就容易地改变。这个过程可以满足不断变化的需求或优化系统。通常,小变化就可能提供巨大的性能改进,但如果它意味着需要繁琐的物理硬件安装,企业就不会尝试。通过这种方式,云计算提供了业务处理能力和灵活性,否则将无法使用。所以,大多数人总结采用云计算是一个很好的选择。 云计算服务提供商DreamHost公司选择采用硬件,而让用户不必直接采用硬件。或者换句话说,云计算服务提供商没有这么幸运。所有这些虚拟机必须在物理硬件上运行在某个水平,DreamHost公司一直在努力确定应该在数据中心中采用哪些硬件。由于最初通过其第一个OpenStack实现(DreamHost Cloud Beta集群),采用者的业务开始采用云计算服务,云计算服务提供商必须十分了解数据中心硬件,才能更好地满足用户的需求。 DreamHost公司决定采用的Dream Compute Beta集群应该使用哪个硬件,并设计后端云基础架构,为企业用户提供虚拟机,同时在其软件限制范围内工作,需要做出一系列选择。并在它发生时,找出什么会更好,然后适应。客户的反馈会为云计算服务修正错误。 以下是为云计算产品寻求合适的硬件组合时所学到的要点: 1.测试限制(然后坚持) 云计算厂商需要知道可以或不能改变什么。在构建云计算集群时,这一点证明是正确的。云计算厂商开始突破某些不变的物理和基于软件的限制。数据中心的机架9英尺(58U)高,并部署了两个60A三相208伏电源板,这是基本的物理基础设施。这个OpenStack实现的操作系统软件是主机上的Ubuntu Linux和交换机上的Cumulus Linux,因此云计算厂商只能使用与Linux兼容的硬件。 此外,作为一个业务问题,客户对CPU,内存,磁盘等使用的需求保持在一定的恒定比率。云计算厂商可以改变其产品和定价,但必须采用一定的比率,这将成为一个硬限制。 2.加强核心:数量或质量? 对于Dream Compute Beta集群,云计算厂商使用AMD皓龙6200系列处理器,为每台机器提供令人印象深刻的64个CPU。其唯一的缺点是,相对于其他选项运行缓慢并功率不足。大量的CPU允许在单个主机上部署大量的虚拟机,并提供优秀的规格,虚拟机的配置大约为32个CPU,64GBRAM。虽然客户肯定喜欢有很多CPU,但是市场反馈比较冷淡,因为拥有更强大的CPU对客户于的需求更加重要。经验教训:在下一个集群的设计中,云计算厂商在平衡CPU功耗和数量方面要仔细考虑。 3.服务器的电源问题 说到电源问题,每个虚拟机管理程序机器中的CPU和内存的密度(加上在每个机箱上安装的两个系统的设置)创建了一种情况,其中服务器无法使用单根电源线运行,但需要两个1600W电源。因此,不可能在这个系统中建立冗余,这样的管理程序没有弹性。在遇到维护事件,电源波动,PDU故障等情况下,它们都会掉电,并使这种情况更糟糕,机器附带的电源电缆的C13连接器很小,因此它们很容易从PDU上的插座中滑出。 这反过来意味着管理程序也将失去电力。对于新的集群来说,云计算厂商必须在电力冗余的硬件方面进行投资。 4.选择硬件时,不要群集存储群集 当涉及到Dream Compute Beta集群的构建块存储时,DreamHost公司使用了最初在DreamHost开发的对象存储软件Ceph。当时,唯一的参考点是使用什么样的硬件,大型对象存储集群Dream Objects,所以云计算厂商将相同类型的专用存储设备到位。 事实证明,大型对象存储集群和云计算存储集群有不同的需求。大型对象存储集群旨在保存大量未经常访问的数据,因此可以使用低端处理器,少量RAM和简单的RAID卡。相比之下,OpenStack云的数据后端需要能够处理各种并发和正在进行的进程:虚拟机向上或向下运行,MySQL正在执行操作等。DreamHost公司再次面临一个平衡问题:实际需要的存储空间接近10倍,性能表现不佳。 最后,试验,错误,挫折,客户反馈,知情改进的迭代过程使云计算有合适的硬件。如何在硬件功能之间在电源和广度之间取得适当平衡的教训,并逐渐提高了产品的质量。 本文转自d1net(转载)

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

人工智能应用案例——智能客服

智能客服 点此咨询顾问 使用智能语音识别技术,将传统客服电话的通话内容以文本形式记录下来,再进一步做文本结构化和信息挖掘,对客服质量监测、做舆情分析和风险控制。 业务痛点及需求 在不少企业的售前咨询、售后客服场景中,每天有很多的客户提问一些常规性问题,导致人工客服工作繁琐重复,客服人力成本居高不下。 在企业的反馈高峰时段,如电商行业促销活动期间、房产行业上新楼盘期间,由于人工客服有限,导致在线用户提问排队时间很长,极大的影响了用户的体验。 人工客服人员水平层次不齐,导致服务质量高低不平。不但无法给出最合理规范的服务,而且连对客服人员的服务质量评估都非常困难。 系统架构 企业在阿里云开通账号。 企业通过阿里云提供的接口,将知识库按照固定格式上传到阿里云上。 企业通过阿里云提供的接口,更新数据库到自己的专用服务上 企业通过阿里云提供的接口,即可传入用户的问

资源下载

更多资源
Nacos

Nacos

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

Spring

Spring

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

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

用户登录
用户注册