Tiny Tiny RSS 推送到 kindle

前方高能预警:以下内容本人仅照原样提供,不对其有任何支持!伸手党速速退散,折腾指数五颗星!

前方预警:如果你没有 kindle 或者不打算用 kindle 看 RSS,以下内容对你而言并无作用。

很久以前折腾了一个 Calibre 的自定义脚本,用这个脚本可以将 tiny tiny rss 中的内容推送到 kindle 上实现 kindle 的 rss 阅读。

kindle 上的阅读体验

不过在最新的 ttrss 上,我发现它已经没法实现分类阅读了,估计是 api 有所改动,毕竟写了也有好几个月了,懒得调整了……

先放上脚本链接,包含 recipe 文件和推送脚本,后者需要 mailgun 账户。

如果你用的是 Linux VPS,那么只要按照calibre 官网上所述的安装方法安装好 calibre,最后将 recipe 文件和 push.sh 放到 VPS 上,修改一些变量就能用了。

如果你用的是 Windows (自己的电脑或者 VPS 都好),那打开 calibre,点新闻抓取,高级,自己添加一个 recipe,将我的 recipe 文件粘贴进去,最后设置登录用户名为: username;http://<ttrss-url>;test,密码为 ttrss 的密码,然后设置自动抓取推送即可。

最后说一句,对此脚本不负任何责任,这玩意需要自己慢慢折腾,我之前没写折腾笔记所以现在懒得写 step-by-step 了……

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";
    }

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

Cmder / Listary 搭配使用的若干技巧

Cmder 是一个在 Windows 下用起来很舒服的控制台。以下引自官方网站,请自行阅读。

Cmder is a software package created out of pure frustration over the
absence of nice console emulators on Windows. It is based on amazing
software, and spiced up with the Monokai color scheme and a custom
prompt layout. Looking sexy from the start.

确切的说来,Cmder 是基于 ConEmu 定制的。我这里要说的,主要是 Cmder 如何和其它软件进行集成。

一、 免 UAC 以管理员权限启动 Cmder (或者任何程序)

这里用到的所谓 “免 UAC” 其实是利用 Windows 的计划任务功能。在“控制面板”中搜索“计划任务”打开计划任务的控制台,新建一个任务。路径选择你的 Cmder.exe(新版本)或者 Cmder.bat(老版本),并选上“使用最高权限运行”。触发器可以全都删掉,最后得到的结果大概如下图:

常规标签

然后记住图中的“位置”和“名称”。接着,打开一个非管理员的命令行,执行:

C:\WINDOWS\system32\schtasks.EXE /run /tn "\Best33.com\Cmder"

其中 /tn 后的参数则是“位置”和“名称”用\拼合的结果。

二、在任何地方打开你的 Cmder

这里我的 Cmder 是一个比较老的版本,1.1 吧。新版本很简单,用.\cmder.exe /REGISTER ALL注册就可以了。

老版本的话比较麻烦。我是这么做的:

修改 vendor\init.bat 加入以下内容到最尾部:

@IF "%~1"=="" GOTO endparse
@cd /D %1
:endparse

然后就可以用命令行:ConEmu.exe /Icon <CmderPath>\icons\cmder.ico /Title Cmder /LoadCfgFile <CmderPath>\vendor\conemu-maximus5\ConEmu.xml /Single /cmd cmd.exe /k <CmderPath>\vendor\init.bat "%path%"来启动 Cmder ,其中 %path% 则是你要启动的路径,而<CmderPath>则是你 Cmder 的路径。。

当然,说到 listary ,就不得不提它的智能菜单。我实现了一个这样的功能,双击资源管理器的空白处的菜单中增加了“在这里打开 Cmder 选项”,还是十分的好用的。

双击快速菜单

具体方法,则是在 选项->菜单->智能命令 中,点击“+”->启动应用程序,在“路径”中输入 ConEmu 的路径,大概是<CmderPath>\vendor\conemu-maximus5\ConEmu.exe;“参数”中输入/Icon <CmderPath>\icons\cmder.ico /Title Cmder /LoadCfgFile <CmderPath>\vendor\conemu-maximus5\ConEmu.xml /Single /cmd cmd.exe /k <CmderPath>\vendor\init.bat "%path%"

Listary 设置

附注

由于配置这一系列的东西的时间比较早,现在才整理出来,不免有些杂乱。如果有任何问题可以直接在下面留言。

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

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 订阅分享给我~

Firefox 35 下可用的 pentadactyl

pentadactyl 是一个以类 vim 方式操作 Firefox 的插件。

由于某些原因,pentadactyl 并未停止开发,但火狐附加组件页面和官方每日构建页面都停止了更新,导致火狐新版无法支持 。

于是我自己构建了一个版本,是文章发布时的最新源码构建的。放在了百度网盘,需要的人自取。

构建其实也很简单,以 CentOS 为例,假设你安装了 epel ,然后:

yum install mercurial zip make # 安装hg,zip,gmake等依赖
hg clone http://dactyl.googlecode.com/hg/ dactyl # 将 dactyl 的源码克隆到本地
cd dactyl/
make -C pentadactyl xpi # 制作 pentadactyl 的 xpi 文件

然后你会在 downloads 文件夹下发现构建好的 xpi 文件。直接用火狐安装即可。

更新:Firefox 35 可用的版本已经传到了百度网盘

使用 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 ~

supervisord 管理多进程程序如 pyspider 时的合适配置

现在的工程中,有一部分是用 pyspider 来抓取数据的,使用 supervisord 来管理它的进程。在使用过程中,遇到一个奇怪的问题:用supervisorctl stop pyspider之后,pyspider 并未全部停止,而是留下了三四个进程在系统中。

查阅官方手册,在 [program:x] Section Settings 中找到了名为 stopasgroup 的选项,解释如下:

If true, the flag causes supervisor to send the stop signal to the whole process group and implies killasgroup is true. This is useful for programs, such as Flask in debug mode, that do not propagate stop signals to their children, leaving them orphaned.

在 [program:pyspider] 小节,开启这个选项。如:

[program:pyspider]
command=/home/oott123/pyspider/run.py
autorestart=true
startsecs=2
user=oott123
directory=/home/oott123/pyspider/
redirect_stderr=true
stopasgroup=true
environment=WEBUI_HOST="127.0.0.1",WEBUI_PORT="5033"

然后重启 supervisord ,再测试停止 pyspider 的服务,它就不会残留那几个进程了。

CentOS 7 下 docker 安装拾穗

如何安装 docker

docker 在 CentOS 7 下已经收录到了 extras 包中,因此我们只需要执行:yum install docker 即可安装 docker。

安装后,使用systemctl start docker来启动 docker 的服务,再用systemctl enable docker来使其开机启动。顺带一提,service docker startchkconfig docker on也能达到同样的效果;但由于 CentOS 7 采用了 systemd 来管理服务和开启启动项,因此我们尽量使用 systemctl 来操作服务。

安装后输入 docker info 来查看 docker 信息。

[root@localhost data]# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-253:0-68161190-pool
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 293.0 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 0.7 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.10.0-123.el7.x86_64

如何修改 Data file 路径

遇到的第一个问题,则是:docker 的数据都放到哪里了?显然,上面的 docker info 给了我们答案: 在/var/lib/docker/ 下。由于种种神奇的原因,我们希望尝试 修改 docker 的数据存放目录

编辑这个文件:vim /etc/sysconfig/docker,找到OPTIONS=--selinux-enabled -H fd://,修改为:OPTIONS=-g /mnt/docker0/data --selinux-enabled -H fd://。这样我们就成功的将 docker 目录修改成功了。

执行 systemctl restart docker ,再 docker info ,可以看到目录已经修改成功了。

如何使用国内的 docker 镜像源

考虑 DockerPool 这个 docker poll。

例如,我要下载 CentOS 7 的 docker 镜像,那么执行:

docker pull dl.dockerpool.com:5000/centos:centos7

镜像文件略微有点大,下得我心醉。在 DockerPoll Downloads 可以找到其它的镜像列表。

下载完成后,要把第三方 registry 的下载的文件打上 tag

docker tag dl.dockerpool.com:5000/centos:centos7 centos:centos7

如何清理 docker 容器

执行了一些简单的命令,比如docker run -t -i centos:centos7 ping baidu.com之后,再看 docker info ,发现 Containers 居然到了 4 。大惊,用 docker ps -a 查看后才知道,每次我用 docker run 的时候他都会新建一个 Container。试了下 docker rm ,一次只能删除一个。改用 docker rm $(docker ps -aq) ,成功删除它们。

参考:Docker——从入门到实践

还算比较完善的 Linux 服务器自动备份、上传脚本

脚本托管于gist,点击查看

由于内嵌会导致一定程度的网页加载阻塞,故此处内嵌并非实时版本。

#!/bin/bash
Err() { echo -ne "\e[1;31m"; Log "$@" 1>&2; echo -ne "\e[0m";}
Log() { echo $(date +"[%Y-%m-%d %H:%M:%S]") $@; }
Log ====每日备份脚本开始运行====
UPLOADER_BIN="/root/auto-scripts/bpcs_uploader/bpcs" #bpcs 上传脚本路径(见下方bpcs文件)
REMOTE_DIR=$(date +"%Y%m")/$(date +"%Y%m%d") # 远端上传路径
WORKING_DIR="/root/auto-scripts/backup_daily" # 工作路径
CONFIG_DIR=$WORKING_DIR/list.d #配置文件路径
BACKUP_DIR=$WORKING_DIR/backups #本地备份路径
CURRENT_DIR=$BACKUP_DIR/$(date +"%Y%m%d")
OLD_DIR=$BACKUP_DIR/$(date -d -3day +"%Y%m%d")
zipPassword=ChangeThePasswordToYourOwn #备份密码
#准备删除老文件
Log 删除旧备份文件夹:$OLD_DIR
rm -rf $OLD_DIR
#创建新目录
mkdir -p $CURRENT_DIR
#遍历配置目录,进行备份
for i in $(ls $CONFIG_DIR)
do
zipExclude="*/cache/* */tmp/* */temp/* */.npm/* */data/threadcache/*"
. $CONFIG_DIR/$i
Log 备份$backupDir为$i……
backupFile=$i.zip
zip -r -P $zipPassword $CURRENT_DIR/$backupFile $backupDir -x $zipExclude
Log 上传备份……
$UPLOADER_BIN upload $CURRENT_DIR/$backupFile $REMOTE_DIR/$backupFile
done
Log 备份完成!

用法懒的写,自己研究!

依赖:bpcs_uploader,以及 zip 。yum install zip