Creke Blog | 梦溪博客 http://blog.creke.net 从这里睁眼看世界 Mon, 12 Sep 2016 12:31:50 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.5.3 EarthLiveSharp中cloudinary的CDN图片缓存自动清理 http://blog.creke.net/823.html http://blog.creke.net/823.html#respond Mon, 12 Sep 2016 12:30:57 +0000 http://blog.creke.net/?p=823 最近总是对地球宇宙着迷。

恰巧发现有个叫“EarthLiveSharp”,可用将日本向日葵8号卫星的地球实时图片设为屏保。向日葵8号卫星的地球实时图片官网为:http://himawari8.nict.go.jp/,EarthLiveSharp的项目地址是:https://github.com/bitdust/EarthLiveSharp。

为了减轻向日葵8号的服务器负担,同时也是提高地球实时图片的获取成功率,需要使用cloudinary来做CDN。注册配置都在软件里有说明。

目前EarthLiveSharp暂时没有清理cloudinary的CDN图片缓存的功能,于是我用python写了一个,并尝试用gist管理,地址为:https://gist.github.com/creke/c5a8a18fa41b8f5c1a0719a7e0cf4de6

同时,为了大家方便,顺便编译成了Windows可执行文件,下载: https://pan.baidu.com/s/1c27fXEo 提取码:k33n

为了自己检索方便,顺便在这里附上python脚本源码,可以作为python如何使用RESTful接口的例子,相关工具类函数也便于参考。

EarthLiveCleanCloudinary.py

# -*- coding: utf-8 -*-
# Author: Creke
# HomePage: http://blog.creke.net

import sys
import urllib, urllib2
import base64
import json

URLLIB_DEBUG_LEVEL = 1
URLLIB_TIMEOUT = 5

def Dict2Uri(dic):
return urllib.urlencode(dic)

def GenUrllibReq(url, method, api_key, api_secret, post_data=None):
urlreq = None
if post_data is None:
urlreq = urllib2.Request(url)
else:
urlreq = urllib2.Request(url, post_data)
urlreq.get_method = lambda: method
auth_str = base64.b64encode('%s:%s' % (api_key, api_secret))
urlreq.add_header("Authorization", "Basic %s" % auth_str)
urlreq.add_header('Cache-Control', 'no-cache')
return urlreq

def GetApiDelUrl(cloud_name, img_type):
url = "https://api.cloudinary.com/v1_1/%s/resources/image/%s" % (cloud_name, img_type)
params = {"prefix": "http://himawari8-dl"}
url = url + "?" + Dict2Uri(params)
return url

def main(argv):
arg_idx = 1
api_key = argv[arg_idx]
arg_idx += 1
api_secret = argv[arg_idx]
arg_idx += 1
cloud_name = argv[arg_idx]

while True:
del_url = GetApiDelUrl(cloud_name, 'fetch')
urlreq = GenUrllibReq(del_url, 'DELETE', api_key, api_secret)

print "==========================="
print "Requesting %s" % (del_url)
opener = urllib2.build_opener(urllib2.HTTPSHandler(debuglevel=URLLIB_DEBUG_LEVEL))
urllib_open = opener.open(urlreq, timeout=URLLIB_TIMEOUT)
response = urllib_open.read()
print "==========================="
print "Response:"
print "%s" % (response)
print "==========================="
urllib_open.close()
print "Done Requesting"

res_json = json.loads(response)
deleted_cnt = len(res_json['deleted'])
print "Deleted %u himawari8 pics" % (deleted_cnt)
print "==========================="
if 'next_cursor' in res_json and deleted_cnt>0:
print "Due to Cloudinary limits, we're starting a new round"
else:
break

return 0

def PrintHelp(argv):
print "\t USAGE: %s [api_key] [api_secret] [cloud_name]" % (argv[0])

if __name__ == '__main__':
if len(sys.argv) < 4:
PrintHelp(sys.argv)
exit(1)
print "RUNNING main"
main(sys.argv)
print "DONE main"

EarthLiveCleanCloudinary2exe.py

# -*- coding: utf-8 -*-
# Author: Creke
# HomePage: http://blog.creke.net

from distutils.core import setup
import py2exe

setup(console=['EarthLiveCleanCloudinary.py'])

 

]]>
http://blog.creke.net/823.html/feed 0
WordPress取消英文标点符号自动替换中文标点符号的优雅方法 http://blog.creke.net/821.html http://blog.creke.net/821.html#comments Thu, 01 Sep 2016 06:20:38 +0000 http://blog.creke.net/?p=821 众所周知,WordPress中文版有个特性,会将每一处英文引号("")都稀里哗啦转化为中文引号(“”)。不仅仅是英文引号,在WordPress翻译文件定义了不少自动转换符号,具体可以参考这里

对文字博客来说,这是个好功能,这样会避免用错英文标点。

然而,WordPress是独立的php程序,中文社区中懂得使用者,大部分都是技术博客。而技术博客会经常贴出代码,里面包含各种英文标点是再正常不过的事情。这时候,英文标点符号自动转换就是一个恼人的画蛇添足功能了。

网上很多文章都是让该WordPress核心文件。只不过,WordPress是一个高度模块化的系统,肯定有更优雅的解决方案。

一番搜寻之后,发现最简单的办法,就是安装一个叫Quotmarks Replacer的插件,地址在这里

插件很简单,就是将WordPress自动转换标点符号的函数用系统接口去掉。核心代码如下:

<?php
/*
Plugin Name: Quotmarks Replacer
Plugin URI: http://sparanoid.com/work/quotmarks-replacer/
Description: Quotmarks Replacer disables wptexturize function that keeps all quotation marks and suspension points in half-width form.
Version: 2.6.17
Author: Tunghsiao Liu
Author URI: http://sparanoid.com/
Author Email: t@sparanoid.com
License: GPLv2 or later

Copyright 2016 Tunghsiao Liu, aka. Sparanoid (t@sparanoid.com)

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2, as
published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

$qmr_work_tags = array(
'the_title',             // http://codex.wordpress.org/Function_Reference/the_title
'the_content',           // http://codex.wordpress.org/Function_Reference/the_content
'the_excerpt',           // http://codex.wordpress.org/Function_Reference/the_excerpt
// 'list_cats',          Deprecated. http://codex.wordpress.org/Function_Reference/list_cats
'single_post_title',     // http://codex.wordpress.org/Function_Reference/single_post_title
'comment_author',        // http://codex.wordpress.org/Function_Reference/comment_author
'comment_text',          // http://codex.wordpress.org/Function_Reference/comment_text
// 'link_name',          Deprecated.
// 'link_notes',         Deprecated.
'link_description',      // Deprecated, but still widely used.
'bloginfo',              // http://codex.wordpress.org/Function_Reference/bloginfo
'wp_title',              // http://codex.wordpress.org/Function_Reference/wp_title
'term_description',      // http://codex.wordpress.org/Function_Reference/term_description
'category_description',  // http://codex.wordpress.org/Function_Reference/category_description
'widget_title',          // Used by all widgets in themes
'widget_text'            // Used by all widgets in themes
);

foreach ( $qmr_work_tags as $qmr_work_tag ) {
remove_filter ($qmr_work_tag, 'wptexturize');
}

 

]]>
http://blog.creke.net/821.html/feed 2
安装aria2及使用yaaw配置WebGUI界面 http://blog.creke.net/819.html http://blog.creke.net/819.html#respond Tue, 30 Aug 2016 00:13:34 +0000 http://blog.creke.net/?p=819 现在一般的linux发行版的gcc都不太新,而aria2 1.18之后需要gcc 4.8,所以只能装之前的版本咯。反正下载功能没有区别,都支持http、ftp、bt、magnet磁力链接等协议。

wget http://jaist.dl.sourceforge.net/project/aria2/stable/aria2-1.17.1/aria2-1.17.1.tar.gz
tar zxf aria2-1.17.1.tar.gz
cd aria2-1.17.1
./configure --prefix=/usr/local/blog.creke.net/aria2 --enable-static=true --enable-shared=true --enable-libaria2 --with-tcmalloc --with-sqlite3=/usr/local
#注:configure输出最主要看Xml-RPC是yes就行
make
make install

然后摸一下session文件:

touch /home/blog.creke.net/work/aria2/aria2.session

配置(/home/blog.creke.net/work/aria2/aria2.conf):

#Basic
dir=/home/blog.creke.net/work/aria2/download
continue=true

#HTTP
user-agent=Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0

#BT
enable-dht=true
seed-time=0
dht-listen-port=6882
dht-entry-point=loki.uplinklabs.net:33445

#network
max-overall-download-limit=5M
max-overall-upload-limit=1M
max-upload-limit=512K

#RPC
enable-rpc=true
#rpc-listen-all=true
rpc-allow-origin-all=true
rpc-listen-port=35002
#rpc-user=none
#rpc-passwd=none

#Advanced

配置nginx代理aria2的jsonrpc:

location /aria2/jsonrpc {
proxy_pass http://localhost:35002/jsonrpc;
proxy_redirect off;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
}

安装web gui:

wget https://github.com/binux/yaaw/archive/master.zip
mv master yaaw.zip
unzip yaaw.zip
mv yaaw-master/ yaaw/

值得一提的是,yaaw不支持用户名密码,所以用nginx进行反向代理。修改
打开yaaw的js目录中aria2.js和yaaw.js,搜寻端口号,改成自己定义的端口号和路径。

附:init.d适用的自动启动脚本如下:

#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f nginx defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add aria2'

### BEGIN INIT INFO
# Provides:          aria2c
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts aria2c
# Description:       starts aria2c as a service
### END INIT INFO

# Author:   Creke
# website:  http://blog.creke.net/

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="aria2c daemon"
NAME=aria2c
DAEMON=/usr/local/blog.creke.net/aria2/bin/$NAME
CONFPATH=/home/blog.creke.net/work/aria2/aria2.conf
SESSION=/home/blog.creke.net/work/aria2/aria2.session
#PIDFILE=/usr/local/haproxy/etc/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
USER="blog.creke.net"

set -e
[ -x "$DAEMON" ] || exit 0

do_start() {
su - $USER -c "$DAEMON --conf-path=$CONFPATH -D --input-file=$SESSION --save-session=$SESSION" || echo -n "aria2c already running"
}

do_stop() {
killall -INT $NAME || echo -n "aria2c not running"
}

do_reload() {
kill -HUP $NAME || echo -n "aria2c can't reload"
}

case "$1" in
start)
echo -n "Starting $DESC: $NAME"
do_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
;;
reload|graceful)
echo -n "Reloading $DESC configuration..."
do_reload
echo "."
;;
restart)
echo -n "Restarting $DESC: $NAME"
do_stop
do_start
echo "."
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
exit 3
;;
esac

exit 0

 

]]>
http://blog.creke.net/819.html/feed 0
Zabbix安装简记 http://blog.creke.net/818.html http://blog.creke.net/818.html#respond Mon, 29 Aug 2016 14:06:57 +0000 http://blog.creke.net/?p=818 安装zabbix:

wget http://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.2.6/zabbix-2.2.6.tar.gz
tar zxf zabbix-2.2.6.tar.gz
cd zabbix-2.2.6
./configure --prefix=/usr/local/zabbix --enable-server --with-mysql=/usr/local/mysql/bin/mysql_config --with-libcurl --enable-proxy --enable-agent
make
make install

配置zabbix:

编辑/usr/local/zabbix/conf/zabbix_server.conf。按照自己的需求对照编辑即可。

配置开机自动启动服务:

cd zabbix-2.2.6/misc/init.d/fedora
cp core5/zabbix_server /etc/init.d/

编辑/etc/init.d/zabbix_server其中的ZABBIX_BIN的值为"/usr/local/zabbix/sbin/zabbix_server"

增加用户组及用户:

groupadd -g 601 zabbix
useradd -u 601 -s /sbin/nologin -d /dev/null -M -g zabbix zabbix

导入初始数据库:

cd zabbix-2.2.6/database/mysql
mysql -ucreke -p
> use creke_zabbix;
> source schema.sql;
> source images.sql;
> source data.sql;
> quit;

复制php前端:

cp -r zabbix-2.2.6/frontends/php /home/wwwroot/default/zabbix
cd /home/wwwroot/default/zabbix
cp conf/zabbix.conf.php.example conf/zabbix.conf.php
编辑conf/zabbix.conf.php的数据库配置

默认帐号:admin,密码:zabbix

Zabbix简要安装说明,也只是装着玩玩,并没有深究。一般情况下,个人的服务器监控需求,还是使用监控宝、360网站监控之类的服务,会比自己搭建维护成本低。

 

]]>
http://blog.creke.net/818.html/feed 0
WordPress垃圾评论大作战 http://blog.creke.net/817.html http://blog.creke.net/817.html#comments Thu, 25 Aug 2016 18:23:28 +0000 http://blog.creke.net/?p=817 自从把博客搬到独立服务器之后,垃圾评论有日益增长的趋势。

上次集中清理垃圾评论的时间,刚好是6月初的一天。到8月下旬,居然积攒了5000多条垃圾评论!

WordPress的用户应该都深有感触,这个博客程序还是挺招惹垃圾评论的。因此WordPress自带了一个叫Akismet的插件。

Akismet插件工作原理是,将垃圾评论通过API上报到云端(想当年,Akismet诞生时云还不叫云,叫远程服务器),然后也会把垃圾评论存到垃圾评论数据库中。

不过像我这样几个月收几千条垃圾评论的用户来说,存起来显然不是个好办法。那么,怎么解决呢?

不急不急,解决之前,不如先分析一下问题吧!

垃圾评论也分三六九等的,定义如下:

  1. 机器人瞎子一样直接向WordPress的评论接口发数据包
  2. 机器人先解析页面,然后构造请求
  3. 机器人解析页面,还模拟浏览器运行脚本,然后构造请求
  4. 人工手打垃圾评论

分析了几千条垃圾评论,我觉得,像我这种小博客,99.99%都是第一、第二种情况。第三种几乎没有。第四种的话……也太看得起本站了。

分析之后,豁然开朗,针对第一种的情况,其实只需要在页面加一些隐含的字段就可以了。不过现在的机器人似乎比较聪明,还是会看一下评论表单的隐藏字段。那么就用脚本再加另外一个隐含字段——只有运行脚本的浏览器,才能正确解析,也才能正确发送这一个由脚本填充的隐藏字段。

但是,这种方案也有缺点,如果用户的浏览器不支持脚本,也就无法正确发送脚本填充的隐藏字段,同样会被拦截。关键在于,这样的用户有多少呢?

这时候,大数据(误)就派上用场了。我看了一下来访用户统计,大部分都是chrome或chrome核心,其它移动端的用户也是智能设备。也就是说,感谢科技发展,大部分用户的浏览器都是支持脚本的。那么,这个措施还是可以实施的。

于是乎,总结上面啰啰嗦嗦的一大串文字结论如下:

  1. 使用脚本在评论表单添加隐藏字段,发表评论时验证字段。
  2. 其余漏网之鱼,交给Akismet拦截。

参考代码如下:

<?php

defined( 'ABSPATH' ) or die( 'No script kiddies please!' );

define('DEFAULT_JQUERY_BEFORE', 'jQuery(function($) {');
define('DEFAULT_JQUERY_AFTER', '});');

function creke_cal_comment_val($k)
{
return strval(crc32('CrekeComment'.$k));
}

function creke_get_comment_form()
{
if(is_user_logged_in())
{
return;
}

$k = time(NULL);
$v = creke_cal_comment_val($k);
return "
<input type='hidden' name='creke_comment_k' value='$k' />
<input type='hidden' name='creke_comment_v' id='creke_comment_v' creke_comment_v='$v' value='$k'/>
";
}

function creke_get_comment_script($jQueryBefore=DEFAULT_JQUERY_BEFORE, $jQueryAfter=DEFAULT_JQUERY_AFTER)
{
if(is_user_logged_in())
{
return;
}

return "
<script type='text/javascript'>
$jQueryBefore
var id='#creke_';
id+='comment_v';
$(id).val($(id).attr('creke_comment_v'));
$jQueryAfter
</script>
";
}

function creke_comment_form()
{
echo creke_get_comment_form();
echo creke_get_comment_script();
}

add_action('comment_form', 'creke_comment_form');

function creke_comment_check($commentdata)
{
$dieMsg = 'do not spam';
$dieTitle = 'title';
$isSpam = FALSE;

$type = comment_type('comment', 'trackback', 'pingback');

if(is_user_logged_in() || $type == 'pingback' || $type == 'trackback')
{
return $commentdata;
}

$k = $_POST['creke_comment_k'];
$v = $_POST['creke_comment_v'];
if((time(NULL) - $k) > 86400)
{
$isSpam = true;
}
if(!$isSpam)
{
$isSpam = (creke_cal_comment_val($k) != $v);
}

if($isSpam)
{
wp_die($dieMsg, $dieTitle);
}

return $commentdata;
}

if(!is_admin()) {
add_filter('preprocess_comment', 'creke_comment_check', 1);
}

?>

]]>
http://blog.creke.net/817.html/feed 4
博客装修之升级wordpress:从2.8.6到4.5.3 http://blog.creke.net/816.html http://blog.creke.net/816.html#respond Thu, 25 Aug 2016 00:46:08 +0000 http://blog.creke.net/?p=816 博客很久没有更新了,不管是程序还是文章。博客程序用的是wordpress 2.8.6,那是2009年11月12日发布的,转眼间近7年了,想想还真是一段很长的时间啊。

最近垃圾评论陡然增多,反垃圾插件太旧了跟不上时代,于是盘算着把长草的博客里里外外装修一番。

就从博客程序先开始吧。

参考文档:https://codex.wordpress.org/Upgrading_WordPress_-_Extended_Instructions,里面详细描述了如何升级wordpress,总的来说有以下几个要点:

  1. 备份数据库
  2. 备份当前所有wordpress文件,特别提醒别忘了.htaccess文件
  3. 验证上面两步的备份是可用的
  4. 停用所有插件
  5. 确保前面4步没问题
  6. 下载解压缩新版wordpress
  7. 从备份中拷出下列目录/文件,覆盖新版:wp-config.php、wp-content目录(除了wp-content/cache和wp-content/plugins/widgets目录)、wp-images(如果有的话)、wp-includes/languages/、.htaccess、robots.txt
    上传上面准备好的新文件
  8. 访问wordpress更新程序:你的博客/wp-admin/upgrade.php
  9. 检查.htaccess是否需要更新,一般不需要
  10. 更新插件到新版本
  11. 重新启用插件
  12. 更新wp-config.php的安全秘钥,就是AUTH_KEY那堆配置啦
  13. 再确认wordpress变更是否正常

里面还有一章,叫“Upgrading Across Multiple Versions”即“跨版本升级”一节,其中提到:

  • wordpress向后兼容
  • 如果要跨好多版本升级,那么建议间隔一个版本来慢慢升级,例如:从2.5开始升级到4.5,那么先升级到2.7,再升级到2.9,再升级到3.1……以此类推
  • wordpress3.7之后有个一键升级(话说之前不是有吗?),支持从3.7直达4.5.3;不过,为了稳妥起见,我还是按照上面第2点的方法,跨版本慢慢升级

按照wordpress的官方指引,再加上自己的小窍门,我的升级步骤如下。

备份:

  1. 备份网站
  2. 备份数据库

准备环境:

  1. 在本地启动Apache+PHP+MySQL环境,创建blog.creke.net的虚拟主机
  2. 更改blog.creke.net的host到127.0.0.1
  3. 恢复blog.creke.net网站和数据库到本地的虚拟主机
  4. 检查本地的环境真的真的没问题

升级:

  1. 开始跨版本升级,每次都删除所有内容——解压新版——从备份中拷贝自定义内容——访问升级程序
  2. 看看后台是否正常,看看登入环境中前台是否正常,看看未登录环境中前台是否正常,注意用ctrl+F5刷新
    备份升级好的数据库,这个很重要,毕竟wordpress大量依赖数据库
  3. 从步骤1开始重复轮回,直到升级到最新版
  4. 升级了最后一个版本的时候,最后按照https://codex.wordpress.org/Editing_wp-config.php的文档,重新从wp-config-sample.php和旧的wp-config.php对照,编辑一个新的wp-config.php,保证设置的最新
  5. 更新必要的插件

上线更新:

  1. 在网站上挂升级公告
  2. 查看第一步到现在有没有人留言,有的话注意增量备份留言
  3. 恢复文件和数据库
  4. 下线公告,恢复网站正常访问
  5. 稳定运行一段时间后,使用插件清理文章的草稿等数据

于是乎,博客程序终于升级到了wordpress新版,旧的主题还能用,归功于wordpress向后兼容的设计哲学。

当然主题也是要装修的,下次有时间继续吧。

]]>
http://blog.creke.net/816.html/feed 0
后会无期,还是有期?——《后会无期》影评观后感 http://blog.creke.net/813.html http://blog.creke.net/813.html#comments Fri, 25 Jul 2014 23:39:30 +0000 http://blog.creke.net/?p=813 随着胡生憨傻的独白慢慢地将故事背景讲述出来,我们知道,这是一个以浩汉驱车送江河从他们居住的地方,我国最东边的岛屿,到最西边的边境入职的故事。关键的地方在于,这个最东边的东极岛,即将被拆迁。于是,这是一群即将连家乡都不存在的人。

一路上,他们先经过了当年青梅竹马的周沫的工作地方,也就是一个抗日神剧的片场。在那里,他们聊起了年少的时光。浩汉想送花,而周沫最终没有收下。然后,他们来到了一个破烂的旅馆。这里,江河遇到了假扮性工作者的苏米。苏米其实是与家人一起联合设局骗钱的,因为她怀孕了,需要钱。而骗嫖客的钱,也就成了他们自诩盗亦有道的理由。而当苏米的电话铃声响起时,那是一首《Que sera sera》,身为老师的江河居然能跟着歌词,将中文翻译如诗般朗诵出来。苏米就这样爱上了这个木讷但却又带几分情趣的男人。于是在家人假扮警察查房的顺水推舟下,她差点随着江河一行人远走高飞。最终苏米家人还是追上了他们,最终苏米还是回到了家人身边,并向江河解释这其实是骗局。也就是这个时候,胡生被落下了,从此车上只有浩汉与江河一起继续前行。

两人来到了浩汉另一个好友刘莺莺的家乡。浩汉已和刘莺莺书信来往多时,并且浩汉对刘莺莺甚为心仪。一见面,浩汉更加笃定了要对刘莺莺告白的决心。但是,刘莺莺先一步告诉浩汉事情的真相,浩汉一直视为勇者行为的当年父亲台风天出海捕鱼的意外其实并不是真的,其实他父亲是为了还情债而悄悄加入刘莺莺的家庭,其实浩汉和刘莺莺是同父异母的兄妹。

于是,无奈的浩汉继续与江河一路向西。然后观众基本算是明白,其实这是一部现代版西游记,然后电影插曲真的缓缓唱起了西游记插曲,“悄悄问圣僧,女儿美不美”。只不过这个插曲是吉他轻弹清唱,不知道是不是影院音响效果好,反正我是觉得听起来很舒服。旅途上俯拍的视角,配上车子孤独地在笔直的大桥上行驶的画面,影院里的人都不禁赞叹。仿佛假如电影从此变成了风景纪录片,也是值回票价的。

当然,故事情节还是不断地在展开。路上,他们收留了一条小狗,也收留了一个名为阿吕的人,继续前行。阿吕自称骑着摩托车环游全国,并讲述了对往生的妻子的无限思念。阿吕希望在西边的国境线上,看到追赶旅行者1号的卫星发射的场景。在发射当日,阿吕把浩汉的车子骗走。当浩汉与江河只好在荒凉的西边国境线上徒步,并因此发生争执时,那一颗卫星发射了。当大家都以为这颗卫星起码会象征着自己的梦想飞往宇宙当中时,发射失败爆炸了。就这样,江河带着小狗前往入职,与浩汉分道扬镳。

直到后来,胡生读到一个关于旅行者的故事。故事的结尾,江河回到东极岛游览。在船上,一位女生幸福地靠在江河身上打盹,她是苏米。

整部电影,一直在以反高潮的手法制造出理想与现实间的强烈反差。当观众以为,电影在描述了爱情,铺垫了信任,烘托了理想时,情节总会急转直下,原来他们是兄妹,原来他是骗子,就连载满了梦想的火箭都轰然爆炸只留下一地的残骸。只有那一条不断卖萌的阿拉斯加犬,由头到尾善始善终,这是因为导演韩寒是一个爱狗的人,仍然与理想和希望无关。片中有58同城的植入,而值得让观众放心的时,58同城的代言人兼《小时代》女主角杨幂终究还是没有跑错片场。既然提到了《小时代》,还是不得不说一下这两部电影的对比。其实我的看法很简单,对一部讲了4、5个故事的电影,和三部讲了一个故事的电影,在两者都具有剧情不够强粘合的缺点下,显然是多看几个故事会更有趣。

最后,故事中各个人物貌似没有明确交待结局。这不就像生活吗,当我们送行以为从此会离别时,发现其实联系方式一直都在,而且交通也很方便,看似后会无期,实则后会有期,其实这就是生活。

]]>
http://blog.creke.net/813.html/feed 7
CentOS使用VNC查看X11图形界面窗口 http://blog.creke.net/811.html http://blog.creke.net/811.html#comments Tue, 11 Feb 2014 15:11:21 +0000 http://blog.creke.net/?p=811 上篇文章《CentOS在SSH中运行GUI图形界面程序》提到了怎么在SSH中转发X11窗口,但是在实际应用过程中,特别是网络不好的时候,往往会发现SSH的X11转发速度很慢。而如果我们能在服务器中启动一个VNC服务,通过连接服务器提供的VNC来查看窗口内容,则在网络不好时仍能有比较流畅的远程窗口界面。

我的CentOS服务器是通过SSH连接,而且没有安装图形窗口的,即Headless System。因此我决定使用x11vnc和Xvfb两个轻量级的应用来实现我的需求。其中,x11vnc是一个VNC服务程序,本身就比较轻量级,因此对于只需要运行一两个图形界面窗口程序的轻量级需求就更加贴切了。我们知道,在Linux中显示窗口,首先要创建一个display服务。而Xvfb就是一个轻量级的,不产生实际屏幕输出的虚拟display服务程序。因此整个方案的原理是,Xvfb创建display,x11vnc连上去并转换成vnc协议。

首先,安装必要组件:

yum install xorg-x11-xauth xterm libXi libXp libXtst libXtst-devel libXext libXext-devel

接着安装x11vnc,脚本如下:

wget http://softlayer-ams.dl.sourceforge.net/project/libvncserver/x11vnc/0.9.13/x11vnc-0.9.13.tar.gz

tar zxf x11vnc-0.9.13.tar.gz

cd tar zxf x11vnc-0.9.13

./configure --prefix=/usr/local/blog.creke.net/x11vnc

make

make install

然后我们通过yum来安装Xvfb,脚本如下:

yum install Xvfb

然后通过x11vnc的一条简单的命令就可以很简单地把Xvfb也使用进来了,如下:

/usr/local/x11vnc/bin/x11vnc -rfbport 12345 -passwd 连接密码 -create -forever

运行起来后,用vnc客户端链接服务器12345端口,输入正确的密码就可以看到终端窗口了。而在终端中启动窗口程序,也能够在VNC中直接显示出来了。如果希望在登出SSH后窗口还能用,则可以在screen中运行上面的脚本。如果希望多个人能够同时连进VNC,可以加上“-shared”参数。具体的详细参数说明参阅x11vnc参数说明文档

]]>
http://blog.creke.net/811.html/feed 3
CentOS在SSH中运行GUI图形界面程序 http://blog.creke.net/810.html http://blog.creke.net/810.html#respond Tue, 11 Feb 2014 14:48:46 +0000 http://blog.creke.net/?p=810 最近需要在CentOS中运行FreeRapid,是一个图形界面的网盘下载器。

一般情况来说,设置好JAVA_HOME、PATH等系统环境变量后,运行以下命令即可:

java -jar frd.jar > /dev/null 2>&1 &

但我的CentOS是无桌面环境的服务器系统,那怎么配置运行呢?步骤如下。

首先,打开/etc/ssh/sshd_config,修改:

X11Forwarding yes
X11UseLocalhost yes

然后重启sshd:

service sshd restart

重新登入ssh,若出现“WARNING! The remote SSH server rejected X11 forwarding request.”,则需要安装以下组件:

yum install xorg-x11-xauth xterm

若运行Java程序时出现“No X11 DISPLAY variable was set, but this program performed an operation which requires it.”,则:

export DISPLAY=localhost:10.0

localhost:10.0只是一个常用的例子,具体要根据用户本机的X11 server来设定;如果用Xmanager,在SSH的属性设置的Tunneling中forward到Xmanager了,登录SSH会自动设置好这个系统环境变量的。

若出现“libXtst.so.6: cannot open shared object file: No such file or directory”,则安装必要组件:

yum install libXi libXp libXtst

还有个问题,SSH中用screen是很方便的,但是screen中运行X11图形界面程序就很麻烦了,解决方案有以下几个:

1、用proxy-display这个小脚本,不过兼容性有点问题。https://blog.nelhage.com/2010/05/using-x-forwarding-with-screen/

2、用xpra,号称是“X窗口环境中的screen”,相关网址是http://xpra.org

3、不用X11转发,改用VNC进行远程图形界面传输,这是个很好的方案。还可以弥补X11 forwarding的性能卡顿问题。这个解决方案我会整理另一篇文章,参见《CentOS使用VNC查看X11图形界面窗口》:。

]]>
http://blog.creke.net/810.html/feed 0
CentOS安装gcc 4.4并保留原有版本 http://blog.creke.net/809.html http://blog.creke.net/809.html#respond Tue, 11 Feb 2014 12:18:03 +0000 http://blog.creke.net/?p=809 其实在CentOS中,yum库已经独立出了gcc 4.4,可以单独安装:

yum install gcc44 gcc44-c++

在使用gcc 4.4编译时,要进行必要环境变量设置:

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
export CC=gcc44
export CXX=g++44
export PKG_CONFIG=/usr/bin/pkg-config

]]>
http://blog.creke.net/809.html/feed 0