Ngnix的功能非常强大，配置也十分灵活，下面是一些使用用一些常用配置： 禁止使用IP地址访问网站 IP地址访问很不友好，但是默认IP的访问是被允许的，以下设置可以禁止通过IP访问服务器网站。 server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 403; } 仅允许指定用户的IP访问网站 server { # 其它配置代码 location / { # 其它配置代码 # 只允许ip为8.8.8.8的用户进行访问。 allow 8.8.8.8; # 拒绝所有的ip访问，这样设置后，就只有ip为8.8.8.8可以访问网站。拒绝后返回的是403错误 deny all; } } 允许跨域访问及设置白名单域名 跨域的访问十分普遍，以下设置允许其他域名的跨域访问，同时还进行白名单设置 server { # 其它配置代码 location / { # 跨域允许设置，允许所有跨域 add_header 'Access-Control-Allow-Origin' *; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; if ($request_method = 'OPTIONS') {# 处理OPTIONS请求 return 204; } # 跨域允许设置结束 # 防盗链设置，因为上述跨域是允许所有的，这里就要设置防盗链从而进行域名的白名单设置 valid_referers none blocked *.baidu.com *.sina.com.cn; if ($invalid_referer) { #返回一个盗链图片，或直接返回403 # rewrite ^/ http://ww4.sinaimg.cn/bmiddle/051bbed1gw1egjc4xl7srj20cm08aaa6.jpg; return 403; } # 如果要将禁止特定后缀文件的盗链，则可将上述代码放在下面里面 # location ~* \.(js|css|gif|jpg|png|jpeg)$ { #} } } 反向代理某个域名 server { listen 80; server_name www.yovisun.com; #用户访问的域名 location / { proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://proxy.yovisun.com; # 服务器实际去访问的代理域名 } } 反向代理某个域名，并在url上追加参数 下述对/avatar/目录下的所有文件，都在url后面追加：detail=abcd server { listen 80; server_name www.yovisun.com; #用户访问的域名 # 头像图片转接到oss内部 location ~* /avatar/ { add_header backendIP $upstream_addr; add_header backendCode $upstream_status; set $delimeter ""; if ($is_args) { set $delimeter "&"; } set $args $args${delimeter}detail=abcd; proxy_pass http://proxy.yovisun.com; proxy_set_header Host www.yovisun.com; } } 伪静态（Yii2设置） 伪静态的需求非常普遍，下面是Yii2框架推荐的配置 server { listen 80; server_name www.yovisun.com; root "C:/www/my/web"; index index.php; # access_log /path/to/basic/log/access.log; # error_log /path/to/basic/log/error.log; location / { index index.php index.html error/index.html; #Yii的伪静态 try_files $uri $uri/ /index.php$is_args$args; autoindex off; } # 避免避免Yii处理对不存在的静态文件的调用 location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { try_files $uri =404; } # deny accessing php files for the /assets directory location ~ ^/assets/.*\.php$ { deny all; } location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } location ~* /\. { deny all; } } http（80端口）的链接301跳转到对应的https（443） server { listen 80; server_name www.域名.com; rewrite ^(.*)$ https://${server_name}$1 permanent; }
近期，大家在使用电脑访问SCIhub搜索文章后出现空白页面，无法下载。经测试，手机版本可以正常下载，请大家使用【手机】输入SCIhub网址搜索即可下载，如果你熟悉计算机，可以直接用打开PC浏览器模拟手机也可以下载（推荐chrome）。下面是在电脑上使用chrome浏览器模拟手机的视频方法。 播放器载入中...jwplayer("jwplayer_1").setup({"file":"http:\/\/storage.yovisun.com\/blog\/video\/scihub-blank-help.mp4","title":"SCIHub\u7535\u8111\u7f51\u9875\u4e0b\u8f7d\u9047\u5230\u7a7a\u767d\u9875\u7684\u4e34\u65f6\u89e3\u51b3\u65b9\u6cd5","width":"100%","aspectratio":"16:9","image":"http:\/\/storage.yovisun.com\/blog\/video\/scihub-blank-help-cover.jpg","skin":"https:\/\/www.yovisun.com\/usr\/plugins\/JWPlayer\/player\/skins\/bekle.xml"});
Sci-Hub and Alexandra basic information I decided to make a quick summary of facts about Sci-Hub and myself, because in our times you cannot fully trust articles published in media, Wikipedia pages. Well, they do present facts about Sci-Hub that are correct in general, but at the same time there are mistakes in minor details. These details however create incorrect impression about the project. So, I want to make a quick look-up page with basic information about Sci-Hub and me that is reliable and first-hand. I will add more information to this page later Who is Alexandra Elbakyan and how the project started? I’m a computer programmer behind Sci-Hub. I created the website in September, 2011 in Almaty, Kazakhstan. In Kazakhstan, my homeland, access to LiveJournal website was blocked by government. LiveJournal is a blog system, where anyone can write their articles. Hence to access LiveJournal, I had to use ‘anonymizer’ websites. You go to such a website, paste a link to any webpage — for example LiveJournal article — and you can open it. So I got the idea: we need the same for research articles. It took me two or three days to write the code and upload it to free PHP webhosting. And so Sci-Hub got live, and started processing requests from users (it almost immediately became very popular) Indeed, I had a dream to write software for easy access to research since 2009. I was an undergaduate student in Kazakh National Tech University and got into problems while trying to access research papers needed for my research project. So I thought it would be cool to write some software to automatically download such papers. However in 2009 it was only a blurry non-specific idea. I learned HTML at age 12 using free tutorial avaiable on the Internet. I started programming in high school and first learned PHP, Delphi and Assembly programming languages on myself, before I got to the university. I was interested in information security and entered Kazakh National Tech University in 2005 to study Information Technologies with a security speicalization. Here I improved programing skills a lot. After graduation I wanted to continue in science and do research in bioengineering. Apart from computer and information technologies, I was interested in neuroscience, consciousness and artificial intelligence and while studying at university, collected a lot of ebooks on that topic. They were all downloaded from ‘pirate’ websites. So in 2010 I tried to work in a few neuroscience research labs in Russia, Germany and United States. I read online that you can write to the professor and s/he will accept you to their lab. So I did the same and that’s how I got into laboratories. Here I also did programming, but for bioengineering applications. However I found it boring. I wanted to work on greater things: such as the Global Brain. I even was lucky to give a talk on that topic in H+ transhumanist conference in Harvard. In 2011 I returned to Kazakhstan and worked for a few months as a freelance web-programmer. I created websites and applications on PHP language. And finally I was able to code Sci-Hub. Was there any funding for Sci-Hub? There was no. Sci-Hub started by accident, there was no Big Plan behind it. After a couple of months, users asked to add some option to donate and help the project. Sci-Hub is living on the donations for years. There were some big donations, but there was never any specific funding behind the project. Was any government involved in creating Sci-Hub? I was interested in politics and always supported communism, but Sci-Hub has always been a personal project. Even if some government helped, for example by sending anonymous donations, it was completely invisible to me. Using the Occam’s razor, no government was involved. Is there any team behind Sci-Hub? No, and never was. I do all the programming and server configuration myself. I also do all the Twitter posts and communication with users and media. I use Google to search for pictures to use on the website and social networks. There a people though, who create mirrors of Sci-Hub articles database. I run a few mirrors and other mirrors are run independently, and Sci-Hub also uses accounts to access library resources provided by others. What is the relationship between Sci-Hub and Library Genesis projects? Sci-Hub started in 2011 as a web application to download research article requested by user, using library accounts. There was no storage for downloaded articles. In 2012 Library Genesis, that collected e-books, wanted to collect research articles too and started saving papers downloaded by Sci-Hub to their database. In 2013 the number of requests to Sci-Hub grew, and I re-programmed Sci-Hub to check if article was already stored in Libgen; if it was, the user was redirected to Libgen database. In 2014, I copied articles collected by Libgen to create Sci-Hub’s own database. I did not fork Libgen: only the papers PDF files were copied. Then I configured new servers to serve these files to Sci-Hub users. Today Sci-Hub uses it’s own servers to store research papers. However all new articles downloaded by Sci-Hub are mirrored to Library Genesis databases too. Libgen also publishes torrents to download these papers. … and question that is always asked: How is Sci-Hub different from Aaron Swartz? How different between each other are PLoS One, arXiv.org and Budapest Open Access Initiative? All these projects work on providing free access to research papers, however it is easy to see: there are very different between each other. Sci-Hub is a web application that can open research paper requested by user, from database or by downloading it. All downloaded papers are collected in database. The database grew for a few years. A. Swartz, as far as I know his story, made an attempt to download a few million research papers from JSTOR website in 2010. The download was noticed and he got arrested. Perhaps he wanted to upload all downloaded research articles on torrent. In 2009 I did similar things: I downloaded Nature and Scientific American journal volumes and uploaded them on ‘pirate’ websites where people share e-books, and I also shared there volumes on torrents. A lot of people were doing it then. In 2004 I even programmed a PHP script that could automatically download paywalled e-books from MIT Cognet website, using a bug. Even though it sounds very similar to Sci-Hub, it is completely different in design and function. Before Sci-Hub, there were a lot of illegal websites where any person could download e-books for free. Sci-Hub became the first website where you can download articles on a massive scale, not e-books only. Before Sci-Hub there were other websites to get research papers for free but they were also different from Sci-Hub in design. There are similarities with A. Swartz but to say they are the same is some kind of an illusion that arises from lack of understanding of complexity. The similar illusion is to think that all black people, or all Chinese people are the same, because white person cannot easily recognize their faces. 本文转载自： https://engineuring.wordpress.com/2019/03/31/sci-hub-and-alexandra-basic-information/
先上传送门：http://tool.yovisun.com/scihub/ 大名鼎鼎的SCI-Hub，相信每一个科研工作者都熟悉，它是世界上第一款提供大众和公众访问科研论文的网站，该网站几乎可以下载任意SCI全文文献，只要输入文献的标题、或者链接、或者DOI、或者PubMed号，就可以下载到文献全文，简单快速的让你难易想象。这个过程中不需要你购买任何数据库的权限，完全免费。 然而，由于一些原因，网站作者不得不经常性的更换服务器或者域名，所以该网站的可用性难以得到保证，给大家带来了烦恼，我也深感不便，但正如SCI-Hub的口号“removing barriers in the way of science”所言，为了给大家提供方便，本人花了点时间想出了一个办法，实现了SCI-Hub的网址自动检测程序，可以实时更新可用地址。 以下是SCI-Hub可用网址链接的传送门： http://tool.yovisun.com/scihub/ 如对您有所帮助，请收藏并推荐给需要的朋友。 科研分享，知识无界，让我们一起消除科学的障碍。
经常写一些PHP以及JSP的程序，在给别人部署的时候，发现默认情况下系统都安装了IIS，尤其是server 2003的系统，而且是开机自启动的，最关键的是它占用了宝贵的80端口，这让你安装好其它的服务器软件以后都启动不了。虽然通过一些方法，也可是让PHP以及JSP的程序在IIS上运行起来，但是需要有一定的折腾能力才可以。 所以，一般人想到的肯定是卸载IIS，这当然可行，不过IIS在有的时候还是有用处的，所以最好还是不要将它干掉。对于新手来说，最好的办法就是将IIS的服务停掉，禁止它开机自启动，让出80端口。下面简单的说下，如果关掉IIS。 在我们安装完IIS以后，会在系统中生成一个名叫“World Wide Web Publishing Service”的服务，而且服务的启动类型是“自动”，这就是该问题的关键，我们只需要找到它，停止它，再将其设置为手动就行。以后如果需要的话，再将其启动即可。具体操作如图所示： 1）停止服务； 2）将启动类型改为手动； 3）点击应用生效，再确定。 服务的寻找方法，不同的系统可能方式不同，你可以选择下面几种之一： 控制面板 -> 管理工具 -> 服务 开始 -> 所有程序 -> 管理工具 -> 服务 右键我的电脑 -> 管理 -> 服务和应用程序 -> 服务 开始 -> 运行 -> 输入“services.msc”（推荐）
关于本站版权的声明及黑名单记录
博客是一个知识共享的平台，原创性是其最大的一个特色，很多博主都将自己在学习生活中的知识领悟无私的奉献给大家，然而也有一些无耻之徒在网络上四处抄袭别人的成果，致使文章内容常常被错误的传递给了别人，这种行为实在让人唾弃。 本站的文章除非说明否则均为原创，本博客采用“知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议”进行许可。 您可以自由： 复制、发行、展览、表演、放映、广播或通过信息网络传播本作品 创作演绎作品 惟须遵守下列条件： 署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。 非商业性使用 — 您不得将本作品用于商业目的。 相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作，您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。 这就意味着，您可以转载本站的技术类文章，但是转载时必须以超链接形式标明文章原始出处、作者信息以及版权声明。转载而不注明原始出处的行为严重损害了原始作者的利益，更是给读者带来了麻烦，这违背了博客的初衷。 本站部署了严密的防抄袭措施，本站所有的的下载资源，仅可以在本站下载，其它网站如果盗链到本站，本站将会发出警告，并且盗链的网站信息，访问的IP信息等均被记录在案，抄袭严重的将被加入黑名单。 但是，即使这样，仍然有人无视道德的约束，一而再再而三的抄袭。本文将记录这些抄袭行为，及处理措施。如果你有发现其它网站抄袭本站的内容，欢迎在这里留言举报。 For Blog 该博客主要是收集网上博客文章的网站，就是一般所谓的“聚客”，但是这位博主却违反了上述协议，可以说是一个彻头彻尾的抄袭他人文章的站点，不知道这位博主为什么会有如此厚的脸皮，竟然还在博客中写出“本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可”这样的字眼，真是荒唐。 与正规聚客网站不同的是，该网站把所有引用网站的信息删除，没有注意文章的来源出处，完全是抄袭行为。该博客到处布满广告，一看便知是一个利用机器人收集别人的原创文章来提高自己在搜索引擎中的权重，从而来谋取非法利益的网站。 这是我刚发布的一篇题为《Typecho智能评论过滤插件：SmartSpam》的文章： 再看看这篇文章被抄袭以后的样子： 通过安全记录，发现该网站的IP来源是142.4.208.200，请参看下面的日志记录： 名称：For Blog 域名：www.4blog.cn 抄袭行为：严重抄袭 处理措施：目前已经通知该网站的管理员删除抄袭本站的所有文章。并且，本站已经拦截该IP对feed的访问。如果再出现这样的行为，将禁止该IP及域名对本站所有内容的访问。
更新日志 SmartSpam_v2.7.0 @ 2021-03-08 支持对游客评论进行设置 修复同接口插件一起使用时存在的兼容问题。 感谢网友 泽泽 提供 SmartSpam_v2.6.0 @ 2014-10-18 添加对发布者网址的检测！ SmartSpam_v2.5.0 @ 2014-08-30 添加检测评论内容中是否包含文章标题，该功能对于机器人非常有用！ SmartSpam_v2.4.0 @ 2014-08-27 添加对于昵称关键词的检测，若昵称中含有某关键词，则评论失败；添加对于邮箱地址的检测。 SmartSpam_v2.3.0 @ 2013-12-18 经过近段时间对垃圾评论的观察，特增加对昵称的检测，包括昵称长度的限制，对昵称进行网址的过滤。 SmartSpam_v2.2.0 @ 2013-12-01 添加评论昵称为日文的检测，可以禁止昵称含有日文字符。 SmartSpam_v2.1.0 @ 2013-11-06 添加禁止日文评论的检测，可以允许和禁止日本评论。作此改进，主要是因为在上一个版本的基础上，常常有很多垃圾评论用的是日文，而且很多，评论每天大约有1-2个不等。 SmartSpam_v2.0.0 @ 2013-06-02 添加评论字符长度的检测。该功能主要是发现，大部分垃圾评论会输入大量的文字，这是机器人的特征之一。 插件下载 SmartSpam_v2.7.0 SmartSpam_v2.6.0 SmartSpam_v2.5.0 SmartSpam_v2.4.0 SmartSpam_v2.3.0 SmartSpam_v2.2.0 SmartSpam_v2.1.0 SmartSpam_v2.0.0 插件缘起 评语是博客的精髓之一，是最直接的与别人交流的方式，是进行交互学习的重要途径之一。但是网络情况复杂，更多的死尸在这里横行，博主们不得不常常与这些尸体抗争，清理他们留下的痕迹。 一个负责任的博主，会常常关注博客中的评论，并且有针对性的进行回复，同时清理一些垃圾评论，而这些垃圾评论常常不会很少，它们主要是由一些机器人留下的，也有人为的，主要用于广告。清理垃圾评论的过程是非常让人反感的，因为谁都不希望自己的博客被别人乱搅和。 屏蔽垃圾评论的方法有两个：一）关闭博客的评论功能，一般人是不希望的。2）限制评论，主要使用插件。目前，在Typecho平台上，主要借助插件，插件的形式不外乎这几种：验证码，拖动解锁等。不管是哪一种，它们都有一个共同点，就是在有效屏蔽垃圾评论的同时增加了有效评论者的负担，因为他们要多做一件与评论不相关的事情，用户的体验很差。 鉴于此，我写了SmartSpam智能评论过滤插件，使用本插件，只需要做一些简单的设置，就可以根据规则自动阻止垃圾评论的提交，评论人不需要做任何的额外操作，所有的评论过滤都由插件智能化处理。目前支持：IP屏蔽、中文检测、日文检测、评论长度检测、禁用词汇、敏感词汇等。 根据本人的经验，推荐禁用日文评论，以及对评论字符数进行限制，如不超过200字，这两样是机器人最喜欢干的事情。以前本博客基本每天有上百条的垃圾评论，用了我自己写的SmartSpam插件以后，垃圾评论基本为零。 拦截统计 根据2013年12月3日到4日SmartSpam插件的拦截情况，统计数据如下： 拦截数：799（平均每分钟有0.56个垃圾评论） 误拦截数：0（不会拦截正常评论，因为系统有提示，如果是人为，会根据提示修改评论内容） 未拦截到：4（这是很少的） 拦截成功率为：99.5%（这个数字是惊人的） 本插件的名称为：SmartSpam，顾名思义，就是智能的过滤插件。本插件最初是根据imhan的CommentFilter优化改进而来。以后有时间的话，我会对其进行长期维护和更新。本网页将实时更新发布该插件的最近版本。如果您有什么想法和建议，欢迎在这里留言。
PhpStudy是一款非常方便的搭建PHP动态网站或者服务器的国产集成软件包，包含apache、mysql、php等。可以到其官方网站查看并且下载。 注意这里的PhpStudy是Apache+php解决方案，另外一个PhpFind是Nginx+php解决方案。由于Apache的使用较多些，以下的所有示例均是针对Apache，当然，只要是Apache，不管是自己独立安装，还是选择象我这样的懒人方式，集成式一键安装。配置均相同。 gzip是GNUzip的缩写，它是一个GNU自由软件的文件压缩程序。当服务器开启gzip压缩功能以后，当有人访问服务器的网站时，服务器将网页内容压缩后传输到来访的电脑浏览器，浏览器进行解压再显示出来。一般对纯文本内容可压缩到原大小的70%甚至更高。 以前介绍过如何开启SAE的gzip压缩功能，以及Typecho的gzip压缩，另外还有tomcat的gzip的压缩。本文主要讲述如何开启Apache的gzip压缩功能。 要让apache支持gzip功能，要用到deflate_Module和headers_Module。打开apache的配置文件httpd.conf，大约在105行左右，找到以下两行内容：（这两行不是连续在一起的） #LoadModule deflate_module modules/mod_deflate.so #LoadModule headers_module modules/mod_headers.so 然后将其前面的“#”注释删掉，表示开启gzip压缩功能。开启以后还需要进行相关配置。在httpd.conf文件的最后添加以下内容即可： <IfModule deflate_module> #必须的，就像一个开关一样，告诉apache对传输到浏览器的内容进行压缩 SetOutputFilter DEFLATE </IfModule> 最少需要加上以上内容，才可以生gzip功能生效。由于没有做其它的额外配置，所以其它相关的配置均使用Apache的默认设置。这里说一下参数“DeflateCompressionLevel”，它表示压缩级别，值从1到9，值越大表示压缩的越厉害。 注意，这里要强调一个地方，我是通过搜索引擎找到相关文章进行设置的，而这些文章可能是来回复制的，有错误都不知道，如果你也按照那些做法去做，八层是出错，直接Apache都启动不了。究其原因，主要是有个参数不匹配。在上面去掉注释的“#”，即： LoadModule deflate_module modules/mod_deflate.so 这里以后会用到中间的名称，即deflate_module。后续开启gzip压缩中要使用该名称，即： <IfModule deflate_module> ...... ...... </IfModule> 这两个deflate_module必须一致。网络上其它很多文章，都是不一致的，所以直接报错。 下面是另一个典型配置，供参考。这里不建议将图片视频等多媒体文件进行gzip压缩，一般只压缩纯文本格式的文件，如.php、.txt、.html、.css、.js等。 <IfModule deflate_module> #必须的，就像一个开关一样，告诉apache对传输到浏览器的内容进行压缩 SetOutputFilter DEFLATE #压缩级别，1-9，9为最高 DeflateCompressionLevel 9 #不进行压缩的文件 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary #设置不对后缀gif，jpg，jpeg，png的图片文件进行压缩 SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary #同上，就是设置不对exe，tgz，gz。。。的文件进行压缩 SetEnvIfNoCase Request_URI \.(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #针对代理服务器的设置 <IfModule headers_moudle> Header append vary User-Agent </IfModule> </IfModule>
Typecho插件本来就少，涉及SEO的更是不多，目前我所知道只有Robots和Ping这两款插件。对于个人博客需不需要做SEO，仁者见仁，智者见智。我个人认为，对于技术类博客或者文章还是有必要的，因为这些大部分内容都是原创的，如果将SEO做好，就有利于原创文章可以让更多的人看到，让更多的人学习到最直接的知识，而不是那种转来转去复制的乱七八糟的垃圾文。当然，个人生活类的文章就没必要做SEO了。 本插件原名“Robots”，由Shion创建，可以记录搜索引擎蜘蛛的种类、爬行时间、爬行的页面、来源的IP。有利于监控站点的被蜘蛛抓取的情况，了解蜘蛛的习惯。可以为站点的SEO提供很多参考数据。 但是该插件还是有很多可以优化和升级的地方，试着给作者提点建议，但是其网站一直无法打开，无法联系。所以只有自己硬着头皮上了。 本插件的名称为：RobotsPlus，顾名思义，是加强版本的Robots插件。有时间的话，我会对其进行长期维护和更新。本网页将实时更新发布该插件的最近版本。如果您有什么想法和建议，欢迎在这里留言。 更新日志 RobotsPlus_v2.0.0 @ 2013-5-02 新增加对“360搜索”蜘蛛的识别。 优化数据库中蜘蛛记录表的结构，名称由typeche_logs改为typeche_robots_logs，更加符合规范。 启用插件后，进行提醒初始化设置。 RobotsPlus_v1.0.0 添加IP识别功能，可以显示蜘蛛来源的地理位置和网络情况。 插件下载 RobotsPlus_v2.0.0 RobotsPlus_v1.0.0 Robots原版
先吐槽一下，又是一个让人郁闷的事情，互联网上的信息让人眼花缭乱，一些不负责任的人总会把一些信息、文字复制来复制去，完全不经过思考，不去实践验证信息的真伪，导致一些错误的信息被广泛传开，让真正需要这些信息的人却只能被这些错误的东西误导，以至于浪费大量的时间。 所以强烈呼吁，请尊重原创，尊重知识，尊重他人，不要随便轻易的复制别人的原创文章。 OK，这次遇到一个关于数据库JNDI在Tomcat和WebSphere中配置的问题。两者的配置是不同的，而网上大量的资料都没有说出两者的不同，不进行强调，直接等同处理，将错误的配置放出来了，误导他人。 众所周知，数据库连接过程中通过JNDI的方式在安全性和效率上都有着一定优势，我的这个项目就是用JNDI进行数据库连接的。在WebSphere环境中完全可以运行，但是放到Tomcat上轻量级调试的时候，数据库连接总是错误。后来，多方验证才知道原来JNDI连接字符串在Tomcat和WebSphere中是不一样的，而网上搜索所得到的信息是两者的连接字符串都是一致的，所以耽误了我大量的时间。 下面说说JNDI数据库连接字符串在Tomcat和WebSphere中配置的不同，以及tomcat中JNDI的配置。数据库使用的是Oracle。 在Tomcat的目录中找到conf/context.xml文件，加上如下代码： <Resource name="jdbc/bbs" auth="Container" type="javax.sql.DataSource" username="yovisun" password="12345" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:xe" maxActive="100" maxIdle="30" maxWait="10000"/> 具体参数根据情况调整，这里配置JNDI时使用的字符串为jdbc/bbs。而在Tomcat运行环境下，程序实际使用的JNDI连接字符串为java:/comp/env/jdbc/bbs。 注意，对于tomcat而言必须在前面加上java:/comp/env/，websphere则不需要，直接是jdbc/bbs即可。 对于我的项目，再修改src/conf/datasource/dataSource.xml为以下内容即可： <?xml version="1.0" encoding="UTF-8"?> <dataSources> <dataSource dsName="project" dsTitle="" isJndi="true" jndi="java:/comp/env/jdbc/bbs" isEnabled="true" isDrm="false"> </dataSource> </dataSources> JNDI的名称，即jdbc/bbs，可以根据情况调整，切记对于tomcat，在运行的时候，使用的JNDI名称前面必须加上java:/comp/env/，网上搜索的很多文章没有说明这一点。 希望看到这篇文章的人对你有用。
富文本编辑器UEditor的安装配置，及PHP版本服务器端上传设置
最近在有几个网站的项目，需要用到富文本编辑器，服务器端采用的是PHP语言，之前知道国外有几款比较好，如TinyMCE。但是由于没有接触过，估计配置起来需要一点精力。于是百度了一下，找到了百度自家的富文本编辑器UEditor。看了一下，还不错，功能非常齐全，于是就用到项目中。 关于UEditor UEditor是一套开源的在线HTML编辑器，主要用于让用户在网站上获得所见即所得编辑效果，开发人员可以用 UEditor 把传统的多行文本输入框(textarea)替换为可视化的富文本输入框。UEditor 使用 JavaScript 编写，可以无缝地与 Java、.NET、PHP、ASP 等程序集成，比较适合在 CMS、商城、论坛、博客、Wiki、电子邮件等互联网应用上使用。 UEditor的项目主页为：http://ueditor.baidu.com/，可以在项目主页下载完整源码包。 关于在项目网站已有的介绍，本文简单略过。本文主要讲述我在UEditor的安装与使用过程中遇到的一些问题，及需要注意的事项，特别是文件上传中的路径问题。如果你连网站路径或者说网站目录这些基本概念都不清楚，建议你不要继续看下去了。 安装与部署 第一步：下载UEditor到相应的目录。（后续路径请视自己的情况修改） 第二步：引入入口js文件。在需要使用的页面头部引入。 第三步：使用js创建编辑器实例及其DOM容器。（注意使用textarea的id初始化） 这里写你的初始化内容 第四步（重要）：修改editor_config.js文件，主要是URL变量，在最上面加上以下内容。（根据自己的路径写） window.UEDITOR_HOME_URL = "/kx/share/ueditor/"; 注意：如果将该路径写错了，将导致无法加载编辑器。 OK，经过以上四步即可完成配置，并且默认情况下，上传文件功能均可正常运行。 自定义配置 默认情况下，可以在项目下载页进行配置，但是没有手工写来的简便。可以在创建编辑器实例的时候，进行初始化配置。也就在是“安装与部署”的第三步，利用js创建实例的时候，传入json格式的配置参数即可。 例如，我的配置如下： UE.getEditor('content', {toolbars:[["source",'|',"undo","redo",'|',"bold","italic","underline","strikethrough",'|', 'insertorderedlist', 'insertunorderedlist', '|',"superscript","subscript",'|',"justifyleft","justifycenter","justifyright","justifyjustify",'|',"indent","rowspacingbottom","rowspacingtop","lineheight","|",'selectall', 'cleardoc'],["fontfamily","fontsize", '|',"forecolor","backcolor", '|',"pasteplain",'removeformat', 'formatmatch',"autotypeset",'|',"insertimage",'music', 'insertvideo',"attachment",'|',"link","unlink","spechars",'|',"inserttable","deletetable"],['gmap', 'insertframe','highlightcode', 'template','background',"|",'horizontal', 'date', 'time', '|', 'print', 'searchreplace', 'preview', "fullscreen"]] ,initialFrameWidth:750 //初始化编辑器宽度,默认1000 ,initialFrameHeight:400 //初始化编辑器高度,默认320 ,initialContent:'' //初始化编辑器的内容,也可以通过textarea/script给值，看官网例子 ,wordCount:true //是否开启字数统计 ,maximumWords:10000 //允许的最大字符数 ,autoHeightEnabled:false // 是否自动长高,默认true ,elementPathEnabled:false //左下角显示元素路径 ,autoFloatEnabled:false //工具栏浮动 ,textarea:"content" ,initialStyle:'body{font-size:14px}' //编辑器内部样式,可以用来改变字体等 }); 如果需要更多的配置，可以参看editor_config.js文件，里面罗列了所有可配置的参数及说明，并且有了默认的参数。当然你也可以直接修改editor_config.js文件，不过不推荐，还是建议初始化的时候进行自定义配置。 修改上传路径 PHP版本的上传，官方写的很烂。默认把文件上传到了ueditor\php的子目录下，很糟糕，对于网站迁移很不利，特别是更换成其他的编辑器。 下面讲述如何将图像上传到网站的根目录下（对于文件上传也一样修改），这里我把UEditor放在如下的目录/kx/share/ueditor/，网站访问的地址是127.0.0.1/kx/，其实是一个二级目录。 打开ueditor\php\imageUp.php， 找到 "savePath" => ($path == "1" ? "upload/" : "upload1/"), 改为 "savePath" => ($path == "1" ? "../../../upload/" : "../../../upload1/"), 注意：这里的upload1是另一个上传目录，在上传的时候可以通过html网页的option选，虽然比较灵活，但是我觉得比较鸡肋，一看就是程序员写的半成品。哎，百度的程序员也不过如此啊。 这样修改以后，就可以将文件上传到网站根目录了，其实也不是最好的办法，因为会出现很多冗余。如上传一个文件后，它的地址为：/kx/share/ueditor/php/../../../upload/20130501/201305011130205278.zip。可以看到，是从根目录遍历，但是先到下面ueditor所在的子目录，再回溯到上层目录，多走了一道路，重复了，所以说不是最佳的解决方法，但是不影响使用。 注意这里修改以后，还需要修改图片“在线管理”的路径，否则，无法在编辑器中进行历史图片的查看。打开ueditor\php\imageManager.php， 找到 $paths = array('upload/','upload1/'); 改为 $paths = array('../../../upload/','../../../upload1/'); 特别说明：图片路径不能含有中文，否则不能显示。 同样需要修改“图片远程抓取”的路径。打开ueditor\php\getRemoteImage.php，找到 "savePath" => "upload/" , //保存路径 改为 "savePath" => "../../../upload/" , //保存路径 注意，这里远程抓取的图片保存在了upload根目录下，要想保存在upload的子目录下，例如每个月份的文件夹下，则需要找到以下代码 //创建保存位置 $savePath = $config[ 'savePath' ]; 改为： //创建保存位置 $savePath = $config[ 'savePath' ].date( "Ym" )."/"; 这是最简便的修改方法，具有通用性，如果想做到完美，可以再进行细致的修改，这里不便赘述。 修改上传的文件夹和文件名 默认情况下，会为每天上传文件新建一个文件夹，如20130501。这样，如果上传频繁的话，导致子目录非常多，不是很合理，于是改为按照每月新建上传的文件夹。打开ueditor\php\Uploader.class.php，在靠近最后找到 $pathStr .= date( "Ymd" ); 改为 $pathStr .= date( "Ym" ); 另外默认是按照unix时间戳重命名上传的文件名，不够直观，改成直接使用自然时间格式显示。同样，打开ueditor\php\Uploader.class.php文件，找到： return $this->fileName = time() . rand( 1 , 10000 ) . $this->getFileExt(); 改为 return $this->fileName = date("YmdHis") . rand( 1 , 10000 ) . $this->getFileExt(); 注意，这后面还有一个随机数，防止同一时间上传的重复 OK，经过以上修改，基本算是比较合理了。强烈提醒，在网站迁移的时候，一定要注意编辑器的路径配置，本机与服务器路径一定相同，否则很可能造成文件路径错误。
为雅安祈福，黑白头像生成器特别版
《黑白头像生成器》这是我在2011年编写的基于新浪微博的站内应用程序，主要功能是为了方便大家将自己的微博头像快速的换成黑白风格的。 由于当时发生了7·23温州动车事件，很多人为了传递爱心，表达爱到，将自己的头像换成了黑白风格的。考虑到不是所有人都会使用图像处理软件将彩色图像变成黑白的，于是我就写了这个应用，即使你不懂PS，你也可以轻松的将自己的头像换成黑白风格的。 原以为，我的这个应用再也不会有人用了。但是天意弄人，天不佑我大中华，在我们的四川时隔五年又发生了4·20雅安地震事件。于是，我连夜修改了这款应用，制成《祈福雅安_黑白头像生成器特别版》，愿逝者安息，为雅安祈祷！ 由于新浪微博未开放更换头像的功能，还需要大家到新浪微博的更换头像页面进行更改，此为一大遗憾。不过还得在此非常感谢新浪微博的工作人员，将我的应用置顶推荐。 《祈福雅安_黑白头像生成器特别版》,网址：app.yovisun.com/heibai。点击进入。 祈福雅安，中国加油！ 黑白头像生成器大事记 7·23 温州动车事件（2011） 4·20 雅安地震（2013） 希望大事记就此停止，希望大家忘了这款应用。祝福中国！
在SAE平台使用DeferredJob结合Cron服务对数据库进行自动备份
前几天由于更换域名，涉及到数据库中的内容也需要进行修改。从SAE平台中的phpAdmin直接导出sql文件，直接对文件进行替换操作，如将www.yovisun.me替换为www.yovisun.com。完成以后，删除原来数据库，再将替换后的sql文件导入，发现总是出错。后来检查sql文件，才知道，phpAdmin导出的sql文件有错，不能全部导出所有数据。 经过与SAE工作人员交流，才知道，官方推荐使用DeferredJob进行数据库的导入导出操作。但是问题出现了，得解决。SAE是有数据库恢复的功能的，以前都是通过论坛或者邮件申请，由工作人员手动恢复。现在该服务已经公开推出，可以自动恢复。但是个人感觉费用有点高，只允许付费云豆，其计费方式为: 数据恢复费用（付费云豆） = 底价（10,000云豆）+ 数据大小(单位MB，不足1MB按1MB计算) × 系数（默认10）×（当前日期 — 数据恢复日期） 这样我的恢复需要10012个付费云豆，相当于人民币100.12元，对于个人无商业价值的网站的确有点高了。如果是10元那还可以接受。 由于本次数据丢失，是由于SAE平台导致的，主要责任不在于我，于是便给SAE写了一篇Email说明了情况，还不错，管理员很快给我安排手动恢复了数据。得赞一下。（P.S 后续，SAE相关工作人员还与我交流，询问相关出错信息，很不错，让我对SAE平台又有点好感） 说了那么多废话，下面讲一下怎么使用SAE平台的服务进行数据自动备份吧，数据无价，人的精力时间有限，现在希望的都是一切自动化。所以，首先想到的是Cron服务，可以按设定的时间规则自动进行相关任务。然后，再结合官方推荐使用的DeferredJob服务进行数据库备份，自然就解决问题了。 可以新建一个php文件，如命名为：bak_up_db.php，使用DeferredJob进行数据导出，我的设置如下： <?php /** * 使用DeferredJob服务对数据库进行备份 * 结合Cron服务，实现定时备份 * * 函数原型： addTask($tasktype,$dbtype,$stor_domain,$stor_filename,$dbname,$tbname,$callback) * http://sae.sina.com.cn/?m=devcenter&catId=196 */ $stor_domain = "yovisun";//Storage的存放域 $file_path = "/bak_up_db/";//文件路径 $file_name = date('YmdHis').".sql.zip";//以当前的时间日期为文件名 $stor_filename = $file_path .$file_name;//完整的文件名（含路径） $dbname = SAE_MYSQL_DB; //数据库名 $dj = new SaeDeferredJob(); $taskID = $dj->addTask("export", "mysql", $stor_domain, $stor_filename, $dbname, null, null); if($taskID===false){ var_dump($dj->errno(), $dj->errmsg()); }else{ var_dump($taskID); } 这样就可以进行数据的导出，当然，请先创建相应的Storage，保证目录正确。接下来就是在config.yaml文件中设置Cron任务，可以根据自己的需要设计，具体语法可以参考官网的文档。我的设置如下： cron: - description: 使用DeferredJob每天凌晨4点对进行数据库备份 url: task/bak_up_db.php schedule: every day of month 04:00 这样，在每天凌晨的4点就会进行自动备份。 OK，完工，去Storage看看吧，所有的备份数据均在那里，是不是心里踏实了许多。 （温馨提示：目前DeferredJob每天只能执行10次）
由于他人恶意抢注，致使我的域名（yovisun.com）在外漂泊两年，现在终于重回我的怀抱。目前yovisun.me域名还有一年过期，现在准备将yovisun.me域名下的所有网站都转移到yovisun.com下面。考虑到友好性，计划采用301进行永久转向。 以前都是通过我购买的国外主机，使用CPannel进行301转向的，经过交流发现，SAE也有此功能。这真是太棒了，速度快，也省去我每年购买主机的人民币。 打开SAE网站根目录下的config.yaml文件，在handle下添加以下代码： - rewrite: if(in_header["host"] ~ "^www.yovisun.me" && path ~ "^(.*)$") goto "http://www.yovisun.com$1 [L,QSA,R=301]" 上面使用了通配符转换，对应关系如下： www.yovisun.me/* 301的对应到 www.yovisun.com/* 例如www.yovisun.me/abs.html 301到对应的 www.yovisun.com/abs.html 例如www.yovisun.me/123/jkkk.html 301到对应的 www.yovisun.com/123/jkkk.html 我最终做了三个重定向关系，如下 - rewrite: if(in_header["host"] ~ "^www.yovisun.me" && path ~ "^(.*)$") goto "http://www.yovisun.com$1 [L,QSA,R=301]" - rewrite: if(in_header["host"] ~ "^yovisun.com" && path ~ "^(.*)$") goto "http://www.yovisun.com$1 [L,QSA,R=301]" - rewrite: if(in_header["host"] ~ "^yovisun.sinaapp.com" && path ~ "^(.*)$") goto "http://www.yovisun.com$1 [L,QSA,R=301]" 第一个是由于域名转换，将以前域名下的网页www.yovisun.me，全部301到新的域名下www.yovisun.com 第二个是将裸域名yovisun.com全部301到www.yovisun.com下，这样有利于搜索引擎对权重的集中 第三个是将SAE默认的二级域名yovisun.sinaapp.com，301到www.yovisun.com，避免权重的分散。 可以根据自己的情况做相应的调整。接下来也将其它的域名做了301，具体是： pk.yovisun.me，全部301到新的域名下pk.yovisun.com app.yovisun.me，全部301到新的域名下app.yovisun.com iweibo.yovisun.me，全部301到新的域名下iweibo.yovisun.com 什么是301转向？（摘自网络） 301转向（或叫301重定向，301跳转）是当用户或搜索引擎向网站服务器发出浏览请求时，服务器返回的HTTP数据流中头信息（header）中的状态码的一种，表示本网页永久性转移到另一个地址。 其它常见的状态码还包括，200表示一切正常，404网页找不到，302暂时转向，等等。 网址转向方法主要包括：301转向，302转向，JavaScript转向，PHP/ASP/CGI转向，META REFRESH网页META刷新，等。302转向可能会有URL规范化问题。其它方法都是常用的作弊手法，当然不是说不可以正当地用，方法本身没有错，但被作弊者用多了，搜索引擎对这些可疑的转向都很敏感。 当网页A用301重定向转到网页B时，搜索引擎可以肯定网页A永久的改变位置，或者说实际上不存在了，搜索引擎就会把网页B当作唯一有效目标。好处是，第一，没有网址规范化问题，第二，也很重要的，网页A的PR网页级别会传到网页B。
最近接触一个关于OpenGL的项目，使用VC++，由于自己从来没有接触过OpenGL，也只能且学且做了。遇到一个关于坐标转换的问题，在网上搜索了许多资料，搜索引擎的前100个结果页面中的回答和代码都是千篇一律，基本都是错的或者不完整。哎，估计都是抄来抄去，自己想都不想就写篇文章发出去，或者在论坛上随便百度个答案回复一下。 原创，原创，多么渴望多一点原创的内容啊。闲话少说，希望搜索到我这篇文章的人，对你有用。 功能很简单：鼠标点击屏幕中的某点，然后获取该点屏幕坐标对应的OpenGL坐标。鼠标点的坐标很容易获得，直接从鼠标点击消息中获取就可以，但是OpenGL坐标却需要做一定计算转换。需要用到的核心OpenGL函数是gluUnProject()。 对于这个问题，在网上流传着如下类似的代码： GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; glGetIntegerv(GL_VIEWPORT, viewport); glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, projection); winX = (float)x; winY = viewport[3] - (float)y; glReadPixels((int)winX, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ); gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); 注：(x, y)是屏幕坐标，(winX, winY, winZ)是视景体坐标及深度坐标，(posX, posY, posZ)是OpenGL坐标。 上述代码几乎占了搜索引擎前99%的结果，基本没有人说出其中的问题，估计可能也是出自某个教科书。上面的代码其实只能针对一种特殊情况才有效，即glViewport(0, 0, screenWidth, screenHeight)，screenWidth、screenHeight分别是客户区的宽和高，视口左下角坐标恰好是(0, 0)，并且未经过任何模型变换。 从屏幕坐标向OpenGL坐标转换需要经过两步：第一步是屏幕坐标向视景体坐标转换，第二步是视景体坐标向OpenGL坐标转换。上述代码中winX = (float)x; winY = viewport[3] - (float)y;反映第一步，gluUnProject()是第二步。一般说来，gluUnProject()的转换是不会出问题的。 如何进行正确的转换呢？ 首先，在glGetIntegerv()之前必须添上模型变换的代码，即和绘图时使用的模型变换代码一样；其次，必须保证平移、缩放、旋转的顺序和绘图时的一致；另外，屏幕坐标向视景体坐标转换要正确。 还有非常重要的一点，就是在多视口情况下，活动视口必须最后绘制，使它作为当前的视口，这样才能保证glGetIntegerv()等取值函数能够得到正确的值。 好了，现在给出完整的代码，如下： GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; glPushMatrix(); //缩放、平移、旋转等变换 glScalef(......); glRotatef(......); glTranslatef(......); //变换要绘图函数里的顺序一样，否则坐标转换会产生错误 glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数 glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, projection); glPopMatrix(); winX = x; winY = viewport[3] - (float)y; glReadPixels((int)winX, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ); gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); 本文原创，希望看到我这篇文章的人，对你有用。
现在的博客都倾向于轻量化、开放性，所以功能才会更加丰富，插件可以因己所需，量身定制，使用自己最需要的资源。Typecho的插件远远没有wordpress多，但是基本能满足要求，经过近一个多月的试用，我主要使用了下面的一些插件，感觉比较好用，分享给大家。 注意，以下罗列的插件仅在Tyoecho 0.8上测试通过，现在已经有更高级的版本，我没有测试。目前，0.8版本已经够用，升级涉及到一系列的更改，太麻烦。（2015-1-17） MagikeEditor：简易编辑器插件 一款简易的后台文章编辑器，我个人非常喜欢。可以随便的自定义按钮，例如快速加 标签、加 标签等，当然，也可以自己加 这样的标签。根据我的习惯，一般都是直接在后台输入完内容，然后再套几个 标签等，非常快速方便。试过很多其它比较华丽的编辑器，用的很不舒服，略过，简洁才是王道。 AjaxComments：异步无刷新评论插件 Typecho默认的评论是要页面刷新的，该插件可以异步提交评论，页面无刷新，非常人性化。当然还有一个重要的功能是附带评论回复的邮件通知，支持smtp发送，只要在源文件里面设置几个参数即可，不过由于不是异步发送的，可能是最大的欠缺了。另外该插件smtp邮件通知设置中，如果使用的是腾讯的企业邮箱，有个bug，可能无法发送邮件。经过我的测试，必须使发送人名称和发送邮件的地址一致才可以发送。由于博客在SAE上，这里用的是SAE版本的AjaxComments。 CommentFilter：评论过滤器 让你远离垃圾评论，绝对的神器。可以直接封掉评论者的IP，设置禁止词汇和敏感词，限制输入中文，经过简单的设置直接spam掉垃圾评论，阻止提交或者提交到待审状态。非常棒的插件，使用以后，垃圾评论为零。有了它，其它的例如滑动锁，验证码等等的都不需要使用了，太不友好。 后续：本人在该插件的基础上进行了改进并且升级，推出了SmartFilter插件，请参看《Typecho智能评论过滤插件：SmartSpam》 Sticky：文章置顶插件 文章列表默认是按照时间顺序显示的，致使有些重要的文章可能不能重点显示。这个插件可以对单篇文章置顶、多篇文章置顶、自定义置顶文章显示顺序、自定义置顶样式等，还是比较有用的。 Robots：蜘蛛来访记录插件 做SEO必备的一款插件，可以记录搜索引擎蜘蛛的种类、爬行时间、爬行的页面、来源的IP。有利于监控站点的被蜘蛛抓取的情况，了解蜘蛛的习惯。 后续：本人在该插件的基础上进行了升级，请参看《Typecho蜘蛛来访记录插件加强版：RobotsPlus》 GravatarCache：头像缓存插件 评论者的头像缓存插件，主要是有一段时间Gravatar被GFW了，造成页面打开巨慢，该插件可以直接将头像下载到本地，防止Gravatar无法访问。由于SAE不支持本地写文件，这里使用的是SAE版本的GravatarCache，将头像下载保存到了Storage里面。 注意，由于gravatar的链接地址命名规则有了更新，致使该插件无法使用，目前本人已经修复，修改后的SAE新版本已经上传，可下载。另外修复了禁用插件时删除Storage出错的bug。（2015-1-17） Smilies：评论表情及贴图插件 在评论时可以加入表情和贴图，可以使评论的互动性更加丰富，该插件可有可无。 SlimBox2：图片灯箱显示插件 类似插件很多，但是感觉比较臃肿，这款算是非常小巧，20几K的大小。 AudioPlayer：MP3播放器插件 到目前为止就用过一次，虽然用的少，但是偶尔还是有用的，这是直接从wordpress迁移过来的，清爽简单。该插件的设置就是配置参数，可以参看官方文档，非常简单。 TypechoKit：侧边栏加强插件 这个其实算不上什么插件，就是几个简单的函数。例如随机日志、评论最多的日志、评论最多的访客、沙发最多的访客、最近评论数等。另外，这里有几个函数有点bug，我直接改掉了。具体是哪个也不太记得了。 Views：浏览次数统计插件（目前已弃用，改用StatPro@2019-6-17） 记录每篇文章的浏览次数，另外有一款Stat插件，和这个基本差不多，不过个人偏好这款，命名较好。这款插件其实就是在数据库文章表中加了一个字段，不太友好，改变了原有的的设计规范。建议还是自己做一张表，外键关联一下，这才能体现插件热插拔的特点。 StatPro：浏览数、点赞数、热门文章统计插件。 基于StatPro和Views插件开发。 CodeRenderUnmi：无插件实现代码高亮 使用纯CSS实现代码高亮，干净。只要引入一个css文件即可，当然先要将代码转化为相应的html代码即可。在线版网址：www.jswp.org/tool/code.html。 YoviSunCustom：YoviSun个人定制插件 顾名思义，这是我自己根据自己的博客写的插件，主要有：广告的设置与隐藏，欢迎语的开启与关闭，顶部图片的指定，自定义文字记录等。其实这个插件就是将自己经常用到的需要修改源代码的功能集成了，免去改源代码的麻烦，直接在前台进行设置即可。 另外还有，ArticleList热评与随机文章列表插件，归档页面插件JustArchives，Links友情链接插件，觉的太简单了，没必要做成插件的形式，直接将内容进行修改，结合到主题里面了。 MagikeEditor AjaxComments | AjaxComments（SAE版） CommentFilter | 更强大的SmartSpam Sticky Robots原版 | RobotsPlus加强版 by YoviSun GravatarCache | GravatarCache（SAE版，2015-1-17更新） Smilies多表情加强版 SlimBox2 AudioPlayer TypechoKit Views StatPro YoviSunCustom 本文最后更新时间：2019-06-17。
新浪微博等级快速PK平台说明及PK攻略
花了一下午的时间，写完了这个简单的新浪微博等级快速PK平台。微博控、勋章控们的必备武器，轻松一点PK完毕，PK从此如此简单。 网址：http://pk.yovisun.com 猛击这里进入PK平台 ==》 更详细的新浪微博等级快速PK平台说明及PK攻略，请参看这里 操作说明 1）微博必须处于登陆状态，不然打开的PK窗口会转到登陆界面。 2）直接点击数字就是PK一次，结果页面如果出现三行代表成功PK一次，出现一行代表PK过此号码、或PK次数达到50次。（代码说明见下） 3）目前提供四组PK资源，共200个用户，均为低等级死号，快速、便捷，请随意PK、请放心PK。 4）PK以后，PK界面会将已经PK过的号码变色处理，以方便进行区分。为了便于管理，建议按照顺序进行PK。 5）为了节约大家的时间，更加体现快速PK，可以批量快速PK，目前点击一次会弹出10个新页面，如果弹出成功，说明PK成功。注意：对于部分浏览器（特别是IE），可能会限制此操作，如拦截弹出的窗口，请在提示拦截时设置允许即可。（具体设置见下） 6）PK完毕以后，可以在“微博等级”=》“我的PK”里面查看结果，查看我的PK。 页面代码文字说明 打开新窗口PK以后，会出现一系列的代码文字，主要如下： {"code":"100000","msg":"\u5b8c\u80dc\uff01\u4f60\u591a\u4e86\u4e00\u540d\u624b\u4e0b\u8d25\u5c06\uff01","data":{"mydays":761.5,"fridays":0,"ret":1,"info":"\u6211\u5728\u4e0e@ \u7684\u7b49\u7ea7\u8f83\u91cf\u4e2d\uff0c\u4ee59\u4e2a\u7b49\u7ea7\u7684\u4f18\u52bf\u5b8c\u80dc\uff01\u60f3\u8ddf\u6211PK\u4e48\uff0c\u4e00\u8d77\u6765\u5427\uff01http:\/\/level.account.weibo.com\/u\/?id=1581003323"}} 如出现以上文字或类似文字，含有"code":"100000"，它是要告诉你：“完胜！你多了一名手下败将！” {"code":"100001","msg":"\u4eca\u5929\u4f60\u5df2\u7ecfPK\u8fc750\u6b21\u5566\uff01\u4f11\u606f\u4e0b\uff0c\u660e\u5929\u518d\u6765\u5427\uff01","data":[]} 如出现以上文字，含有"code":"100001"，它是要告诉你：“今天你已经PK过50次啦！休息下，明天再来吧！” 关于PK次数的说明 新浪官方说明如下： 每天与同一位用户的PK次数有且仅限1次；每天PK总次数上限为50次； PK胜利次数达到相应的数量级的话，可以获得PK勋章哦！ 经过网友试验，其实每天最多可以PK4回，6个小时（少几分钟不知道可不可以，可以试一试）后可以再PK，也就是每天最多可以PK200次。注意：每50次PK之间不足6小时千万不要手贱去PK，这样就会再顺延6小时。另外，每天单和同一个账号只能PK一次。（仅供参考） 很多人反映，一天不能PK200次，到现在我还没找到规律。根据我的经验，我最初的时候一天可以PK两个50次，后来，好像也一天只能PK50次了。估计是新浪的漏洞，再慢慢修复。 建议：PK平台已经提供200个用户，最大限度的满足你的要求。请合理PK，不要PK过多，强烈建议每天不要超过50次。 浏览器的设置 对于批量快速PK，由于同时会打开多个窗口进行PK，对于部分浏览器（特别是IE），可能会限制此操作，如拦截弹出的窗口，请在提示拦截时设置允许即可。下面详细介绍IE的操作方法： 点击“批量快速PK”，根据浏览器的设置，浏览器上方可能会有提示消息，如下图所示： 然后在提示框处，点击鼠标右键，选择“总是允许来自此站点的弹出窗口”，见下图： 最后在弹出的确认对话框中，选择“是”，即可。 通过以上的设置，下次即可进行多个同时PK。 如有疑问或建议，欢迎留言。我的微博：@YoviSun 温馨提醒：小工具，仅供个人使用。PK虽爽，也不要P的太多，对身体不好。 更详细的新浪微博等级快速PK平台说明及PK攻略，请参看这里
自从把博客迁移到SAE上以后，速度快了很多，但是俺是个追求完美的人，总想更快。除了利用各种cdn加速以外，gzip压缩也是一个非常重要的加速方法。 通常对网站内容进行gzip压缩，会提高网站的打开速度，网络传输量一般会减少一半以上。浏览器会自动进行解压缩，所以这种压缩对网站内容本身没有多大影响。 Typecho的gzip压缩 开启Typecho的gzip功能很简单，是和wordpress一样的，只要在根目录下的index.php文件里面加上下面这一句就可以了： ob_start('ob_gzhandler'); 注意，是整个网站根目下的index.php文件，不是在主题目录下的。上面这句话建议加在最上面，当然其他位置也可以，可以自行尝试，下面是我修改以后的。 <?php /** * Typecho Blog Platform * * @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) * @license GNU General Public License 2.0 * @version $Id: index.php 1153 2009-07-02 10:53:22Z magike.net $ */ /** 开启gzip压缩, add by yovisun */ ob_start('ob_gzhandler'); 另外，细心的人可能注意到了，在数据库中，typecho_options表下有个字段为gzip，默认值为0。我猜应该是和gzip功能有关系。我试着将其修改为1或0，都没有看到效果（不管是否加了ob_start()），故尚不知该字段的具体作用。 本站测速结果，秀一下 利用Chinaz（站长之家）提供的网页GZIP压缩检测，可以看到效果非常明显。下图是本站（www.yovisun.me）检测的结果，压缩量接近70%，相当可观啊。 用网速检测工具测了一下网速，那速度真是快啊。下面是国内节点检测的结果。 可以看到平均速度只有0.227秒，真的只能用火箭来形容了。当然，测速结果仅供参考，毕竟不同时间的网速可能不太一样，我是在早上进行检测的。 下面是全球其他节点测试的结果，虽然比国内慢了一点，但还是很快，平均速度没有超过用户最好的体验范围。据统计，一般一个网站最好是在5秒内打开，不然会让用户厌烦。 不知道为什么，我亲爱的宝岛怎么就打不开呢？台湾没有GFW吧。o(╯□╰)o 经过以上的设置，现在本站基本都是秒开的，跟没有打开gzip之前有明显的区别，速度真是只能用火箭形容了。^o^/ 注意：如果是在SAE上，以上只能开启网页的gzip压缩，对于图片以及Storage里面存储的文件没有效果。需要进行设置。请参考此文：打开SAE的页面压缩功能。
SAE是按需收费的，所以减少网络流量可以有效的减少云豆的消耗，虽然我的云豆足够多，不用担心，但是从网络传输的角度来看，总希望流量少一点，速度快一点。 一般的服务器都有gzip压缩的功能，当然SAE也不例外，开启SAE的gzip页面压缩，不但能提高访问速度，还能减少云豆的消耗。 下面详细说明一下打开SAE的页面压缩（gzip）功能： 登录SAE的后台，在左侧功能面板中打开AppConfig页面。 然后选择“页面压缩”，点击“设置该项”。 在弹出的对话框中，找到“确认”和“取消”按钮，在其旁边有个“高级语法”，打开。在AppConfig语法中直接填入填下以下内容，其它默认。 - compress: if ( out_header["Content-Length"]>=50) compress - compress: if ( out_header["Content-type"]=="text/css" ) compress - compress: if ( out_header["Content-type"]=="text/javascript" ) compress - compress: if ( out_header["Content-type"]=="text/html" ) compress - compress: if ( out_header["Content-type"]=="image/png" ) compress - compress: if ( out_header["Content-type"]=="image/jpeg" ) compress - compress: if ( out_header["Content-type"]=="text/plain" ) compress - compress: if ( out_header["Use-Compress"] == "1") compress 上面具体是什么意思，可以参考SAE的文档。你也可以只复制第一句，当然，建议完全复制。^_^ 点击“确定”，搞定。（点确定以后可能需要几秒的等待时间，才提示成功，别慌） 是否开启成功，可以利用Chinaz（站长之家）提供的网页GZIP压缩检测进行查看，可以输入网页地址，或者图片地址。 注意，如果是Typecho或者wordpress博客，还需要开启博客网页的gzip压缩功能。请参考此文：开启Typecho的gzip压缩，感受火箭的速度。
在SAE上安装应用仓库中的Typecho，会遇到一些问题，另外由于Typecho for SAE还存在一些BUG，需要做一些设置。这里总结一下。 红字警告 在安装过程中，会有一些红字警告，新手和老手的区别就在这儿体现了。新手往往停在这儿，就不敢往下安装了。老手却不管，一个劲儿往前冲，直接点下一步。所以，遇到警告，就当没看见，直接往下走吧。 404页面乱码 输入不存在的页面，进入主题的404页面，会出现乱码，导致网页无法正常解析。 解决办法： 修改 /var/Widget/Archive.php文件中的error404Handle处理函数，将setStatus(404)改成如下： ob_start(); /** 设置header */ //$this->response->setStatus(404); @header("HTTP/1.0 404 Not Found"); @header("Status: 404 Not Found"); 开启SAE的地址重写功能 关于地址重写（伪静态、rewrite）一直是个很头痛的问题，不管是在linux还是在windows主机上，经常会遇到。而在SAE上更会遇到，默认SAE是没有开启地址重写的，需要到后台手动开启，并且添加规则。方法也有好几个，可以直接更改应用的config.yaml配置文件，当然也可以在管理后台进行可视化的操作。 这里介绍一下，如何通过后台直接操作。 进入TE所在应用的后台，注意这里是SAE管理的后台，在左侧功能面板中打开AppConfig，然后在AppConfig页面找到URL重写(rewrite)模块。点击“设置该项”，在弹出的对话框中，找到“确认”和“取消”按钮，在其旁边有个“高级语法”，打开。在AppConfig语法中填下以下内容： - rewrite: if(!is_dir() && !is_file()) goto "index.php?%{QUERY_STRING}" 其它的直接默认不写，如下图所示，然后，点确定即可。（点确定以后可能需要几秒的等待时间，才提示成功，别慌） 配置Typecho的永久链接 在SAE上开启地址重写以后，还需要在TE上进行相关的设置。进入TE管理员后台页面，点击“设置”=》“永久链接”，按照自己的设定规则来就行了。下图是我的设置。注意，在点击“保存设置”以后，会出现红色字的警告，直接忽略，下一步即可。 Typecho的永久链接设置 另外，如果你设置好以后，想更改“独立页面后缀名”，是不可以的，这是SAE版本TE的bug。解决方法：先不启用“地址重写功能”，然后保存，在独立页面后缀名，再保存，最后再开启“地址重写功能”，红色警告字直接忽略掉。 当然，还有一些其他小问题，蛮简单，百度一下，你就知道...^_^