重新分享我的 RSS 文章订阅

由于最近犯懒严重,所以这玩意儿也很久没更新了……

之前我曾在博客分享过我的 Star 文章订阅,坚持了一段时间之后,就开始用 kindle 读 RSS 了,所以就没法去 Tiny Tiny RSS 给喜欢的文章加 Star。不过最近我发现,用 kindle 读 RSS 的效率实在是比不上用手机 App 读,于是又切换回了 Tiny Tiny RSS。

这次把 Tiny Tiny RSS 重新配置了一遍,然后改用“Publish”功能取代之前用的“Star”功能,并且加了一些 Article Nots,这样订阅就会变得更加像“分享”一些。

RSS 地址:http://share.best33.com/feed/people/oott123.rss

SyntaxHighlighter 的正确使用姿势 – InstantClick 哭晕在厕所

今天闲得无聊,让 InstantClick 支持了 SynatxHighlighter,并且对 Typecho 动了些手脚,使得在 Markdown 渲染的时候无需手动指定就可自动识别代码语言并渲染高亮。

看起来逼格很高的两个事情,其实只需要简单的几个操作。

InstantClick 不支持 SynatxHighlighter ,是因为后者是监听 document.ready 事件的。这种动态渲染的插件,大多和 InstantClick 不兼容。解决方法和在 使用 InstantClick 时 piwik 、 MathJax 的配置 文中描述的一样,只需要加入一段渲染的代码就完工了:

InstantClick.on('change', function() {
    SyntaxHighlighter.highlight();
});

值得一提的是,我之前一直在试着加 SyntaxHighlighter.all() 发现没有用,后来读源码才发现, SyntaxHighlighter.all() 这个函数依然是监听 document.ready 事件,并在监听后调用 SyntaxHighlighter.highlight() 的,所以应该直接调用后者。

另外,SyntaxHighlighter 在换页后似乎无法 Autoload 对应的 Brush,所以需要在页面中预先用 script 标签加载所有的 brush。

至于 Markdown 渲染的时候加入自动识别,其实也就是加了个简单的正则。是在 /var/MarkdownExtraExtended.php 文件中,修改 _doCodeBlocks_callback 函数如下:

<?php
    protected function _doCodeBlocks_callback($matches) {
            $codeblock = $this->unhashHTMLBlocks($matches[1]);

            $codeblock = $this->outdent($codeblock);
            $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);

            # trim leading newlines and trailing newlines
            $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
            $codeRegexs = array(
                    'php' => '#\\?php#',
                    'html' => '#\(html|body|head|title|h1|div|p|?xml)#',
                    'js' => '#var|function \(|window\.|document\.|innerHTML#',
                    'bash' => '#curl|wget|sh|^\#!|service .* start|yum install|clone |cd #',
                    'sql' => '#SELECT|UPDATE|DELETE|WHERE#',
                    'python' => '#if.*:|def .*\(#',
                    'css' => '#background-color|font-family|margin|padding#',
            );
            $brush = 'text';
            foreach ($codeRegexs as $lang => $reg) {
                    if(preg_match($reg, $codeblock)){
                            $brush = $lang;
                            break;
                    }
            }
            $codeblock = "<pre class='brush: $brush'>$codeblock\n</pre>";
            return "\n\n".$this->hashBlock($codeblock)."\n\n";
    }

好了,从此告别手动指定语言,走向新时代啦~

勇敢的少年,快来创造奇迹!

UPDATE: 由于群成员已经达到预期,本群暂停接受申请。对之前申请被放置 play 的几位同学深表歉意。

UPDATE2: 本群已于 2016-06-03 被解散,请参考 Telk 群解散告知

前几天把好友列表中几位有意思的人拉到一起,建了一个 QQ 群。
(至于为什么是 QQ ,我们可以不讨论这个问题么……)

这个群大概是 ACG 向的的 Web 开发者交流扯淡小圈子。

初步打算控制在 25 人以内。现在的人数是 22 人,去掉一个小号是 21 人。 群成员已达到预期,暂时停止新成员的加入。

我们有:

  • 全端攻城狮囧叔 @orzFly
  • 00 后少年前端攻城狮钉子 @dimpurr
  • 可萌的CS博士(妹子)@**(保护个人隐私……)

那么,如果你:

  • 是 Geek ,或者有一颗想当 Geek 的心
  • 喜欢 web 开发
  • 喜欢 ACG
  • 不是基佬(重要)

(以上是必要条件)

如果是:

  • 技术不那么厉害,但是很可爱
  • 女孩子(我们有良好的男女比例!自从发了这篇文章之后就没有了)
  • 想要一个可以随便扯淡的群

那就更好了!(非必要条件)

那么,点击这里,完成一个 10 分钟的小谜题,来加入我们吧!

UPDATE: 由于群成员已经达到预期,本群暂停接受申请。对之前申请被放置 play 的几位同学深表歉意。

UPDATE2: 本群已于 2016-06-03 被解散,请参考 Telk 群解散告知

分享我的 Star 文章 rss 订阅

RSS 地址:

http://best33.com/usr/stared_feed.php

信息源列表:
信息源列表

从明天开始我会在这些信息源中筛选我觉得有意思/有价值/值得一看的文章标星。大概会控制在10篇/日的频率。

也不知道能够坚持多久,总之觉得做一下一定很不错~

各位用 rss 的欢迎订阅~也欢迎订阅我的博客 rss 哟。

另外如果你也在用 rss ,也请把你的 star 文章的 rss 订阅分享给我~

使用 InstantClick 时 piwik 、 MathJax 的配置

InstantClick 是一个利用 hover 和 click 的时间差,预加载网页的黑科技。原理主要是在 hover 的时候预读网页,然后点击的时候就替换整个页面,让你的网站看起来整个都 PJAX 过~很酷炫。

不过造成的问题也很显然:换页的时候很多统计工具会失效;像我博客用的 piwik 就无法统计到页面的切换。同样,MathJax 这类渲染页面的插件也失效了。

解决方法很简单,只需在初始化之前,监听 InstantClick 对象的 change 事件,在事件中处理统计和渲染操作。代码如下:

InstantClick.on('change', function() {
    //piwik
    _paq.push(['setDocumentTitle', document.title]);
    _paq.push(['trackPageView']);
    //mathjax
    MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
});
InstantClick.init();

Enjoy ~

根据天气和时间动态更换的博客背景图

之前博客的背景图是一个永恒的晴天……
因为一开始就是当成一个可以根据时间和天气轮换的设计,但是懒得去写 js ,于是就是如大家所见的那样。

刚刚闲得无聊,把整个逻辑补完了。用到的是新浪的天气 js 接口,然后用一组图片搞定了他们。

核心代码如下:

var t = Math.floor(((new Date()).getHours() + 6) / 5),
    f = 'bright' + t;
if (w.indexOf('雨')>=0 || w.indexOf('雪') >= 0) {
    f = 'rainy';
} else if (w.indexOf('云')>=0 || w.indexOf('阴') >= 0) {
    f = 'cloudy' + t;
}
if (document.body.clientWidth > 600) {
    document.body.style.backgroundImage = 'url("' + f + '.jpg")';
}

具体的效果,可以参考本博客背景,也可以移步演示页面

相应的几张背景图为原创,谢绝扒图。如需自用,请联系我。

一种可能是高大上的防止SPAM的方法

前一阵子比特币火的一塌糊涂,然后猛然惊觉其实自己在几年前就买过这种东西,后来换电脑了钱包啥的都没有保留下来,扼腕叹息觉得我差一点点就是富豪了。事实证明我想多了,因为仔细一想才发现自己的持有量还不到1个单位,才多少钱啊,离富豪的距离还有几千倍呢。不过当年不明白比特币的原理,也想不了那么多,这个钱没这个福气赚,也是没办法的事情。

最近又去看了看比特币的实现原理,然后在想,如果说把类似的原理用在其它地方会发生什么。于是就有了这个防 SPAM 的思路。不过也不知道该用什么关键字去检索,也不知道自己是原创还是在重复造轮子,总之是写了一个 typecho 的插件叫 SpammersGoAway ,已经在自己博客上部署了,并且把其它的防垃圾策略都撤了,看看有什么后果。

Update : 由于对某些手机浏览器支持不能,暂时关闭了本站的 SpammersGoAway .

这个实现原理在 README.md 里已经详细的叙述了,这里就复制粘贴一下好了。

对于 Spammer 来说,效率是摆在第一位的。他们需要用极短的时间来发送大量的 SPAM ,这就是 Spammer和普通的用户最显著的区别。

利用这一点,我们可以使每位评论者都花上一点点的时间来计算一个特殊的 hash值,比如hash(time+i),然后循环使i自增,最后要求计算出来的 hash 满足一个特殊的条件如前3位相同,这样对于一个Spammer 来说,他发送一个 SPAM 所使用的资源提高了:需要更多的 CPU 和时间。而对于普通用户来说,浏览器计算这个 hash值的时间在 3 秒内,还不够用户输入一条完整的评论,对于用户来说几乎无影响。

升级到 typecho 0.9,以及typecho在kangle下伪静态问题的解决

今天正好在折腾服务器,想起来了自己的typecho一直无法禁用启用插件。后来跑去Google查了一下,发现这其实是普遍问题,比如说官方论坛的帖子kangle服务器下启用伪静态的一个bug,以及无法激活主题模板,都提到了这个问题。

还有 typecho 0.9 貌似内置了 Markdown 的解释器,不知道是怎么实现的。我把之前的插件给禁用掉之后,原来的文章全部都不解析了。可能还需要再看看源码才可以。

这里给出 typecho 0.9 在 kangle 下可用的伪静态.htaccess文件。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1?%{QUERY_STRING} [L]

修改过去之后就可以正常使用伪静态了,后台禁用开启插件、切换主题一切正常。

新版 typecho 的管理后台真心漂亮,升级过程也非常简单。推荐还没有更新的朋友们(咦……应该只有我没更新了吧……)去更新一下看看。

UPDATE:刚刚去看了一下数据库,发现 typecho 控制 Markdown 与否,是在数据库中的对应条目的文章内容前加上<!--markdown-->。你可以使用以下SQL语句来更新你的数据库,让以前的文章也使用 Markdown 解析。

UPDATE `typecho_contents` SET `text`=CONCAT('<!--markdown-->',`text`)

在CentOS 6下安装配置Squid缓存服务器

基于成本考虑,这次把博客折腾换到了东海岸。

东海岸的机房真不是一般的慢啊,已经快慢掉渣了。不争气的服务器和拉车的老牛一样慢,一个页面四五秒钟都加载不起来。

翻了一下现在市面上的CDN,都不满意,不是速度慢就是被墙了,想来想去,还是自己再弄个LA机房的服务器反代过去,充当一个“伪”CDN好了。

于是弄了个LA机房的VPS,还是自己习惯的CentOS6.2。不知道为何对CentOS比较有感情,虽然最近接触Debian觉得真是个好系统。说不定从哪天开始就移情别恋了=-=

好了说正事。在CentOS下装Squid并不难,如下:

yum install squid

好吧如果文章就到这里就没有了你们一定会喷我的。所以文章还没结束——还有最重要的,把Squid作为一个反向代理服务器来配置。

用yum装好之后,squid的主配置文件在/etc/squid/squid.conf,装好之后里面一堆东西,其实我们全部都可以不要。如下把它删掉:

mv /etc/squid/squid.conf /etc/squid/squid.conf.bak
vim /etc/squid/squid.conf

然后敲以下配置:

acl manager proto cache_object
http_access deny manager
http_access allow all
http_port 80  accel vhost vport #反向代理监听端口
cache_peer 192.168.1.1 parent 80 0 no-query originserver round-robin  name=web #源服务器端口和IP地址,以及名字
cache_peer_domain web !localhost #对应域名设定源服务器
forwarded_for truncate #截断X-Forwarded-For,防止IP地址欺骗;也可以不要这一行
cache_mem 32 MB #内存缓存大小
cache_dir ufs /var/spool/squid 100 16 256 #磁盘缓存设置
coredump_dir /var/spool/squid
refresh_pattern -i (/cgi-bin/|\?) 0    0%      0
refresh_pattern -i \.php 0    0%      0
refresh_pattern .              0       20%     4320

如果像我一样只有一台服务器,那就按上面的配置就好了,把192.168.1.1改成你源站的服务器,然后就算设置完成了。

如果你有很多不同的服务器,然后想对应不同的域名,就修改其中的cache_peer如下:

cache_peer 192.168.1.1 parent 80 0 no-query originserver round-robin  name=web1
cache_peer_domain web1 best33.com
cache_peer 192.168.1.2 parent 80 0 no-query originserver round-robin  name=web2
cache_peer 192.168.1.3 parent 80 0 no-query originserver round-robin  name=web3
cache_peer_domain web2 web3 oott123.com

最后重启squid,设置开机自启动

service squid restart
chkconfig squid on

这样就算配置完了。

Typecho的CommentToMail插件不支持https的问题

如题。

在仔细查看了CommentToMail的插件源码后,我发现了这个:

 /**
 * 发送异步请求
 *
 * @access public
 * @param string $filename 存放邮件的临时文件名
 * @param string $siteUrl 网站连接
 * @return void
 */
public static function asyncRequest($filename,$siteUrl) {
    $dmpt=parse_url($siteUrl);
    $host = $dmpt['host'];
    $port = $dmpt['port']?$dmpt['port']:80;
    if(substr($dmpt['path'], -1) != '/') $dmpt['path'] .= '/';
    $url = $dmpt['path'].'action/comment-to-mail';
    $get='send='.$filename;
    $head = "GET ". $url . "?" . $get . " HTTP/1.0\r\n";
    $head .= "Host: " . $host . "\r\n";

它很明确的表达了:我压根就没打算支持SSL,你看我都是用纯粹的fsocksopen在异步请求呢!

既然如此,我也顺便就把博客的ssl去掉了。平心而论,博客加ssl纯粹就是好玩。至于安全性需要加强的部分,我已经把它挪到其它的子域名去了,也乐得一个自在。