首页 文章 精选 留言 我的

精选列表

搜索[官方镜像],共10000篇文章
优秀的个人博客,低调大师

阿里云官方价格分享:云服务器ECS最低配置及最新价格分享(当前所有活动)

本文整理了阿里云目前长期优惠活动中所推云服务器的最低价格及配置,通过本文您可以知道阿里云目前长期优惠所推的最低的云服务器多少钱,适合新手用户参考选择,如果您想以最低的价格购买阿里云服务器,那么通过阿里云目前正在进行中的长期优惠活动去购买是很划算的,阿里云对于新用户给的优惠折扣都是很大的。 说明:以下仅展示的是阿里云目前主要长期优惠活动中所推的最低云服务器配置和价格,每个活动都推出了很多更高的云服务器配置,具体配置及优惠价格请登录活动详情页查看。 长期优惠活动一:Hi拼团活动最低价格:99元/1年配置:1.突发性能T6实例2.CPU内存配置:2核1G3.带宽:1M带宽4.云盘:40G高效云盘活动主要亮点:用户可以选择直接购买享受活动特价,也可以自己开团然后邀请他人一起购买享受更低的的优惠价格。 长期优惠活动二:主机爆款特惠活动最低价格:313.2元/1年配置:1.突发性能5实例2.CPU内存配置:1核1G3.带宽:1M带宽4.云盘:40G 高效云盘活动主要亮点:①,所推云服务器配置众多,均属爆款,基本上能满足绝大部分用户的上云服务器配置需求。②,带宽1-10M任选,选择更加自由。③,活动同时推出云虚拟主机,海外云服务器,数据库等产品特惠,满足不同层次用户的需求。 长期优惠活动三:高性能云服务器特惠最低价格:1282.2元/1年配置:1.计算型C5实例2.CPU内存配置:2核4G3.带宽:1M带宽4.云盘:40G 高效云盘活动主要亮点:阿里云专为企业用户而制定的专属特惠活动,活动推出的云服务器实例规格为计算型、网络增强型实例,是企业用户购买比较多的实例。 长期优惠活动四:阿里云云小站最低价格:366元/1年配置:1.突发性能T5实例2.CPU内存配置:1核1G3.带宽:1M带宽4.云盘:40G 高效云盘活动主要亮点:本活动最大亮点在于购买3年的优惠价格跟购买2年的优惠价格一样,适合于需要一次购买3年的用户。 以上就是阿里云目前主要的长期优惠活动及所推的云服务器最低配置及价格,对于新手用户来说,我们不妨每个活动都看看,参考活动所推云服务器的适合场景,多比较下然后选择最适合自己的活动去购买阿里云服务器,既达到满足需求的同时,又最大限度的节约我们的上云成本。例如我们需要购买最低配置的1核1G,2核1G之类的低配云服务器,通过比较我们发现Hi拼团优惠活动是最划算的,而我们如果需要一次购买3年的话,全民云计算是最划算的,如果我们需要带宽上面更加灵活,主机爆款特惠则是比较划算的,如果我们是企业用户可以重点考虑企业高性能特惠活动所推出的云服务器配置。

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

Android官方开发文档Training系列课程中文版:Activity测试之创建功能性测试

原文地址:http://android.xsoftlab.net/training/activity-testing/activity-functional-testing.html 功能性测试包括模拟用户操作之类的组件验证。例如开发者可以通过功能性测试来验证在用户执行了UI操作之后Activity是否启动了Activity。 如要为Activity创建功能性测试,测试类应当继承ActivityInstrumentationTestCase2。与ActivityUnitTestCase不同,ActivityInstrumentationTestCase2既可以与Android系统通信,又能使程序可以接收键盘输入事件与屏幕点击事件。 验证功能行为 一般功能性测试可能会有以下测试目的: 验证在某个UI控制器被按下后,目标Activity是否被启动。 验证目标Activity是否将在启动之前的用户输入数据正确显示。 开发者所实现的代码可能如下: @MediumTest public void testSendMessageToReceiverActivity() { final Button sendToReceiverButton = (Button) mSenderActivity.findViewById(R.id.send_message_button); final EditText senderMessageEditText = (EditText) mSenderActivity.findViewById(R.id.message_input_edit_text); // Set up an ActivityMonitor ... // Send string input value ... // Validate that ReceiverActivity is started ... // Validate that ReceiverActivity has the correct data ... // Remove the ActivityMonitor ... } 测试框架会等待ReceiverActivity启动,否则的话将会在超时后返回null。如果ReceiverActivity启动,那么ActivityMonitor则会收到一个命中。开发者可以通过断言方法来验证ReceiverActivity是否被启动,命中数是否会如所期望的那样有所增长。 设置ActivityMonitor 如果需要监视Activity,可以注册ActivityMonitor。当目标Activity启动时,系统会通知ActivityMonitor一个事件。如果目标Activity启动,那么ActivityMonitor的计数器则会更新。 一般使用ActivityMonitor应当执行以下步骤: 1.通过getInstrumentation()方法获得用于测试的Instrumentation实例。 2.通过Instrumentation的addMonitor()重载方法将Instrumentation.ActivityMonitor的实例添加到当前的instrumentation中,具体的匹配规则可由IntentFilter或者类名指定。 3.等待被监视的Activity启动。 4.验证监视器的数字增长。 5.移除监视器。 例如: // Set up an ActivityMonitor ActivityMonitor receiverActivityMonitor = getInstrumentation().addMonitor(ReceiverActivity.class.getName(), null, false); // Validate that ReceiverActivity is started TouchUtils.clickView(this, sendToReceiverButton); ReceiverActivity receiverActivity = (ReceiverActivity) receiverActivityMonitor.waitForActivityWithTimeout(TIMEOUT_IN_MS); assertNotNull("ReceiverActivity is null", receiverActivity); assertEquals("Monitor for ReceiverActivity has not been called", 1, receiverActivityMonitor.getHits()); assertEquals("Activity is of wrong type", ReceiverActivity.class, receiverActivity.getClass()); // Remove the ActivityMonitor getInstrumentation().removeMonitor(receiverActivityMonitor); 使用Instrumentation发送键盘事件 如果Activity含有EditText,可能需要测试用户是否可以对其输入数据。 一般来说,要发送字符串到EditText,应当: 1.在runOnMainSync()方法中运行requestFocus()同步方法,这样会使UI线程一直等待接收焦点。 2.调用waitForIdleSync()方法使主线程变为空闲状态。 3.通过sendStringSync()方法发送一条字符串给EditText。 例如: // Send string input value getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { senderMessageEditText.requestFocus(); } }); getInstrumentation().waitForIdleSync(); getInstrumentation().sendStringSync("Hello Android!"); getInstrumentation().waitForIdleSync();

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

Android官方开发文档Training系列课程中文版:后台加载数据之处理CursorLoader的查询结果

原文地址:http://android.xsoftlab.net/training/load-data-background/handle-results.html 就像上节课所说的,我们应该在onCreateLoader()内使用CursorLoader来加载数据。那么在数据加载完毕之后,加载结果会通过LoaderCallbacks.onLoadFinished()方法传回到实现类中。该方法的其中一个参数为包含查询结果的Cursor对象。你可以通过这个对象来更新UI数据或者用它来做进一步的操作。 除了onCreateLoader()及onLoadFinished()这两个方法之外,还应当实现onLoaderReset()方法。这个方法会在上面返回的Cursor对象所关联的数据发生变化时调用。如果数据发生了变化,那么Android框架会重新进行查询。 处理查询结果 为了显示Cursor对象中的数据,这里需要实现AdapterView的相关方法以及CursorAdapter的相关方法。系统会自动的将Cursor中的数据转换到View上。 你可以在展示数据之前将数据与Adapter对象进行关联,这样的话系统才会自动的更新View: public String[] mFromColumns = { DataProviderContract.IMAGE_PICTURENAME_COLUMN }; public int[] mToFields = { R.id.PictureName }; // Gets a handle to a List View ListView mListView = (ListView) findViewById(R.id.dataList); /* * Defines a SimpleCursorAdapter for the ListView * */ SimpleCursorAdapter mAdapter = new SimpleCursorAdapter( this, // Current context R.layout.list_item, // Layout for a single row null, // No Cursor yet mFromColumns, // Cursor columns to use mToFields, // Layout fields to use 0 // No flags ); // Sets the adapter for the view mListView.setAdapter(mAdapter); ... /* * Defines the callback that CursorLoader calls * when it's finished its query */ @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { ... /* * Moves the query results into the adapter, causing the * ListView fronting this adapter to re-display */ mAdapter.changeCursor(cursor); } 移除旧的Cursor引用 CursorLoader会在Cursor处于无效状态时对其进行重置。这种事件会经常发生,因为Cursor所关联的数据会经常发生变化。在重新查询之前,系统会调用所实现的onLoaderReset()方法。在该方法内,应将当前Cursor的所持有的引用置空,以防止内存泄露。一旦onLoaderReset()方法执行完毕,CursorLoader就会重新进行查询。 /* * Invoked when the CursorLoader is being reset. For example, this is * called if the data in the provider changes and the Cursor becomes stale. */ @Override public void onLoaderReset(Loader<Cursor> loader) { /* * Clears out the adapter's reference to the Cursor. * This prevents memory leaks. */ mAdapter.changeCursor(null); }

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

Android官方开发文档Training系列课程中文版:键盘输入处理之指定输入的类型

原文地址:http://android.xsoftlab.net/training/keyboard-input/index.html 引言 在文本框接收到焦点时,Android系统会在屏幕上显示一个软键盘。为了提供良好的用户体验,你可以指定相关输入类型的特性,以及输入法应当如何展现。 除了屏幕上的软键盘之外,Android还支持实体键盘,所以APP如何与各种类型的键盘交互这件事情,就变得很重要了。 指定输入的类型 每一个文本框必定只有一种输入类型,比如一个电子邮件地址,一个电话号码或者是常规文本。所以为每一个文本框指定输入类型就变得很重要,这样的话系统才会显示正确的输入法。 你可以指定比如输入方法所提供的拼写建议、首字母大写、以及输入法右下角按钮的行为(Done或者Next)。这节课主要介绍如何指定这些特性。 指定键盘类型 你应该总是为文本框声明输入类型,通过android:inputType属性可以为文本框添加输入类型。 比如,如果你希望文本框的输入类型为电话号码,可以使用”phone”: <EditText android:id="@+id/phone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/phone_hint" android:inputType="phone" /> 或者如果文本框主要是用于输入密码的,可以使用”textPassword”隐藏用户的输入文本: <EditText android:id="@+id/password" android:hint="@string/password_hint" android:inputType="textPassword" ... /> android:inputType含有多种指定的输入类型,并且一些值可以组合使用。 开启拼写检查与其它功能 android:inputType属性允许你可以为输入类型指定多种行为。更重要的一点是,如果文本框的重点在基础文本输入上(如文本消息),你应当使用”textAutoCorrect”开启拼写检查。 你还可以为android:inputType属性指定多种不同的行为以及输入类型。比如,下面的例子就展示了如何同时开启首字母大写以及拼写检查的功能: <EditText android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType= "textCapSentences|textAutoCorrect" ... /> 指定输入法按钮的行为 大多数的输入法都在右下角提供了一个用户功能按钮,这对于当前的文本框来说是极为恰当的。在默认情况下,系统使用这个按钮来实现Next或者Done功能。除非你的文本框允许多行情况的出现(比如使用了android:inputType=”textMultiLine”)。在这种情况下,该功能按钮是一个回车按钮。然而,你可以指定一些更加符合你文本框的特别功能,比如Send或Go。 为了指定键盘的功能按钮,需要使用属性android:imeOptions,并需要执行比如”actionSend”或”actionSearch”之类的值: <EditText android:id="@+id/search" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/search_hint" android:inputType="text" android:imeOptions="actionSend" /> 接下来可以通过TextView.OnEditorActionListener来监听功能按钮的按下事件,并需要在该监听器内响应正确的IME功能ID,该ID定义与EditorInfo中,比如下面使用的就是IME_ACTION_SEND: EditText editText = (EditText) findViewById(R.id.search); editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { boolean handled = false; if (actionId == EditorInfo.IME_ACTION_SEND) { sendMessage(); handled = true; } return handled; } });

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

如果想从jenkins直接生成docker镜像,并推送到harbor中,最简单的脚本如何实现?

如果不考虑意外, 第一版最简单的构思如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import getopt, sys import subprocess import os site_name = app_name = dep_version = war_name = "" docker_harbor_ip = "x.x.x.x" docker_login_name = "boss" docker_login_password = "client" #参数用法 def usage(): print "./docker.py -s site -a app -d dev --war=war_name" sys.exit() #获取参数 def get_opt(): try: opts, args = getopt.getopt(sys.argv[1:], "hs:a:d:", ["help", "war="]) except getopt.GetoptError: print "getopt function has error.." usage() for o, a in opts: if o in ("-h", "--help"): usage() if o in ("-s"): site_name = a if o in ("-a"): app_name = a if o in ("-d"): dep_version = a if o in ("--war"): war_name = a return site_name, app_name, dep_version, war_name #执行shell命令 def docker_cmd(cmd): return_code = subprocess.call(cmd, shell=True) if return_code != 0: print "command === %s === error" % (cmd) usage() return return_code def main(): site_name, app_name, dep_version, war_name = get_opt() if "" in [site_name, app_name, dep_version, war_name]: print "args have empty value..." usage() docker_login = 'docker login -u %s -p %s http://%s' % (docker_login_name, docker_login_password, docker_harbor_ip ) docker_tag = 'docker build -t %s/%s/%s:%s .' % (docker_harbor_ip , site_name.lower(), app_name.lower(), dep_version) docker_push = 'docker push %s/%s/%s:%s' % (docker_harbor_ip , site_name.lower(), app_name.lower(),dep_version) for cmd in [docker_login, docker_tag, docker_push]: docker_cmd(cmd) print "docker cmd is run..." if __name__ =='__main__': main()

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册