首页 文章 精选 留言 我的

精选列表

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

网站前端和后台性能优化7

不使用CSS表达式 (Avoid CSS Expressions) tag:css CSS表达式是一种有力的(同时也很危险的)动态设置CSS属性的方法。从IE5开始支持CSS表达式。比如,使用CSS表达式可以实现背景颜色每小时变换的效果。 background-color: expression_r( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" ); 如上所示,表达式方法采用了 Javascript的表达。CSS属性则被设为Javascript表达式的结果。其它的浏览器会忽略CSS表达式,所以对于设置专属IE的属性以便在不同浏览器间能有一致的体验是有用的。、 而CSS表达式的问题是它比大多数人期望的执行次数更频繁。表达式不仅仅在页面展现和重新设置大小的时候执行,在页面滚动,甚至用户在页面上挪动鼠标时都会执行。给CSS表达式添加一个计数器可以跟踪CSS在什么时候和怎样执行。在页面上移动鼠标可以轻易的产生一万次以上的执行。 使用一次性的表达式是减少CSS表达式的执行次数的一个方法,当表达式第一次执行时,CSS表达式会被一个确定的值代替。如果在页面生命周期中,样式属性必须动态的设定,使用事件处理替代CSS表达式是一个可选的方法。如果必须使用CSS表达式,要记得它们会执行上千次并影响页面的性能。

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

网站前端和后台性能优化6

把脚本放在最后(Put Scripts at the Bottom) tag:javascript 脚本可能会堵塞并发的下载。HTTP/1.1规范建议浏览器在每个域名下只进行两个并发下载。如果你把图片放在多个域名下,可以实现多于两个的并发下载。当脚本被下载时,即使使用不同的域名。浏览器也不会进行任何其它的下载。 有些情况下把脚本放到底部并不太容易。比如,脚本使用了document.write 来添加部分页面中的内容,就不能放到页面中更后面的位置。还可能有作用域的问题。很多情况下,还有一些变通的方法。 通常的建议是使用延迟脚本。DEFER属性表明脚本不包含document.write,而且提示浏览器继续展现。不幸的是,Firefox不支持DEFER属性。IE中,脚本可以被延迟,但并不如你期望的那么久。如果一个脚本可以被延迟,那么它也可以被放在页面的底部。这会让你的页面加载的更快。

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

网站前端和后台性能优化2

使用内容分布式网络 (Use a Content Delivery Network) tag:server 用户连接你的网站服务器的速度影响响应的快慢。把你的网站布置在多台分布于不同地域的服务器上,会让用户觉得你的页面加载速度更快。那么我们应该从哪里开始呢? 不要一开始就把重新设计你的网站使其能够适应分布式结构作为实现网站地域分布的第一步。根据你的网站的复杂程度不同,更新网站结构的过程也许会包含诸如同步会话状态、在服务器间复制数据库等一系列复杂的步骤。这样你提高用户访问速度的目的反而会被更新网站架构的工作耽误。 记住,用户80-90%的访问时间被花费在下载页面中的图片、样式表、脚本、Flash这些组件上。这是网站展示的黄金法则。那么与其重新设计网站的结构,不如先实现这些静态组件的分布。这不仅仅可以大幅减少响应时间,而且由于内容分布式网络(content delivery networks)的存在,这将是个很简单的工作。 内容分布式网络(CDN)是一系列分布在不同地域的服务器的集合,能够更有效的给用户发送信息。它会根据一种衡量网域距离的方法,选取为某个用户发送数据的服务器。比如,到达用户最少跳或者最快相应速度的服务器会被选中。 一些大型Internet公司拥有他们自己的CDN,但使用公用的CDN服务提供商更为划算,比如 Akamai Technologies, Mirror Image Internet, 或者Limelight Networks。对于刚起步的公司和个人网站来说,CDN服务的花费也许会偏高。但当你的目标用户越来越多而且趋于国际化,用CDN来降低响应时间就很必要了。在Yahoo!,把静态的内容从自己的网络服务器移到CDN提高了用户20%甚至更多的访问速度。转向CDN会是一个只需要相对简单的代码更新的工作,而且那将会显著的提高你的网站访问速度。

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

Spark提交参数说明和常见优化

打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处: http://blog.csdn.net/gamer_gyt 博主微博: http://weibo.com/234654758 Github: https://github.com/thinkgamer 最近在搞一个价格分类模型,虽说是分类,用的是kmeans算法,求出聚类中心,对每个价格进行级别定级。虽然说起来简单,但做起来却是并没有那么容易,不只是因为数据量大,在执行任务时要不是效率问题就是shuffle报错等。但在这整个过程中对scala编程,Spark rdd 机制,以及海量数据背景下对算法的认知都有很大的提升,这一篇文章主要是总结一些Spark在shell 终端提交jar包任务的时候的相关知识,在后续文章会具体涉及到相关的”实战经历“。 对Spark的认识 由于之前接触过Hadoop,对Spark也是了解一些皮毛,但中间隔了好久才重新使用spark,期间也产生过一些错误的认识。 之前觉得MapReduce耗费时间,写一个同等效果的Spark程序很快就能执行完,很长一段时间自己都是在本地的单机环境进行测试学习,所以这种错误的认知就会更加深刻,但事实却并非如此,MR之所以慢是因为每一次操作数据都写在了磁盘上,大量的IO造成了时间和资源的浪费,但是Spark是基于内存的计算引擎,相比MR,减少的是大量的IO,但并不是说给一个Spark程序足够的资源,就可以为所欲为了,在提交一个spark程序时,不仅要考虑所在资源队列的总体情况,还要考虑代码本身的高效性,要尽量避免大量的shuffle操作和action操作,尽量使用同一个rdd。 会用spark,会调api和能用好spark是两回事,在进行开发的过程中,不仅要了解运行原理,还要了解业务,将合适的方法和业务场景合适的结合在一起,才能发挥最大的价值。 spark-submit 进入spark的home目录,执行以下命令查看帮助 bin/spark-submit --help spark提交任务常见的两种模式 1:local/local[K] 本地使用一个worker线程运行spark程序 本地使用K个worker线程运行spark程序 此种模式下适合小批量数据在本地调试代码 2:yarn-client/yarn-cluster yarn-client:以client方式连接到YARN集群,集群的定位由环境变量HADOOP_CONF_DIR定义,该方式driver在client运行。 yarn-cluster:以cluster方式连接到YARN集群,集群的定位由环境变量HADOOP_CONF_DIR定义,该方式driver也在集群中运行。 注意:若使用的是本地文件需要在file路径前加:file:// 在提交任务时的几个重要参数 executor-cores —— 每个executor使用的内核数,默认为1 num-executors —— 启动executors的数量,默认为2 executor-memory —— executor内存大小,默认1G driver-cores —— driver使用内核数,默认为1 driver-memory —— driver内存大小,默认512M 下边给一个提交任务的样式 spark-submit \ --master local[5] \ --driver-cores 2 \ --driver-memory 8g \ --executor-cores 4 \ --num-executors 10 \ --executor-memory 8g \ --class PackageName.ClassName XXXX.jar \ --name "Spark Job Name" \ InputPath \ OutputPath 如果这里通过--queue 指定了队列,那么可以免去写--master 以上就是通过spark-submit来提交一个任务 几个参数的常规设置 executor_cores*num_executors 表示的是能够并行执行Task的数目 不宜太小或太大!一般不超过总队列 cores 的 25%,比如队列总 cores 400,最大不要超过100,最小不建议低于 40,除非日志量很小。 executor_cores 不宜为1!否则 work 进程中线程数过少,一般 2~4 为宜。 executor_memory 一般 6~10g 为宜,最大不超过20G,否则会导致GC代价过高,或资源浪费严重。 driver-memory driver 不做任何计算和存储,只是下发任务与yarn资源管理器和task交互,除非你是 spark-shell,否则一般 1-2g 增加每个executor的内存量,增加了内存量以后,对性能的提升,有三点: 1、如果需要对RDD进行cache,那么更多的内存,就可以缓存更多的数据,将更少的数据写入磁盘, 甚至不写入磁盘。减少了磁盘IO。 2、对于shuffle操作,reduce端,会需要内存来存放拉取的数据并进行聚合。如果内存不够,也会写入磁盘。如果给executor分配更多内存以后,就有更少的数据,需要写入磁盘,甚至不需要写入磁盘。减少了磁盘IO,提升了性能。 3、对于task的执行,可能会创建很多对象。如果内存比较小,可能会频繁导致JVM堆内存满了,然后频繁GC,垃圾回收,minor GC和full GC。(速度很慢)。内存加大以后,带来更少的GC,垃圾回收,避免了速度变慢,性能提升。 常规注意事项 预处理数据,丢掉一些不必要的数据 增加Task的数量 过滤掉一些容易导致发生倾斜的key 避免创建重复的RDD 尽可能复用一个RDD 对多次使用的RDD进行持久化 尽量避免使用shuffle算子 在要使用groupByKey算子的时候,尽量用reduceByKey或者aggregateByKey算子替代.因为调用groupByKey时候,按照相同的key进行分组,形成RDD[key,Iterable[value]]的形式,此时所有的键值对都将被重新洗牌,移动,对网络数据传输造成理论上的最大影响. 使用高性能的算子 参考: 1:http://www.cnblogs.com/haozhengfei/p/e570f24c43fa15f23ebb97929a1b7fe6.html 2:https://www.jianshu.com/p/4c584a3bac7d

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

AliOS Things全链路优化-CoAP FOTA

FOTA(Firmware Over-The-Air)即空中固件升级功能;CoAP(Constrained Application Protocol),字面意思为受限的应用协议,基于UDP,专为资源有限的物联网设备量身定制;所以AliOS Things的纯CoAP FOTA就是专为资源有限的物联网设备(如基于NB-IoT,LoRa)提供的远程固件升级功能。 1.AliOS Things1.1.2 FOTA简介 我们先看一下当前版本(AliOS Thing1.1.2)的FOTA结构图: 简要介绍: 信息交互通道:指与特定的云平台交互更新信息如版本上报、查询,下载链接获取,进度上报等控制或通知类信息; 下载通道:通过1中获取的下载链接下载指定固件; FOTA service:fota主服务; 版本管理:维护升级前后的固件版本; Sec

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

EnterpriseDB剑指Hadoop:优化数据处理

世界上领先的供应商EnterpriseDB正式发布了Hadoop的Postgres Plus(R) Connector。作为PostgreSQL衍生版本的EnterpriseDB却异军突起,近期频繁的市场动作无疑让人眼前一亮。 开源数据库:EnterpriseDB异军突起 EnterpriseDB是一家基于开源数据库PostgreSQL,提供增值服务的开源服务供应商。目前,MySQL、PostgreSQL、EnterpriseDB是全球三大开源数据库,而PostgreSQL是目前最为流行的开源数据库之一。与MySQL侧重在个人和轻量型数据库应用不同,PostgreSQL是一种面向企业级的数据库产品。EnterpriseDB所做的工作就是在PostgreSQL的基础上,集成各种组件和实用的工具,从而为PostgreSQL增加了一些高级特性,以满足各种高级需求。 EnterpriseDB有三种产品,分别是基础版、标准版和企业版。其增值主要体现在后两个版本上。标准版中提供了客户端连接驱动、连接池、地理信息支持、自动软件更新; 企业版直接支持Oracle数据库的数据类型、SQL语法、PL/SQL、触发器、序列、自定义包等。针对Oracle设计的应用几乎不需修改即可在EnterpriseDB上快速运行,并且提供一键式迁移工具EnterpriseDB Migration Studio来简化数据库迁移过程,并生成完整的迁移报告,使之更适合高性能、高数据量、企业级功能数据库的核心应用。 EnterpriseDB的产品另一个非常重要的特点是与Oracle数据库的兼容。事实上,保持与Oracle数据库的兼容性、让用户可以一键式地实现从Oracle数据库向EnterpriseDB的数据库迁移,已经成了 EnterpriseDB的一个非常重要的市场战略,而究其根源可能是想撬动Oracle帝国的根基,很显然,它把目标瞄准了Oracle数据库的潜在客户。 EnterpriseDB发布Postgres Plus(R) Connector: 剑指Hadoop EnterpriseDB发布了基于Hadoop的Postgres Plus(R) Connector。该连接器允许访问Postgres Plus(R) Advanced Server (PPAS)以及PostgreSQL数据库中的大量数据,并支持在Hadoop集群上大量处理和分析数据。Hadoop的Postgres Plus(R) Connector允许程序员使用它们熟悉的MapReduce框架来处理基于SQL的批量数据。 ▲ Hadoop是一个开源分布式的处理框架,集成了大量重要的应用程序,包括分布式文本搜索、web访问日志统计等等。Hadoop主要由三部分组成:HDFS(Hadoop Distributed File System),MapReduce与Hbase。 本文转自 taojin1240 51CTO博客,原文链接:http://blog.51cto.com/taotao1240/713485,如需转载请自行联系原作者

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

ios14--购物车优化2

// // ViewController.m // 03-综合练习 // // Created by xiaomage on 15/12/28. // Copyright © 2015年 小码哥. All rights reserved. // #import "ViewController.h" @interface ViewController () // 购物车 @property (weak, nonatomic) IBOutlet UIView *shopCarView; // 添加按钮 @property (weak, nonatomic) IBOutlet UIButton *addButton; // 删除按钮 @property (weak, nonatomic) IBOutlet UIButton *removeButton; /** 数据数组 */ @property (nonatomic, strong) NSArray *dataArr; @end @implementation ViewController /** * 懒加载 1.作用: 1>用到的时候再加载 2>全局只会被加载一次 3>全局都可以使用 过程: 1.重写成员变量的get方法 2.在get方法中判断: 1>如果为空,加载数据 2>如果不为空,就直接返回数据 */ - (NSArray *)dataArr{ if (_dataArr == nil) { // 加载数据 self.dataArr = @[ @{@"name":@"单肩包", @"icon":@"danjianbao"}, @{@"name":@"钱包", @"icon":@"qianbao"}, @{@"name":@"链条包", @"icon":@"liantiaobao"}, @{@"name":@"手提包", @"icon":@"shoutibao"}, @{@"name":@"双肩包", @"icon":@"shuangjianbao"}, @{@"name":@"斜挎包", @"icon":@"xiekuabao"} ]; } return _dataArr; } // 初始化数据 - (void)viewDidLoad { [super viewDidLoad]; // NSArray<NSDictionary *> *dataArr = @[ // @{@"name":@"单肩包", @"icon":@"danjianbao"}, // @{@"name":@"钱包", @"icon":@"qianbao"}, // @{@"name":@"链条包", @"icon":@"liantiaobao"}, // @{@"name":@"手提包", @"icon":@"shoutibao"}, // @{@"name":@"双肩包", @"icon":@"shuangjianbao"}, // @{@"name":@"斜挎包", @"icon":@"xiekuabao"} // ]; // self.dataArr = dataArr; } /** * 添加到购物车 * * @param button 按钮 */ - (IBAction)add:(UIButton *)button { /***********************1.定义一些常量*****************************/ // 1.总列数 NSInteger allCols = 3; // 2.商品的宽度 和 高度 CGFloat width = 80; CGFloat height = 100; // 3.求出水平间距 和 垂直间距 CGFloat hMargin = (self.shopCarView.frame.size.width - allCols * width) / (allCols -1); CGFloat vMargin = (self.shopCarView.frame.size.height - 2 * height) / 1; // 4. 设置索引 NSInteger index = self.shopCarView.subviews.count; // 5.求出x值 CGFloat x = (hMargin + width) * (index % allCols); CGFloat y = (vMargin + height) * (index / allCols); /***********************2.创建一个商品*****************************/ // 1.创建商品的view UIView *shopView = [[UIView alloc] init]; // 2.设置frame shopView.frame = CGRectMake(x, y, width, height); // 3.设置背景颜色 shopView.backgroundColor = [UIColor greenColor]; // 4.添加到购物车 [self.shopCarView addSubview:shopView]; // 5.创建商品的UIImageView对象 UIImageView *iconView = [[UIImageView alloc] init]; iconView.frame = CGRectMake(0, 0, width, width); iconView.backgroundColor = [UIColor blueColor]; [shopView addSubview:iconView]; // 6.创建商品标题对象 UILabel *titleLabel = [[UILabel alloc] init]; titleLabel.frame = CGRectMake(0, width, width, height - width); titleLabel.backgroundColor = [UIColor yellowColor]; titleLabel.textAlignment = NSTextAlignmentCenter; // 居中 [shopView addSubview:titleLabel]; /***********************3.设置数据*****************************/ // 方式四 (数组 + 字典) /* NSArray<NSDictionary *> *dataArr = @[ @{@"name":@"单肩包", @"icon":@"danjianbao"}, @{@"name":@"钱包", @"icon":@"qianbao"}, @{@"name":@"链条包", @"icon":@"liantiaobao"}, @{@"name":@"手提包", @"icon":@"shoutibao"}, @{@"name":@"双肩包", @"icon":@"shuangjianbao"}, @{@"name":@"斜挎包", @"icon":@"xiekuabao"} ]; */ // 懒加载 /* if (self.dataArr == nil) { self.dataArr = @[ @{@"name":@"单肩包", @"icon":@"danjianbao"}, @{@"name":@"钱包", @"icon":@"qianbao"}, @{@"name":@"链条包", @"icon":@"liantiaobao"}, @{@"name":@"手提包", @"icon":@"shoutibao"}, @{@"name":@"双肩包", @"icon":@"shuangjianbao"}, @{@"name":@"斜挎包", @"icon":@"xiekuabao"} ]; } */ // 设置数据 NSDictionary *dict = self.dataArr[index];//调用get方法 iconView.image = [UIImage imageNamed:dict[@"icon"]]; titleLabel.text = dict[@"name"]; /***********************4.设置按钮的状态*****************************/ button.enabled = (index != 5); // 5.设置删除按钮的状态 self.removeButton.enabled = YES; } /** * 从购物车中删除 * * @param button 按钮 */ - (IBAction)remove:(UIButton *)button { // 1. 删除最后一个商品 UIView *lastShopView = [self.shopCarView.subviews lastObject]; [lastShopView removeFromSuperview]; // 3. 设置添加按钮的状态 self.addButton.enabled = YES; // 4. 设置删除按钮的状态 /* if (self.shopCarView.subviews.count == 0) { self.removeButton.enabled = NO; } */ self.removeButton.enabled = (self.shopCarView.subviews.count != 0); } @end 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7449679.html,如需转载请自行联系原作者

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

Androidi性能优化之多线程和同步

线程: 创建线程的方法: a:定义Thread类的实例,并start(); b:实现Runnable接口,并作为参数传给Thread类的实例,然后start(); 不管线程是通过什么方式创建的,它都有一个优先级,调度器根据优先级来决定调度执行哪个线程,即让哪个线程使用CPU,调用Thread.setPriority()可以改变线程的优先级。thread.setPriority(Thread.MAX_PRIORITY); //最高优先级(比UI线程高) 如果未指定优先级,会使用默认值,Thread类定义了三个变量: a:MIN_PRIORITY(1) b:NORM_PRIORITY(5) -----默认优先级 C:MAX_PRIORITY(10) 如果应用设置的线程优先级超出取值范围,也就是说,小于1或大于10,那么会抛出Illegal ArgumentException异常 另一中设置线程优先级的方式是基于Linux优先级,主要参考的是android.os包里的Process.setThreadPriority API。 注意:应该避免混用Thread.setPriority和Process.setThreadPriority,这会使代码一团糟。注意,Linux的优先级从-20(最高)到19(最低),而线程的优先级从1(最低)到10(最高)。 在Android中创建线程并在后台执行非常简单,但更新用户界面比较麻烦:因为view的方法只能在UI线程中调用,所以必须把结果反馈给主线程处理。 AsyncTask: 很多情况下,应用处理顺序如下: a:在UI线程收到事件 b:在非UI线程中处理相应事件 c:UI根据处理结果进行刷新 为了简化这个模式,Android 1.5及以上版本定义了AsyncTask类,AsyncTask类可以让应用执行后台操作,并通知UI线程操作结果。为简单起见,对用户隐藏了Thread、Runable以及其他相关对象。 实际上,doInBackground()调用时机取决于Android版本,Android 1.6之前,任务是串行执行,只需要一个后来线程。从Android 1.6开始,线程池取代了单个的后台线程,线程池允许并行执行多个任务,以提升性能。然而,并行执行多个任务,如果没有正确的同步或者任务执行顺序不符合开发者的预期,那很可能导致严重的问题。因此,Android团队计划在Honeycomb之后恢复到默认情况下只有一个后台线程的模式。 Handler和 Looper 多线程应用程序通信的基石:Handler 、Looper 数据类型: 我们知道两种产生线程的方法,使用Thread和AsyncTask类,如果两个或多个线程访问相同的数据,就需要确保数据类型支持并发访问。 同步(Synchronized)、易变(volatile)、内存模型 如果想在多个线程之间共享对象,但没有实现任何细粒度的锁机制,可以用Synchronized关键字确保数据访问的线性安全。 Java的内存模型:一个线程中变量的修改可能不会立即对其他线程可见。事实上,也许永远不可见。 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/3649519.html如需转载请自行联系原作者 demoblog

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

手机影音最终,软件退出功能的优化

现在软件到了主页面,点一次返回键后,就退出了,如果用户不小心点到了,就退出,比较不友好,那么就要在这里做一下判读,当用户2秒内再点击返回键后,就退出。 在MainActivity里,重写onKeyDown();方法。 定义一个boolean isExit=false; //判断是否退出操作 第一次接收到返回键监听时,将isExit设置为true,然后弹出toast,提示用户2秒内再按就退出。 然后延迟2秒发一个handler,在handler里将isExit=false;表示2秒内没按返回键,那么就需要再在2秒内点2次返回键才能退出 代码如下: 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 boolean isExit; //是否退出 /** *实现2秒内按返回键,才退出的功能 *@paramkeyCode *@paramevent *@return */ @Override public boolean onKeyDown( int keyCode,KeyEventevent){ if (keyCode==KeyEvent.KEYCODE_BACK){ if (position!= 0 ){ //不是首页 position= 0 ; rg_bottom_tag.check(R.id.rb_video); return true ; } else if (!isExit){ isExit= true ; Toast.makeText(MainActivity. this , "2秒内再按一次退出" ,Toast.LENGTH_SHORT).show(); new Handler().postDelayed( new Runnable(){ @Override public void run(){ isExit= false ; } }, 2000 ); return true ; } } return super .onKeyDown(keyCode,event); } 由于视频只有讲到这里,这个项目就暂时到这里为止。如果后期能找到后面的视频,会把这个APP的后面功能加上去。 纪念我的第一个比较正式的Android项目,虽然没有完全做完功能,但是也是比较完善了。后面几天会总结下这个项目,然后继续努力学习。 作为一个从java转Android的人,我会继续努力去学习Android,积累技术实力。 技术改变命运!!! 2017年8月1日0:01分 于临海市 浙江省临海监狱招待所完成。 本文转自老婆的宝宝51CTO博客,原文链接:http://blog.51cto.com/cm0425/1952532,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

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

Sublime Text

Sublime Text

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

用户登录
用户注册