首页 文章 精选 留言 我的

精选列表

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

python : 动态不刷屏幕输出 python/shell 实现

前言后台运行程序有一种需求,比如查看当前进度,想在终端看到某个值的变化情况: 先提供一种很土的办法,把进度落地文件为 例如 process,采用创建写的方式。然后可以使用watch -n 1 cat process来查看进度。 这里提供两种方式,python和shell shell版本,如下(附带一个进度条的例子) #! /bin/bash for ((i=0; $i<=100; i+=1)) do printf "progress: [%-100s] %d%%\r" "xxxxxxxxxx xxx xxx" $i sleep 1 done function sleepPrograss(){ [ $# -eq 0 ] && echo "sleepPrograss Usage: sleepPrograss 10 " [ $# -eq 0 ] && return 1 allTime=$1 strDone='' stepTime=$(echo "scale=1; $allTime/100" | bc) for ((i=0; $i<=100; i+=1)) do printf "progress: [%-100s] %d%%\r" $strDone $i sleep $stepTime strDone+='#' done echo } python版本,如下(附一个多线程输出进度的例子) 基础用法示例 #! /usr/bin/env python import os import sys import time while 1: os.write(1, "\r[%.3f]" % time.time()) sys.stdout.flush() time.sleep(1) 子线程完成自己的任务,主线程跟踪执行进度。 ** 小编推荐一个学python的学习qun 740322234无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享! ** #! /usr/bin/env python # -*- coding: utf-8 -*- ''' @filename : demo.py @authors : U{peterguo<mailto: peterguo@tencent.com>} @copyright: tencent @date : 2012-11-15 @version : 1.0.0.1 ''' import os import sys import time import thread g_nTotal = 100 g_nProcessed = 0 g_fStartTime = time.time() def simpleThdreadFun(interval): global g_nProcessed global g_nTotal while g_nTotal > g_nProcessed: time.sleep(interval) g_nProcessed += 1 thread.exit_thread() def test(): global g_nTotal global g_nProcessed global g_fStartTime g_fStartTime = time.time() thread.start_new_thread(simpleThdreadFun, (1,)) thread.start_new_thread(simpleThdreadFun, (2,)) thread.start_new_thread(simpleThdreadFun, (3,)) thread.start_new_thread(simpleThdreadFun, (4,)) while True: time.sleep(0.5) fRunTime = time.time() - g_fStartTime nLeftNum = g_nTotal - g_nProcessed fLeftTime = fRunTime * nLeftNum / (g_nProcessed + 0.1) fPrograss = 100.0 * g_nProcessed / g_nTotal os.write(1, "\rLeftTime[%.3f]\tLeftNum[%d]\tProgress[%.3f %% (%d/%d) ]" % (fLeftTime, nLeftNum, fPrograss, g_nProcessed, g_nTotal)) sys.stdout.flush() if g_nTotal <= g_nProcessed: break print "\nTest Done, use %.3f seconds" % (time.time() - g_fStartTime) if __name__=='__main__': test()

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

为什么不推荐大家去外包公司

其实大家心里都像明镜一样地明白“低技术含量的外包没有前途”,好多人都认为外包没有技术,其实这种思想不对,国外有大量的高端技术外包业务等着我们干,但是反问一句“你们能干吗?”。 现在大部分的公司都是平均每个项目开发4个月,干完就再转一个组再做别的项目,从Java .NET C C++ 到有些人可能没有听说过的RPG,一个有着7年开发经验的外包人员可以说自已会十几种开发语言做过几十个case,但是却不敢说自已有技术,为什么? 很简单我们只是编码,听好了就是编码,并且是在别人已开发好的框架上编码,就是干一百年也提高不了,我们充其量就是一个组装工人,大家都知道技术是要积累的,没有积累就没有进步,我们国家的汽车产业就是走的这条路,以前丰田、福特、通用在中国开厂,我们只是把别人的发动机、变速器拿来,再加上自已的廉价汽车配件生产出一台台性价比很高的汽车,随着工人的成本在上升,这种以成本为推动的外包还能维持多久? 看看本田的罢工吧,看看富士康的跳楼吧!在这里真的应该表扬一下吉利,老总真的有魄力有远见,建议软件厂商们都学学吉利吧,这才叫牛B呐。 希望中国以后的中国软件都能向华为中兴一样走出中国走向世界和老外一比高下,这样的软件产业才是一谭活水,光靠人力成本的低廉是走不长,走不远的。 古语有云:好铁不打钉。今天我想说的是好程序员不去外包公司。这个观点估计会有人反对,我也相信任何非技术性的帖子都会有支持者,也会有反对者。今天我就来和大家谈谈为什么不去外包公司,尤其是你想在技术的路线上走的更长远一点,做个好程序员,就请不要去外包公司。 我们打工者在一个公司能待下去的理由无非两个:1、Money,工资高;2、有发展空间。其实说白了就是能学到东西,能有沉淀的东西,未来能挣更多的money。我先从这两点来谈论一下为什么不要去外包公司: 第一是Money, 大家可能都觉得外包公司给的待遇比一般的非外包公司给的会稍微高一点点,这个高低是相对个人而言的。 外包公司的运作模式中有一个很大特点就是以人力为成本,即人就是成本,比如你的工资是1万每个月,那么你被外派到其他公司的时候,你可能会被卖到了2万、3万一个月,甚至更高。但即便这样你一个人的毛利是多少呢1-2万,但公司还有很多不能外派出去的人呢,比如行政呀,财务呀,采购等等管理人呀,还有公司的运营成本,水电房租等等,这样一算下来,把你卖出去的毛利就没多少了,那怎么办呢,做量,所以你会发现外包公司都是大公司,都是有上千人甚至几千人,量上去了,利润就多了呀,所以小外包公司很难生存。 大家可能会认为,其他的非外包公司也是以人力为成本的呀?这里要说的是,非外包公司卖的项目和产品,说白了是软件系统,外包公司卖的是人,一个是 劳动密集型企业,一个是知识密集型企业,非外包公司计算的人力成本是作为整个项目成本的一部分,而外包公司的人力成本则是公司卖出产品的(人力)原材料的价格。 举例来说,非外包公司可能会接一个项目,项目合同额100万,公司可能有3个人做半年就够了,那按人力成本3*1万*6=18万,那这个项目的毛利是多少呢,82万。暂且简单计算这个毛利,大家肯定会有人提出来各种成本需要计算(我也知道),我们这里简单这个公式而已。而外包公司的3个人半年的毛利能有多少呢,假设3个人每人工资1万,卖出价格2万,则半年为公司的赚取的毛利是多少呢?3*(2万-1万)*6=18万。 大家应该可以看出点门道来了吧,那好下面我就来谈工资和福利。 非外包公司主要看重人才,因为人才可以为他带来更大效益,公司会为了留住人才,考虑给员工加薪,加福利,总之想尽各种办法留住员工。而外包公司则 不会,因为上面的公式3*(2万-1万)*6=18万中,如果1万变成1.5万,则毛利就少了很多,因为其他的值都不会变,你个人的买入价变高了,卖出价还是那个价钱,所以所能赚取的毛利变少了,外包公司是不会给你提高工资的,即便 提高也是微乎其微,如果你不服,你可以走,你走了外包公司可能会招个更便宜的人,接替你的工作。 再说福利,前面说了,外包公司要想赚钱就必须做量,人海战术,劳动密集型企业,因为你个人能创造的价值在外包公司犹如沧海一粟,也正因为你这沧海一粟的贡献,导致公司对你的任何福利都使得你这沧海一粟变得更小,所以什么年终奖呀,保险呀,公积金呀,补助呀,体检呀,公司旅游,聚会等等这种福利基本上就不要想了,上保险可能是国家法律规定必须上,所以公司会给你按最低的上,因为人太多,每个人的收益率又那么低,所以给你福利就是在增加成本,减少自己的收益。 说完Money再说发展空间,要说到发展空间就不得不说说外包公司的形成原因。 大家知道早些年,搞IT的人的工资待遇相对来说还是比较高的,一个公司,如果没有那么多项目,光养这些技术人员,实际的经营成本确实不低,但是这些 技术人员又不能不养,因为如果一旦来项目了,没人做那也不行,那单纯为这个项目找一批技术人员,一旦项目结束了,下个项目不知道什么时候才来的时候,这些人怎么办呢?还有另外一个情况就是技术能力缺乏,比如公司某个项目需要做sap的接口,但公司没有做这个,但又不能单独为这个项目找个sap的人,所以这个时候,做领导的很头疼,招人招的太多,没有项目头疼,有了项目,人不够头疼。 所以了,有需求就有市场了,外包公司出现了,专门针对上面这种公司解决上面遇到的问题。 大家注意一点,如果非外包公司需要外包公司的人员时,肯定是需要有工作经验的,刚毕业的学生肯定是不要的,除非你能蒙混过关。也就是说,我需要的外包人员是拿过来就能干活,解决我们现有人力不能解决的问题,是我要外包公司的人员现有的技术知识,而不是给你外包公司人员学习技术培养技术的机会,有这机会,我会培养我们自己公司的人员,为什么要培养外包人员呢。 大家觉得在外包公司干两年之后你会有什么沉淀的东西吗? 除了上面说的Money和发展空间以外,还有几个理由,也不能去外包公司。 去外包公司之后,你会经常到各个公司去面试。外包公司招人的时候一般会打电话和你说,“你好,我们这有个派到微软呀,摩托罗拉呀等等的职位”,然后你会先去微软面试,微软面试通过了,外包公司才会和你签合同,就是销售驱动采购,先把你卖出去才能真的去买你,等微软呀摩托罗拉呀这些公司的项目完了, 你就又会要求去其他公司面试,可能你当时图上班方便,在北五环租了个房子,结果下一个外派公司去了南五环,你就惨了。 上面说的是你能再次面试通过的情况,假设你被第一个公司退回来,之后公司会天天安排去到各个公司去面试,直到你被人买走,但如果一个月之内没有公司买你,也就是你一个月接客量不够(和小姐一样),那公司就要考虑给你降薪,裁人了,这里提醒大家一点,外包公司和你签合同一般都是这样签的:每个月基本工资2000,奖金8000;这么签合同实际上就是为了给你少交保险,少交公积金,最主要的是在裁你的时候补偿可以按照2000给,但外包公司一般还会很无耻地和你说,这么签合同是为了给你避税。无耻到极点了。 外包公司没有归属感,哪怕把你派到微软,IBM之类的公司,你也是二等员工。这个自己体会吧。 其实现在去外包公司的人,我分析无非三种人: 完全不知道外包怎么回事的人。 为了多拿一点点钱的人,有些人如果去非外包公司可能只能拿到6000元,但去外包公司可能拿到7000元,这种人,我想提醒你们,去非外包公司,只要你好好干,这6000可能会变成10000,但去外包公司你那7000元,两年后撑死变成7500。 就是完全找不到工作的人,因为外包公司做的是量,大量外派人员到其他大公司,就是卖人,这里就会有捆绑销售的情况了,他们会和其他公司说,你要想买我们这几个人,就还要买我们那几个人,呵呵,这就可以把非常非常便宜买进来的垃圾,捆绑销售出去了。 希望大家慎重的选择自己的职业,别过两年之后对自己说“年轻不懂择业”之类的话。 想要学习Java高架构、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取 架构群:558986829 点击链接加入群聊【JAVA高级架构之路】:https://jq.qq.com/?_wv=1027&k=5jJeqDu

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

不聊webpack配置,来说说它的原理

最近在前端论坛闲逛,看到了一些讲parcel、webpack的文章,就突然很好奇,每天都在用的打包工具,他们打包的原理究竟是什么。只有知道了这一点,才可以在众多的打包工具里,找到最适合的那个它。在了解打包原理之前,先花一些篇章说明了一下为什么要使用打包工具。 0.模块系统 前端产品的交付是基于浏览器,这些资源是通过增量加载的方式运行到浏览器端,如何在开发环境组织好这些碎片化的代码和资源,并且保证他们在浏览器端快速、优雅的加载和更新,就需要一个模块化系统。这个理想中的模块化系统是前端工程师多年来一直探索的难题。 模块系统主要解决模块的定义、依赖和导出。原始的<script>标签加载方式有一些常见的弊端:例如全局作用域下容易造成变量冲突;文件只能按照<script>的书写顺序进行加载;开发人员必须主观解决模块和代码库的依赖关系等。 因此衍生出很多模块化方案: 1.CommonJs:优点:服务器端模块便于重用。缺点:同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源是异步加载的。 2.AMD:依赖前置。优点:适合在浏览器环境异步加载;缺点:阅读和书写比较困难。 3.CMD:依赖就近,延迟执行。优点:很容易在node中运行;缺点:依赖spm打包,模块的加载逻辑偏重。 4.ES6模块::尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。优点:容易进行静态分析;缺点:原生浏览器未实现该标准。 说到模块的加载和传输,若是每个文件都单独请求,会导致请求次数过多,导致启动速度过慢。若是全部打包在一块只请求一次,会导致流量浪费,初始化过程慢。 因此最佳方案是分块传输,按需进行懒加载,在实际用到某些模块的时候再增量更新。要实现模块的按需加载,就需要一个对整个代码库中的模块进行 静态分析、编译打包的过程。Webpack 就是在这样的需求中应运而生。 注:要注意一个概念,一切皆模块。样式、图片、字体、HTML 模板等等众多的资源,都可以视作模块。 1.模块打包器:webpack Webpack 是一个模块打包器。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。 那么问题来了,webpack真的能做到上述提到的静态分析、编译打包么?我们首先来看一下webpack能做什么: 1.代码拆分 Webpack 有两种组织模块依赖的方式,同步和异步。异步依赖作为分割点,形成一个新的块。在优化了依赖树后,每一个异步区块都作为一个文件被打包。 2.Loader Webpack 本身只能处理原生的 JavaScript 模块,但是 loader 转换器可以将各种类型的资源转换成 JavaScript 模块。这样,任何资源都可以成为 Webpack 可以处理的模块。 3.智能解析 Webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 JS 文件。 4.插件系统 Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 Webpack 插件,来满足各式各样的需求。 5.快速运行 Webpack 使用异步 I/O 和多级缓存提高运行效率,这使得 Webpack 能够以令人难以置信的速度快速增量编译。 以上是webpack五个主要特点,但是看完还是觉得有些雾里看山,webpack到底是如何把一些分散的小模块,整合成大模块?又是如何处理好各模块的依赖关系?下面就以parcel核心开发者@ronami的开源项目minipack为例,说明以上问题。 2.打包工具核心原理——以minipack为例 打包工具就是负责把一些分散的小模块,按照一定的规则整合成一个大模块的工具。与此同时,打包工具也会处理好模块之间的依赖关系,将项目运行在平台 上。minipack项目最想说明的问题,也是打包工具最核心的部分,就是如何处理好模块间的依赖关系。 首先,打包工具会从一个入口文件开始,分析里面的依赖,并进一步地分析依赖中的依赖。 我们新建三个文件,并建立依赖: /* name.js */ export const name = 'World' /* message.js */ import { name } from './name.js' export default `Hello ${name}!` /* entry.js */ import message from './message.js' console.log(message) 首先引入必要的工具 /* minipack.js */ const fs = require('fs') const path = require('path') const babylon = require('babylon') const traverse = require('babel-traverse').default const { transformFromAst } = require('babel-core') 接着我们将创建一个函数,参数是文件的路径,作用是读取文件内容并提取它的依赖关系。 function createAsset(filename) { // 以字符串形式读取文件的内容. const content = fs.readFileSync(filename, 'utf-8'); // 现在我们试图找出这个文件依赖于哪个文件。虽然我们可以通过查看其内容来获取import字符串. 然而,这是一个非常笨重的方法,我们将使用JavaScript解析器来代替。 // JavaScript解析器是可以读取和理解JavaScript代码的工具,它们生成一个更抽象的模型,称为`ast (抽象语法树)(https://astexplorer.net)`。 const ast = babylon.parse(content, { sourceType: 'module', }); // 定义数组,这个数组将保存这个模块依赖的模块的相对路径. const dependencies = []; // 我们遍历`ast`来试着理解这个模块依赖哪些模块,要做到这一点,我们需要检查`ast`中的每个 `import` 声明。 // `Ecmascript`模块相当简单,因为它们是静态的. 这意味着你不能`import`一个变量,或者有条件地`import`另一个模块。每次我们看到`import`声明时,我们都可以将其数值视为`依赖性`。 traverse(ast, { ImportDeclaration: ({node}) => // 我们将依赖关系存入数组 dependencies.push(node.source.value); }, }); // 我们还通过递增简单计数器为此模块分配唯一标识符. const id = ID++; // 我们使用`Ecmascript`模块和其他JavaScript,可能不支持所有浏览器。 // 为了确保我们的程序在所有浏览器中运行, // 我们将使用[babel](https://babeljs.io)来进行转换。 // 我们可以用`babel-preset-env``将我们的代码转换为浏览器可以运行的东西. const {code} = transformFromAst(ast, null, { presets: ['env'], }); // 返回有关此模块的所有信息. return { id, filename, dependencies, code, }; } 现在我们可以提取单个模块的依赖关系,那么,我们将提取它的每一个依赖关系的依赖关系,并循环下去,直到我们了解应用程序中的每个模块以及他们是如何相互依赖的。 function createGraph(entry) { // 首先解析整个文件. const mainAsset = createAsset(entry); // 我们将使用queue来解析每个asset的依赖关系. // 我们正在定义一个只有entry asset的数组. const queue = [mainAsset]; // 我们使用一个`for ... of`循环遍历 队列. // 最初 这个队列 只有一个asset,但是当我们迭代它时,我们会将额外的assert推入到queue中. // 这个循环将在queue为空时终止. for (const asset of queue) { // 我们的每一个asset都有它所依赖模块的相对路径列表. // 我们将重复它们,用我们的`createAsset() `函数解析它们,并跟踪此模块在此对象中的依赖关系. asset.mapping = {}; // 这是这个模块所在的目录. const dirname = path.dirname(asset.filename); // 我们遍历其相关路径的列表 asset.dependencies.forEach(relativePath => { // 我们可以通过将相对路径与父资源目录的路径连接,将相对路径转变为绝对路径. const absolutePath = path.join(dirname, relativePath); // 解析asset,读取其内容并提取其依赖关系. const child = createAsset(absolutePath); // 了解`asset`依赖取决于`child`这一点对我们来说很重要. // 通过给`asset.mapping`对象增加一个新的属性(值为child.id)来表达这种一一对应的关系. asset.mapping[relativePath] = child.id; // 最后,我们将`child`这个资产推入队列,这样它的依赖关系也将被迭代和解析. queue.push(child); }); } return queue; } 接下来我们定义一个函数,传入上一步的graph,返回一个可以在浏览器上运行的包。 function bundle(graph) { let modules = ''; // 在我们到达该函数的主体之前,我们将构建一个作为该函数的参数的对象. // 请注意,我们构建的这个字符串被两个花括号 ({}) 包裹,因此对于每个模块, // 我们添加一个这种格式的字符串: `key: value,`. graph.forEach(mod => { // 图表中的每个模块在这个对象中都有一个entry. 我们用模块的id`作为`key`,用数组作为`value` // 第一个参数是用函数包装的每个模块的代码. 这是因为模块应该被限定范围: 在一个模块中定义变量不会影响其他模块或全局范围. // 对于第二个参数,我们用`stringify`解析模块及其依赖之间的关系(也就是上文的asset.mapping). 解析后的对象看起来像这样: `{'./relative/path': 1}`. // 这是因为我们模块的被转换后会通过相对路径来调用`require()`. 当调用这个函数时,我们应该能够知道依赖图中的哪个模块对应于该模块的相对路径. modules += `${mod.id}: [ function (require, module, exports) { ${mod.code} }, ${JSON.stringify(mod.mapping)}, ],`; / 最后,使用`commonjs`,当模块需要被导出时,它可以通过改变exports对象来暴露模块的值. // require函数最后会返回exports对象. const result = ` (function(modules) { function require(id) { const [fn, mapping] = modules[id]; function localRequire(name) { return require(mapping[name]); } const module = { exports : {} }; fn(localRequire, module, module.exports); return module.exports; } require(0); })({${modules}}) `; return result; }); 运行! const graph = createGraph('./example/entry.js'); const result = bundle(graph); //得到结果,开心! console.log(result); 更多信息可访问项目 github地址 3.总结 webpack解决了包与包之间潜在的循环依赖难题,同时,按需合并静态文件,以避免浏览器在网络取数阶段的并发瓶颈。除了打包,还可以进一步实现压缩(减少网络传输)和编译(ES6、JSX等语法向下兼容)的功能。 基于对webpack.config.js文件的配置,执行打包时的工作原理,可总结为:把页面逻辑当作一个整体,通过一个给定的入口文件,webpack从这个文件开始,找到所有的依赖文件,进行打包、编译、压缩,最后输出一个浏览器可识别的JS文件。 一个模块打包工具,第一步会从入口文件开始,对其进行依赖分析,第二步对其所有依赖再次递归进行依赖分析,第三步构建出模块的依赖图集,最后一步根据依赖图集使用CommonJS规范构建出最终的代码。 4.参考网址 https://mp.weixin.qq.com/s/w-oXmHNSyu0Y_IlfmDwJKQ https://github.com/chinanf-boy/minipack-explain/blob/master/src/minipack.js https://zhaoda.net/webpack-handbook/configuration.html 原文发布时间为:2018年07月01日 本文作者:whuzxq 本文来源:掘金 如需转载请联系原作者

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

乘风破浪之ThingJS,从3D场景搭建可见一斑

园区级的物联网场景面向产业园区,涉及到的建筑场景多样,属于办公场所的一种复杂类型。ThingJS在智慧园区有二十年的可视化开发经验,曾主导过腾讯智慧大厦项目,实力不容小觑。 作为ThingJS平台的园区搭建组件CamBuilder,使用它可快速构建园区级物联网3D场景;CamBuilder的基本特性是学习门槛低、搭建速度快;CamBuilder的输出物为3D物联网场景,用户基于此场景和ThingJS平台开发能力,可快速构建3D物联网可视化应用。 使用一个工具的必要且先决条件就是拥有这个工具,进入ThingJS园区搭建工具CamBuilder的产品落地页(https://www.thingjs.com/guide/campus),把工具客户端下载到电脑。 利用ThingJS开发3D项目,场景搭建是第一步要完成的,如果利用CamBuilder搭建园区,我们该如何轻松快捷的制作,让前端开发人员更方便去实现各种功能需求呢? 第一步:安装并登陆,CamBuilder目前只有64位的下载包,同时仅支持Windows系统,不支持其他系统包括Windows虚拟机,下载完成后,管理员方式运行打开如下界面,注意,登录时需要用到昵称+密码的方式去登录,昵称可在ThingJS网站个人信息中查看并修改。 登录后会出现如下界面,当然,新用户的场景是空的,有些场景模型可以在资源中心购买。需要注意的是头像左侧我们有一个工具栏,这一栏有关于CamBuilder的使用手册,点击头像左侧的按钮,然后点击用户手册即可查阅和了解怎么去使用CamBuilder。 CamBuilder作为ThingJS旗下的园区搭建工具,除了摆放模型库中或是我们自行上传的模型外,还能够搭建室内结构,在这里,新手需要注意的是,除非你的室内楼宇中有很多树木等装饰物品外,这些都应该在园区里面搭建,而不是放在建筑中搭建,同时,建筑的搭建需要由内向外,先选择室内,选择进入内部后再去绘制墙,这样制作出来的才是一个有室内结构的建筑。 步骤如下: 1.点击室外,选择建房; 2.点击进入内部,开始绘制室内结构; 3.绘制完成后,回到建筑层级; 4.给建筑设置外立面; 5.退回到园区层级,绘制园区大致结构; ThingJS把艺术性和逻辑性协调一致,简单的元素搭建手法,就能够在线绘制3D模型,完成简单的设计活儿!

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

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等操作系统。

用户登录
用户注册