阿里云布置rails服务,无法使用公网IP访问

Problem: 没有绑定到0.0.0.0

rails s

=> Booting WEBrick

=> Rails 4.2.0 application starting in development on http://localhost:3000

=> Run `rails server -h` for more startup options

=> Ctrl-C to shutdown server

[2015-01-30 23:39:15] INFO  WEBrick 1.3.1

[2015-01-30 23:39:15] INFO  ruby 2.1.2 (2014-05-08) [x86_64-darwin13.0]

[2015-01-30 23:39:15] INFO  WEBrick::HTTPServer#start: pid=27669 port=3000

[2015-01-30 23:42:05] ERROR bad Request-Line `help’.

^C[2015-01-31 09:01:15] INFO  going to shutdown …

[2015-01-31 09:01:15] INFO  WEBrick::HTTPServer#start done.

Solution:
修改config/boot.rb 代码如下:
ENV[‘BUNDLE_GEMFILE’] ||= File.expand_path(‘../../Gemfile’, __FILE__)
require ‘bundler/setup’ # Set up gems listed in the Gemfile.
require ‘rubygems’
require ‘rails/commands/server’
module Rails
  class Server
    alias :default_options_alias :default_options
    def default_options
      default_options_alias.merge!(:Host => ‘0.0.0.0’)
    end
  end
end
重启rails s之后得到如下提示。一切正常。

rails s

=> Booting WEBrick

=> Rails 4.2.0 application starting in development on http://0.0.0.0:3000

=> Run `rails server -h` for more startup options

=> Ctrl-C to shutdown server

[2015-01-31 09:02:25] INFO  WEBrick 1.3.1

[2015-01-31 09:02:25] INFO  ruby 2.1.2 (2014-05-08) [x86_64-darwin13.0]

[2015-01-31 09:02:25] INFO  WEBrick::HTTPServer#start: pid=27958 port=3000

^C[2015-01-31 09:02:32] INFO  going to shutdown …

[2015-01-31 09:02:32] INFO  WEBrick::HTTPServer#start done.

Prepending `bundle exec` to your command may solve this

Problem:

CUImatoMacBook-Pro:pgg_app alan_cuiwei$ rake db:migrate

rake aborted!

Gem::LoadError: You have already activated rake 10.4.2, but your Gemfile requires rake 10.3.2. Prepending `bundle exec` to your command may solve this.

/usr/local/rvm/gems/ruby-2.1.2@global/gems/bundler-1.6.2/lib/bundler/runtime.rb:34:in `block in setup’

/usr/local/rvm/gems/ruby-2.1.2@global/gems/bundler-1.6.2/lib/bundler/runtime.rb:19:in `setup’

/usr/local/rvm/gems/ruby-2.1.2@global/gems/bundler-1.6.2/lib/bundler.rb:120:in `setup’

/usr/local/rvm/gems/ruby-2.1.2@global/gems/bundler-1.6.2/lib/bundler/setup.rb:7:in `<top (required)>’

/Users/alan_cuiwei/workspace/pgg_app/config/boot.rb:4:in `<top (required)>’

/Users/alan_cuiwei/workspace/pgg_app/config/application.rb:1:in `<top (required)>’

/Users/alan_cuiwei/workspace/pgg_app/Rakefile:4:in `<top (required)>’

LoadError: cannot load such file — bundler/setup

/Users/alan_cuiwei/workspace/pgg_app/config/boot.rb:4:in `<top (required)>’

/Users/alan_cuiwei/workspace/pgg_app/config/application.rb:1:in `<top (required)>’

/Users/alan_cuiwei/workspace/pgg_app/Rakefile:4:in `<top (required)>’

(See full trace by running task with –trace)

Solution:

CUImatoMacBook-Pro:pgg_app alan_cuiwei$ bundle exec rake db:migrate

Rails4 + 微信公众号接入

0. 微信公众号设置:http://www.example.com/weixin

1. rails g controller weixins show create


2. weixins_controller.rb:

class WeixinsController < ApplicationController

skip_before_filter :verify_authenticity_token
before_filter :check_weixin_legality

  def show
  render :text => params[:echostr]
  end

  def create
    if params[:xml][:MsgType] == “text”
      render “echo”, :formats => :xml
    end  
  end

  private
  def check_weixin_legality
    array = [“productgaga**”, params[:timestamp], params[:nonce]].sort
    render :text => “Forbidden”, :status => 403 if params[:signature] != Digest::SHA1.hexdigest(array.join)
  end

  def weixin_params
    params.require(:weixin).permit(:xml)
  end


end
3. views/weixins/echo.xml.erb:
<xml>
    <ToUserName><![CDATA[<%= params[:xml][:FromUserName] %>]]></ToUserName>
    <FromUserName><![CDATA[<%= params[:xml][:ToUserName] %>]]></FromUserName>
    <CreateTime><%= Time.now.to_i %></CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[大山的回声:<%= params[:xml][:Content] %>]]></Content>
    <FuncFlag>0</FuncFlag>
</xml>


4. routes.rb:

Rails.application.routes.draw do

  get ‘weixin’ => ‘weixins#show’
  post ‘weixin’ => ‘weixins#create’

  resources :weixins
5. Gemfile:
gem ‘actionpack-xml_parser’
6. Config/application.rb:

require File.expand_path(‘../boot’, __FILE__)

# Pick the frameworks you want:
require “active_model/railtie”
require “active_record/railtie”
require “action_controller/railtie”
require “action_mailer/railtie”
require “action_view/railtie”
require “sprockets/railtie”
require ‘action_dispatch/xml_params_parser’
# require “rails/test_unit/railtie”

# Require the gems listed in Gemfile, including any gems
# you’ve limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module PggApp
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # — all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run “rake -D time” for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = ‘Central Time (US & Canada)’

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join(‘my’, ‘locales’, ‘*.{rb,yml}’).to_s]
    # config.i18n.default_locale = :de
    config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif)
    config.middleware.use “PDFKit::Middleware”, :print_media_type => true


    config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::XmlParamsParser
  end
end

ubuntu定时执行任务crontab的使用

先来说下场景,需要写一个爬虫,定时从某个接口地址获取数据,然后存入本地数据库。

因此就需要一个可定时执行的东西,之前在the5fire的知识体系中除了可以在数据库中定时执行某个存储过程或者sql语句,如何在系统中定时执行某个任务还没有概念。

于是,请教了同事。知道在ubuntu中,准确的说是在linux中,有这么东西——crontab,专门用来定制执行任务。简单解说一番,就会用了。

虽然这个东西比较简单,但为了保证知识体系的完整,还是要查查crontab是个什么。

crontab单词的意思是:定时任务。

crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρόνος),原意是时间。

通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

有了上面的概念,再来看crontab的使用就会清晰些。

既然是系统每分钟都要检查一下,那么必然要有一个检查的依据,如配置文件或者什么的。
还是来看看百科:

crontab文件包含送交cron守护进程的一系列作业和指令。每个用户可以拥有自己的crontab文件;同时,操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc或者/etc之下的子目录中,而这个文件只能由系统管理员来修改。
  crontab文件的每一行均遵守特定的格式,由空格或tab分隔为数个领域,每个领域可以放置单一或多个数值。

好了,开始使用了。估计有些人从定义就知道他要怎么用了。不过我还是想记录下。

使用步骤:
1、终端运行crontab -e [解释:编辑配置文件]
2、选择你要用的编辑器,一般人会选择vi。
3、此时配置文件已打开,只需要按照他的格式写配置即可。

好吧,简单到我都觉得。。

举个例子:

在我的home目录下有一个python脚本,helloworld.py

   #coding:utf-8
   print ‘hello world by crontab!’

我想要这个脚本在每天的早上7点30执行。
因此这个 任务的crontab配置文件就是:

   # m h  dom mon dow   command
   30 7 * * * python /home/the5fire/testcrontab.py >>/home/the5fire/testcrontab.log 2>&1

简单解释下,这个配置的意思就是在每天的7:30用python运行我的家目录下的testcrontab.py文件,并将输出内容输出到testcrontab.log中,后面那个2>&1的意思是把错误的输出也输出到标准输出(2表示错误,2>表示错误输出,&表示等同于,1表示正确),因此如果运行出错也会把错误输出到之前定义的log中。

另外关于合适执行命令还有些要说。

上面只是定时几点执行,那么我怎么设置它按照某一频率执行。比如每分钟执行依次。
对应的配置就是

   # m h  dom mon dow   command
   */1 * * * * python /home/the5fire/testcrontab.py >>/home/the5fire/testcrontab.log 2>&1

再来一个场景,我想在每天的早上六点到八点之间,每隔3分钟执行一次的配置怎么写:

   # m h  dom mon dow   command
   */3 6-8 * * * python /home/the5fire/testcrontab.py >>/home/the5fire/testcrontab.log 2>&1

到此应该都会使用了吧,五个星号表示不同的执行单位(分、时、日、月、年),而那个反斜线表示频率。

Javascript 关闭窗口时提示信息

<script type=”text/javascript”>
var preventUnloadPrompt;
var messageBeforeUnload = “告诉我们,您不愿意付费的原因,发送消息到微信公众账号 tongtianshun,采纳后将给予20元现金奖励!!!”;
$(‘a’).live(‘click’, function() { preventUnloadPrompt = true; });
$(‘form’).live(‘submit’, function() { preventUnloadPrompt = true; });
$(window).bind(“beforeunload”, function(e) { 
    var rval;
    if(preventUnloadPrompt) {
        return;
    } else {
        //location.replace(redirectAfterPrompt);
        return messageBeforeUnload;
    }
//    return rval;
})
</script>

Rails 生成PDF文件 pdfkit

1. 能生成PDF文件:
Gemfile
gem pdfkit'
gem ‘wkhtmltopdf-binary'
bash
bundle install
rake middleware
config/application.rb
config.middleware.use "PDFKit::Middleware", :print_media_type => true
config/initializers/pdfkit.rb
PDFKit.configure do |config|
#  config.wkhtmltopdf = '/Users/alan_cuiwei/workspace/to/wkhtmltopdf'
  config.default_options = {
    :page_size => 'Legal',
    :print_media_type => true
  }
  # Use only if your external hostname is unavailable on the server.
  config.root_url = "http://localhost"
  config.verbose = false

end
修改为:
即可看见pdf效果文件。
2. CSS正常显示:
layouts/application.html.erb

<style type="text/css">
    <%= Rails.application.assets.find_asset('application.css').to_s.html_safe %>
</style>
3. 中文不能正常显示:
a. Ubuntu安装中文字体。
b. 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html dir="ltr" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />

Nginx: Please reinstall Phusion Passenger or fix your ‘passenger_root’ directive

Please edit your Nginx configuration file (probably /opt/nginx/conf/nginx.conf),
and set the passenger_root and passenger_ruby configuration options in the
‘http’ block, like this:

  http {
      …
      passenger_root /usr/local/rvm/gems/ruby-2.1.5@rails4.1.8/gems/passenger-4.0.53;
      passenger_ruby /usr/local/rvm/gems/ruby-2.1.5@rails4.1.8/wrappers/ruby;
      …
  }