taohui.org.cn建站历程

article/2025/9/27 13:37:10

一直以来都在Qzone、CSDN等上面写博客,偶尔有些想法就在Paas平台上搭建服务,新浪和曾经的google上都用过其appengine。可是在别人的平台上写东西,总归有些不方便,有受制于人的感觉。《深入理解Nginx》这本书的在线支持站点,当时因为时间紧,就随便在weebly平台弄了个下载示例代码和写作勘误的页面,毕竟离有效的在线支持网站还是有差距的,至少读者不容易在网站上反馈。想到毕竟在阿里云的弹性计算工作,总不能都不用自己开发的产品吧?于是就买了阿里云的低端服务器,开始了我的第一次完整的建站历程。

作为一个10年互联网后台开发经验的程序员,对于后台开发自然没有问题,可是仔细查了查自己的知识储备与建站所需的知识点,还真是不太匹配。我所熟悉的大规模分布式、高性能服务器设计,其实在流量极小的个人站点上用不上什么,小站点更强调的快速堆砌功能反而是我欠缺的。前端网页设计经验的缺乏其实是最大难题,对于HTTP协议和基本的HTML知识虽然熟,可是最需要了解的CSS、JQuery、Javascript等却几乎就是门外汉。怎么入手呢?

先选定语言吧。虽然长年在C和C++上打滚,但对python并不陌生,尤其是非常喜欢它的语法,很漂亮!更重要的一点是,它的开发效率正是这种小站点所需要的,运行效率差点反而无所谓。选定python,就选择了一条不断“找前人肩膀站立”之路了,不像C语言的项目常常需要“自己动手、丰衣足食”的完成各种组件,python项目就是找各种已完成组件,找到其相应的、与自己软件匹配版本的使用方法。

先要选定web框架,而得到广泛应用的django就迈入了眼帘。现在它已经发展到了django1.6版本,就用最新的了,后面发现其新版本往往不兼容老版本上的组件,这好像是python世界的惯例,真够BT的(所以,virtualEnv才有市场,所以才需要在每个python工程上使用virtualEnv虚拟python环境,以支持多个项目下同一个python组件的不同版本并行存在)。有了django,其实很多web开发的组件都具备了。首先,django是一个“关系数据库驱动”的WEB框架,可见,其先天就是为小站点而生。安装了mysql-python库后,就可以利用django的框架来快速操作mysql数据库了。django的模板系统也是必用的,它将表现层与业务层分离,即,将html与数据分离了,它的各种用法可以在djangobook中找到,当然,这本书的中文版有些老了,1.6的django需要找英文资料。有了模板和数据库的MTV架构,站点已经可以慢慢的边coding边调试了,我们再来看环境。

阿里云服务器实在是小站点的首选,我真不是在做广告:-)

1、足够便宜。最低配是每月55元,年付费还能便宜点。在最低配上现在负载都达不到0.1。

2、带宽不是按量计费的,而是限定了带宽的速度上限。对于无法预估流量的新网站,还是适合的。而且,我可以把图片等耗流量的文件放在服务器上,而不用去考虑为了计费去把图片放在其他平台上,增加复杂度。

3、IO虽然差,可是可靠性高,写磁盘时是强制3份数据写成功,潜台词就是我不用每天备份mysql数据、静态图片等资源了。这种小站点也用不到什么磁盘IO。

4、如果真的站点访问量上来了,服务器资源不够了,加钱在线升级服务器配置呗。

5、云监控是免费的。很有用的东东,关键是不怎么消耗本就是低端服务器的linux资源,后文再详述。

6、带宽稳定。阿里巴巴的ABTN骨干网络还是很靠谱的,对电信、联通网络的支持都很好。

7、备案方便,后文再详述。

购买阿里云服务器当然选择了linux系统,稳定高效的无二选择,随系统阿里云对linux赠送了20G的系统盘。一般来说是够用了,主要是目前我们在做云磁盘,使得用户购买的数据盘以后可以脱离虚拟机而存在。我希望一些数据还是放在数据盘方便以后的管理,就又买了块数据盘。需要注意的是,拿到root及密码、公网IP的服务器,SSH登上去会找不到数据盘,至少从容量上是找不到的,这是因为需要手工挂载。这个真的是阿里云弹性计算需要改进的地方。挂载方式在阿里云官网FAQ里都有。

接下来,就是要充分使用云主机了。目前云盾和云监控是免费的,云盾自动生效,而云监控是要安装一个agent在自己的服务器上,这个agent会定期的上报一些检查信息到云监控服务里,这样从WEB管理控制台上就可以设置监控阀值。每个月有1000条免费通知短信,当服务器的监控项发生变化时,例如进程挂掉、磁盘写满等,就可以及时手机得到通知了。

下面开始讨论网站框架,如下图所示:


前端放Nginx基本是必须的,django没有并发处理能力,而Nginx可以处理十万百万级的并发连接。静态文件特别是大量的图片都交由Nginx加本地磁盘处理,其执行效率不用担心,至少在现在的访问量下是无所谓的。Nginx的access访问日志很关键,它可以给出很有意义的数据分析,所以,慎重设置它的格式,把想统计的信息都记录下来。然后安装awstats这个软件,配置好解析access日志的格式。将access按天来切分文件是个很好的处理方式,awstats的crontab脚本会分析、累加每个过去日子的统计结果,使在页面上可以看到网站的运行情况。

如果是图片服务器,Nginx还可以承担更重要的责任,我们常见的缩略图功能就很有必要。原始图片可能以M为单位,传输这样的图片然后在浏览器上压缩为缩略图,这显示会耗尽我们本就不多的带宽。将Nginx的proxy cache功能和image filter引入,就可以把图片在服务器端压缩后再缓存到硬盘里,下次拉取只取压缩过的图片,减少带宽的损耗。实际上image filter模块功能很弱,只支持一种压缩率,而Nginx的rewriter模块提供了脚本式的变量赋值功能,综合起来就可以很方便的提供各种压缩分辨率,例如下面这段配置,就可以根据URI内容来指定分辨率,并将压缩图缓存之:

<span class="name" style="box-sizing: border-box;">location</span> <span class="operator" style="box-sizing: border-box;">/</span><span class="keyword" style="box-sizing: border-box; color: rgb(59, 13, 6); font-weight: bold;">static</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">resize</span> <span class="punctuation" style="box-sizing: border-box;">{</span><span class="name" style="box-sizing: border-box;">alias</span> <span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">mnt</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">nginx</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">resize_image</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">set</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">width</span> <span class="literal number integer" style="box-sizing: border-box;">550</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">set</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">height</span> <span class="literal number integer" style="box-sizing: border-box;">500</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">set</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">dimens</span> <span class="literal string" style="box-sizing: border-box; color: rgb(12, 84, 4);">""</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="keyword" style="box-sizing: border-box; color: rgb(59, 13, 6); font-weight: bold;">if</span> <span class="punctuation" style="box-sizing: border-box;">(</span><span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">uri</span> <span class="operator" style="box-sizing: border-box;">~*</span> <span class="literal string" style="box-sizing: border-box; color: rgb(12, 84, 4);">"^/static/resize_(\d+)x(\d+)/(.*)"</span> <span class="punctuation" style="box-sizing: border-box;">)</span> <span class="punctuation" style="box-sizing: border-box;">{</span><span class="name" style="box-sizing: border-box;">set</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">width</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="literal number integer" style="box-sizing: border-box;">1</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">set</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">height</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="literal number integer" style="box-sizing: border-box;">2</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">set</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">image_path</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="literal number integer" style="box-sizing: border-box;">3</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">set</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">demins</span> <span class="literal string" style="box-sizing: border-box; color: rgb(12, 84, 4);">"_$1x$2"</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="punctuation" style="box-sizing: border-box;">}</span><span class="keyword" style="box-sizing: border-box; color: rgb(59, 13, 6); font-weight: bold;">if</span> <span class="punctuation" style="box-sizing: border-box;">(</span><span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">uri</span> <span class="operator" style="box-sizing: border-box;">~*</span> <span class="literal string" style="box-sizing: border-box; color: rgb(12, 84, 4);">"^/static/resize/(.*)"</span> <span class="punctuation" style="box-sizing: border-box;">)</span> <span class="punctuation" style="box-sizing: border-box;">{</span><span class="name" style="box-sizing: border-box;">set</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">image_path</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="literal number integer" style="box-sizing: border-box;">1</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="punctuation" style="box-sizing: border-box;">}</span><span class="name" style="box-sizing: border-box;">set</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">image_uri</span> <span class="keyword" style="box-sizing: border-box; color: rgb(59, 13, 6); font-weight: bold;">static</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">image_resize</span><span class="operator" style="box-sizing: border-box;">/</span><span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">image_path</span><span class="operator" style="box-sizing: border-box;">?</span><span class="name" style="box-sizing: border-box;">width</span><span class="operator" style="box-sizing: border-box;">=</span><span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">width</span><span class="operator" style="box-sizing: border-box;">&</span><span class="name" style="box-sizing: border-box;">height</span><span class="operator" style="box-sizing: border-box;">=</span><span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">height</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="keyword" style="box-sizing: border-box; color: rgb(59, 13, 6); font-weight: bold;">if</span> <span class="punctuation" style="box-sizing: border-box;">(</span><span class="operator" style="box-sizing: border-box;">!-</span><span class="name" style="box-sizing: border-box;">f</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">request_filename</span><span class="punctuation" style="box-sizing: border-box;">)</span> <span class="punctuation" style="box-sizing: border-box;">{</span><span class="name" style="box-sizing: border-box;">proxy_pass</span> <span class="name" style="box-sizing: border-box;">http</span><span class="operator" style="box-sizing: border-box;">:</span><span class="comment single" style="box-sizing: border-box; color: rgb(92, 101, 118);">//127.0.0.1:9000/$image_uri;
</span>                <span class="keyword" style="box-sizing: border-box; color: rgb(59, 13, 6); font-weight: bold;">break</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="punctuation" style="box-sizing: border-box;">}</span><span class="name" style="box-sizing: border-box;">proxy_store</span> <span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">mnt</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">nginx</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">resize</span><span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">demins</span><span class="operator" style="box-sizing: border-box;">/</span><span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">image_path</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">proxy_store_access</span> <span class="name" style="box-sizing: border-box;">user</span><span class="operator" style="box-sizing: border-box;">:</span><span class="name" style="box-sizing: border-box;">rw</span> <span class="name" style="box-sizing: border-box;">group</span><span class="operator" style="box-sizing: border-box;">:</span><span class="name" style="box-sizing: border-box;">rw</span> <span class="name" style="box-sizing: border-box;">all</span><span class="operator" style="box-sizing: border-box;">:</span><span class="name" style="box-sizing: border-box;">r</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">proxy_temp_path</span> <span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">mnt</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">tmp</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">images</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">proxy_set_header</span> <span class="name" style="box-sizing: border-box;">Host</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">host</span><span class="punctuation" style="box-sizing: border-box;">;</span>
<span class="punctuation" style="box-sizing: border-box;">}</span><span class="name" style="box-sizing: border-box;">location</span> <span class="operator" style="box-sizing: border-box;">/</span><span class="keyword" style="box-sizing: border-box; color: rgb(59, 13, 6); font-weight: bold;">static</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">image_resize</span> <span class="punctuation" style="box-sizing: border-box;">{</span><span class="name" style="box-sizing: border-box;">alias</span> <span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">mnt</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">images</span><span class="operator" style="box-sizing: border-box;">/</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">image_filter</span> <span class="name" style="box-sizing: border-box;">resize</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">arg_width</span> <span class="error" style="box-sizing: border-box; color: red; font-weight: bold; font-family: sans-serif;">$</span><span class="name" style="box-sizing: border-box;">arg_height</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">image_filter_jpeg_quality</span> <span class="literal number integer" style="box-sizing: border-box;">75</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">allow</span> <span class="literal number float" style="box-sizing: border-box;">127.0.0.0</span><span class="operator" style="box-sizing: border-box;">/</span><span class="literal number integer" style="box-sizing: border-box;">8</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">deny</span> <span class="name" style="box-sizing: border-box;">all</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="name" style="box-sizing: border-box;">error_log</span> <span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">tmp</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">test</span><span class="punctuation" style="box-sizing: border-box;">.</span><span class="name" style="box-sizing: border-box;">log</span> <span class="name" style="box-sizing: border-box;">debug</span><span class="punctuation" style="box-sizing: border-box;">;</span>
<span class="punctuation" style="box-sizing: border-box;">}</span><span class="name" style="box-sizing: border-box;">location</span> <span class="operator" style="box-sizing: border-box;">/</span><span class="keyword" style="box-sizing: border-box; color: rgb(59, 13, 6); font-weight: bold;">static</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">image</span> <span class="punctuation" style="box-sizing: border-box;">{</span><span class="name" style="box-sizing: border-box;">alias</span> <span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">mnt</span><span class="operator" style="box-sizing: border-box;">/</span><span class="name" style="box-sizing: border-box;">images</span><span class="operator" style="box-sizing: border-box;">/</span><span class="punctuation" style="box-sizing: border-box;">;</span><span class="punctuation" style="box-sizing: border-box;">}</span>

django定位为处理动态内容,其实也就是除了静态文件外的所有URL。由django的模板设计HTML,而由mysql里的数据来渲染模板输出HTML页面。这套系统在django book中有详细描述,这里不提。同时,mysql的访问速度是较慢的,用全内存的memcached服务来缓存mysql表数据也是一个很好的选择。django book里仍然有说过用法。

站长管理站点内容时,使用admin功能来直接修改mysql数据库是个几乎最佳选择。django先天对此支持的极好。所以,站点内容尽量向mysql里放吧,这样可以完全在web页面上来管理站点,而不用ssh登上后操作。

对于我最不熟悉的CSS就完全靠bootstrap了。这套系统把常见的CSS、js、jquery都封装成各种CSS类了,使用起来很简单,轻松把一些复杂的页面功能搞定。

如果是博客,那么评论系统就非常重要。当然,自己搞一个用户系统肯定不靠谱,多少用户会在一个小站点上在注册用户记住密码呢?使用已有的如微博、QQ等帐户系统肯定是利人利己的。基于这样的登陆系统再存储评论数据当然是王道,可是时间有限啊,实在没功夫了,这时看到了多说,这个平台就是为小站点们创建的,它把各站点的评论数据放在它的数据库里,这也是多说能拿风投的核心竞争力了吧?使用多说很方便,直接复制一些代码就搞定了。

怎样录入博客呢?输入字符串加回车?太简单了,这样的博客太难看。输入HTML代码?太复杂了,每篇博客使用html的各种标签,效率太低了。于是,在python世界就主推了一个文档语言,叫做reStructureText格式,简写为RST格式。使用它来录入博客内容,再用一些python库将RST格式转到HTML格式即可。在django1.6中,我使用了rstify库来完成转换工作。

一个技术站点最重要的就是展示源代码了。如果能把源代码按语法来展示,类似“printf“这样的关键字高亮显示,岂不是很好?已经有pygments库完成这件事了,同时,rstify就集成了这一功能,使得在rst格式的输入中直接在HTML加CSS指定样式里可以高亮显示源码。

最后说说备案那些事。web服务调试通过,域名也买好了,可是用公网IP访问就是好的,用taohui.org.cn域名访问却总是失败!查看access日志看到错误码是499,很诡异,这是客户端程序主动关连接,可能吗?客户端是浏览器,不会干这事的。那一定是云主机前端的网络出问题了。查了下才发现,原来是国内的Iaas提供商都强制域名必须先在国家备案才允许访问!于是开始查如何备案。阿里云的备案算是非常替小站长考虑了,一系列流程都可以在家用电脑搞定,发拍照的备案幕布速度很快,基本一周搞定,域名可以使用了。

到此,简单的博客已经有了。选用django作为web实现,就是在不断的选择”前人成果“来实现功能,python确实担当得起。这里很多参考了https://github.com/the5fire/django_selfblog开源博客的实现,感谢这位同学的无私分享。其实这个网站的定位并不只是博客,后续我会再修改当前架构,以适应它的定位:展示我的各种想法。未来准备先上一个”孕妈“应用,首先帮助媳妇将养身体:-)



http://chatgpt.dhexx.cn/article/Br9D5pxK.shtml

相关文章

64位投影机专业测试软件,软件分享 篇十四:利用投影仪提高生活质量 —— 自用软件推荐...

软件分享 篇十四:利用投影仪提高生活质量 —— 自用软件推荐 2019-12-30 21:08:51 8点赞 121收藏 6评论 自从家里购入了投影仪以后,电视就变成摆设了 。。。本篇分享我自己经常用的几个投影软件产品评测 篇七:NAS影片播放神器 —— 新开发版体验测试V19.0KODI这款播放器相信…

强强联手,丝滑办公新体验!IdeaHub+华为云会议实测

目录 1. 前言 2. 软硬结合&#xff0c;天生一对 3. 全方位功能体验 3.1 IdeaHub接入华为云会议 3.2 随时随地一键开会 3.3 天生高清 3.3.1 高清视频 3.3.2 纯净音质 3.3.3 智能导播、智能音幕 3.4 天生融合 3.4.1 开会白板 3.4.2 无线投屏 3.4.3 一键流转 3.4.4 …

密码学(二月最佳)

《主干目录》 第一代加密 隐藏 第二代加密 移位 替代 同音替代 第三代加密 维吉尼亚加密 第四代加密 Enigma(恩尼格玛机) 第五代加密 DES 第六代加密 RSA 第七代加密 量子加密 密码学数千年的发展史&#xff0c;加密与解密不断博弈。 加密解密算法层出不穷&#xff0c;因此抓住…

【数智化案例展】深农集团——守护深圳“菜篮子”,腾讯安全携手深农集团保供稳价格...

腾讯安全案例 本项目由腾讯安全投递并参与“数据猿行业盘点季大型主题策划活动——《2022中国企业数智化转型升级创新服务企业》榜单/奖项”评选。 数据智能产业创新服务媒体 ——聚焦数智 改变商业 深圳全面升级疫情管控措施后&#xff0c;农产品供应商情况如何&#xff0c;相…

MAXHUB会议平板的无线投屏怎么用?

过去,一个功能完备的会议室中,至少要备齐白板、投影仪、幕布、电脑、音响等设备才能保证会议内容能够完整的展现。因此稍微小一点的会议室就会被塞得满当当的。另外,投影仪受光线影响,还会出现投影不清晰的情况,需要把会议室光线调暗,因此开会时总是黑漆漆的。现在,智能…

如何在Ubuntu上安装OnlyOffice Docs 7.1?

如何在Ubuntu上安装OnlyOffice Docs 7.1&#xff1f; 什么是OnlyOffice Docs&#xff1f; OnlyOffice Docs是一套在线办公软件&#xff0c;可以打开阅读并编辑文档、表格和幻灯片文件&#xff0c;完全兼容开放XML格式Office文档&#xff1a;.docx、.pptx、.xlsx&#xff0c;并…

Java常见工具安装及环境配置

目录 1、JDK安装及配置 JDK安装 2、笔记推荐 MarkDown笔记 Typora 云笔记 语雀 印象 幕布 枫叶云笔记 本地笔记 Sublime Text Notepad 3、MySQL安装及可视化工具 3.1、MySQL安装教程&#xff1a;保姆级教程 3.2、可视化管理工具 5、IDE IDEA 新建工程 导入…

阿里云服务器绑定域名、esc绑定域名、域名备案

准备工作&#xff1a; 1、购买阿里云esc服务器(建议学生认证再买&#xff0c;的确是便宜很多很多) 2、购买域名&#xff08;建议也在阿里云买&#xff0c;操作的时候可能会方便一些&#xff0c;具体不知道&#xff09; 3、域名备案&#xff08;这一步有点复杂&#xff0c;我下面…

疫情之下「在家办公模式」开启,你该选择哪些远程协同工具?

作者 | Aholiab 编辑 | 胡巍巍 来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 随着抗击新型冠状病毒感染疫情的不断深入&#xff0c;中国的应对举措受到了国际社会的高度关注。周密部署、亲临一线、精诚团结&#xff0c;成了这次疫情战役的关键总结。除了医护人员…

奉劝那些想涨工资的程序员,这些 IT 大神们都在用的网站,你越早知道越好(建议收藏)!!...

点击关注公众号&#xff0c;回复“1024”获取2TB学习资源&#xff01; 作为一个程序员、码农、新时代的农民工来说&#xff0c;一些必备的网站&#xff08;如&#xff1a;搜索引擎、代码管理、技术学习、工具查找、技术博客等&#xff09;是非常必要的。 所以&#xff0c;今天民…

html入门学习笔记(2)(html整理)

最近使用了一款软件"幕布"最新幕布下载&#xff0c;通过点击此链接注册随机获取高级版升级码&#xff0c;制作出了最近所学的HTML知识脑图&#xff0c;分享如下

PPT制作技术收集

1. 两幅图片同时动作 PowerPoint的动画效果比较多&#xff0c;但图片只能一幅一幅地动作。如果你有两幅图片要一左一右或一上一下地向中间同时动作&#xff0c;可就麻烦了。其实办法还是有的&#xff0c;先安置好两幅图片的位置&#xff0c;选中它们&#xff0c;将之组合起来&a…

Java根据模板导出PPT

如何导出PPT Java生成或者导出PPT的问题&#xff0c;都可以归为一类问题&#xff1a;根据模板导出PPT。毕竟这样做&#xff0c;比直接生成PPT要简单。因为工作中&#xff0c;遇到了要生成PPT的需求&#xff0c;所以做了一个根据模板PPT&#xff0c;生成目标PPT的例子&#xff…

LaTex - PPT 换页动态效果(亲测有效)

1 简介 生成的PDF文件默认是全屏打开。 2 源码 \documentclass[table,CJK]{beamer}%支持中文 \usepackage{ctex} %添加动画 \usepackage{animate}%打开即全屏 \hypersetup{backref,pdfpagemodeFullScreen,colorlinkstrue} \usepackage{hyperref} \hypersetup{pdfpagemodeFull…

鼠标悬停效果 PPT制作

鼠标悬停效果实现 在制作PPT时&#xff0c;有时候需要实现鼠标的悬停效果&#xff0c;即将鼠标放置在某个按钮或图片上&#xff0c;实现动态变化的效果。 目标是&#xff1a; 当鼠标悬停在一些人物名字上时&#xff0c;出现该人物的个人信息。 具体做法是&#xff1a; 设置初…

答辩ppt怎么做动态任务时钟制作PPT教程(二)

本文来自BX教程网www.benxitj.com:整理编辑 - 原文出处 www.benxitj.com/Article/?407/59.html 转载注明答辩ppt怎么做 组合部件制造:制造办法:(1.将以前制造的各项部件组合;2.增加上工夫及笔墨) 动画制造: 制造办法:(1.笔墨局部动画——动画——浮入&#xff08;向上&#x…

制作PPT课件

点击下载 更多分享&#xff1a;www.diguage.xyz 好的PowerPoint课件需要有以下几点&#xff1a; PPT课件的首页要整洁 首页是一个PPT课件等待正式上课前使用的一个页面&#xff0c;一般来说是一个欢迎页面&#xff0c;这里不需要太多的内容&#xff0c;但可以稍华丽一点&…

Latex beamer 制作 PPT

Latex beamer 制作 ppt 转载于 Latex beamer制作ppt 改了几个错别字&#xff0c;嘻嘻 参考地址 使用初探 结果展示 注意 参考地址 latex与word&#xff0c;ppt是目前用得最多得排版工具。然后&#xff0c;大部分人熟悉的多是word&#xff0c;事实上latex排版能力比word,ppt…

Latex beamer制作ppt

latex beamer制作ppt 参考地址使用初探结果展示注意 参考地址 latex与word&#xff0c;ppt是目前用得最多得排版工具。然后&#xff0c;大部分人熟悉的多是word&#xff0c;实时上latex排版能力比word,ppt更方便。其使用代码实现插入图片、公式及表格编辑&#xff0c;代码自动…

php 制作ppt,PPT制作三个基本要素是什么?

PPT制作三个基本要素是什么&#xff1f; 1、一个PPT只为一类人服务&#xff0c;针对不同听众制作不同层次内容&#xff1b; 2、PPT永远是为听者服务&#xff1b; 3、PPT只讲一个重点&#xff0c;不要试图在某个PPT中既讲技术&#xff0c;又讲管理。 PPT优势 1.使用 Microsoft O…