首页 文章 精选 留言 我的

精选列表

搜索[递归超智能],共10000篇文章
优秀的个人博客,低调大师

[Android Studio] Android studio 多渠道打包(超简洁版)

转载:http://xuyazhou.com/archives/461 http://relex.me/using-manifestplaceholders/ 最近一直用android studio进行开发,在开发和发版的时候,遇到一个多渠道打包的问题,由于公司里是有七个渠道的包进行分发,由于每次去AndroidManifest.xml修改渠道的值,甚是麻烦。。。 最后去google了一番,发现有些方法,是在gradle文件里切换各种不同的AndroidManifest.xml文件,感觉这样也太麻烦些了。。。后面搜索了些,发些大家写得都差不多,发现一个在gradle利用manifestPlaceholders这个属性来替换渠道值的方法,但我按照这个方法,没有成功,我就去扒官方的文档才彻底搞定。下面就讲讲怎么实现的吧。 一般用渠道的统计无非是用友盟或者其它之类的,今天就以友盟的为例吧。 渠道信息一般在AndroidManifest.xml中修改以下值: <meta-data android:name="UMENG_CHANNEL" android:value="wandoujia" /> 首先你必须在AndroidManifest.xml中的meta-data修改以下的样子: <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" /> 其中${UMENG_CHANNEL_VALUE}中的值就是你在gradle中自定义配置的值。 build.gradle文件就利用productFlavors这样写: productFlavors { wandoujia { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] } baidu { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"] } c360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"] } uc { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"] } } 其中[UMENG_CHANNEL_VALUE: "wandoujia"]就是对应${UMENG_CHANNEL_VALUE}的值。 最新更新 后来发现上面的重复代码太多,就在网上又发现了一个更简洁的写法 productFlavors { wandoujia {} baidu {} c360 {} uc {} productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } } 其中name的值对相对应各个productFlavors的选项值,这样就达到自动替换渠道值的目的了。 这样生成apk时,选择相应的Flavors来生成指定渠道的包就可以了,而且生成的apk会自动帮你加上相应渠道的后缀,非常方便和直观。大家可以自己反编译验证。 一次生成所有渠道包 在android studio底栏中有个命令行工具Terminal,打开后就CMD可以自动切换到当前项目的目录下。 有的项目下会有graldew.bat这个文件,你就可以输入这个命令: gradlew assembleRelease 就可以一次性生成所有的渠道包了 不过我一般不建议大家使用这个命令,gradlew这个命令的gralde的版本无法控制,有时候会莫名其妙的下载老版本的gradle 所以我个人推荐大家使用以下的用法。 先找到gralde的根目录,在系统变量里添加两个环境变量: 变量名为:GRADLE_HOME,变量值就为gradle的根目录; 所以变量值为:C:\Users\yazhou\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1 还有一个在系统变量里PATH里面添加gradle的bin目录 我的就是C:\Users\yazhou\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1\bin 这里配置完成了,接着在Terminal中敲下gradle assembleRelease就可以一次性生成所有的渠道包了。 所有生成的apk在项目的build\outputs\apk下。 如果只是想生成单个渠道的包呢? 打开Android Studio的Gradle tasks面板(右边侧边栏),会发现模块多了很多任务,如下图所示。 此时可以直接双击该任务生成对应的apk,也可以用命令行单独生成,比如 gradle assembleWandoujiaRelease 多渠道打包从此就非常快捷了,今天就写到这里,以后Android studio有相应的tips还是会分享给大家。 参考:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-mergerhttp://www.cnblogs.com/shanpow/p/4097320.html 分类: Android Studio 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/4203997.html如需转载请自行联系原作者 demoblog

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

判断超融合存储优劣的几个原则初探(2)

在 上一篇文章 中,强调了区分系统存储介质访问方式的重要性,接下来,需要考虑的问题就是IO请求所经过的网络路径。 所谓IO请求路径,通常包括几个部分:接收外部(如虚拟机的)IO请求、寻址即将外部IO请求转换为(ServerSAN)系统内部请求、将内部IO请求发至相应的存储节点以实现数据访问。 在一个ServerSAN系统中,通常会由客户端块设备驱动来负责接收外部IO请求,其处理方式亦寻址方式有多种:有些需要查询元数据库(Metadata Store,用于存放内部数据块的元数据,包括数据块在哪个存储节点上的信息);有的则利用Consistent Hashing的方法,直接计算出IO请求对应的内部存储地址,从而达到省略查询元数据库的目的。 此外,将内部请求发送到存储节点也有多种方式:以副本为3份的写请求为例,有的是将数据依次写入3个存储节点,如此就涉及3个网络跳转;也有的是将数据先写入主节点(Primary),再由主节点发给另外两个从节点,如此需要两个网络跳转。另外一种方式是同时广播给3个存储节点,如此只涉及一个网络跳转。 图 1拥有最长网络路径的系统 以Sheepdog Storage系统为例,一个IO请求需要通过QEMU block driver,Gateway,存储节点3个网络跳转,即网络路径为3。以Ceph为例,一个IO请求需要通过RBD(客户端驱动),主OSD(存储节点),从OSD共3个网络跳转,即网络路径为3。 图 2拥有最短网络路径的系统 目前为止,我们见到的分布式存储系统里最优的I/O路径为2:客户端驱动和存储节点;其中寻址功能被合并到客户端驱动,并且寻址不需要查询元数据库。客户端驱动直接广播到所有的存储节点上。 同样的,就像上篇文章提到,有没有一个判断ServerSAN系统I/O路径的简单方法呢? 不幸地是,我们很难通过一个系统的外部表象来判断这个系统的I/O路径是多少,是否最优?我也没有想出一个简单的方法。但就像判断直接和间接访问裸设备一样,判断系统的I/O路径对于判断系统的水平也是非常重要的。 尽管没有一个简单的方法,但在实际的选型过程中,I/O路径应该成为一个考察的重点,用户应该要求供应商介绍其系统架构,以及外部I/O、内部I/O请求的方法,一旦我们得知系统不是内直接寻址或不是将数据一次性广播给所有的副本节点,我们就可以得出如此的判断:该系统的I/O路径极有可能不是极有可能最优的。 (未完待续) 作者简介:陈靓,1999年北京航空航天大学硕士毕业,2002年考入美国俄亥俄州立大学学习计算机科学,2006年获得该校博士学位。此后入职美国Amazon,于AWS Storage Team(云计算核心存储团队)工作,长达7年之久,曾经担任系统架构师和研发团队带头人,负责设计和实现了著名的AWS Glacier系统结构;2011年加入AWS S3团队,负责对AWS S3 的Volume子系统新版本的研发。2013年,接受南京市政府321计划的感召,选择归国创业,创办了南京鹏云网络科技有限公司,致力于私有云存储产品的研发。2015年入选中组部“国家千人计划”专家人才。 作者:南京鹏云网络科技有限公司 来源:51CTO

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

Android Transition Framework详解---超炫的动画框架

前言 早在Android 4.4,Transition 就已经引入,但在5.0才得以真正的实现。而究竟Transition是用来干嘛的呢。接下来我将通过实例和原理解析来分析下Google这个强大的动画框架。 先来张效果图镇住场面 这个效果下文会介绍如何实现,不过要先理解透这个框架的一些基础概念。 Transition Framework 核心就是根据Scene(场景,下文解释)的不同帮助开发者们自动生成动画。通常主要是通过以下几个方法开启动画。 TransitionManager.go() beginDelayedTransition() setEnterTransition()/setSharedElementEnterTransition() 我们来逐一解释以上各种情况 TransitionManager.go() 首先,先介绍下Scene这个类,看看官方的解释 A scene represents the collection of values that various properties in the View hierarchy will have when the scene is applied. A Scene can be configured to automatically run a Transition when it is applied, which will animate the various property changes that take place during the scene change. 通俗的解释就是这个类存储着一个根view下的各种view的属性。通常由getSceneForLayout (ViewGroup sceneRoot,int layoutId,Context context)获取实例。 sceneRoot scene发生改变和动画执行的位置 layoutId 即上文所说的根view 可能这样解释有点无力,下面我举个例子。 privateScenescene1; privateScenescene2; privatebooleanisScene2; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_scene); initToolbar(); initScene(); } privatevoidinitScene(){ ViewGroupsceneRoot=(ViewGroup)findViewById(R.id.scene_root); scene1=Scene.getSceneForLayout(sceneRoot,R.layout.scene_1,this); scene2=Scene.getSceneForLayout(sceneRoot,R.layout.scene_2,this); TransitionManager.go(scene1); } /** *scene1和scene2相互切换,播放动画*@paramview */ publicvoidchange(Viewview){ TransitionManager.go(isScene2?scene1:scene2,newChangeBounds()); isScene2=!isScene2; } scene1: scene2: 注意,两个scene布局中1和4,2和3除了图片位置大小不一样,其id是一样的。可以当成一个view.因为分析比较起始scene 的不同创建动画是针对于同一个view的。 上述简单的例子是通过第一种方式TransitionManager.go()触发动画。即在进入Activity的时候,手动将start scene通过TransitionManager.go(scene1)设置为scene1。点击button通过TransitionManager.go(scene2,new ChangeBounds())切换到end scene状态:scene2.Transition 框架通过ChangeBounds类分析start scene和end scene的不同创建并播放动画。由于ChangeBounds类是分析比较两个scene中view的位置边界创建移动和缩放动画。发现从scene1->scene2其实是1->4,2->3。于是就执行相应的动画,即是如下效果: 类似于ChangeBounds类的还有以下几种,他们都是继承Transiton类 ChangeBounds 检测view的位置边界创建移动和缩放动画 ChangeTransform 检测view的scale和rotation创建缩放和旋转动画 ChangeClipBounds 检测view的剪切区域的位置边界,和ChangeBounds类似。不过ChangeBounds针对的是view而ChangeClipBounds针对的是view的剪切区域(setClipBound(Rect rect)中的rect)。如果没有设置则没有动画效果 ChangeImageTransform 检测ImageView(这里是专指ImageView)的尺寸,位置以及ScaleType,并创建相应动画。 Fade,Slide,Explode 这三个都是根据view的visibility的不同分别创建渐入,滑动,爆炸动画。 以上各个动画类的实现效果如下: AutoTransition 如果TransitionManager.go(scene1)不指定动画,则默认动画是AutoTransition类。它其实是一个动画集合,查看源码可知其实是动画集合中添加了Fade和ChangeBounds类。 privatevoidinit(){ setOrdering(ORDERING_SEQUENTIAL); addTransition(newFade(Fade.OUT)). addTransition(newChangeBounds()). addTransition(newFade(Fade.IN)); } 说到动画集合,其实动画类不仅可以通过类似new ChangeBounds()方法创建,也可以通过xml文件创建。且如果对于动画集合,xml方式可能会更加方便。 只需要两步,第一步在res/transition创建一个xml文件,如下: res/transition/changebounds_and_fade.xml: <?xmlversion="1.0"encoding="utf-8"?> <transitionSetxmlns:android="http://schemas.android.com/apk/res/android"> <changeBounds/> <fade/> </transitionSet> 然后再代码中调用: Transitionsets=TransitionInflater.from(this).inflateTransition(R.transition.changebounds_and_fade); 最后补充一点,关于和TransitionManager.go(scene2)其实是调用当前的scene(scene1)的scene1.exit()以及下一个scene(scene2)的scene2.enter() 而它们又分别会触发scene1.setExitAction()和scene1.setEnterAction().可以在这两个方法中定制一些特别的效果. beginDelayedTransition() 接下来介绍下一个触发方式,如果上面的理解透了话下面的就很简单了。之前的那种TransitionManager.go()一直都是根据xml文件创造start scene和end scene,这样未免有些麻烦。 而beginDelayedTransition()原理则是通过代码改变view的属性,然后通过之前介绍的ChangeBounds等类分析start scene和end Scene不同来创建动画。 依然举个例子: @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_begin_delayed); initToolBar(); initView(); } @Override publicvoidonClick(Viewv){ //startscene是当前的scene TransitionManager.beginDelayedTransition(sceneRoot,TransitionInflater.from(this).inflateTransition(R.transition.explode_and_changebounds)); //nextscene此时通过代码已改变了scenestatue changeScene(v); } privatevoidchangeScene(Viewview){ changeSize(view); changeVisibility(cuteboy,cutegirl,hxy,lly); view.setVisibility(View.VISIBLE); } /** *view的宽高1.5倍和原尺寸大小切换*配合ChangeBounds实现缩放效果*@paramview */ privatevoidchangeSize(Viewview){ isImageBigger=!isImageBigger; ViewGroup.LayoutParamslayoutParams=view.getLayoutParams(); if(isImageBigger){ layoutParams.width=(int)(1.5*primarySize); layoutParams.height=(int)(1.5*primarySize); }else{ layoutParams.width=primarySize; layoutParams.height=primarySize; } view.setLayoutParams(layoutParams); } /** *VISIBLE和INVISIBLE状态切换*@paramviews */ privatevoidchangeVisibility(View...views){ for(Viewview:views){ view.setVisibility(view.getVisibility()==View.VISIBLE?View.INVISIBLE:View.VISIBLE); } } 当触发点击事件时候,此时记录下当前scene status,然后改变被点击view的尺寸,并改变其他view的visibility,再记录下改变后的scene status。而本例中beginDelayedTransition()第二个参数传的是一个ChangeBounds和Explode动画集合,所以这个集合的中改变尺寸的执行缩放动画,改变visibility的执行爆炸效果。整体效果如下: 界面切换动画 前面说了那么多终于到了重头戏了:Activity/Fragment之前的切换效果。界面切换有两种,一种是不带共享元素的Content Transition一种是带有共享元素的Shared Element Transition。 Content Transition 先解释下几个重要概念: A.exitTransition(transition) Transition框架会先遍历A界面确定要执行动画的view(非共享元素view),执行A.exitTransition()前A界面会获取界面的start scene(view 处于VISIBLE状态),然后将所有的要执行动画的view设置为INVISIBLE,并获取此时的end scene(view 处于INVISIBLE状态).根据transition分析差异的不同创建执行动画。 B.enterTransition() Transition框架会先遍历B界面,确定要执行动画的view,设置为INVISIBLE。执行B.enterTransition()前获取此时的start scene(view 处于INVISIBLE状态),然后将所有的要执行动画的view设置为VISIBLE,并获取此时的end scene(view 处于VISIBLE状态).根据transition分析差异的不同创建执行动画。 根据上文解释,界面切换动画是建立在visibility的改变的基础上的,所以getWindow().setEnterTransition(transition);中的参数一般传的是Fade,Slide,Explode类的实例(因为这三个类是通过分析visibility不同创建动画的)。通常写一个完整的Activity Content Transiton有以下几个步骤: 在style中添加 <itemname="android:windowActivityTransitions">true</item> Material主题的应用自动设置为true. 设置相应的A离开/B进入/B离开/A重新进入动画。 //A不设置默认为null getWindow().setExitTransition(transition); //B不设置默认为Fade getWindow().setEnterTransition(transition); //B不设置默认为EnterTransition getWindow().setReturnTransition(transition); //A不设置默认为ExitTransition getWindow().setReenterTransition(transition); 当然也可以在主题中设置 <itemname="android:windowEnterTransition">@transition/slide_and_fade</item> <itemname="android:windowReturnTransition">@transition/return_slide</item> 跳转界面 这里的跳转界面不能仅仅startActivity(intent),需要 Bundlebundle=ActivityOptionsCompat.makeSceneTransitionAnimation(activity).toBundle; startActivity(intent,bundle) ok到这里为止既可以运行activity之间的切换动画了。 但是你会发现,在界面切换的时候,A退出时,过了一小会,B就进入了,(真是过分,不给A完全展示ExitTransition)如果你是想等A完全退出后B再进入可以通过设置setAllowEnterTransitionOverlap(false)(默认是true),同样可以在xml中设置: <itemname="android:windowAllowEnterTransitionOverlap">false</item> <itemname="android:windowAllowReturnTransitionOverlap">false</item> 说了这么多我觉得又得举个简单例子。 A.Activity: @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initToolBar(); getWindow().setExitTransition(TransitionInflater.from(this).inflateTransition(R.transition.slide)); //未设置setReenterTransition()默认和setExitTransition一样 } publicvoidgoContentTransitions(Viewview){ Intentintent=newIntent(this,ContentTransitionsActivity.class); ActivityOptionsCompatactivityOptionsCompat=ActivityOptionsCompat.makeSceneTransitionAnimation(this); startActivity(intent,activityOptionsCompat.toBundle()); } res/translation/slide.xml: <transitionSetxmlns:android="http://schemas.android.com/apk/res/android"> <slideandroid:duration="1000"></slide> </transitionSet> B.Activity: @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_content_transitions); initToolbar(); Slideslide=newSlide(); slide.setDuration(500); slide.setSlideEdge(Gravity.LEFT); getWindow().setEnterTransition(slide); getWindow().setReenterTransition(newExplode().setDuration(600)); } 实现的效果如下: 仔细看着动画你其实可以发现A的状态栏也跟着下拉上拉了,而且和下面的视图有一定的间距。处女座表示不能忍。 其实从原理上来解释,Activity的切换动画针对的是整个界面的view的visibility,而有没有什么方法能让Transition框架只关注某一个view或者不关注某个view呢。当然,transition.addTarget()和transition.excludeTarget()可以分别实现上述功能。 方便的是也可以在xml设置该属性,那么我们现在要做的是将statusBar排除掉,可以在slide.xml这样写: <transitionSetxmlns:android="http://schemas.android.com/apk/res/android"> <slideandroid:duration="1000"> <targets> <!--表示除了状态栏--> <targetandroid:excludeId="@android:id/statusBarBackground"/> <!--表示只针对状态栏--> <!--<targetandroid:targetId="@android:id/statusBarBackground"/>--></targets> </slide> </transitionSet> 大功告成,效果我就不贴了,各位可以脑补一下... Shared Element Transition 界面切换中往往Content Transition和Shared Element Transition是同时存在的,区别于Content Transition,主要有以下几个不同点: startActivity() Bundlebundle=ActivityOptionsCompat.makeSceneTransitionAnimation(activity,pairs).toBundle; startActivity(intent,bundle) 这里的pairs是Pair<View, String>类的实例集合,存储着两个activity之间共享view和name。这里的name要和B界面的共享view的transitionName一致。就像这样: Intentintent=newIntent(this,WithSharedElementTransitionsActivity.class); ActivityOptionsCompatactivityOptionsCompat=ActivityOptionsCompat.makeSceneTransitionAnimation(this ,newPair<View,String>(shared_image,"shared_image_") ,newPair<View,String>(shared_text,"shared_text_")); startActivity(intent,activityOptionsCompat.toBundle());//xml<TextView android:text="withShared" android:transitionName="shared_text_" style="@style/MaterialAnimations.TextAppearance.Title.Inverse" android:layout_width="wrap_content" android:layout_height="wrap_content"/> ><de.hdodenhof.circleimageview.CircleImageView android:id="@+id/icon_gg" android:layout_centerInParent="true" android:src="@mipmap/xkl" android:transitionName="shared_image_" android:layout_width="150dp" android:layout_height="150dp"/> setSharedElementEnterTransition()/setSharedElementReturnTransition() 不设置的话默认是@android:transition/move动画。而setExitTransition()和setEnterTransition()默认为null和Fade. 其实Shared Element Transition原理和Content Transition类似都是根据始末scene status的不同创建动画。 不同的是Content Transition是通过改变view的visibility来改变scene状态从而进一步创建动画,而Shared Element Transition是分析A B界面共享view的尺寸,位置,样式的不同创建动画化的。所以前者通常设置Fade等Transition后者通常设置ChangeBounds等Transition. 最后的最后让我们来分析如何实现文章一开始的那个gif图效果。 整个动画包括Content Transition和Shared Element Transition。而A界面的setExitTransition()并没有设置为null。 当进入B界面,这里的共享view只是单纯的移动所以setSharedElementEnterTransition(transition)可以不用设置,默认为move。同时会执行一个水纹展开动画,这个可以通过ViewAnimationUtils.createCircularReveal()方法实现。在Shared Element Transition结束之后执行Content Transition,可以看出是Slide动画。所以可以通过设置setExitTransition(new Slide())完成。注意这里Slide只作用于底部的item(要设置target),否则就作用于一整个视图了。 最关键的来了,在B退出时候,可以看到屏幕上半部分向上滑过,下半部分向下滑过。一种从中间撕开的视觉效果。所以可以将布局一分为二并指定为用两个不同方向的Slide的Target,差不多像这样: <transitionSet android:duration="800"xmlns:android="http://schemas.android.com/apk/res/android"> <slideandroid:slideEdge="top"> <targets> <targetandroid:targetId="@id/viewGroup_top"></target> </targets> </slide> <slideandroid:slideEdge="bottom"> <targets> <targetandroid:targetId="@id/viewGroup_bottom"></target> </targets> </slide> </transitionSet> 这里其实有个坑,我们先来看看isTransitionGroup()这个方法: publicbooleanisTransitionGroup(){ if((mGroupFlags&FLAG_IS_TRANSITION_GROUP_SET)!=0){ return((mGroupFlags&FLAG_IS_TRANSITION_GROUP)!=0); }else{ finalViewOutlineProvideroutlineProvider=getOutlineProvider(); returngetBackground()!=null||getTransitionName()!=null|| (outlineProvider!=null&&outlineProvider!=ViewOutlineProvider.BACKGROUND); } } 返回值为true表示这个ViewGroup作为一个整体执行Activity Transition,false表示这个ViewGroup中子view各自执行各自的。如果这个ViewGroup设置了background或者TransitionName,或者setTransitionGroup(true)则返回值为true表示作为一个整体执行动画. 所以这里的viewGroup_bottom和viewGroup_top最好设置下setTransitionGroup(true). 实现效果如下,自己加了点其他特效 具体代码我就不贴了,本文的所有的代码已上传Github(我是链接),包括Fragment的切换本文未作介绍代码中有写。希望大家能点个star。 如果你看了一遍还是不知所云那我强烈建议你结合代码运行下在看一遍,其实搞懂了还是蛮简单的。 最后我想说的是关于这个Transition Framework还有一些内容没说完,可能要等过段时间更新了,接下来还会写关于Dagger 2的相关文章以及NavigationBar的加强版,敬请期待吧。 作者:陈留年 来源:51CTO

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

Oracle云存储“超售”导致服务能力无法兑现?

据多位可靠的消息人士透露,Oracle最近经历了一场云存储能力不足的危机,其基础架构即服务以及Exadata Database即服务的客户受到了波及。 虽然目前尚不清楚有多少客户受到了影响,也不知道这个问题是否已经得以解决,消息人士说有一些大客户依旧不能在五月底到期之前使用他们购买的“cloud credits”。据了解,cloud credits是一种针对Oracle云服务的许可证,这种许可证正在越来越多地出现在大型交易之中。 一位不愿意透露姓名的Oracle合伙人表示:“我的一个客户的cloud credits快要到期了,他们想用完这些信用点,但Oracle说他们不用着急。” 据消息人士透露,Oracle2016财年于5月31日结束,在此期间Oracle的销售团队已经售出了大量的IaaS和Exadata云服务。Oracle基于销售数据估算所需的运算及存储能力,而不是实际使用量,这就是问题的起源。 消息人士表示,由于过于乐观,Oracle最终卖掉了所有的IaaS和Exadata的可用技术资源,即使客户实际上只使用了他们已经购买的云服务中的一小部分。 据不愿意透露姓名的消息人士表示,Oracle不得不去构建新的IaaS和Exadata能力,即使它意识到它所提供的云服务能力遭遇了严重的使用不足。 Oracle的官方发言人拒绝对此发表评论。 某位行业的首席技术官对CRN表示,能力短缺可能表明,Oracle在从销售传统的内部部署软件到云服务的转型过程中遭遇到了成长的阵痛。它也掩盖了Oracle可能“严重缺乏能力管理和操作可见性”。 这位不愿透露姓名的企业高管说:“如果Oracle只是单纯按照销售提高云服务的容量,而没有能力或者没有意愿去监控实际使用的情况,那么我认为他们的云服务的管理将会非常混乱。” 这位企业高管表示,云服务供应商需要实时跟踪他们的客户实际使用云服务的情况,同时还要利用预测分析技术预估未来的需求。他表示:“没有任何理由先出售再构建已经售出的所有产品。并且,一个好的云服务商应该拥有很强的能力管理工具和完善的流程,应该能够‘及时’扩展,而不是需要提前几个星期甚至几个月进行准备。” 消息人士称,此次云计算能力的问题部分源于Oracle本身的发展策略。在错过进入市场的最佳时机之后,Oracle希望能够把自己打造成云软件的厂商。 三月,Oracle的第三季度财报显示其IaaS、软件即服务以及平台即服务这几项业务合并营收共计7.37亿美元,和去年同期相比增长了43%;毛利率从上一季度的43%上涨到这一季度的51%。 Oracle联席总裁马克.赫德在投资者电话会议上透露,在2017财年,这些云服务预售额有望达到15亿美元。 然而一些Oracle的合作伙伴对这家加州Redwood Shores的供应商用来刺激云销售数字的方法依尚有疑问。 本月早些时候,一位前Oracle雇员对供应商提出了举报人诉讼,声称她的上司逼迫她在财表上对云服务的数字造假。Oracle已经否认了这些指控,并表示计划反诉。 之前有消息人士告诉CRN,在Oracle销售人员的薪酬模式里,销售云服务获得的佣金比销售传统的内部部署模式软件的佣金明显高得多。这可能导致Oracle云能力不足的情况进一步恶化。 Oracle的销售人员往往会出售cloud credits给客户,以获取更高的佣金。有一个十分典型的场景就是如果客户同意购买20万美元的云服务,Oracle的销售会把一个售价100万美元的传统内部部署软件降价到80万美元。 表面上看这是一个双赢的局面:Oracle的销售代表由于交易中包含的云服务获得了更高的佣金,而客户可以降低第二年续订软件所需的费用,因为客户使用的传统软件变少了。 然而,除了现在已经曝出的云能力不足, Oracle用于刺激销售的举措也造成了一些意想不到的副作用。 在应对这场云能力危机时, Oracle的一个明显举措就是降低了销售人员的佣金。 据消息人士透露,去年夏天,Oracle为云服务销售向销售人员支付了高达正常水平五倍的佣金,而今年只有三倍。Oracle拒绝对此做出评论。 一位不愿意透露姓名的Oracle长期合作伙伴表示:“佣金从五倍下调到三倍可能是近期Oracle做出的一个细化调整,因为公司意识到如果佣金倍数太高,会导致销售人员滥用薪酬计划。” 对于云计算能力的短缺,Oracle采取的另一个明显的反应是加大力度以确保客户会使用他们购买的云服务。 总部位于纽约的Palisade Compliance公司是一家致力于为Oracle的客户处理许可证相关事宜的企业,该公司的首席执行官Craig Guarente表示:“我们听到很多客户抱怨说,一旦跟Oracle的销售人员签了云服务的购买合同之后,他们就会接到无数个来自对方的电话。他们会反复告诉客户必须登陆并使用这项服务。” Oracle这样做并不是仅仅为了更好掌握客户对云服务的需求。之前已经在Oracle工作了16年,并且曾担任过负责处理合同事宜的全球副总裁的Guarente表示,他认为Oracle跟微软以及其它云供应商一样,希望客户能够一直持续使用其提供的云服务。 他说道:“从某种程度上来说,云应该要保持粘性。如果客户不再使用,他们将不会再为这个服务买单。”本文转自d1net(转载)

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

爱立信:物联网连接数会超手机连接

爱立信发布预测称,到2018年,全球物联网连接数将超过手机连接数。爱立信在报告中称,到2021年,全球的移动连接数将达到275亿,其中物联网连接数将达到157亿、手机连接数为86亿。 届时,亚太地区将成为物联网连接的最大市场,其次是西欧和北美。移动运营商需要注意的是,爱立信预测,到2021年,基于蜂窝网络的物联网连接在总的物联网连接中的占比仅为不到10%。这表明,WiFi和LoRaWAN等使用未授权频谱的技术至少在未来5年里成为物联网的主导技术。但从2020年起,随着运营商开始5G商用,蜂窝网络为对物联网将越来越重要。 爱立信预测,到2021年年底,全球5G连接数将达到1.5亿。届时,LTE连接将从今年第一季度末的12亿增长到43亿。同时,3G连接数也有望从2015年年底的21亿增长到31亿,而2G连接数则将从36亿下降至12亿。本文转自d1net(转载)

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

图文超详解zabbix的安装以及设置邮件报警

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一、 zabbix简介 zabbix是完全开源的工具,整合了cacti和nagios等特性 附:SNMP(udp 161 udp 162) 众多网络工具都支持此协议,比如常见路由交换,常见OS 其既可以做管理端也可以做被管理端 snmp协议大致有3个版本分别是v1 v2 v3 无论是v1 和 v2 的安全性是比较差的,因为传输是明文的, V3的认证密码用MD5/SHA摘要算法加密。 很多工具支持网络管理的功能,而对于非网络设备(操作系统),可以完全抛开snmp这种不安全的架构来实现监控的。所以很多工具都是控制端和agent架构,他们有专属的agent Zabbix的主要功能: ①具备常见的商业监控软件所具备的功能(主机的性能监控、网络设备性能监控、数据库、FTP 等通用协议监控、多种告警方式、详细的报表图表绘制)。 ②支持自动发现网络设备和服务器(可以通过配置自动发现服务器规则来实现)。 ③支持分布式,能集中展示、管理分布式的监控点,扩展性强。 ④server 提供通用接口(api 功能),可以自己开发完善各类监控(根据相关接口编写程序实现),编写插件容易,可以自定义监控项,报警级别的设置。 ⑤数据收集,支持 snmp(包括 trapping and polling ),IPMI,JMX,SSH,TELNET。 ⑥自定义的检测;自定义收集数据的频率; ⑦服务器/代理和客户端模式。 ⑧灵活的触发器(可以定义非常灵活的问题阈值,称为触发器)。 ⑨高可定制的报警,发送通知,可定制的报警升级,收件人,媒体类型。 ⑩CPU负荷、内存使用、磁盘使用、网络状况、端口监视、日志监视等等。 硬件监控:Zabbix IPMI Interface 系统监控:Zabbix Agent Interface Java监控:ZabbixJMX Interface 网络设备监控:Zabbix SNMP Interface 应用服务监控:Zabbix Agent UserParameter MySQL数据库监控:percona-monitoring-plulgins URL监控:ZabbixWeb 监控 zabbix重要组件说明: ①zabbix server:负责接收agent发送的报告信息的核心组件,所有配置、统计数据及操作数据都由它组织进行; ②database storage:专用于存储所有配置信息,以及由zabbix收集的数据; ③web interface:zabbix的GUI接口; ④proxy:可选组件,常用于监控节点很多的分布式环境中,代理server收集部分数据转发到server,可以减轻server的压力; ⑤agent:部署在被监控的主机上,负责收集主机本地数据如cpu、内存、数据库等数据发往server端或proxy端; 另外,zabbix server、proxy、agent都有自己的配置文件以及log文件,重要的参数需要在这里配置,后面会详细说明。 一个监控系统运行的大概的流程是这样的: agentd需要安装到被监控的主机上,它负责定期收集各项数据,并发送到zabbix server端,zabbix server将数据存储到数据库中,zabbix web根据数据在前端进行展现和绘图。这里agentd收集数据分为主动和被动两种模式: 主动:agent请求server获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy 被动:server向agent请求获取监控项的数据,agent返回数据。 zabbix常用的监控架构平台 ①server-agentd模式: 这个是最简单的架构了,常用于监控主机比较少的情况下。 ②server-proxy-agentd模式: 这个常用于比较多的机器,使用proxy进行分布式监控,有效的减轻server端的压力。 zabbix的系统架构: 说明:abbix是一个基于Web界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案。借助Zabbix,可以很轻松地减轻运维人员们繁重的服务器管理任务,实现业务系统的持续运行。 下面会逐步介绍Zabbix分布式监控系统的部署及使用。 配置好IP、DNS 、网关,确保使用远程连接工具能够连接服务器。 二、Zabbix部署前的LNMP环境的搭建过程: 虚拟机环境: 监控端和被监控端ip: ①zabbix监控服务器(即:zabbix_server): 192.168.1.8 说明:zabbix的服务端(若要监控本机,则需要在本机的配置zabbix agent) ②zabbix被监控主机(即:zabbix_agent): 192.168.1.9 说明:zabbix的客户端(被监控端,必须配置zabbix agent) 系统环境: centos7.2x86_64 1)安装编译工具及库文件 图中内容如下: yum-y install make apr* autoconf automake curl-devel gcc gcc-c++ openssl openssl-devel gd kernel keyutilspatch perl kernel-headers compat* mpfr cpp glibc libgomp libstdc++-develkeyutils-libs-devel libcom_err-devel libsepol-devel libselinux-devel krb5-develzlib-devel libXpm* freetype libjpeg* libpng*libtool* libxml2 libxml2-devel patch libcurl-devel bzip2-develfreetype-devel 2)安装mysql5.7.13 ①在这里安装mysql的步骤就省略了,不会安装mysql5.7.13的朋友可以浏览我的博文,地址如下: http://zpf666.blog.51cto.com/11248677/1908988 ②mysql安装完毕后,看一下mysql的服务: ③防火墙开启3306端口例外 ④mysql数据库密码 我的数据库密码是:123456 3)安装nginx1.10.2 ①解压zlib和pcre 说明:不需要编译,只需要解压就行。 ②创建组账户和用户账户 ③下载安装nginx 下载nginx的源码包:http://nginx.org/download 图中内容如下: ./configure--prefix=/usr/local/nginx1.10 --with-http_dav_module--with-http_stub_status_module --with-http_addition_module--with-http_sub_module--with-http_flv_module --with-http_mp4_module--with-pcre=/root/pcre-8.39 --with-zlib=/root/zlib-1.2.8 --with-http_ssl_module--with-http_gzip_static_module --user=www --group=www && make&& make install ④做软链接 ⑤nginx语法检测、启动nginx服务并查看服务 ⑥防火墙开启80端口例外 ⑦在一台客户端访问测试 4)安装php5.6.27 ①安装libmcrypt ②做软链接 ③安装php 图中内容如下: ./configure--prefix=/usr/local/php5.6 --with-config-file-path=/etc --with-mysql=/usr/local/mysql--with-mysqli=/usr/local/mysql/bin/mysql_config--with-mysql-sock=/usr/local/mysql/mysql.sock --with-gd --with-iconv--with-libxml-dir=/usr --with-mhash --with-mcrypt--with-config-file-scan-dir=/etc/php.d --with-bz2 --with-zlib--with-freetype-dir --with-png-dir --with-jpeg-dir --enable-xml --enable-bcmath--enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex--enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf--with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip--enable-soap --without-pear --with-gettext --enable-session --with-mcrypt--with-curl && make && make install ④拷贝样例配置文件并修改 //设置时区 //禁止显示php版本的信息 //支持php短标签 //上传文件大小 //php脚本最大执行时间 //以秒为单位对通过POST、GET以及PUT方式接收数据时间进行限制 ⑤创建php-fpm服务启动脚本 ⑥提供php-fpm配置文件并编辑 ⑦启动php-fpm服务并查看 5)配置nginx支持php user www www; worker_processes 4; #error_loglogs/error.log; #error_loglogs/error.log notice; #error_loglogs/error.log info; #pidlogs/nginx.pid; events { use epoll; worker_connections 1024; } http { includemime.types; default_type application/octet-stream; #log_format main'$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent"$http_referer" ' # '"$http_user_agent""$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; charset utf-8; #access_loglogs/host.access.log main; location / { root html; index index.phpindex.html index.htm; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } #error_page 404 /404.html; # redirectserver error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /status { stub_status on; } } } 6)测试LNMP 进入nginx默认的网页根目录,创建.php的测试页: 在客户端上访问: 至此,LNMP部署完毕。 三、监控系统Zabbix-3.2.1的安装 1)zabbix-server端的操作 说明:zabbix服务器端要提前安装好LNMP环境(mysql,nginx,php5的安装目录均是/usr/local) ①创建zabbix运行的用户 ②安装libcurl和net-snmp等依赖包 图中内容如下: yum-y install net-snmp net-snmp-devel curl-devel java-1.8.0-openjdkjava-1.8.0-openjdk-develOpenIPMI-devel libssh2-devel 注意:OpenIPMI-devel 和libssh2-devel软件包必须使用centos在线yum软件源安装。 ③安装Fping ④安装zabbix Server 图中内容如下: ./configure--prefix=/usr/local/zabbix --enable-server --enable-agent --enable-java--with-mysql=/usr/local/mysql/bin/mysql_config --with-net-snmp --with-libcurl--with-openipmi && make && make install 注意: ⑴编译时最好带上--enable-java这个参数,方便后续监控tomcat程序所用。 ⑵--with-ssh2是不需要在客户端服务器上面安装Zabbix agent,如果需要使用ssh检查,需要在编译的时候加上这项,最低需要libssh2 1.0.0版本,需要安装ssh开发包 ⑶--with-openipmi用户可以利用IPMI 监视服务器的物理特征,如温度、电压、电扇工作状态、电源供应等。 ⑷如果添加了--enable-proxy, 那么会生成get和sender两条命令. 如下, 用于接收agent发生过来的信息, 同时发送给server。 ⑤添加系统软连接 2)zabbix server配置与启动 ①创建zabbix数据库和mysql用户 ②导入zabbix初始数据 切换到zabbix的解压目录下: 进行zabbix初始数据导入: ③编辑/usr/local/zabbix/etc/zabbix_server.conf ④启动zabbix server 从上图可以看到启动zabbix server服务失败了。 我们先分析下失败原因: 从图上可以看出,说是没发现libmysqlclient.so.20这个库文件。那我们用find命令搜索一下看一看,到底有没有这个文件: libmysqlclient.so.20这个库文件确实存在。现在我们再去看看ld.so.conf文件,看看里面有没有libmysqlclient.so.20的路径。 可以看见里面没有libmysqlclient.so.20的路径,我们把libmysqlclient.so.20路径添加到ld.so.conf里面即可。 注明:ld.so.conf文件是系统搜索动态连接库的目录设置,在这个文件里面写下的地址系统在运行程序时会自动去这些个目录里面找需要的动态库文件 解决办法如下: ⑴进入ld.so.conf文件 ⑵在末尾新增两行内容 ⑶让其修改生效 再次尝试启动: 从上图我们可以看到启动后没有报错,启动成功了,确认一下服务是否真正开启,我们可以看到zabbix_server默认监听的端口号是10051。 ⑤添加开机启动脚本 ⑥修改zabbix开机启动脚本中的zabbix安装目录 编辑服务端配置文件: //zabbix安装目录 //pid文件路径 编辑客户端配置文件: ⑥重载systemctl,并重新启动zabbix_server服务 ⑦在防火墙上开启10051端口例外 3)配置zabbix web页面 ①在安装目录将frontends拷贝到指定的web root: 注1:/usr/local/nginx/html为Nginx默认站点目录 注2:www为Nginx运行账户 注3:PHP需要至少开启扩展: gd,bcmath,ctype,libXML,xmlreader,xmlwriter,session,sockets,mbstring,gettext,mysql ②查看是否包括了上面所提到的所有扩展模块 从上图里看到的扩展和注3进行对比,少一个都不行,少一个你都没有继续做下去的必要了。 我这里可以对比出,全部的扩展模块都存在了。 ③在页面上安装zabbix_server 说明:访问Web界面http://192.168.1.8/zabbix,进行相关web配置,配置完成后使用默认用户admin(密码:zabbix)登陆即可。 ⑴进入ZABBIX WEB安装画面 ⑵进入ZABBIX检测画面 ⑶对数据库进行设置,这里如果数据库在本地的话端口可以使用0 ⑷点击Next step,下一步步进行zabbix server 细节的设置 这一步可以默认 ⑸点击安装,安装完成后,如果没有错误就会进入完成画面 ⑹使用账号:admin,用默认密码:zabbix 登录 ⑺登录后画面如下 至此 ZABBIX的基础安装完成。 ④此时你看到的是英文页面,我们现在让其显示简体中文页面 ⑴由于在安装数据库时已经将zabbix库设置了utf-8字符 首先确定zabbix开启了中文支持功能: 说明:登录到zabbix服务器的数据目录下(前面部署的zabbix数据目录是/usr/local/nginx1.10/html/zabbix/),打开locales.inc.php文件。 我们可以从第55行看到,zabbix是支持简体中文的。 ⑵登陆zabbix后,点击右上角的“用户”图标,将语言设置为“中文” ⑤解决zabbix绘图中出现中文乱码问题 ⑴从windows下控制面板->字体->选择一种中文字库。 例如“楷体” ⑵把它拷贝到zabbix的web端的fonts目录下 ⑶把原有的字体文件DejaVuSans.ttf移动到别处 注意:如果你的simkai文件的后缀TTF是大写字母,一定要改成小写字母ttf。 ⑷接着修改代码include/defines.inc.php文件中的字体配置,将里面关于字体设置从DejaVuSans替换成simkai 这样,修改后,zabbix监控图形中的中文字就不会出现乱码了。 四、zabbix客户端的安装 说明:既然要监控,我们就要添加要监控的主机,在添加主机之前我们首先要在被检测主机上面安装agent,安装agent比较简单,我们也是按照安装server的流程,下载软件包,在编译的时候,我们只选择agent即可。 192.168.1.9作为zabbix的被监控端,它提供web和mysql应用服务。 1)安装zabbix,配置zabbix agent ①安装zabbix agent ②配置开机自动启动 ③修改zabbix开机启动脚本中的zabbix安装目录 编辑客户端配置文件: ④重载systemctl ⑤编辑zabbix_agentd.conf文件 注明:其中Server和ServerActive都指定zabbixserver的IP地址,不同的是,前者是被动后者是主动。也就是说Server这个配置是用来允许192.168.1.8这个ip来我这取数据。而serverActive的192.168.1.8的意思是,客户端主动提交数据给他。 Hostname=XXX,这个定义的名字必须和web页面里面host的名字一样。 ⑥启动zabbix_agentd ⑦防火墙开启10050端口例外 到此,zabbix3.2.1监控系统的基本环境安装完成。 2)实现zabbix添加监测项,添加对Linux主机的监控 说明:先在“配置”-“主机”里添加主机监控,监控os资源:内存,cpu,io,负载,带宽等. ①登录zabbix,先在“配置”-“主机”里单击”创建主机”: ②在“主机”标签,填写相关信息 其它选项默认即可。 ③在“模板”标签,填写相关信息 至此,Zabbix监控Linux主机设置完成,如下图所示: ④过一段时间后,可以来观察监控图效果出来了没有 3)添加对Linux主机的mysql的监控 说明:zabbix3.0 server已自带mysql的模板了,只需配置好agent客户端,然后在web端给主机增加模板就行了。 ①首先在客户端的mysql里添加权限,即本机使用zabbix账号连接本地的mysql(在zabbix_agent客户端上操作) ②在zabbix_agent服务目录下创建.my.cnf 连接文件(注意有个“.”) 说明:zabbix安装目录是/usr/local/zabbix 注意: ⑴如果在数据库grant授权时,针对的是localhost,这个.my.cnf里面就不用加host参数了【就如上面的配置】 ⑵如果grant授权时针对的是本机的ip(如192.168.1.9),那么在.my.cnf文件里就要加上host参数进行指定了 即在.my.cnf文件就要加上: host=192.168.1.9 socket=/usr/local/mysql/mysql.sock user=zabbix password=123456 ③配置mysql的key文件 说明:这个可以从zabbix3.2安装时的解压包里拷贝过来 从zabbix_server服务端安装时解压目录/root/zabbix-3.2.1/conf/zabbix_agentd/userparameter_mysql.conf 拷贝到zabbix_agent客户端上的/usr/local/zabbix/etc/zabbix_agentd.conf.d/ 目录下。 ④查看 userparameter_mysql.conf 文件,看到类似HOME=/var/lib/zabbix 的路径设置,把路径全都替换为/usr/local/zabbix/etc/,也就是上面的.my.cnf文件所在的目录路径。 另外,注意userparameter_mysql.conf 文件里的mysql命令路径(提前做好mysql的系统环境变量,以防mysql命令不被系统识别)。 ⑤重启zabbix_agent服务 注明:如果stop关不了服务,可以使用“pkill -9 zabbix_agent”命令强制杀死进程。 另外还可以使用“/usr/local/zabbix/sbin/zabbix_agentd”开启服务。 ⑥接着在zabbix_server服务端进行命令行测试 解决办法如下: ⑴在userparameter_mysql.conf中关于mysql命令前面添加绝对路径(在zabbix_agent上操作) ⑵修改三个地方 ⑶重启服务 再次回到zabbix_server服务端进行命令行测试: 注明1:如果出现类似这一串key的数字,就说明配置ok,服务端能监控到客户端的mysql数据了! 成功了之后在监控界面增加主机对应的MySQL模板就ok了。 注明2: zabbix_get命令介绍 参数说明: -s--host:指定客户端主机名或者IP -p--port:客户端端口,默认10050 -I--source-address:指定源IP,写上zabbix server的ip地址即可,一般留空,服务器如果有多ip的时候,你指定一个。 -k--key:你想获取的key zabbix_get获取数据: ⑴获取负载 ⑵获取主机名 ⑦登录zabbix监控界面,在“配置”-“模板”里可以看到自带的mysql监控模板 ⑧在相应主机监控配置里添加mysql的监控模版(zabbix自带的)即可: ⑨下面是mysql监控项的效果图 ⑴监控mysql的带宽:在zabbix前端可以实时查看mysql发送接收的字节数。其中bytes received表示从所有客户端接收到的字节数,bytes sent表示发送给所有客户端的字节数。 ⑵监控mysql的操作状态:在zabbix前端可以实时查看各种SQL语句每秒钟的操作次数。 五、zabbix3.2.1邮件报警设置 说明:zabbix监控服务端、客户端都已经部署完成,被监控主机已经添加,zabiix监控运行正常。 在zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱。 具体操作如下(操作在Zabbix监控服务端进行): 1)安装sendmail两个依赖包 2)解压sendmail,然后将sendemail复制到/usr/local/bin/目录下,并加上可执行权限,然后修改用户和群组 3)执行# /usr/local/bin/sendEmail -h可查看sendEmail的帮助 4)下面开始进行发邮件测试 ①先去申请一个邮箱,我这里以网易的163邮箱为例 ②登录邮箱,申请授权码 注明:这里我将我的授权码设置成了123abc ③正式开始测试 从上图我们看出,邮件没发成功,有报错。 原因是:sendemail软件和perl5里面的ssl版本不兼容导致的,通过修改sendemail里面的内容可以解决这个问题。 解决办法如下: 1906行改为如下内容: 再次进行重试测试: 我们去邮箱查看: 命令主要选项说明: /usr/local/bin/sendEmail #命令主程序 -f from@126.com #发件人邮箱 -tto@126.com #收件人邮箱 -ssmtp.126.com #发件人邮箱的smtp服务器 -u"我是邮件主题" #邮件的标题 -omessage-content-type=html #邮件内容的格式,html表示它是html格式 -omessage-charset=utf8 #邮件内容编码 -xufrom@126.com #发件人邮箱的用户名 -xp123abc #发件人邮箱密码或授权码 -m"我是邮件内容" #邮件的具体内容 5)测试成功了,我们还可以创建报警脚本,自动给我们发邮件 ①进入/usr/local/zabbix/share/zabbix/alertscripts/目录 ②创建脚本 图中内容如下: #!/bin/bash to=$1 subject=$2 body=$3 /usr/local/bin/sendEmail-o tls=auto -f dabiaoge999@126.com -t "$to" -s smtp.126.com -u"$subject" -o message-content-type=html -o message-charset=utf8 -xu dabiaoge999@126.com -xp 123abc -m "$body" ③给脚本可执行权限 ④执行脚本测试发邮件 ⑤再次去邮箱看一下 6)zabbix web端配置 ①上面的邮件脚本配置好后,就要在web端添加报警媒介,在web页面的管理,报警媒介类型页面,点击右边的创建媒体类型 ②进入创建页面,然后输入名称“邮件报警脚本”,类型选择脚本,名称选择mail.sh,点击添加按钮,添加三个脚本参数,分别是{ALERT.SENDTO},{ALERT.SUBJECT},{ALERT.MESSAGE},分别对于mail.sh中的to、subject和body。添加完成后点下面的添加按钮,我们的报警媒介就创建完成了。 ③创建好报警媒介后,就需要将报警媒介关联到我们的用户。点击管理,用户,然后选择我们的用户admin也可新建一个用户,点击用户名就进入到用户配置界面。点击报警媒介,然后点添加,选择我们上一步创建的邮件报警脚本,输入收件人,选择报警时间和类型,然后点击添加,就将创建好的报警媒介关联到我们的用户上面了。 ④现在需要做的是,创建一个触发动作,即系统出现故障时,触发这个动作,然后给我们的邮箱发送报警邮件。点击配置,选择动作,然后点击右边的创建动作。 在动作这一页名称中写入我们定义的动作名以及触发条件。 说明:步骤是1-3,也即是从1开始到3结束。一旦故障发生,就是执行Email.sh脚本发生报警邮件给zabbix用户。 假如故障持续了1个小时,它也只发送3次,第1-3次(即前3次)邮箱发送给zabbix用户,时间间隔为0秒。 如果改成1-0,0是表示不限制.无限发送 接着设置“恢复操作”: ⑤报警测试 将192.168.1.9服务器的zabbix_agent进程关闭,然后等待邮件。 最后,点击”报表“->”动作日志“,可以看到触发动作的次数(右边还看查看到邮件发送状态“已发送”)。

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

给 Java 学习者的超全教程整理

Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了。 网上有很多 Java 教程,无论是基础入门还是开发小项目的教程都比比皆是,可是系统的很少,对于Java 学习者来说找到系统、完整、可学性较强的教程其实并不是那么容易。实验楼上有很多 Java 教程,从基础入门、J2SE 开发、SSH 框架到实战项目都有,因此,这里就把这些课程总结一下,希望对 Java 学习者有所帮助~ 一、Java基础 Java 基础不必多说了,下面的5门课程就可以带你动手学习,入门Java。 Java编程语言 这个课程介绍了 Java 基本语法、Java 平台应用、 Java 的核心概念:JVM、JDK、JRE以及 java 面向对象思想。非常适合 Java 入门学习。 Java 8 新特性指南 Java 8是近年来一个Java编程语言发行版本,由Oracle 2014年3月发布。该版本为Java带来许多新特性,是一个具有重大改变的版本。 这个课程适用于Java初学者或者是具有一定编程经验的开发者,主要是学习 Java 8 的一些新特性,为自己的技能升级打补丁。如果你想学习java可以来这个群,首先是二二零,中间是一四二,最后是九零六,里面有大量的学习资料可以下载。 JDBC 入门教程 这个教程学习 JDBC 定义和架构,回顾 SQL 语法,搭建 JDBC 的环境,通过实例来深入学习 JDBC。 JDK 核心 API 这个课程学习包括 java.lang 包,java.util 包,java.io 包以及泛型的相关知识。 Java进阶之设计模式 这个课程介绍常用的设计模式以及 Java 语言的实现实例来学习 java 设计模式。通过这个课程可以学习到很多类型的设计模式,其中包括工厂模式、抽象工厂模式、单例模式、适配器模式、观察者模式、装饰者模式等等。 二、J2SE 开发 J2SE,全称为Java 2 Standard Edition。Java 2平台包括:标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本。J2SE即Java 2的标准版,主要用于桌面应用软件的开发。 下面这段话是ORACLE对于Java SE的官方描述: Java Platform, Standard Edition (Java SE) 可以让您在桌面和服务器以及目前要求较高的嵌入式环境中开发和部署 Java 应用程序。 Java 提供了当今应用程序所需要的丰富的用户界面、良好的性能、多功能性、可移植性和安全性。 J2SE与J2EE、J2ME之间的关系可以通过下图来表示: J2SE的架构 J2SE的架构如下图所示,它主要包含了UI、集成库、语言和工具基础库、其他基础库、Java虚拟机等组件。 综上所述,将J2SE压缩一点再加上一些CLDC等方面的特性就是J2ME;将其扩充一点再增加一些EJB等企业应用方面的特性就是J2EE。因此J2SE是J2EE的基础,建议从事Java的开发人员从J2SE开始学习。 以下是学习J2SE的教程: J2SE核心开发实战 这个课程主要讲解IO、Util等常用类库的使用、Swing图形化编程、多线程编程等知识点。 J2SE网络通信实践 这个课程介绍怎么使用 J2SE 常用网络通信 API 以及 Socket 编程。可以学习到网络基础知识、获取URL资源的大小、Swing图形界面编程、套接字编程。 三、Java SSH框架 SSH(Spring + Struts + Hibernate)集成框架,是应用十分广泛的一种 Java Web 应用程序开发框架。SSH 框架也体现了典型的分层结构,分层有很多好处,例如项目整体的构架更加清晰,代码也更易维护和扩展。 通常来说,SSH 整体上大致可以用下图描述: 以下是教程: Spring框架入门教程 这个课程主要是介绍 Spring 框架。 Struts框架教程 这个课程主要是介绍 Struts 框架。 Hibernate框架教程 这个课程主要是介绍 Hibernate 框架。 SSH 框架应用实例 这个课程学习 SSH(Spring + Struts + Hibernate)集成框架的应用,并用 SSH 框架开发一个简单的用户管理网站。 四、Java 实战项目 当然,我们在学习了Java各种基础知识之后,最需要做的就是学会应用,开发一些项目把所学的知识应用起来,下面的8个实战项目就是比较好的练手教程。 1、Java开发简单的计算器 这个项目一看名字就知道,开发一个常见的计算器。 2、Java实现记事本 这也是一个常见的Java项目,开发记事本。 3、Java实现电子通讯录 用Java实现电子通讯录功能。 4、Java实现简单的支付平台业务流程 这个项目编写简单的 PayPlatform 程序模拟支付平台流程,主要涉及到 Java 线程与同步。 5、自己的Java编辑器 项目使用 Eclipse 开发,配合 Java 语言完成一个 Java 编辑器。它的主要功能:1、Java代码的编辑 2、编译及运行Java程序。 6、Java实现MD5文件校验 项目使用 Java 语言编写对文件进行MD5值的校验程序。可以学习到MD5的加密逻辑以及Swing插件的安装方法和Java界面编程等知识。 7、Java和WebSocket开发网页聊天室 8、结合七牛搭建个人相册 项目基于七牛云存储的 SDK 实现个人相册服务,学习并实践 Java Web 开发基本方法及七牛云存储 Java API 接口。 最后 ,以上,就是总结的Java学习教程,无论是Java初学者,还是想找项目练手的,都可以找到合适的教程。 当然,教程是有了,剩下的就是自己多动手学习啦!

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

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

用户登录
用户注册