• #1 楼 @saiga 哈哈,最近接触的也就只有这些了。他们都比较有名。

  • #23 楼 @ruby_sky 我是用 rails4,加了了 actionpack-xml_parser gem,验证的 URL 填写的是http://example.com/weixin/show 验证通过,但是发消息都是走 POST http://example.com/weixin/showURL改为,肯定错误,随后我把验证 http://example.com/weixin/create ,通过,但是问题是没 POST,为什么会有两个 URL 微信不通常都说一个吗?谢谢。

  • write myself

  • 项目分模块的问题 at 2014年08月05日

    我通常是 api 用 grape,单独文件夹,然后就是所有模块公用 model,只在 controller 和 view 里面分,例如 admin/ 和 site/ 分别表示后台和网站。

  • http://git-scm.com/book/zh 只需花两个小时读完前四章,完美解答。不谢

  • 这无可厚非啊,难道你要细力度控制到 id?我的控制是小型应用就到类,例如 User,再细一点到方法,例如 del 和 create 的权限不一样的,特别的 id 单独写,没有遇到过这么细力度的。

  • 楼主具体说说哪些不清楚,如果不是科班出生,我觉得两个月在 linux 下搭好开发环境就不错了。还有一点就是入门之后进步会很快,当然后面还会遇到卡顿,都是难免的。慢慢来吧。我看过的书籍有《ruby 编程语言》和《ruby 元编程》都是好书,其他英语的我通常只看代码。从来不写测试!!!哈哈。ruby 我通常用来做 web 开发。感觉挺快。用 rails 我也有许多不清楚,因为他很多配置都是使用的最佳实践,没有给新手透明化。所以我通常是遇到问题 google,不会就发帖,通常都能够解决了。另外 ruby 可能用作管理工具多点,其他没发现了。还有一点是楼主决定做哪一块,如果不做 web 敏捷开发,我觉得接触 ruby 没什么意思,毕竟小众。开发安卓就用 java,ndk 就算了,官方都说兼容差。职业开发 ios,我想楼主的大洋,应该暂时不行。底层的就去 c 和 c++ 吧。祝大家七夕快乐。

  • 腾讯的吧,比阿里便宜。用过

  • 有人用过 xmpp 的客户端吗 at 2014年08月01日

    聊天类软件大多使用该协议,也有的基于他来修改。可以关注 openfire 服务器 (java 的),在安卓端也有成熟的开发库 smack,如果是桌面端就是 openfire+spark,另外,他有许多插件 (例如视屏聊天等),而且开源。

  • #9 楼 @Kabie 这个数据量大了不靠谱吧。我只能想到 sql 了 (貌似更渣)。

    SELECT * FROM User WHERE ((条件1 and 条件2) or (条件1 and 条件3) or ......)
    

    30 个啊,好像很渣。

  • #37 楼 @Rei 37 楼说的用新工具那三个容易实现是指?

  • 叫我怎么右键保存图片啊!!!

  • 也可能是楼主的 puma 服务器的设置,例如 tomcat 的 post 限制一般为 2M,get 的限制一般视浏览器来定。

  • jruby 伪装 java,哈哈

  • 请教前后台部署的方案 at 2014年07月29日

    为什么一定要两个域名呢?我通常是加 admin namespace,以下我没试过,不知道行不行。 1.配置两个 server,然后跳转

    server {
      listen 80;
      server_name admin.com;
      return 301 http://site.com/$request_uri;
    }
    
    server {
      listen 80;
      server_name site.com;
      root /var/www/web;
    }
    

    2.配置 rewrite,但是在同一个 server 中

    server {
           listen 80;
           server_name admin.com site.com;
           root /var/www/web;
    
           if ($http_host == "admin.com") {
                     rewrite ^/(.*)$ http://site.com/$1 permanent;
           }
    }
    
  • #3 楼 @xieyu33333 在中国不小众吧!!!

  • live 绑定也可以。

  • #12 楼 @hammer 怎么说?python3.4 的,我只是 paste 了关键部分,大概知道意思就可以。

  • #6 楼 @assyer 感觉 ruby-china 的做法还不够,没有过期时间限制。

    module RubyChina
      module APIHelpers
        def warden
          env['warden']
        end
    
        # topic helpers
        def max_page_size
          100
        end
    
        def default_page_size
          15
        end
    
        def page_size
          size = params[:size].to_i
          [size.zero? ? default_page_size : size, max_page_size].min
        end
    
        # user helpers
        def current_user
          token = params[:token] || oauth_token
          @current_user ||= User.where(private_token: token).first
        end
    
        def oauth_token
          # 此处的是为 ruby-china-for-ios 的 token Auth 特别设计的,不是所谓的 OAuth
          # 由于 NSRails 没有特别提供独立的 token 参数, 所以直接用 OAuth 那个参数来代替
          token = env['HTTP_AUTHORIZATION'] || ""
          token.split(" ").last
        end
    
        def authenticate!
          error!({ "error" => "401 Unauthorized" }, 401) unless current_user
        end
      end
    end
    
    
    class SessionsController < Devise::SessionsController
      def new
        super
        session['user_return_to'] = request.referrer
      end
    
      def create
        resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#new")
        set_flash_message(:notice, :signed_in) if is_navigational_format?
        sign_in(resource_name, resource)
        resource.ensure_private_token!
        respond_to do |format|
          format.html { redirect_to after_sign_in_path_for(resource) }
          format.json { render status: '201', json: resource.as_json(only: [:login, :email, :private_token]) }
        end
      end
    end
    
      # 重新生成 Private Token
      def update_private_token
        random_key = "#{SecureRandom.hex(10)}:#{self.id}"
        self.update_attribute(:private_token, random_key)
      end
    
  • Ruby-China?刚看了一个 python 的 app 做法,大致做法是客户端注册时,生成 access_token

    access_token = generate_access_token()
    def generate_access_token():
        # uuid.uuid1().hex => a3541742154011e49beb180373634345
        return uuid.uuid1().hex
    

    随后设置过期时间,并保存到 redis,返回给客户端

    expire = time.time() + 30 * 24 * 3600
    set_access_token(access_token, {'uid': str(uid)})
    return {
      'access_token': access_token,
      'expire': expire
    }, 201
    
    ACCESS_TOKEN_KEY_FMT = "auth:access_token:{access_token}"
    def set_access_token(access_token, login_info, expire=30 * 24 * 3600):
        #' ACCESS_TOKEN_KEY_FMT.format(access_token=access_token) => auth:access_token:a3541742154011e49beb180373634345'
        g.memdb.setex(ACCESS_TOKEN_KEY_FMT.format(access_token=access_token), expire, json.dumps(login_info))
    

    登陆是携带 access_token 放入 Authorization Authorization 形如 YWNjZXNzX3Rva2VuPTIwNzMwNDVhZTgyNzExZTM4MTMwYjhlODU2MmFhZGM4 是把 access_token=2073045ae82711e38130b8e8562aadc8 base64.urlsafe_b64encode(b'access_token=2073045ae82711e38130b8e8562aadc8') 后的结果, 服务端先解码,然后解析为数组,取出 access_token,然后从 redis 取出 uid,再从 mongodb 取得用户。定义的是一个 login_required 包裹

    def login_required(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            '''
            Check and parse the ``Authorization`` Header to get ``access_token`` and valify it.
            If user has logined, then this function will call the handler function directory, or it will
            return ``401 Unauthorized``.
    
            '''
            reqparser = reqparse.RequestParser()
            reqparser.add_argument('Authorization', type=str, required=True, location='headers')
            reqargs = reqparser.parse_args()
    
            try:
                token_encoded = parse_qs(base64.urlsafe_b64decode(reqargs['Authorization']))
    
                if b'access_token' not in token_encoded:
                    abort(401, message='Access token is required')
    
                access_token = token_encoded[b'access_token'][0].decode()
            except:
                abort(401, message='Malformed access token')
    
            login_info = get_access_token(access_token)
            if login_info is None:
                abort(401, message='Access token is expired')
    
            g.current_uid = ObjectId(login_info['uid'])
            return func(*args, **kwargs)
        return wrapper
    

    登出代码

    class LogoffHandler(restful.Resource):
    
        @login_required
        def get(self):
            argparser = reqparse.RequestParser()
            argparser.add_argument('Authorization', type=str, location='headers')
            args = argparser.parse_args()
    
            token_encoded = parse_qs(base64.urlsafe_b64decode(args['Authorization']))
            access_token = token_encoded[b'access_token'][0].decode()
    
            del_access_token(access_token)
    
            app.logger.info('User `%s` logout' % str(g.current_uid))
    
            return {}
    

    请问有什么问题吗? 这篇帖子也不错 http://www.cnblogs.com/TankXiao/archive/2012/09/26/2695955.html

  • 新手问 Block, Proc, Lambda at 2014年07月24日

    #5 楼 @blacktulip just a word, thx

  • 新手问 Block, Proc, Lambda at 2014年07月24日

    #3 楼 @Peter lambda 会返回它的调用函数,但 Proc 会结束它所位于的 function

    def return_from_proc
      ruby_proc = Proc.new { return "return from a Proc" }
      ruby_proc.call
      return "The function will NOT reach here because a Proc containing a return statement has been called"
    end
    
    def return_from_lambda
      ruby_lambda = lambda { return "return from lambda" }
      ruby_lambda.call
      return "The function will reach here"
    end
    
    puts return_from_proc # display return from proc
    puts return_from_lambda # display The function will reach here
    

    求解释。lambda 会返回它的调用函数,但 Proc 会结束它所位于的 function,这句话和代码怎么对应,我理解的和结果打印刚好相反。

  • #9 楼 @ruohanc 怪不得,我在书里面没看到过,只在 python 里面见过。

  • 新手问题 undefined method at 2014年07月23日

    嘿嘿,你一定是看漏了啥!

  • #15 楼 @mobiwolf js 是一门未经精心设计的语言。和 php 差不多,用着方便。

  • turbolinks 错误 at 2014年07月23日

    #1 楼 @ywjno win 和 mac 自带 js 解析,linux 需要自己装 nodejs 或者用一个 gem 替代。 加入 gem execjs gem therubyracer bundle install 试试