本篇内容主要讲解“Netty粘包问题的解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Netty粘包问题的解决方法”吧!我们知道,netty当中有boss线程和worker线程,通常是1对多的关系,可以理解为boss接到客户的请求之后,分配给其中一个worker去处理,如果客户过多,可能会出现一个worker服务多个客户的情况。这是背景。按照我的理解,粘包问题解决的关键在于2点,1、接收到数据在无法得到及时解析的情况下,得有地方给它存下来;2、缓冲区指针的任意移动;恰好,这两点netty都能够很轻易的。下面是代码,因为公司的保密需求,将会隐去具体业务部分。public class ProtocolAnaDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, Listout) throws Exception { Object decoded = null; while(true){ decoded = decode(ctx, in); if (decoded != null) { out.add(decoded); } else{ return; } } } private Object decode(ChannelHandlerContext ctx, ByteBuf in) { //标记当前读指针位置 in.markReaderIndex(); while(in.isReadable()){ byte b = in.readByte(); //业务处理部分,如果获得一个正确的消息对象,直接返回 } //如果没有得到任何消息对象,重置读指针位置(之前mark的位置)。 in.resetReaderIndex(); return null; }}到此,相信大家对“Netty粘包问题的解决方法”有了更深的了解,不妨来实际操作一番吧!这里是辰讯云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!...
这篇文章主要介绍“怎么在CentOS6.x服务器上配置Nodejs”,在日常操作中,相信很多人在怎么在CentOS6.x服务器上配置Nodejs问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在CentOS6.x服务器上配置Nodejs”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!首先创建一个playbook文件,我们尽量让它保持简单。--- - hosts: all tasks:定义一些运行这个playbook的主机,然后下面列出一系列的tasks。1.1 添加额外的源在准备应用一个服务器的时候,为了确保指定些软件包可以用或者在***的版本,管理员经常首先添加额外的源。下面的脚本,我们想要添加EPEL和Remi源,以便于我们可以得到类似node.js的软件包。如果使用shell脚本处理的话,如下所示。# 导入 Remi GPG 密钥 – 请参阅: http://rpms.famillecollet.com/RPM-GPG-KEY-remi wget http://rpms.famillecollet.com/RPM-GPG-KEY-remi \ -O /etc/pki/rpm-gpg/RPM-GPG-KEY-remi rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi # 安装 Remi repo, Remi repo里面包含了很多的PHP扩展 rpm -Uvh --quiet \ http://rpms.famillecollet.com/enterprise/remi-release-6.rpm# 安装EPEL源yum install epel-release# 安装 Node.js (npm + 和它的依赖关系).yum --enablerepo=epel install npm这个shell脚本用于导入EPEL和Remi的GPG keys,然后添加这源,***安装Nodejs。这对于简单的部署是没有问题的,但是运行这么多命令是比较笨的方法,如果你的连接不小心断开了,那么你的脚本也会停止的。而如果这个时候,你的脚本刚准备完成呢?提示:如果你想跳过指定的步骤,你可以跳过添加GPG keys的步骤,只需要在运行命令的时候加上—nogpgcheck.或者在Ansible中,yum模块中设置disable_gpg_check参数为yes,但是***还是添加GPG keys。使用GPG,你可以知道包的作者是谁,包有没有修改稿,除非你知道你正在做什么,否则***不要禁止GPG检查。Ansible让事情变的更有健壮性,下面使用Ansible的案例显得更加详细,它和上面的shell脚本有同样的功能,但是更容易理解,更加结构化。 下面使用了Ansible的变量和其它的一些有用的特性。接着上面的playbook,我们继续往下写。tasks: - name: Import Remi GPG key rpm_key: "key={{ item }} state=present" with_items: - "http://rpms.famillecollet.com/RPM-GPG-KEY-remi" - name: Install Remi repo. command: "rpm -Uvh --force {{ item.href }} creates={{ item.creates }}" with_items: - href: "http://rpms.famillecollet.com/enterprise/remi-release-6.rpm" creates: "/etc/yum.repos.d/remi.repo" - name: Install epel repo yum: name=epel-release state=present - name: Stop the firewall service: name=iptables state=stopped - name: Install NodeJS and npm yum: name=npm state=present enablerepo=epel我们看一下具体步骤。rpm_key 是一个的Ansible模块用于从你的RPM数据库中添加或移除GPG key。我们正在从Remi的源中导入一个key。因为Ansible没有rpm命令,因此我们使用command模块来使用rpm命令,这样我们可以做其它的两件事情。a) 使用creatse参数告诉Ansible什么时候不运行这个命令,这个例子里,我们告诉Ansible,这个命令成功执行后,将会创建那些文件。当这个文件存在的时候,这个命令将不会运行。b) 使用with_items定义一个URL和用于creates检查的文件。yum负责安装EPEL源。因为这个服务器我们将用来做测试用,所以我们使用service模块禁止系统防火墙,防止它干涉我们测试。yum安装Node.js(同时安装npm,Node’s package manager),我们使用enablerepo来指定在EPEL源中搜索它,当然也可以使用disablerepo来指定不使用那个源(repository)。因为NPM现在被安装了,我们使用Ansible 的npm模块安装Node.JS工具forever,forever来运行我们的app,设置global为yes,告诉NPM安装模块在/usr/lib/node_modules位置,然后所有的用户都可以使用它了。我们已经有一个Node.js app 服务器了,让我们部署一个简单的Node.js app,在80端口响应HTTP请求1.2 部署一个Node.js app这一步是在我们的服务器上部署简单的Node.js app。首先,通过创建一个新的文件夹,我们创建一个简单的Node.js app,这个文件夹和你上面的ymal文件处于相同的路径下面。然后创建新的文件,app.js,在这个文件夹里面,编辑下面的文件//app.js // 加载express 模块. var express = require('express'), app = express.createServer(); // 响应”/”请求为 'Hello World'. app.get('/', function(req, res){ res.send('Hello World! Yunzhonge'); }); // 像一个真实服务器那样监听在80端口 app.listen(80); console.log('Express server started successfully.')不要担心node.js的语法的和我们的案例。我们需要一个快速的部署案例,这个案例可以用Python,Perl,Java,PHP或者其他编程语言来写,但是因为Node是非常简单的语言,运行一个简单的轻量级的环境,它是一个非常不错的语言来测试你的服务器。因为这个小app依赖于Express(一个简单的Node的HTTP框架),我们同样需要通过一个package.json文件告诉NPM关于它的依赖关系,这个文件与app.js处于相同的路径下面。{ "name": "examplenodeapp", "description": "Example Express Node.js app.", "author": "yunzhonghe", "dependencies": { "express": "3.x.x" }, "engine": "node >= 0.10.6" }然后添加下面内容到你的playbook里面,拷贝整个app到这个服务器,然后让npm下载依赖的东西,(这里为express.)- name: Ensure Node.js app folder exists. file: "path={{ node_apps_location }} state=directory" - name: Copy example Node.js app to server. copy: "src=app dest={{ node_apps_location }}" - name: Install app dependencies defined in package.json. npm: "path={{ node_apps_location }}/app"首先我们使用file模块确保我们安装的app目录存在。{{ node_apps_location }}变量可以在vars部分定义,vars部分位于playbook的顶部。当然也可以在inevntory中定义,也可以在运行ansible-playbook的时候定义。我们使用Ansible的copy模块拷贝这整个app文件夹到测试服务器,copy模块可以聪明的区分单一的文件和包含文件的目录,然后在目录中递归,就像rsync或scp。Ansible的copy模块在单个文件或少量文件时候非常好用,但是如果你拷贝大量的文件,嵌套几层的目录,copy模块就不能胜任。这种情形下,如果你想拷贝整个目录,你***考虑使用synchronize模块,如果你想拷贝一个归档,然后展开它,***使用unarchive模块。第三步,我们使用npm模块,这次除了app的路径之外没有额外的参数。这告诉NPM来解析package.json文件,然后确保所有的依赖关系都存在。已经都完成了,***一步是启动这个app1.3 运行一个Node.js app我们现在使用forever来启动这个app。- name: Check list of running Node.js apps. command: forever list register: forever_list changed_when: false - name: Start example Node.js app. command: "forever start {{ node_apps_location }}/app/app.js" when: "forever_list.stdout.find('{{ node_apps_location }}/app/app.js') == -1"在这个play中,我们做了两件新的事情。register 创建了一个新的变量,forever_list,以便于下次task的时候使用用于判断是否允运行下一个命令。register用于保存命令的输出包括标准输出和错误输出,然后赋给变量名。changed_when告诉Ansible什么时候这个play会导致改变。在这里,forever list命令永远都不会导致服务器的改变,因为我们指定了false。第二个play实际上使用forever启动了这个app。我们可以启动这个app通过调用node {{ node_apps_location }}/app/app.js,不过这种方式更难控制。Forever跟踪它管理的Node app,然后我们使用Forever的list选项,打印一系列的运行app。我们***次运行这个playbook时候,这list明显是空的,但是判断为空之后就会运行,如果app正在运行,我们不会启动另外一个实例了,为了避免这种情形,我们使用when语句,指定,当app的路径不在forever list的输出信息的时候,我们启动这个app。1.4 Node.js app服务器总结。在这时候上,你已经完成了playbook,然后安装一个简单的Node.js app,在80端口响应HTTP请求。为了运行这个playbook在一个服务器上,使用下面的命令,传递node_apps_location变量通过命令ansible-playbook --extra-vars="node_apps_location=/usr/local/opt/node"当服务器完成配置和部署服务器的时候,在浏览器中指定测试服务器的主机名查看效果简单,但是有效,我们已经在少于50行的YMAL文件中配置了一个Nodejs应用服务器到此结束,非常感谢朋友们的关注。1.5 问题问题1:当我在给100台服务器进行nodejs app部署的时候,到20台中断了,我再重新执行,他是一个怎么个过程,前面已经安装的软件包,进行的配置的会重新的再进行执行一遍还是跳过呢?麻烦大牛解答答:Ansible自身有幂等特性使其能有效保证所有操作的安全可靠性,针对执行失败的情况会自动在家目录下生成 对应的错误服务器列表 通过 --limit 再次有针对性的完成剩余工作问题2: 请问大侠的nodejs 是通过工具部署的? npm 好复杂啊哈,npm的配置是一次性的,初始配置确认比较耗时且麻烦,yum 或 npm 各有优劣,视业务而定吧问题3: --extra-vars= 请问企业中应用的多吗?答:多,最少在我们的工作中一直有应用,前几期的分享大家应该也有看到,这个参数应用的很多。但官网介绍的却一笔代过。还是建议大家多用问题4:当我通过ansible执行任务的过程中,会出现任务被长时间卡主的原因,这一般需要重哪些地方排查呢答:很多朋友遇到这个问题,一直有问,根据个人的经验建议如下几个方面排查:确实当前命令执行时间不长,pong 检测服务器存活有些命令需连接外网下载更新耗时较长的可检查网络宽带情况-vvv 是非常好的排查方式如若却无解,/etc/ansible/ansible.cfg 中缩短操作执行时长,等待最终结束尝试到此,关于“怎么在CentOS6.x服务器上配置Nodejs”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注辰讯云网站,小编会继续努力为大家带来更多实用的文章!...
本篇内容主要讲解“在RHEL8配置静态IP地址的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在RHEL8配置静态IP地址的方法有哪些”吧!在 Linux 服务器上工作时,在网卡/以太网卡上分配静态 IP 地址是每个 Linux 工程师的常见任务之一。如果一个人在 Linux 服务器上正确配置了静态地址,那么他/她就可以通过网络远程访问它。在本文中,我们将演示在 RHEL 8 服务器网卡上配置静态 IP 地址的不同方法。以下是在网卡上配置静态IP的方法:nmcli(命令行工具)网络脚本文件(ifcfg-*)nmtui(基于文本的用户界面)使用 nmcli 命令行工具配置静态 IP 地址每当我们安装 RHEL 8 服务器时,就会自动安装命令行工具 nmcli,它是由网络管理器使用的,可以让我们在以太网卡上配置静态 IP 地址。运行下面的 ip addr 命令,列出 RHEL 8 服务器上的以太网卡[root@linuxtechi ~]# ip addr正如我们在上面的命令输出中看到的,我们有两个网卡 enp0s3 和 enp0s8。当前分配给网卡的 IP 地址是通过 DHCP 服务器获得的。假设我们希望在第一个网卡 (enp0s3) 上分配静态 IP 地址,具体内容如下:IP 地址 = 192.168.1.4网络掩码 = 255.255.255.0网关 = 192.168.1.1DNS = 8.8.8.8依次运行以下 nmcli 命令来配置静态 IP,使用 nmcli connection 命令列出当前活动的以太网卡,[root@linuxtechi ~]# nmcli connectionNAME UUID TYPE DEVICEenp0s3 7c1b8444-cb65-440d-9bf6-ea0ad5e60bae ethernet enp0s3virbr0 3020c41f-6b21-4d80-a1a6-7c1bd5867e6c bridge virbr0[root@linuxtechi ~]#使用下面的 nmcli 给 enp0s3 分配静态 IP。命令语法:# nmcli connection modify <interface_name> ipv4.address <ip/prefix>注意: 为了简化语句,在 nmcli 命令中,我们通常用 con 关键字替换 connection,并用 mod 关键字替换 modify。将 IPv4 地址 (192.168.1.4) 分配给 enp0s3 网卡上,[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.addresses 192.168.1.4/24使用下面的 nmcli 命令设置网关,[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.gateway 192.168.1.1设置手动配置(从 dhcp 到 static),[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.method manual设置 DNS 值为 “8.8.8.8”,[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.dns "8.8.8.8"[root@linuxtechi ~]#要保存上述更改并重新加载,请执行如下 nmcli 命令,[root@linuxtechi ~]# nmcli con up enp0s3Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)以上命令显示网卡 enp0s3 已成功配置。我们使用 nmcli 命令做的那些更改都将长久保存在文件 etc/sysconfig/network-scripts/ifcfg-enp0s3 里。[root@linuxtechi ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3要确认 IP 地址是否分配给了 enp0s3 网卡了,请使用以下 IP 命令查看,[root@linuxtechi ~]#ip addr show enp0s3使用网络脚本文件(ifcfg-*)手动配置静态 IP 地址我们可以使用配置以太网卡的网络脚本或 ifcfg-* 文件来配置以太网卡的静态 IP 地址。假设我们想在第二个以太网卡 enp0s8 上分配静态 IP 地址:IP 地址 = 192.168.1.91前缀 = 24网关 =192.168.1.1DNS1 =4.2.2.2转到目录 /etc/sysconfig/network-scripts,查找文件 ifcfg-enp0s8,如果它不存在,则使用以下内容创建它,[root@linuxtechi ~]# cd /etc/sysconfig/network-scripts/[root@linuxtechi network-scripts]# vi ifcfg-enp0s8TYPE="Ethernet"DEVICE="enp0s8"BOOTPROTO="static"ONBOOT="yes"NAME="enp0s8"IPADDR="192.168.1.91"PREFIX="24"GATEWAY="192.168.1.1"DNS1="4.2.2.2"保存并退出文件,然后重新启动网络管理器服务以使上述更改生效,[root@linuxtechi network-scripts]# systemctl restart NetworkManager现在使用下面的 ip 命令来验证 IP 地址是否分配给网卡,[root@linuxtechi ~]# ip add show enp0s83: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:7c:bb:cb brd ff:ff:ff:ff:ff:ff inet 192.168.1.91/24 brd 192.168.1.255 scope global noprefixroute enp0s8 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe7c:bbcb/64 scope link valid_lft forever preferred_lft forever[root@linuxtechi ~]#以上输出内容确认静态 IP 地址已在网卡 enp0s8 上成功配置了。使用 nmtui 实用程序配置静态 IP 地址nmtui 是一个基于文本用户界面的,用于控制网络的管理器,当我们执行 nmtui 时,它将打开一个基于文本的用户界面,通过它我们可以添加、修改和删除连接。除此之外,nmtui 还可以用来设置系统的主机名。假设我们希望通过以下细节将静态 IP 地址分配给网卡 enp0s3 ,IP 地址 = 10.20.0.72前缀 = 24网关 = 10.20.0.1DNS1 =4.2.2.2运行 nmtui 并按照屏幕说明操作,示例如下所示,[root@linuxtechi ~]# nmtui选择第一个选项 “Edit a connection”,然后选择接口为 “enp0s3”,选择 “Edit”,然后指定 IP 地址、前缀、网关和域名系统服务器 IP,选择确定,然后点击回车。在下一个窗口中,选择 “Activate a connection”,选择 “enp0s3”,选择 “Deactivate” 并点击回车,现在选择 “Activate” 并点击回车,选择 “Back”,然后选择 “Quit”,使用下面的 ip 命令验证 IP 地址是否已分配给接口 enp0s3,[root@linuxtechi ~]# ip add show enp0s32: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:53:39:4d brd ff:ff:ff:ff:ff:ff inet 10.20.0.72/24 brd 10.20.0.255 scope global noprefixroute enp0s3 valid_lft forever preferred_lft forever inet6 fe80::421d:5abf:58bd:c47e/64 scope link noprefixroute valid_lft forever preferred_lft forever[root@linuxtechi ~]#以上输出内容显示我们已经使用 nmtui 实用程序成功地将静态 IP 地址分配给接口 enp0s3。到此,相信大家对“在RHEL8配置静态IP地址的方法有哪些”有了更深的了解,不妨来实际操作一番吧!这里是辰讯云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!...
本篇内容主要讲解“ceph配置日志使用独立分区的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ceph配置日志使用独立分区的方法”吧!查看当前日志所在的位置ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | grep osd_journal输出结果如下所示:[root@ceph-gw-209214 ~]# ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | grep osd_journal "osd_journal": "\/var\/lib\/ceph\/osd\/ceph-0\/journal",方式一、在使用ceph-disk添加osd时ceph-disk prepare --cluster ceph --cluster-uuid f453a207-a05c-475b-971d-91ff6c1f6f48 --fs-type xfs /dev/sdb1 /dev/sdc1 命令解释:ceph-disk prepare --cluster 集群名称 --cluster-uuid 集群id --fs-type 添加的osd的类型 数据存储位置(蓝底部分) 日志位置、注意,在准备磁盘之前应该充分规划好你服务器上的磁盘方式二、修改配置文件,增加[osd]osd journal = /dev/sda2osd journal size = 0保存退出ceph.conf文件随后执行ceph-osd --mkjournal -i 0;注意:分区要提前分配划分好方式三、1、修改配置文件/etc/ceph/ceph.conf 中添加下面配置[osd]osd journal = /var/log/$cluster-$id/journal2、替换osd设noout,并停止osd命令:ceph osd set noout /etc/init.d/ceph stop osd.1(停止osd) 手动移动日志 mv /var/lib/ceph/osd/ceph-1/journal /var/log/ceph-1/ 启动osd /etc/init.d/ceph start osd.1 ceph osd unset noout完成ceph集群日志的迁移更改。到此,相信大家对“ceph配置日志使用独立分区的方法”有了更深的了解,不妨来实际操作一番吧!这里是辰讯云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!...
这篇文章主要介绍“怎么在Linux下制作HTML幻灯片”,在日常操作中,相信很多人在怎么在Linux下制作HTML幻灯片问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在Linux下制作HTML幻灯片”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!准备工作:安装Pandoc首先,你需要安装文本转换的神器Pandoc:http://johnmacfarlane.net/pandoc/installing.html具体安装方法参见文档,在此不再赘述。 代码如下:$ cabal update $ cabal install pandoc书写内容内容是演示文稿的主体。PowerPoint或OpenOffice Impress里面的“大纲”就是用来把握这个主体的视图。这可以让写作者暂时忘记幻灯片的具体外观、排版这些表面化的东西,把集中力放到整个演讲的逻辑流程和提纲要领上。书写HTML幻灯片可以像日常记笔记一样简捷快速。实际上,这些幻灯片本身就是用轻量级标记语言写成的纯文本,你可以用任何一种Pandoc支持的标记语言(Markdown、org-mode、reST、Textile……)来书写其内容。在此以Markdown为例: 代码如下:% Nonsense Stuff % John Doe % March 22, 2005 # In the morning ## Getting up - Turn off alarm - Get out of bed ## Breakfast - Eat eggs - Drink coffee # In the evening ## Dinner - Eat spaghetti - Drink wine ------------------ ![picture of spaghetti](images/spaghetti.jpg) ## Going to sleep - Get in bed - Count sheep分级标题、列表、插入图片……等标准的Markdown语法均被支持,和平常用Markdown记笔记写博客无异。为了让Pandoc对不包含任何元信息的Markdown文本进行处理生成幻灯片,在文本开头需要包含三行以%打头的元信息:标题、作者和日期。为了生成合适的用于演示的HTML文档,需要记住的另一点是:在默认情况下每个二级标题是一张独立的幻灯片。这样在写作的时候,只需注意把每个二级标题下的内容控制在适当的长度。列表的显示效果可以人为设定,例如在幻灯片演示的时候逐条渐入,后文会提到。也可以使用$插入 TeX公式,Pandoc可以将其转换为被大部分现代浏览器支持的MathML,或借助MathJax在较旧浏览器中显示。也可以直接在文本中嵌入HTML,用于显示Markdown等标记语言不支持的表格,或控制字体大小,以及进行其他更加复杂的排版。当然,如果用到的HTML标签过多,这不是Markdown这些轻量级标记语言的错,也许是做幻灯片的方式出了问题。因为演示本身要传达的是内容,复杂的排版没有任何意义。定义样式目前Pandoc包含了对五种HTML幻灯片框架的支持: DZSlides Slidy S5 Slideous reveal.js当然,你实际上可以使用任何喜欢的幻灯片框架(比如Google I/O HTML5 slide template),只要让Pandoc在渲染HTML时使用你指定的模板即可。自定义HTML模板首先,如果你知道如何写CSS去定义页面外观、如何写JavaScript让<div>元素动起来,或者已经有了一个不错的HTML幻灯片模板,你就可以直接让Pandoc把Markdown转换成纯HTML片段,用来嵌到自己的模板里: 代码如下:$ pandoc slides.md -o slides.html生成一个完整的HTML页面(包含<html>、<head>、<body>标签和各种元信息): 代码如下:$ pandoc slides.md -o slides.html -sDZSlides当然,我们完全没有必要写自己的HTML模板,因为Pandoc已经提供了对多种幻灯片模板的支持。DZSlides便是其中最简单的一种,支持键盘操作→/←翻页,PgUp/PgDn,Home/End。Pandoc生成的DZSlides幻灯片中自包含了所需CSS和JavaScript,无需依赖任何外部文件。采用默认模板渲染一个独立的DZSlides幻灯片: 代码如下:$ pandoc slides.md -o slides.html -t dzslides -s若要对模板的样式进行调整,可以用--template指定自定义模板。默认的模板为default.dzslides,因此上述命令等效于: 代码如下:$ pandoc slides.md -o slides.html -t dzslides --template default.dzslides可以从这里https://github.com/jgm/pandoc-templates找到原来的模板,自行修改后替换掉原先的模板。其余幻灯片框架与此相仿,以后不再赘述。SlidyHTML Slidy是W3C开发的一个极简主义HTML幻灯片模板,没有任何多余的样式,支持鼠标单击翻页,键盘操作→/←,PgUp/PgDn,Home/End。采用默认模板渲染一个独立的Slidy幻灯片: 代码如下:$ pandoc slides.md -o slides.html -t slidy -s或指定自定义模板: 代码如下:$ pandoc slides.md -o slides.html -t slidy --template default.slidyPandoc生成的Slidy HTML依赖于http://www.w3.org/Talks/Tools/Slidy2/styles/slidy.css和http://www.w3.org/Talks/Tools/Slidy2/scripts/slidy.js这两个外部文件。若不想依赖http://www.w3.org/,可以将它们保存为本地文件。S5S5(Simple Standards-Based Slide Show System)是一个公有领域的HTML幻灯片规范。它支持鼠标单击翻页,键盘操作→/←,PgUp/PgDn,Home/End。为了使用S5作为幻灯片框架,需要从这里下载S5。解压之后把S5文件夹中的ui/default拷贝到幻灯片所在路径下,改名为s5/default即可。渲染幻灯片: 代码如下:$ pandoc slides.md -o slides.html -t s5 -s在S5的幻灯片界面上,鼠标移到右下角可以看到若干控制选项。SlideousSlideous是另一个有些年头的HTML幻灯片框架。支持鼠标单击翻页,键盘操作→/←,PgUp/PgDn,Home/End。下载http://goessner.net/download/prj/slideous/slideous.js和http://goessner.net/download/prj/slideous/slideous.css这两个文件,放到本地目录slideous/下即可。渲染幻灯片: 代码如下:$ pandoc slides.md -o slides.html -t slideous -sSlideous的界面上提供了比较丰富的控制选项。reveal.jsreveal.js这东西已经红得不能更红了,最近开始火起来的WYSIWYG在线幻灯片工具slid.es也是基于它。reveal.js的设计风格(字体、HTML5/CSS3效果)比起前面几个框架更加现代,所以如果没有特别的理由(旧浏览器兼容性)的话,reveal.js果然还是最应该推荐的一个。虽说reveal.js本身就提供对Markdown语法的支持,不过Pandoc的好处很明显,那就是一条命令解决问题,不需要用户接触任何HTML。首先需要从GitHub上获取https://github.com/hakimel/reveal.js,将reveal.js同名的文件夹放在幻灯片所在目录下即可: 代码如下:$ git clone https://github.com/hakimel/reveal.js渲染幻灯片: 代码如下:$ pandoc slides.md -o slides.html -t revealjs -s除了默认的外观主题以外,reveal.js还提供了多个主题可供选择, 代码如下:$ pandoc slides.md -o slides.html -t revealjs -s -V theme=beige default:(默认)深灰色背景,白色文字 beige:米色背景,深色文字 sky:天蓝色背景,白色细文字 night:黑色背景,白色粗文字 serif:浅色背景,灰色衬线文字 simple:白色背景,黑色文字 solarized:奶油色背景,深青色文字LaTeX Beamer最后,虽然不是HTML,Pandoc也可以用来将Markdown文件渲染成LaTeX beamer样式的PDF幻灯片。如需要打印而不是演示时特别有用。 代码如下:$ pandoc slides.md -o slides.pdf -t beamer 更多设置幻灯片级别(Slide level)在前文的例子里看到, 代码如下:# In the morning ## Getting up - Turn off alarm - Get out of bed1级标题In the morning后面紧跟2级标题Getting up,而2级标题Getting up后面的内容是显示在幻灯片上的主体内容,因此这里的Slide level为2。这意味着每个2级标题生成一张幻灯片。高于2级的标题(1级标题)生成一张独立的仅包含标题的幻灯片,而低于2级的标题(3级标题)将存在于上一级标题的幻灯片中,不单独生成新的幻灯片。可以使用--slide-level选项覆盖默认的Slide level。在reveal.js模板下,由于幻灯片的滚动方向可以是二维的(键盘→←↑↓),所以1级标题渲染为水平方向的幻灯片,2级标题渲染为竖直方向的幻灯片。“华丽丽的分割线”: ------------------用来强制生成新的幻灯片。渐进显示生成幻灯片时加入-i选项,用于控制列表的显示效果(逐条渐入)。 代码如下:$ pandoc slides.md -o slides.html -t slidy -s -i两段文字显示之间的人为停顿,用如下分割线: . . .TeX公式可以直接插入TeX公式: 代码如下:$e^x =\sum_{n=0}^\infty\frac{x^n}{n!} =\lim_{n\rightarrow\infty} (1+x/n)^n$MathML的渲染效果为: 代码如下:ex=∑n=0∞xnn!=limn→∞(1+x/n)n控制TeX公式渲染方式的选项有--mathml,--webtex,--mathjax和--latexmathml。(Chrome和Firefox均支持MathML)代码高亮风格控制代码高亮风格的选项有: --highlight-style pygments --highlight-style kate --highlight-style monochrome --highlight-style espresso --highlight-style haddock --highlight-style tango --highlight-style zenburn自定义CSS你当然可以通过修改相应模板文件夹下的CSS来实现自定义外观,不过也可以使用--css指定任何现成的CSS文件。提示板首先,提示板的功能仅适用于reveal.js。其次,由于浏览器的本地安全策略,需使用该功能的幻灯片必须在HTTP服务器上运行。在Markdown中插入标签<div class="notes">的小抄: 代码如下:<span class="nt"><div</span> <span class="na">class=</span><span class="s">"notes"</span><span class="nt">></span> This is my note. - It can contain markdown - like this list <span class="nt"></div></span>使用键盘s键打开提示板。当然,这个提示板是用来给演讲者自己看的,是不用mirror到外接投影仪的。到此,关于“怎么在Linux下制作HTML幻灯片”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注辰讯云网站,小编会继续努力为大家带来更多实用的文章!...
这篇文章主要介绍shell语法检查模式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!启用 verbose 调试模式在进入本指导的重点之前,让我们简要地探索下 verbose 模式。它可以用 -v 调试选项来启用,它会告诉 shell 在读取时显示每行。要展示这个如何工作,下面是一个示例脚本来批量将 PNG 图片转换成 JPG 格式。将下面内容输入(或者复制粘贴)到一个文件中。#!/bin/bash#convertfor image in *.png; doconvert "$image" "${image%.png}.jpg"echo "image $image converted to ${image%.png}.jpg"doneexit 0接着保存文件,并用下面的命令使脚本可执行:$ chmod +x script.sh我们可以执行脚本并显示它被 Shell 读取到的每一行:$ bash -v script.sh在 Shell 脚本中启用语法检查调试模式使用 -n 激活语法检查模式它会让 shell 读取所有的命令,但是不会执行它们,它(shell)只会检查语法。一旦 shell 脚本中发现有错误,shell 会在终端中输出错误,不然就不会显示任何东西。激活语法检查的命令如下:$ bash -n script.sh因为脚本中的语法是正确的,上面的命令不会显示任何东西。所以,让我们尝试删除结束 for 循环的 done 来看下是否会显示错误:下面是修改过的含有 bug 的批量将 png 图片转换成 jpg 格式的脚本。#!/bin/bash#script with a bug#convertfor image in *.png; doconvert "$image" "${image%.png}.jpg"echo "image $image converted to ${image%.png}.jpg"exit 0保存文件,接着运行该脚本并执行语法检查:$ bash -n script.sh从上面的输出中,我们看到我们的脚本中有一个错误,for 循环缺少了一个结束的 done 关键字。shell 脚本从头到尾检查文件,一旦没有找到它(done),shell 会打印出一个语法错误:script.sh: line 11: syntax error: unexpected end of file我们可以同时结合 verbose 模式和语法检查模式:$ bash -vn script.sh我们还可以通过修改脚本的首行来启用脚本检查如下面的例子:#!/bin/bash -n#altering the first line of a script to enable syntax checking#convertfor image in *.png; doconvert "$image" "${image%.png}.jpg"echo "image $image converted to ${image%.png}.jpg"exit 0如上所示,保存文件并在运行中检查语法:$ ./script.shscript.sh: line 12: syntax error: unexpected end of file此外,我们可以用内置的 set 命令来在脚本中启用调试模式。下面的例子中,我们只检查脚本中的 for 循环语法。#!/bin/bash#using set shell built-in command to enable debugging#convert#enable debuggingset -nfor image in *.png; doconvert "$image" "${image%.png}.jpg"echo "image $image converted to ${image%.png}.jpg"#disable debuggingset +nexit 0再一次保存并执行脚本:$ ./script.sh以上是“shell语法检查模式的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注辰讯云资讯频道!...
本篇文章给大家分享的是有关javascript中如何保留两位小数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。四舍五入以下处理结果会四舍五入:var num =2.446242342;num = num.toFixed(2); // 输出结果为 2.45不四舍五入以下处理结果不会四舍五入。第一种,先把小数变整数:Math.floor(15.7784514000 * 100) / 100 // 输出结果为 15.77第二种,当作字符串,使用正则匹配:Number(15.7784514000.toString().match(/^\d+(?:\.\d{0,2})?/)) // 输出结果为 15.77,不能用于整数如 10 必须写为10.0000以上就是javascript中如何保留两位小数,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注辰讯云资讯频道。...
layui中如何设置checkbox勾选,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。方法1在返回的json中设置LAY_CHECKED为true,页面上的checkbox就是选中状态了。data":[ {"name":"北京市","areaType":"省/直辖市","id":"110000","LAY_CHECKED":true}, {"name":"市辖区","areaType":"地市","id":"110100","LAY_CHECKED":true}, {"name":"县","areaType":"地市","id":"110200","LAY_CHECKED":false}]相关推荐:《layui框架教程》方法2如果返回的数据中没有LAY_CHECKED怎么办?比如说返回的是这样的数据:data":[ {"name":"北京市","areaType":"省/直辖市","id":"110000","checked":true}, {"name":"市辖区","areaType":"地市","id":"110100","checked":true}, {"name":"县","areaType":"地市","id":"110200","checked":false}]注意:这里用的是checked来标识是否选中,而非LAY_CHECKED。这时候可以修改下页面的js。layui.use('table', function(){ var $ = layui.$; var table = layui.table; //在使用table之前加上下面这句就可以了 table = $.extend(table, {config: {checkName: 'checked'}}); table.render({ ... });});看完上述内容,你们掌握layui中如何设置checkbox勾选的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注辰讯云资讯频道,感谢各位的阅读!...
这篇文章将为大家详细讲解有关json文件中如何加注释,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。添加注释//或者/**/在JSON文件中是不允许的JSON有两种数据结构:● 名称/值对的集合:key : value样式;● 值的有序列表:就是Array;而在JSON的文档中说明只要是不符合上面两种结构的都不被支持,并提示错误。那么JSON如何才能添加注释?如果确实需要在.json文件中使用注释,可以使用以下两种方式:1、使用key : value添加可以使用key : value在JSON中增加一个充当注释的数据元素。如果有必要,在JSON数据说明文档告诉使用此JSON数据的客户端:在解析数据时忽略"comment"数据元素。2、使用JSON.minify()函数;通过使用JSON.minify(test.json)可以删除test.json文件中的注释及空格,从而使带有注释的.json文件通过编译关于json文件中如何加注释就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...
本篇文章给大家分享的是有关CSS3中如何使用first-child选择器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。CSS :first-child选择器用于匹配其父元素中的第一个子元素;即只有当元素是其父元素的第一个子元素时才会匹配元素。CSS3 :first-child选择器怎么用?:first-child 选择器匹配其父元素中的第一个子元素。语法:元素:first-child{ css样式}例:匹配 <p> 的父元素的第一个<p>元素p:first-child{ background-color:yellow;}注释:所有主流浏览器都支持 :first-child 选择器。对于 IE8 及更早版本的浏览器中的 :first-child,必须声明 <!DOCTYPE>。CSS :first-child选择器的使用示例示例1:选择每个 <p> 中的每个 <i> 元素并设置其样式,其中的 <p> 元素是其父元素的第一个子元素:<!DOCTYPE html><html><head><style>p:first-child i{background:yellow;}</style></head><body><p>I am a <i>strong</i> man. I am a <i>strong</i> man.</p><p>I am a <i>strong</i> man. I am a <i>strong</i> man.</p></body></html>效果图:示例2:每一个<ul>元素的第一个子元素选择的样式<!DOCTYPE html><html><head><meta charset="utf-8"> <style>ul>:first-child{background:yellow;}</style></head><body><ul> <li>Coffee</li> <li>Tea</li> <li>Coca Cola</li></ul><ul> <li>Coffee</li> <li>Tea</li> <li>Coca Cola</li></ul></body></html>以上就是CSS3中如何使用first-child选择器,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注辰讯云资讯频道。...