Forecast::IO 599 Internal Exception

Forecast.io provide great public weather data service API. They also provide SDK for many languages which is very friendly to developers.

However if you are using their Perl module Forecast::IO, maybe you will have this error when you try to install it

Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/forecast.t .. # Please enter your Forecast.io API key: 
xxxxxxxxxxxxxxxxxxxx
Request to 'https://api.forecast.io/forecast/xxxxxxxxxxxxxxxxxxxx/43.6667,-79.4167,1373241600?units=auto' failed: 599 Internal Exception
# Looks like your test exited with 255 before it could output anything.
t/forecast.t .. Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 6/6 subtests

The root cause of this error is Forecast::IO use HTTP::Tiny for HTTP request. And HTTP::Tiny need Net::SSLeay module to access HTTPS url. If the module was not installed HTTP::Tiny would only say 599 error and you can't know the real reason unless you look into the code and try it like below.

$ perl -e "use HTTP::Tiny; use Data::Dumper; print Dumper(HTTP::Tiny->new>get('https://api.forecast.io/forecast/xxxxxxxxxxxxxxxxxxxx/43.6667,-79.4167,1373241600?units=auto'));"
$VAR1 = {
          'success' => '',
          'headers' => {
                         'content-type' => 'text/plain',
                         'content-length' => 53
                   },
          'status' => 599,
          'content' => 'Net::SSLeay 1.49 must be installed for https support',
          'reason' => 'Internal Exception',
          'url' => 'https://api.forecast.io/forecast/xxxxxxxxxxxxxxxxxxxx/43.6667,-79.4167,1373241600?units=auto'
        };

This is really a confused way to report this error.

Anyway, to fix this issue you only need to install the module Net::SSLeay

sudo perl -MCPAN -e 'install Net::SSLeay'

阅读笔记 20140115

[TOC]

持续集成以及自动化部署

Linux Container + Checkpoint/Restore

LXC + CRIU

Docker

将程序的安装流程封装成Dockerfile,用hg/git进行版本管理。

两种部署方案

  • 用post_commit_hook配合Fabric脚本来完成自动脚本部署
  • 用buildbot/jerkins做持续集成,push的时候自动激活ci进行部署

部署

  1. 使用docker来build一个全新的image,build成功后打上标签
  2. 停掉运行老的image的container,用docker run -v /path/to/volume 的方式,将container上的数据挂载到新的container上,实现新版本的升级
  3. 如果程序需要不中断升级的话,可以考虑将数据库独立出来,然后在跑应用的前面加上hipache之类的动态代理,在不停掉老的container的情况下,运行新的container,在动态代理上将流量指向新的container
  4. 如果需要回滚的话,那就停掉新的container,用docker restart将老的container重新跑起来。这中间如果要实现跟代码仓库的联动,可能需要在build image的时候打上合适的标签,然后检测到有老的已经build了的image,就直接找这个image已有的container来用。
  5. 在运行环境中,supervisor可能会用上,virtualenv可以不用,因为docker本身就是隔离环境,可以直接用系统的python环境。

问题

  1. 默认使用端口映射模式,而不是路由模式,iptables在设定的时候非常容易冲突(尤其是并行启动关闭虚拟机的时候),而且性能不会太高。
  2. 默认使用lxc-kill来干掉虚拟机,但是用户程序写的不好的情况下,虚拟机有可能干不掉,会剩下一个defunct进程。这时候虚拟机已经“退散”了,但是资源项释放不干净。例如vethXXX虚拟接口一直在系统里删不掉。
  3. API全部都undocument,几乎每个版本一改。不过还好,这是开发中系统的特性。

Source via

代码段速记 gist.github.com

gist.github.com

github最初的主要功能是类似sourceforge和google code的代码库存储发布,后来似乎开始往面向程序员的SNS方向发展。SourceForge这么多年了,没想到从git这样一个貌似很常见的版本版本管理工具的基础上,能够发展出这么多形形色色的功能。

最近又发现GitHub发布了gist.github.com,这是一个用来保存和发布代码片段的功能,每个代码片段都用一个git仓库管理,可以保存历史版本。也可以通过一个链接很方便的嵌入在Blog或网页中。这样一来,发布代码片段的时候,再也不用为了保持代码格式和语法高亮去费劲的调试CSS和插件了,而且可以很方便的进行代码段的更新和版本跟踪。如果能够加上tag或者分类的话,就更加完美了。

此外,如果使用Chrome浏览器,还有一个GitHub Gist插件可以用。

制作ASCII字符动画

看过Matrix的同学应该还记得,在母舰上一直在计算的电脑屏幕在Neo觉醒的时候,不停的下落的杂乱无章的字符组成了Neo当时所处的场景。其实利用开源和免费的工具,我们可以将现有的视频转换为ASCII字符格式的视频。

需要用到的工具是QQ影音、Ascgen dotNET、MPlayer和Mencoder。QQ影音用于提取视频和音频;MPlayer用于自动截图,可以从www.mplayerhq.hu下载,其中应该包含了mencoder.exe。如果没有的话,可以去下一个mediacoder,里面有mencoder这个工具。Ascgen dotNET用于将图片专为ASCII的,可以从http://ascgendotnet.jmsoftware.co.uk/download下载;最后使用mencoder将图片重新编码为视频。

第一步,找到需要转换的视频,利用QQ影音的“转码/截取/合并”功能,将想要转换的视频和音频分别截取出来。

第二步,用MPlayer打开要前面准备好的视频,播放的同时按“Shift-D”也就是启动“开始/停止自动截图”功能,截取的图片默认是保存在C:\Documents and Settings\Administrator.smplayer\screenshots下面。每分钟的视频大概会有1500多张图片。

第三步,使用Ascgen dotNET的Batch Conversion功能,将截取的所有图片文件或目录加入到列表中,设置好输出目录,选择输出为jpg格式、75%大小,勾选Colour选项,然后点Convert开始转换。这一步会将原始图片转换为以ASCII字符构成的图片。

最后一步,在转换好的ASCII图片目录中,使用mencoder用命令行编码为视频:

[mencoder.exe所在的目录]\mencoder mf://*.jpg -mf w=[生成图片的宽度]:h=[生成图片的高度]:fps=[原始视频的fps]:type=jpg 
-ovc lavc  -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -audiofile [第一步提取出来的mp3文件] -o output.avi

其中“生成图片的高度和宽度”可以从查看生成的图片的属性,在“摘要”中有图片的高度和宽度信息。原始视频的fps值一般情况下是30,可以用QQ影音打开视频文件,右键点视频窗口——文件信息——“视频帧率”中查到,也可以查看视频文件的“属性”——摘要——“帧速率”。如果不需要声音的话,可以去掉命令行中“-audiofile [第一步提取出来的mp3文件]”这一部分。

最终在当前目录下生成的output.avi文件就是转换好的ASCII字符视频了。