首页 文章 精选 留言 我的

精选列表

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

HBase实操 | 使用Spark通过BulkLoad快速导入数据到HBase

HBase社区直播本期分享专家:明惠(网名:过往记忆)-阿里云数据架构师 视频地址: https://yq.aliyun.com/live/590?spm=a2c4e.11155435.0.0.460177969kCLxf PPT地址: https://yq.aliyun.com/download/3033 PS:欢迎关注HBase+Spark团队号https://yq.aliyun.com/teams/382博客,问答,直播,各类HBase资料,线下meetup都会发布到这里。 1.文档编写目的 在项目中有需求需要将Hive表中的数据存储在HBase中。使用Spark访问Hive表,将读表数据导入到HBase中,写入HBase有两种方式:一种是通过HBase的API接口批量的将数据写入HBase,另一种是通过BulkLoad的方式生成HF

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

阿里云Kubernetes容器服务 - 快速部署虚拟节点virtual-nodes

容器和Serverless的多样结合 随着容器和Serverless概念的普及,阿里云容器服务团队和弹性计算团队合作推出了多个Serverless容器产品和解决方案,包括Serverless Kubernetes、弹性容器实例ECI、virtual-nodes addon功能。这些不同的产品为用户提供了丰富的无服务器容器应用场景支持。 Serverless Kubernetes 阿里云容器服务的Serverless Kubernetes已经公测一段时间,用户无需管理服务器,同时能够正常使用kubernetes各种API操作,包括创建pod、service、ingress、job等。无服务器的最大价值不仅是免去了服务器运维的负担,更为应用提供了强大的弹性扩容能力,弹性不再受限于集群的节点规模,而且应用仅按资源使用量付费。 Kubernete

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

ELK日志系统之使用Rsyslog快速方便的收集Nginx日志

Rsyslog Rsyslog是高速的日志收集处理服务,它具有高性能、安全可靠和模块化设计的特点,能够接收来自各种来源的日志输入(例如:file,tcp,udp,uxsock等),并通过处理后将结果输出的不同的目的地(例如:mysql,mongodb,elasticsearch,kafka等),每秒处理日志量能够超过百万条。 Rsyslog作为syslog的增强升级版本已经在各linux发行版默认安装了,无需额外安装。 收集Nginx日志 ELK通过Rsyslog收集日志流程图如下: ● 处理流程为:Nginx --syslog--> Rsyslog --omkafka--> Kafka --> Logstash --> Elasticsearch --> Kibana● Nginx产生日志通过syslog系统服务传给Rsyslog服务端,Rsyslog接收到日志后通过omkafka模块将日志写入Kafka,Logstash读取Kafka队列然后写入Elasticsearch,用户通过Kibana检索Elasticsearch里存储的日志 ● Rsyslog服务系统自带无需安装,所以整个流程中客户端不需要额外安装应用 ● 服务端虽然Rsyslog也已安装,但默认没有omkafka模块,如果需要Rsyslog写入Kafka需要先安装这个模块 ● omkafka模块在rsyslog v8.7.0之后的版本才支持,所以需要先通过rsyslogd -v命令查看rsyslog版本,如果版本较低则需要升级 Rsyslog升级 1.添加rsyslog源的key # apt-key adv --recv-keys --keyserver keys.gnupg.net AEF0CF8E 2.添加rsyslog源地址 echo "deb http://debian.adiscon.com/v8-stable wheezy/" >> /etc/apt/sources.list echo "deb-src http://debian.adiscon.com/v8-stable wheezy/" >> /etc/apt/sources.list 3.升级rsyslog服务 # apt-get update && apt-get -y install rsyslog 添加omkafka模块 1.安装编译工具,下边autoreconf需要用到,不然无法生成configure文件 # apt-get -y install pkg-config autoconf automake libtool unzip 2.omkafka需要安装一堆的依赖包 # apt-get -y install libdbi-dev libmysqlclient-dev postgresql-client libpq-dev libnet-dev librdkafka-dev libgrok-dev libgrok1 libgrok-dev libpcre3-dev libtokyocabinet-dev libglib2.0-dev libmongo-client-dev libhiredis-dev # apt-get -y install libestr-dev libfastjson-dev uuid-dev liblogging-stdlog-dev libgcrypt-dev # apt-get -y install flex bison librdkafka1 librdkafka-dev librdkafka1-dbg 3.编译安装omkafka模块 # mkdir tmp && cd tmp # git init # git pull git@github.com:VertiPub/omkafka.git # autoreconf -fvi # ./configure --sbindir=/usr/sbin --libdir=/usr/lib --enable-omkafka && make && make install && cd .. Rsyslog收集nginx日志 Client端Nginx配置 log_format jsonlog '{' '"host": "$host",' '"server_addr": "$server_addr",' '"http_x_forwarded_for":"$http_x_forwarded_for",' '"remote_addr":"$remote_addr",' '"time_local":"$time_local",' '"request_method":"$request_method",' '"request_uri":"$request_uri",' '"status":$status,' '"body_bytes_sent":$body_bytes_sent,' '"http_referer":"$http_referer",' '"http_user_agent":"$http_user_agent",' '"upstream_addr":"$upstream_addr",' '"upstream_status":"$upstream_status",' '"upstream_response_time":"$upstream_response_time",' '"request_time":$request_time' '}'; access_log syslog:server=rsyslog.domain.com,facility=local7,tag=nginx_access_log,severity=info jsonlog; 1.Nginx在v1.10之后的版本才支持syslog的方式处理日志,请确保你的Nginx版本高于1.10 2.为了降低logstash的处理压力,同时也为了降低整个配置的复杂度,我们nginx的日志直接采用json格式 3.抛弃文本文件记录nginx日志,改用syslog直接将日志传输到远端的rsyslog服务器,以便我们后续的处理;这样做的另一个非常重要的好处是我们再也无需考虑nginx日志的分割和定期删除问题(一般我们为了方便管理通常会采用logrotate服务来对日志进行按天拆分和定期删除,以免磁盘被占满) 4.access_log直接输出到syslog服务,各参数解释如下: ●syslog:指明日志用syslog服务接收 ●server:接收syslog发送日志的Rsyslog服务端地址,默认使用udp协议,端口是514 ●facility:指定记录日志消息的类型,例如认证类型auth、计划任务cron、程序自定义的local0-7等,没有什么特别的含义,不必深究,默认的值是local7 ●tag:给日志添加一个tag,主要是为了方便我们在服务端区分是哪个服务或者client传来的日志,例如我们这里给了tag: nginx_access_log,如果有多个服务同时都写日志给rsyslog,且配置了不通的tag,在rsyslog服务端就可以根据这个tag找出哪些是nginx的日志 ●severity:定义日志的级别,例如debug,info,notice等,默认是error Server端Rsyslog配置 # cat /etc/rsyslog.d/rsyslog_nginx_kafka_cluster.conf module(load="imudp") input(type="imudp" port="514") # nginx access log ==> rsyslog server(local) ==> kafka module(load="omkafka") template(name="nginxLog" type="string" string="%msg%") if $inputname == "imudp" then { if ($programname == "nginx_access_log") then action(type="omkafka" template="nginxLog" broker=["10.82.9.202:9092","10.82.9.203:9092","10.82.9.204:9092"] topic="rsyslog_nginx" partitions.auto="on" confParam=[ "socket.keepalive.enable=true" ] ) } :rawmsg, contains, "nginx_access_log" ~ 1.在rsyslog.d目录下添加一个专门处理nginx日志的配置文件 2.rsyslog配置文件重要配置解释如下: ●module:加载模块,这里我们需要加载imudp模块来接收nginx服务器syslog发过来的日志数据,也需要加载omkafka模块来将日志写入到kafka ●input:开启udp协议,端口514,也可以同时开启tcp协议,两者可以共存 ●template:定义一个模板,名字叫nginxLog,模板里可以定义日志的格式,因为我们传的已经是json了,不需要再匹配格式,所以这里不额外定义,注意模板名字要唯一 ●action:在匹配到inputname为imudp且programname为nginx_access_log(就是我们上边nginx配置里边的tag)之后的处理方式,这里的配置为匹配到的日志通过omkafka模块写入kafka集群,还有一些关于omkafka更详细的配置参考上边给出的omkafka模块官方文档 ●:rawmsg, contains:最后这一行的意思是忽略包含nginx_access_log的日志,没有这一行的话rsyslog服务默认会把所有日志都记录到message里边一份,我们已经把日志输出到kafka了,本地就没必要再记录了 3.omkafka模块检查kafka里边topic是否存在,如果不存在则创建,无需手动创建kafka的topic Server端logstash配置 input { kafka { bootstrap_servers => "10.82.9.202:9092,10.82.9.203:9092,10.82.9.204:9092" topics => ["rsyslog_nginx"] } } filter { mutate { gsub => ["message", "\\x", "\\\x"] } json { source => "message" } date { match => ["time_local","dd/MMM/yyyy:HH:mm:ss Z"] target => "@timestamp" } } output { elasticsearch { hosts => ["10.82.9.205", "10.82.9.206", "10.82.9.207"] index => "rsyslog-nginx-%{+YYYY.MM.dd}" } } 重要配置参数解释如下: ● input:配置kafka的集群地址和topic名字 ● filter:一些过滤策略,因为传入kafka的时候是json格式,所以不需要额外处理,唯一需要注意的是如果日志中有中文,例如url中有中文内容时需要替换 \x,不然json格式会报错 ●output:配置ES服务器集群的地址和index,index自动按天分割 联调测试 配置完成后分别重启rsyslog服务和nginx服务,访问nginx产生日志 1.查看kafka是否有正常生成topic # bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181 __consumer_offsets rsyslog_nginx 2.查看topic是否能正常接收日志 # bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic rsyslog_nginx {"host": "domain.com","server_addr": "172.17.0.2","http_x_forwarded_for":"58.52.198.68","remote_addr":"10.120.89.84","time_local":"28/Aug/2018:14:26:00 +0800", "request_method":"GET","request_uri":"/","status":200,"body_bytes_sent":1461,"http_referer":"-","http_user_agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36","upstream_addr":"-","upstream_status":"-", "upstream_response_time":"-","request_time":0.000} 3.kibana添加index,查看Elasticsearch中是否有数据,如果前两步都正常,kibana搜不到index或index没有数据,多半是index名字写错了之类的基础问题,仔细检查 kibana查询展示 ●打开Kibana添加rsyslog-nginx-*的Index,并选择timestamp,创建Index Pattern ●进入Discover页面,可以很直观的看到各个时间点请求量的变化,根据左侧Field实现简单过滤,例如我们想查看所有访问状态为404的uri,可以点击request_uri和status后边的add,这两项的内容将出现在右侧,然后点击status下边404状态码后边的加号,则只查看状态为404的请求,点击上方auto-refresh可以设置页面自动刷新时间 ●通过各种条件的组合查询可以实现各种各样的需求,例如每秒请求、带宽占用、异常比例、慢响应、TOP IP、TOP URL等等各种情况,并且可以通过Visualize很方便的将这些信息绘制图标,生成Dashboard保存 写在最后 ●Nginx的access log绝对是网站的一个宝藏,通过日志量的变化可以知道网站的流量情况,通过对status状态的分析可以知道我们提供服务的可靠性,通过对特定活动url的追踪可以实时了解活动的火爆程度,通过对某些条件的组合查询也能为网站运营提供建议和帮助,从而使我们的网站更友好更易用 ●Rsyslog服务的单点问题可以通过部署多个Rsyslog服务过三层负载来保证高可用,不过以我们的经验来说rsyslog服务还是很稳定的,跑了一年多,每分钟日志处理量在20w左右,没有出现过宕机情况,不想这么复杂的话可以写个check rsyslog服务状态的脚本跑后台,挂了自动拉起来 ●整个过程中我们使用了UDP协议,第一是因为Nginx日志的syslog模式默认支持的就是UDP协议,翻了官网没找到支持TCP的方式,我想这也是考虑到UDP协议的性能要比TCP好的多,第二也考虑到如果使用TCP遇到网络不稳定的情况下可能会不停的重试或等待,影响到Nginx的稳定。对于因为内容过长超过以太网数据帧长度的问题暂时没有遇到 原文发布时间为:2018-08-30 本文作者:37丫37 本文来自云栖社区合作伙伴“ 运维咖啡吧”,了解相关信息可以关注“ 运维咖啡吧”。

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

快速将log4j.xml 转换为 logback.xml

应用的日志输出频率太高,log4j同步日志输出的时候锁竞争太过激烈,导致业务线程阻塞。系统load 200+,线程数2000+ 。所以想通过切换到logback 来提升日志输出的内容。 想要切换到logback要做两件事情: * 切换pom中依赖的jar包 * 将log4j.xml 转换成 logback.xml 第一件事情比较简单,但是第二件事情稍微有些麻烦,特别是碰到原本日志Appender就非常多的情况下(我们配置了超过50个Appender)一个一个手动改就很繁琐了。在网上找了很多都是从 log4j.properties 转换为 logback.xml 的,我们这边还是很少有用到log4j.properties的。 在Google 上找了好久找到了一个文章 http://rpuchkovskiy.blogspot.com/2014/11/xslt-to-convert-log4jxml-config-to.html。通过他可以把 log4j.xml 转换为 logback.xml ,不过他的实现比较老,我结合我们的使用场景稍微修改了下。 <!-- This XLST script converts log4j.xml.bak file to logback.xml file trying to mimic its behavior as close as possible @author Roman Puchkovskiy --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="log4j xalan" xmlns:log4j="http://jakarta.apache.org/log4j/" xmlns:xalan="http://xml.apache.org/xslt" xmlns:xslt="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" xalan:indent-amount="4"/> <xsl:variable name="vLower" select="'abcdefghijklmnopqrstuvwxyz'"/> <xsl:variable name="vUpper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> <xsl:template match="/log4j:configuration"> <configuration> <xsl:apply-templates select="appender"/> <xsl:apply-templates select="logger"/> <xsl:apply-templates select="root"/> <xsl:apply-templates select="comment()"/> </configuration> </xsl:template> <xsl:template match="appender"> <appender> <xsl:attribute name="name"> <xsl:value-of select="@name"/> </xsl:attribute> <xsl:attribute name="class"> <xsl:choose> <!-- 定义了Appender 之间的映射关系 --> <xsl:when test="@class = 'org.apache.log4j.DailyRollingFileAppender'">ch.qos.logback.core.rolling.RollingFileAppender</xsl:when> <xsl:when test="@class = 'com.alibaba.common.logging.spi.log4j.DailyRollingFileAppender'">ch.qos.logback.core.rolling.RollingFileAppender</xsl:when> <xsl:when test="@class = 'org.apache.log4j.AsyncAppender'">ch.qos.logback.classic.AsyncAppender</xsl:when> <xsl:when test="@class = 'org.apache.log4j.ConsoleAppender'">ch.qos.logback.core.ConsoleAppender</xsl:when> <xsl:when test="@class = 'org.apache.log4j.net.SMTPAppender'">ch.qos.logback.classic.net.SMTPAppender</xsl:when> <xsl:when test="@class = 'org.apache.log4j.net.SocketAppender'">ch.qos.logback.classic.net.SocketAppender</xsl:when> <xsl:when test="@class = 'org.apache.log4j.net.SyslogAppender'">ch.qos.logback.classic.net.SyslogAppender</xsl:when> <xsl:otherwise> <xsl:message terminate="yes">Unknown appender class: <xsl:value-of select="@class"/> </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:apply-templates select="param"/> <xsl:apply-templates select="layout"/> <xsl:apply-templates select="filter"/> </appender> <xsl:call-template name="newline"/> </xsl:template> <xsl:template match="param"> <xsl:choose> <!-- 将log4j file 转换为 logback 的file --> <xsl:when test="@name = 'file'"> <xsl:element name="{concat(translate(substring(@name,1,1), $vUpper, $vLower),substring(@name, 2))}"> <xsl:value-of select="@value"/> </xsl:element> </xsl:when> </xsl:choose> </xsl:template> <xsl:template match="layout"> <xsl:choose> <!-- 将PatternLayout 做转换 --> <xsl:when test="@class = 'org.apache.log4j.PatternLayout'"> <xsl:choose> <xsl:when test="../@class = 'org.apache.log4j.ConsoleAppender' or ../@class = 'org.apache.log4j.DailyRollingFileAppender' or ../@class = 'com.alibaba.common.logging.spi.log4j.DailyRollingFileAppender'"> <encoder> <pattern> <xsl:value-of select="param[@name = 'ConversionPattern']/@value"/> </pattern> <charset>UTF-8</charset> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <xsl:element name="fileNamePattern"> <xsl:value-of select="../param[@name = 'file']/@value" />.%d{yyyy-MM-dd}</xsl:element> <maxHistory>7</maxHistory> </rollingPolicy> </xsl:when> <xsl:when test="../@class = 'org.apache.log4j.net.SocketAppender' or ../@class = 'org.apache.log4j.net.SyslogAppender'"> <xsl:comment>this is NOT needed tor this logger, so it is commented out</xsl:comment> <xsl:comment><![CDATA[ <layout> <pattern>]]><xsl:value-of select="param[@name = 'ConversionPattern']/@value"/><![CDATA[</pattern> </layout>]]> </xsl:comment> </xsl:when> <xsl:otherwise> <layout> <pattern> <xsl:value-of select="param[@name = 'ConversionPattern']/@value"/> </pattern> </layout> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes">Unknown layout class: <xsl:value-of select="@class"/> </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="filter"> <xsl:choose> <xsl:when test="@class = 'org.apache.log4j.varia.LevelRangeFilter' and param[@name = 'LevelMin']/@value != '' and param[@name = 'LevelMax']/@value = 'FATAL'"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level> <xsl:value-of select="param[@name = 'LevelMin']/@value"/> </level> </filter> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes">Don't know what to do with filter</xsl:message> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="logger"> <logger> <xsl:attribute name="name"> <xsl:value-of select="@name"/> </xsl:attribute> <xsl:attribute name="level"> <xsl:choose> <xsl:when test="level/@value = 'FATAL'">OFF</xsl:when> <xsl:otherwise> <xsl:value-of select="level/@value"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:if test="@additivity != ''"> <xsl:attribute name="additivity"> <xsl:value-of select="@additivity"/> </xsl:attribute> </xsl:if> <xsl:apply-templates select="appender-ref"/> </logger> </xsl:template> <xsl:template match="appender-ref"> <appender-ref> <xsl:attribute name="ref"> <xsl:value-of select="@ref"/> </xsl:attribute> </appender-ref> </xsl:template> <xsl:template match="root"> <xsl:call-template name="newline"/> <root> <xsl:attribute name="level"> <xsl:value-of select="level/@value"/> </xsl:attribute> <xsl:apply-templates select="appender-ref"/> <xsl:apply-templates select="comment()"/> </root> </xsl:template> <xsl:template match="comment()"> <xsl:copy-of select="."/> </xsl:template> <xsl:template name="newline"> <!-- don't reformat this! --> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet> 使用方式很简单: String[] parmas = {"-IN", "log4j.xml", "-XSL", "log4j-to-logback.xsl", "-OUT", "logback.xml"}; org.apache.xalan.xslt.Process.Process.main(parmas);

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

Linux(创建大文件)快速把服务器空间写满

有时我们需要测试服务器空间不足时程序的性能。这时你就需要手动对服务器创建大文件使其空间不足了。 我在百度之后发现了三个命令:truncate dd fallocate truncate命令: 它的作用是指定一个文件的大小,如果该文件不存在,就会创建该文件。如果指定文件的大小小于原先的大小,会丢失内容。 这个命令指定的文件大小其实是虚拟的。只是显示出来的大小。如果你指定一个非常大的文件。其实服务器剩余空间并不会减少。 用法:turncate -s 1G test.txt--创建一个虚拟大小1G的test文件,其真实大小为0 dd命令: 可以创建虚拟大小的文件,也可以创建真实占用空间的文件。 真实:dd if=/dev/zero of=test.txt count=10 bs=512M --创建一个5G大的test.txt文件 虚拟:dd if=/dev/zero of=test.txt count=10 bs=512M seek=10G --创建一个5G大的test.txt文件,但显示容量为10G 参数含义: if 输入文件 of 输出文件 count 创建的文件构成的块数 bs 每块的容量大小 seek 指定的虚拟大小 /dev/zero 一个不断返回0值字节的字符设备,为了提供写入的字符。 fallocate命令: 可以直接分配一个指定容量的真实大小文件,且速度很快。 用法:falloate -l 5G test.txt --创建一个大小为5G的真实文件 选择:最后我还是使用fallocate进行文件的创建,因为它速度较快。 注: 1.文件的虚拟大小可以通过ls/ll命令进行查看,真是大小可以通过进入文件所在目录,然后 du -sh *,找到对应文件名,看其真实大小。 2.dd命令十分强大,我只是使用了它其中的一种,以后还需学习其他用法。

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

java中System.in和System.out快速学会使用

import java.io.*; /** * @author LiaoYangJun * @createTime 2018/3/23. */ public class Demo2 { /** * 因为用的是字节流所以 * 控制台 中文 字符串 数字都可以输入输出 * @param args */ public static void main(String[] args) { // 标准的输入流对象 --读取操作 InputStream is = System.in; // 标准的输出流对象---写的操作 OutputStream os = System.out; try { // System.in是一个很原始、很简陋的输入流对象,通常不直接使用它来读取用户的输入。 // 一般会在外面封装过滤流: BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 然后调用br.readLine()方法进行读取。 String inputStr = br.readLine(); // 把数据写出去,写出的类型是字节型 os.write(inputStr.getBytes()); } catch (IOException e) { e.printStackTrace(); } } } 输入 张三123sdasd 输出 张三123sdasd

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

使用模板元编程快速的得到斐波那契数。。

这是一种将运行时消耗转移到编译器消耗的方法,是c++模板的一种应用。 当你的程序运行时效率需要特别高的时候,可以考虑这样的方法。 模板实例化的时候需要常量: #include <iostream> using namespace std; template < unsigned N > struct Fib { enum { Val = Fib<N-1>::Val + Fib<N-2>::Val //递归。。 }; }; template<> //针对和的特化作为结束的条件 struct Fib<0> { enum { Val = 0 }; }; template<> struct Fib<1> { enum { Val = 1 }; }; int main() { cout<<Fib<20>::Val <<endl; return 0; } 如果你觉得Fib<20>::Val这样的调用很麻烦的话可以定义一个类似的宏使得其应用有类似于函数调用的形式: #define FibFuc( n ) (Fib<n>::Val) ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/04/02/2429818.html,如需转载请自行联系原作者

资源下载

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册