• 1. Lifecycle of TCP socket client

    1. create socket
    2. bind(if you skip this step, system will defaultly bind a ephemeral port to connect server.)
    3. connect
    4. close

    2. This example is verbose but easy to understand

    require 'socket'
    # step1 create
    socket = Socket.new(:INET, :STREAM)
    
    # step2 bind(skip)
    
    # step3 connect
    remote_addr = Socket.pack_sockaddr_in(80, 'google.com')
    socket.connect(remote_addr)
    
    while data = socket.readpartial(one_hundred_kb) do
      puts data
    end
    
    
    # step4 close
    socket.close
    

    3. stackoverflow 上一个很好范例

    http://stackoverflow.com/questions/8649860/ruby-tcpsocket-http-request

    4. 一本很好的关于 Tcp socket 的通俗易懂的书

    [book] Working with TCP Sockets

    大便时遇到这个问题,顺便回一下。

  • #1 楼 @so_zengtao

    socket.read 是个 block 的操作,如果 server 没有返回 eof,客户端不会打印出任何东西。

    所以应该使用 partial read 来替代 read。

  • #1 楼 @rei

    Puma +1

    1. Puma 省内存。Unicorn 一个进程 120M - 140M,Puma 一个进程 80M-120M。
    2. Puma 是多线程的 server,同样配置的机器干更多的活。
  • 感谢楼主的精彩分享,这篇文章确实极其精彩,我刚好这两天也在反复的读,特此补充,哈哈。

    补充 1

    这个地方翻译欠妥。查找常量时 Module.nesting 并不是当前的代码定义的 class。

    Ruby 有三种 context

    1. self 当前对象

    2. definee 当前类

    3. lexical scope

    作者在此处指的是第三种 context:lexical scope。lexical scope 只和 class 和 module 这两个 keyword 有关。

    所以作者最后的结论是两个:

    1. Module.nesting 取决于 lexical scope

    2. lexical scope 只取决于 class、module 两个关键字。(和 class_eval、instance_eval 无关)

    补充 2

    原文用的 attach Object,不是 Open Object,此处确实很难翻译。

    class C
    
    end
    

    在顶级定义一个类 C 时,是把 C 这个常量 attach 到 Object 这个 Rclass 的 constant table 中。

  • 👎

    花里胡哨的感觉。

  • #3 楼 @lgn21st

    改吧,多谢管理员。

    传统一直是周二,作者可能也是指的周二。

  • #3 楼 @zgm

    我的意思是,这两个方法 local_address/remote_address 是在哪拿的数据呢?

    > c.method(:local_address).source_location
    nil
    

    是用的 C 的库吗?

  • 请教一个问题

    require 'socket'
    
    local_socket = Socket.new(:INET, :STREAM)
    local_addr   = Socket.pack_sockaddr_in(4481, '0.0.0.0')
    local_socket.bind(local_addr)
    server.listen(Socket::SOMAXCONN)
    
    # accept a connection
    connection, remote_addr = server.accept
    

    建立连接后,connection 是一个 Socket 对象,instance_variable 是空的,local_address/remote_address 是保存在哪里呢?

    > connection.instance_variables
    > []
    
    > p connection.local_address
    Local address: #<Addrinfo: 0.0.0.0:4481 TCP>
    
    > p connection.remote_address
    Remote address #<Addrinfo: 59.102.12.1:4481 TCP>
    
  • #10 楼 @steven_yue

    同问,

    1. 为啥不考虑 jruby?

    2. 如果用 golang 重写的话,所有的业务逻辑是不是都要重新实现一遍?而且要和 Rails 中的业务逻辑始终保持一致,维护的工作量是不是有点大?

  • 哈哈,我来抢沙发。

  • #5 楼 @zgm

    这叫磨刀不误砍柴工啊

  • #1 楼 @mingyuan0715

    这和标题不符啊,哈哈。

  • which ruby at July 31, 2015

    shell: $PATH
    Ruby: $LOAD_PATH

    他们的用途好像啊

  • 果断 redis 的 zset 哇。

  • 请问 mina 到底比 cap 快在哪些地方?

    一些比较慢的操作是不可避免的呀。

    比如每次部署最耗时间的部分 assets compile 是逃不过去的呀?

  • Gemfile 详解 at July 28, 2015

    这篇文章又系统,又通俗,真是篇好文章。

  • 可以在本机造一亿条假数据,索引之间的差异会拉大。此外 SET SESSION query_cache_type=0; 可以在当前连接的 session 关闭缓存。

    如何在 4 分钟内创建一亿条 mysql 假数据( @vincent 教我的,哈哈)

    Without creating a stored procedure, one technique I've applied is to use the table itself to add the columns. First seed it with a value...

    insert into table_name ( column1, column2, column3, column4 )
      values ( 1, 2, 3, 4 );
    

    Then insert again, selecting from this table to double the rows each time...

    insert into table_name ( column1, column2, column3, uuid)
      select  round( rand()*10000), 0, 0, UUID() from rand_numbers;
    

    You don't need to run the second query that many times to get quite a few random rows. Not as "neat" as using a stored procedure of course, just proposing an alternative.

  • client_type 和 status 的值的种类都很少

    client_type

    • BlackBerryDevice
    • iPhone
    • iPad

    status

    • 1
    • 2

    某个字段的值特异度很低的情况下,建索引比起全表扫描节省不了多少时间。所以我的看法是,这个字段的索引没啥用。

    炮哥,你怎么看?

    @ hooopo

  • 找个 ruby 工作,跟着大牛一步步学

  • 无所谓,都行

    1. 对公司技术氛围的贡献(带领新人,分担管理压力)
    2. 对公司业务的贡献(commit 数量)
    3. 对社区的贡献(招人时一呼百应)
    4. 元编程(基础扎实,会造轮子)
    5. web 框架(对 rails 的熟悉度)
    6. 精通数据库(各种数据库的应用场景)
    7. 过去做过的业务多(再开发重复产品时速度快)
    8. 计算机基础好(学习速度快)

    我觉可以从这么几个角度来打分。

  • #23 楼 @aston

    每个周五晚上,很多同事加班打德州扑克,欢迎加入。

  • #18 楼 @ysihaoy

    15 寸的顶配 rMBP,加上原装的 magic mouse,以太网转换器,耳机,iPad,差不多该有的都有了。

    我是满足了。😄

  • if there is no primary key, innodb will create a hidden column as primary key, and cluster rows on it

  • 我喜欢打击人,哈哈。

    你收集完了这些资源后,花了多少时间去学习这些课程?

  • help me...

  • 可能还没有正式 release,你可以在 gemfile 中指定仓库地址和 commit sha,使用 6.0.2

  • 👍

  • 为什么没有人说:用 elasticsearch 呀

  • 感谢 @zgm @serco 以及炮哥的解答。 :plus1:

    我以前彻底的混淆了这两种查询的处理流程,他们两个查询时的策略完全不一样的。

    1. query 1

      --  ms 级别
      -- token 已经加了索引
      select count(*) from devices where token="xxx"
      
    2. query 2

      select count(*) from devices
      

    Query1

    在 Query1 中,mysql 会考虑 devices_token, devices_token_prefix_index 两个索引,最终选择了 selectivity 最高的索引 devices_token。

    这个查询是 ms 级别的。

    Query2

    在 query 2 中,MySQL optimizer 会考虑使用以下三个索引:

    • primary key 是 clustered index,是所有索引中最大的一个。在这个查询中,无论如何也不会用它。(largest)
    • device_token 是次大(larger)
    • device_token_prefix_index 是(large)

    device_token_prefix_index 体积最小,所以会优先用它。

    结论

    在 InnoDB 存储引擎中,primary key 是 clustered index(最大的索引),使用它来处理 select count(*) from table_name 最慢。

    新的疑问

    但这样牵扯出一个新的疑问:

    除了 constant table,所有的 select count(*) from table_name 都是一种低效的查询,是这个样子吗?

    @zgm @serco @hooopo