ace.js

官方的github https://github.com/ajaxorg/ace
ace 是一个用 JavaScript 编写的独立代码编辑器。我们的目标是创建一个基于浏览器的编辑器,该编辑器匹配并扩展现有本机编辑器(如 TextMate,VIM 或 Eclipse)的功能,可用性和性能。它可以轻松嵌入任何网页或 JavaScript 应用程序中。Ace 是 Cloud9 IDE 的主要编辑者,也是 Mozilla Skywriter(Bespin)项目的继承者。

特点

  • 超过 120 种语言的语法突出显示(可导入 TextMate / Sublime / .tmlanguage 文件)

  • 超过 20 个主题(可导入 TextMate / Sublime / .tmtheme 文件)

  • 自动缩进和突出

  • 可选的命令行

  • 处理大量文件(最后检查,4,000,000 行是上限)

  • 完全可定制的键绑定,包括 VIM 和 Emacs 模式

  • 搜索并替换正则表达式

  • 突出显示匹配的括号

  • 在软标签和真实标签之间切换

  • 显示隐藏的字符

  • 使用鼠标拖放文本

  • 换行

  • 代码折叠

  • 多个游标和选择

  • 实时语法检查器(目前是 JavaScript / CoffeeScript / CSS / XQuery)

  • 剪切,复制和粘贴功能

ace.js 编译文件下载

默认情况下,它是分开的2个库,经过查找,找了,不需要自己打包编译出来。
https://github.com/ajaxorg/ace-builds/
下载即可,有多种模式。
file


git clone https://github.com/ajaxorg/ace-builds.git

ace.js快速入门

初始化

  • 定义 HTML

  • 编写 JS


<div id="editor">some text</div><script src="src/ace.js" type="text/JavaScript" charset="utf-8"></script><script>

    var editor = ace.edit ("editor");// 这里不需要加 #</script>

这样是不能显示的,所有需要加个高度和宽度,例如

<br/>

#editor {

    width: 500px;
    height: 400px;}

主题

  • 加入你的主题 JS

  • 写入调用

<br/>

<script src="src/theme-twilight.js" type="text/JavaScript" charset="utf-8"></script><script>
   editor.setTheme ("ace/theme/twilight");</script>

输入模式

默认情况下,输入的是文本编辑器,如果你想要加入 JavaScript 编辑器,需要加入文件,并且设置模式

<br/>

<script src="src/mode-javascript.js" type="text/JavaScript" charset="utf-8"></script>

<br/>

<script>var JavaScriptMode = ace.require ("ace/mode/JavaScript").Mode;editor.session.setMode (new JavaScriptMode ());</script>

销毁

<br/>

editor.destroy ();editor.container.remove ();

自动提示语法

<br/>

editor.setOptions ({
    enableBasicAutocompletion: true,//
    enableSnippets: true,//
    enableLiveAutocompletion: true,// 补全});

监听内容实时输出

<br/>

editor.getSession().on ('change', function (e) {});

获得输入内容 editor.getValue ()

设置输入内容 editor.setValue (editorValue);

移动光标 editor.moveCursorTo (0, 0);// 移动光标至第 0 行,第 0 列

编辑内容搜索 editor.execCommand ('find');// 与 ctrl+f 功能一致

ace.js配置

创建并初始化 ace.edit(element, options);

<br/>

// pass options to ace.editace.edit("元素ID", {
    mode: "ace/mode/javascript",
    selectionStyle: "text"})

方法设置参数多个 editor.setOptions(options)

<br/>

var editor=ace.edit("元素ID");editor.setOptions({
        enableBasicAutocompletion: true,
        enableSnippets: true,
        enableLiveAutocompletion: true,//只能补全
    });

方法设置参数单个 editor.setOption(options)

取得单个配置 editor.getOption

<br/>

editor.getOption("optionName");

设置主题 editor.setThemee("主题")

<br/>

 editor.setTheme("ace/theme/monokai");//monokai

设置编辑器语言模式getSession().setMode(mode)

<br/>

   editor.getSession().setMode("ace/mode/html");//语言

支持以下

<br/>

|-- ambiance.css|-- ambiance.js|-- chaos.css|-- chaos.js|-- chrome.css|-- chrome.js|-- clouds.css|-- clouds.js|-- clouds_midnight.css|-- clouds_midnight.js|-- cobalt.css|-- cobalt.js|-- crimson_editor.css|-- crimson_editor.js|-- dawn.css|-- dawn.js|-- dracula.css|-- dracula.js|-- dreamweaver.css|-- dreamweaver.js|-- eclipse.css|-- eclipse.js|-- github.css|-- github.js|-- gob.css|-- gob.js|-- gruvbox.css|-- gruvbox.js|-- idle_fingers.css|-- idle_fingers.js|-- iplastic.css|-- iplastic.js|-- katzenmilch.css|-- katzenmilch.js|-- kr_theme.css|-- kr_theme.js|-- kuroir.css|-- kuroir.js|-- merbivore.css|-- merbivore.js|-- merbivore_soft.css|-- merbivore_soft.js|-- mono_industrial.css|-- mono_industrial.js|-- monokai.css|-- monokai.js|-- nord_dark.css|-- nord_dark.js|-- pastel_on_dark.css|-- pastel_on_dark.js|-- solarized_dark.css|-- solarized_dark.js|-- solarized_light.css|-- solarized_light.js|-- sqlserver.css|-- sqlserver.js|-- terminal.css|-- terminal.js|-- textmate.css|-- textmate.js|-- tomorrow.css|-- tomorrow.js|-- tomorrow_night.css|-- tomorrow_night.js|-- tomorrow_night_blue.css|-- tomorrow_night_blue.js|-- tomorrow_night_bright.css|-- tomorrow_night_bright.js|-- tomorrow_night_eighties.css|-- tomorrow_night_eighties.js|-- twilight.css|-- twilight.js|-- vibrant_ink.css|-- vibrant_ink.js|-- xcode.css
`-- xcode.js

取消语言模式的语法检查 editor.session.setUseWorker(false);

复制

 editor.session.setUseWorker(false);
 或
 editor.getSession().setUseWorker(false);

更改编辑器的大小

复制

editor.resize()

获取选定的文本:

复制

editor.getSelectedText(); // or for a specific rangeeditor.session.getTextRange(editor.getSelectionRange());

光标处输入信息

复制

editor.insert("Something cool");

替换范围内的文本

复制

editor.session.replace(new ace.Range(0, 0, 1, 1), "new text");

获取当前光标所在的行和列:

复制

editor.selection.getCursor();

转到一行:

复制

editor.gotoLine(lineNumber);

获取总行数:

复制

editor.session.getLength();

设置默认TAB大小:

复制

editor.session.setTabSize(4);

设置字体大小:

复制

document.getElementById('editor').style.fontSize='12px';

切换自动换行:

复制

editor.session.setUseWrapMode(true);

设置行高亮显示:

复制

editor.setHighlightActiveLine(false);

设置打印边距可见性:

复制

editor.setShowPrintMargin(false);

将编辑器设置为只读:

复制

editor.setReadOnly(true);  // false to make it editable

查找

复制

editor.find('needle',{
    backwards: false,
    wrap: false,
    caseSensitive: false,
    wholeWord: false,
    regExp: false});editor.findNext();editor.findPrevious();

您可以使用以下选项作为搜索参数:

  • needle:您要查找的字符串或正则表达式

  • backwards:是否从光标当前位置向后搜索。默认为false

  • wrap:搜索到末尾时是否将搜索回头。默认为false

  • caseSensitive:搜索是否应该区分大小写。默认为false

  • wholeWord:搜索是否仅匹配整个单词。默认为false

  • range:该 [范围] 内搜索。将 null 整个文档设置为

  • regExp:搜索是否为正则表达式。默认为false

  • start:开始搜索的起始 [范围] 或光标位置

  • skipCurrent:是否在搜索中包括当前行。默认为false

  • preventScroll:是否将光标移动到下一个匹配项。默认为false

这是执行替换的方法:

复制

editor.find('foo');editor.replace('bar');

这是全部替换:

复制

editor.replaceAll('bar');

editor.replaceAll使用较早设置的针头editor.find('needle', ...

ace.js 监听事件

onchange 内容变化监听

复制

editor.session.on('change', function(delta) {
    // delta.start, delta.end, delta.lines, delta.action});

监听 selection

复制

editor.session.selection.on('changeSelection', function(e) {});

监听光标:

复制

editor.session.selection.on('changeCursor', function(e) {});

添加新命令和快捷键

复制

editor.commands.addCommand({
    name: 'myCommand',//命令名称
    bindKey: {win: 'Ctrl-M',  mac: 'Command-M'},//快捷键
    exec: function(editor) {
        //执行的代码
    },
    readOnly: true // false 只读模式});

配置模式和主题的动态加载

复制

ace.config.set("basePath", "https://url.to.a/folder/that/contains-ace-modes";);

一个模块的路径可以单独配置:

复制

ace.config.setModuleUrl("ace/theme/textmate", "url for textmate.js");

将ace与webpack一起使用时,可以使用以下命令配置所有子模块的路径

复制

require("ace-builds/webpack-resolver");

ace 英文wiki

https://github.com/ajaxorg/ace/wiki

ace.js在线演示实例

<br/>

在程序员的职业生涯中,就是要时刻保持怀疑的态度,如果没有经过自己测试过的代码,绝对不能部署到项目上去。举一个简单的例子,在js代码里面有一段这样的代码,当然我说的是理想状态下的情况,是这样的。

var studentList = [{name:"张三",age:5,sex:"男"},{name:"李四",age:6,sex:"男"}];

这个studentList变量是通过调用别人写的函数返回的值,现在,有这么一个需求,需要把数组的第一个元素的年龄修改成6,那要如何修改呢,对于一些编程经验比较少的人来讲,他们可能上来直接写成这样的代码。

studentList[0]['age'] = 6;

这样有错么,如果真实的数组长度大于0,那么这样做的确没有什么问题。如果这个studentList数组的长度等于0,那这样的代码肯定是要报错了。因为我们不能够确定这个数组的长度一定是大于0的,所以,在修改之前必须要判断一下这个数组的长度是否为0.

if(studentList.length>0){
    studentList[0]['age'] = 6;

}

经过这样的一个处理,无论这个数组的长度是否为0,我们的这个代码始终都不会报错了。当然了,这里我只是列举了这么简单的一个小的例子,我的意思就是说,我们在写代码的时候,一定要认真思考,考虑好各种边界条件的限制,不要想当然地认为所有的代码都会朝着理想的方向发展。

总结,不要轻易相信任何人写的代码,哪怕是自己写的代码,在使用之前都要经过自己的严格检测和测试,只有这样做,我们代码的报错的几率才会降低。

MySQL连接数过多的时候,排查问题的方法,可以查看每一个连接都执行了什么语句。

执行一下这个SQL语句进行查看。

select id, db, user, host, command, time, state, info 
from information_schema.processlist 
where command != 'Sleep'  order by time desc

image.png

info列就是正在执行的SQL语句。

关于MySQL连接过多的排查方法
在一些项目上会出现mysql连接过多导致后台无法正常访问,出现这个问题的原因可能有以下几点。
1,数据库连接池数量开的太多。
2,MySQL的超时关闭空闲连接时间太长。
3,MySQL的连接数太少。

现在的解决办法就是从这三方面去优化。
1,尽量减少数据库连接池的开销。数据库连接池如果处理的过来,越少越好,控制在50以内吧。
2,修改MySQL的配置文件my.ini里面的wait_timeout和interactive_timeout参数,默认值28800是8个小时的时间,这两个参数必须要同时修改成600,就是10分钟的空闲连接,mysql就会自动关闭。但是,这样做就必须要注意的事情就是在我们的程序里面必须要在10分钟内最少要使用一次MySQL,否则就有可能导致mysql连接断开,需要重连。
3,去修改mysql配置文件my.ini里面的max_connections参数,这个是6000,基本上不用修改,如果第1步和第2步都修改了,仍然有问题,那可以把这个参数调大一点。实际上并不是这个值越大越好,因为这个受限制于硬件,如果硬件配置低,修改的再大也没有用。所以需要具体情况具体分析。


最近在解决一个项目现场问题的时候,我发现管理后台访问特别卡顿,几乎无法访问。首先说明一下,我们的管理后台是Apache+PHP+MySQL架构的。当我打开任务管理器的时候,看到httpd进程占用CPU只有不到10左右,就会影响到整个系统的正常使用了。这个现象很奇怪,我也是第一次遇到过。像其他项目上,并发高峰期httpd进程可能会占用CPU到50%~70%左右,但是,后台仍然是可以正常访问的。由此推断,这个可能和服务器的配置有关系,也和Apache对服务器资源的占用有关系,具体是什么关系,可能牵扯到的知识太多了,我也不可能全部掌握,再者说,项目出现问题了,我就要立刻解决掉,恢复正常使用。

既然CPU还有很多的资源可以使用,那么我就可以多创建几个Apache的进程做负载均衡来分摊这个并发压力。具体实现方法是,利用Nginx的反向代理模式把请求均匀地分配给三个Apache的服务。也就是说,Nginx作为请求的入口,它不做任何的逻辑处理,只是负责把请求分发给后端的Apache处理。

Nginx的关键配置代码截图如下所示

image.png

配置完成以后,刷新一下后台,也可以正常访问,在数据请求的高峰期可以看到三个Apache的进程都在处理请求。如图所示

image.png

这样三个Apache进程分摊了所有的请求,这个时候再刷新一下管理后台,发现很快就可以获取到数据。的确比之前一个进程访问的后台要快很多。

由于公司的产品涉及到软件和硬件,同时,也用到了mqtt服务。我负责的这个产品从诞生到现在,mqtt服务也经历了好几次的更替。这个主要是从并发角度去考虑的。

1,Apache ActiveMQ,这个mqtt服务是我们最早使用的也是使用时间最长的一款mqtt服务软件,这个mqtt服务有很多有点,但是,它的缺点最终让我决定把它替换掉。那我就简单地列举一下缺点。最核心的缺点就是占用CPU比较高。举例说明,例如一个服务器的CPU是12个核,32G内存,当并发数量增加到2000以上的时候,CPU的使用率瞬间就会飙升到100%,也有可能会持续很长时间。占用这么高的CPU,最终就会导致整个系统无法正常使用。占用CPU过高最核心的问题就是Java这个虚拟机导致的,所以,这个没有办法从根本上解决问题。

2,mosquito,这个是c语言实现的一个轻量级的mqtt服务,相比于activemq它会减少很多的CPU资源,进而降低整个服务器的压力。总体来讲这个软件还是比较不错的。但是,最近一个项目上发现这个mosquito进程占用的CPU并不高,高峰期使用率只有14%左右,始终维持在2000左右的并发数量,项目现场的终端在3000台左右。每一台终端都会建立一个mqtt客户端连接。这样就会导致将近700台左右的设备无法正常连接服务器。没办法只能替换。最后终于找到原因了,这是因为网卡是百兆网卡,现场工程说是因为网线问题导致服务器的千兆网卡变成了百兆网卡。

3,emq,这个是erlang编程语言实现的一个mqtt服务,erlang编程语言的优势就是对并发的处理。可以这么说,erlang语言就是为并发而生。从这一点不能看出,到目前为止,emq是我使用过的所有mqtt服务性能最优的一款软件。尽管erlang也是以虚拟机的方式在运行,但是它占用的CPU资源要远比Java少的多,可以与mosquito相媲美。使用erlang既解决了并发问题,同时也解决了CPU使用率过高的问题。erlang编程语言里面的线程叫做协程,它可以用更少的资源来处理并发请求。

https://www.emqx.io/docs/zh/v4.4/getting-started/cluster.html#%E8%8A%82%E7%82%B9%E5%8F%91%E7%8E%B0%E4%B8%8E%E8%87%AA%E5%8A%A8%E9%9B%86%E7%BE%A4


辽公网安备21010602000703号 备案号:冀ICP备2022001219号