| Servlet Spec | JSP Spec | EL Spec | WebSocket Spec | Authentication (JASIC) Spec | Apache Tomcat Version | Latest Released Version | Supported Java Versions |
|---|---|---|---|---|---|---|---|
| 5.0 | 3.0 | 4.0 | 2.0 | 2.0 | 10.0.x | 10.0.0 (beta) | 8 and later |
| 4.0 | 2.3 | 3.0 | 1.1 | 1.1 | 9.0.x | 9.0.41 | 8 and later |
| 3.1 | 2.3 | 3.0 | 1.1 | 1.1 | 8.5.x | 8.5.61 | 7 and later |
| 3.1 | 2.3 | 3.0 | 1.1 | N/A | 8.0.x (superseded) | 8.0.53 (superseded) | 7 and later |
| 3.0 | 2.2 | 2.2 | 1.1 | N/A | 7.0.x | 7.0.107 | 6 and later (7 and later for WebSocket) |
| 2.5 | 2.1 | 2.1 | N/A | N/A | 6.0.x (archived) | 6.0.53 (archived) | 5 and later |
| 2.4 | 2.0 | N/A | N/A | N/A | 5.5.x (archived) | 5.5.36 (archived) | 1.4 and later |
| 2.3 | 1.2 | N/A | N/A | N/A | 4.1.x (archived) | 4.1.40 (archived) | 1.3 and later |
| 2.2 | 1.1 | N/A | N/A | N/A | 3.3.x (archived) | 3.3.2 (archived) | 1.1 and later |
Tomcat与jdk及servlet版本对应关系
Linux命令-screen
简介
screen是linux下的一种多重视窗管理程序。在使用telnet或SSH远程登录linux时,如果连接非正常中断,重新连接时,系统将开一个新的session,无法恢复原来的session.screen命令可以解决这个问题。
Screen工具是一个终端多路转接器,在本质上,这意味着你能够使用一个单一的终端窗口运行多终端的应用。
Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
语法
# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s <shell>][-S <作业名称>]
参数说明
| 参数 | 作用 |
|---|---|
| -A | 将所有的视窗都调整为目前终端机的大小。 |
| -d <作业名称> | 将指定的screen作业离线。 |
| -h <行数> | 指定视窗的缓冲区行数。 |
| -m | 即使目前已在作业中的screen作业,仍强制建立新的screen作业。 |
| -r <作业名称> | 恢复离线的screen作业。 |
| -R | 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。 |
| -s <shell> | 指定建立新视窗时,所要执行的shell。 |
| -S <作业名称> | 指定screen作业的名称。 |
| -v | 显示版本信息。 |
| -x | 恢复之前离线的screen作业。 |
| -ls 或 –list | 显示目前所有的screen作业。 |
实例
创建 screen 终端
# screen //创建 screen 终端
创建 screen 终端 并执行任务
# screen vi ~/main.c //创建 screen 终端 ,并执行 vi命令
离开 screen 终端
# 在 screen 终端 下 按下 Ctrl+a d 键
查看已经创建的screen终端
# screen -ls
###重新连接离开的 screen 终端
# screen -ls //显示已创建的screen终端
There are screens on:
2433.pts-3.linux (2013年10月20日 16时48分59秒) (Detached)
2428.pts-3.linux (2013年10月20日 16时48分05秒) (Detached)
2284.pts-3.linux (2013年10月20日 16时14分55秒) (Detached)
2276.pts-3.linux (2013年10月20日 16时13分18秒) (Detached)
4 Sockets in /var/run/screen/S-root.
# screen -r 2276 //连接 screen_id 为 2276 的 screen终端
常用参数
| 参数 | 作用 |
|---|---|
| screen -S yourname | 新建一个叫yourname的session |
| screen -ls | 列出当前所有的session |
| screen -r yourname | 回到yourname这个session |
| screen -d yourname | 远程detach某个session |
| screen -d -r yourname | 结束当前session并回到yourname这个session |
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
| 快捷键 | 作用 |
|---|---|
| C-a ? | 显示所有键绑定信息 |
| C-a c | 创建一个新的运行shell的窗口并切换到该窗口 |
| C-a n | Next,切换到下一个 window |
| C-a p | Previous,切换到前一个 window |
| C-a 0..9 | 切换到第 0..9 个 window |
| Ctrl+a [Space] | 由视窗0循序切换到视窗9 |
| C-a C-a | 在两个最近使用的 window 间切换 |
| C-a x | 锁住当前的 window,需用用户密码解锁 |
| C-a d | detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。 |
| C-a z | 把当前session放到后台执行,用 shell 的 fg 命令则可回去。 |
| C-a w | 显示所有窗口列表 |
| C-a t | Time,显示当前时间,和系统的 load |
| C-a k | kill window,强行关闭当前的 window |
| C-a [ | 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样 |
| C-b | Backward,PageUp |
| C-f | Forward,PageDown |
| <div>H(大写)</div> | High,将光标移至左上角 |
| L | Low,将光标移至左下角 |
| 0 | 移到行首 |
| $ | 行末 |
| w | forward one word,以字为单位往前移 |
| b | backward one word,以字为单位往后移 |
| Space | 第一次按为标记区起点,第二次按为终点 |
| Esc | 结束 copy mode |
| C-a ] | Paste,把刚刚在 copy mode 选定的内容贴上 |
官网
http://www.gnu.org/software/screen/
参考
Typecho上传附件失败解决
版本信息
typecho版本:1.1
服务器版本:CentOS 7
问题描述
在typecho上传附件是总是失败
解决方法
在博客程序安装目录下找到var/Typecho/Common.php这个文件,在大约400行左右的地方有这样一个函数
401 /**
402 * 检测是否在app engine上运行,屏蔽某些功能
403 *
404 * @static
405 * @access public
406 * @return boolean
407 */
408 public static function isAppEngine()
409 {
410 return !empty($_SERVER['HTTP_APPNAME']) // SAE
411 || !!getenv('HTTP_BAE_ENV_APPID') // BAE
412 || !!getenv('HTTP_BAE_LOGID') // BAE 3.0
413 || (ini_get('acl.app_id') && class_exists('Alibaba')) // ACE
414 || (isset($_SERVER['SERVER_SOFTWARE']) &&
strpos($_SERVER['SERVER_SOFTWARE'],
'Google App Engine') !== false) // GAE
415 ;
416 }
修改成
public static function isAppEngine()
{
return false;
}
修改之后,还需要修改usr../uploads这个文件夹的权限
chmod 777 -R usr../uploads
禁止前端页面调试小技巧
<script>
function endebug(off, code) {
if (!off) {
!function(e) {
function n(e) {
function n() { return u; }
function o() {
window.Firebug && window.Firebug.chrome &&
window.Firebug.chrome.isInitialized ? t("on") : (a = "off",
console.log(d), console.clear(), t(a));
}
function t(e) {
u !== e && (u = e, "function" == typeof c.onchange &&
c.onchange(e));
}
function r() {
l || (l = !0, window.removeEventListener("resize", o),
clearInterval(f));
}
"function" == typeof e && (e = {
onchange: e
});
var i = (e = e || {}).delay || 500,
c = {};
c.onchange = e.onchange;
var a, d = new Image;
d.__defineGetter__("id", function() {
a = "on"
});
var u = "unknown";
c.getStatus = n;
var f = setInterval(o, i);
window.addEventListener("resize", o);
var l;
return c.free = r, c;
}
var o = o || {};
o.create = n, "function" == typeof define ?
(define.amd || define.cmd) && define(function() {
return o
}) : "undefined" != typeof module && module.exports ?
module.exports = o : window.jdetects = o
}(), jdetects.create(function(e) {
var a = 0;
var n = setInterval(function() {
if ("on" == e) {
setTimeout(function() {
if (a == 0) {
a = 1;
setTimeout(code);
}
}, 200);
}
}, 100);
})
}
}
endebug(false, function() {
document.write("非法调试,请关闭后刷新!");
});
</script>
Emmet入门
简介
Emmet — the essential toolkit for web-developers
Emmet is a web-developer’s toolkit for boosting HTML & CSS code writing.
With Emmet, you can type expressions (abbreviations) similar to CSS selectors and convert them into code fragment with a single keystroke.
Emmet(以前名为Zen Coding是一套面向文本编辑器的插件,它允许通过内容辅助高速度的编写和编辑HTML、XML、XSL和其他结构化的代码格式。此项目2008年由Vadim Makeev发起,并由Sergey Chikuyonok和其他Emmet用户基于Zen Coding 2.0的概念继续积极开发。这套工具已经被一些高端的文本编辑器采纳,以及存在于Emmet团队开发或其他人独立实现的插件中。不过,Emmet独立于任何文本编辑器,它的引擎可以直接处理文本,而无需与任何特定软件相关。
Emmet以MIT许可证开源。
Emmet使用特定的语法来展开小段代码,它类似CSS选择器,使其成为完整的HTML代码。
简单说一下用法:
假如你需要写这样一段代码:
<ul>
<li class="item001"></li>
<li class="item002"></li>
<li class="item003"></li>
<li class="item004"></li>
<li class="item005"></li>
</ul>
如果纯手工敲键盘的话你需要从头敲到尾,或许一些老司机会复制li那一行复制一下。但是对于使用Emmet的玩家来说,只需要在键盘上敲出以下几个字符:
ul>li.item$$$*5
敲完之后按一下组合键Ctrl+e(热键可修改),即可得到和上面一样的代码了。
这种字符及其规则,就是Emmet语法,可以参考下面的 github 网址查看文档,下面也提供了一份 Emmet Cheat Sheet 以供学习。
github地址:
Hexo博客中插入PDF文档
缘起
PDF文件格式是较为流行的文档格式,具有格式固定等很多优点,在博客中插入PDF格式文档还可以避免复杂公式的输入。
使用iframe标签实现
在博客文章中插入以下语句可以实现,src参数为pdf文档位置
<iframe src="https://xxxx.com/......./1.pdf" width="100%" height=768></iframe>
活在当下,而不是未来
我现在还活着。当我吃东西的时候,我就一心一意地吃;走路的时候,我就只管走路;如果我必须打仗,那么这一天和其它任何一天一样,都是我死去的好日子。因为我既不生活在过去里,也不生活在将来中,我所有的仅仅是现在,我只对现在感兴趣。假如你能总是把握着现在,你就能成为一个幸福的人。你将会发现,沙漠中存在着生命,夜空里有着星星,战士们打仗因为是人类生活的一个组成部分。生活是一个节日,是一场盛大的宴会,因为它永远是,又仅仅是我们现在经历的这一刻。
———— Paulo Coelho 《牧羊少年奇幻之旅》
以前总觉得活在当下是一句很诗意的话。
今天另一个词突然出现在脑海里:活在未来
总是在想:我以后一定…我下次一定会…我下周….我明年…我毕业以后…这是不是一种活在未来的表现呢?
使用mysqldump对MySQL数据库备份
缘起
管理数据库的工具有很多,例如 phpmyadmin、sqlyog,Navicat等等,但是服务器的端口能少开放一个就少开一个,于是我找到了mysqldump这个程序,mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。
操作环境
操作系统:CentOS 7
操作步骤
不需要进入MySQL,在命令行直接输入下面语句。
mysqldump -u root -p [database] > /root/xxxx.sql
[database]是数据库名,/root/xxxx.sql是路径和备份文件的文件名
执行后输入密码即可在上面指定的目录下生成数据库备份文件。
PicGo安装插件失败
缘起
想要使用gitee做一个图床,使用PicGo作为上传客户端,使用Typora作为写作工具,但是在PicGo安装插件时,点击了安装按钮,没有任何提示,就是安装失败,后来查资料才知道,插件安装需要用到npm,所以需要安装nodejs.
一点插曲
电脑前段时间装的系统,用的win7,在官网下载最新版的nodejs安装包,安装时已经提示不支持win7了,又找了旧版的安装,看来2020年还用win7始终不是长久之计啊。
在Hexo博客视频中插入B站视频
<script type="text/javascript">
document.getElementById("spkj").style.height=document.getElementById("spkj").scrollWidth*0.76+"px";
</script>
key | 说明 |
|---|---|
| aid | 视频ID就是B站的 avxxxx 后面的数字 |
| cid | 应该是客户端id, clientId 的缩写(推测的, 不一定准确)经过测试, 这个字段不填也没关系 |
| page | 第几个视频, 起始下标为 1 (默认值也是为1)就是B站视频, 选集里的, 第几个视频 |
| as_wide | 是否宽屏 1: 宽屏, 0: 小屏 |
| high_quality | 是否高清 1: 高清, 0: 最低视频质量(默认);如视频有 360p 720p 1080p 三种, 默认或者 high_quality=0 是最低 360p,high_quality=1 是最高1080p |
| danmaku | 是否开启弹幕 1: 开启(默认), 0: 关闭 |