Ruby Debugging Magic Cheat Sheet

Ruby自带的一些debug功能其实还是很好用的,这里稍做记录。

找到方法是在哪一行记录的

object = Object.new
puts object.method(:blank?).source_location
=> ["/gems/activesupport-5.0.0.beta1/lib/active_support/core_ext/object/blank.rb", 14]

打开项目依赖的gem

$ bundle open active_support

这行命令可以打开Gemfile.lock制定的gem版本的active_support的源代码。使用当前环境变量里EDITOR指定的文本编辑器。

还原gem

$ gem pristine activesupport

假如你对activesupport这个gem添加了一些debug code之类的,可以轻松通过这条命令将gem重置为本来的状态。

$ gem pristine --all

这行命令会重置所有的gem,特别是当一些gem有c扩展的时候,会花费更多时间。

找到方法是如何被调用的

class Project

  def foo
    puts "====================="
    puts caller
  end
end

可以用caller,在不抛出异常的情况下打印出当前的backtrace信息。

找到super方法定义的位置

def foo
  puts method(:foo).super_method.source_location
  super
end

列出一个对象的所有方法

object.methods
# => [:instance_of?, :public_send, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :private_methods, :kind_of?, :instance_variables, :tap, :is_a?, :extend, :define_singleton_method, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :display, :send, :object_id, :to_s, :method, :public_method, :singleton_method, :nil?, :hash, :class, :singleton_class, :clone, :dup, :itself, :taint, :tainted?, :untaint, :untrust, :trust, :untrusted?, :methods, :protected_methods, :frozen?, :public_methods, :singleton_methods, :!, :==, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]

通过类直接找到对象方法定义的位置

User.instance_method(:github_url).source_location
得到方法所需的参数
def parse(input, skip_code_comments: false, ignore_whitespace: true)
  # do stuff
end
method(:parse).parameters
#=> [[:req, :input], [:key, :skip_code_comments], [:key, :ignore_whitespace]]

寻找变量是何时被改变的

可以debug的时候灵活使用object.freeze 这样当object被改变时,就可以抛出异常得知object是在哪里被改变了。注意!这个trick只对变量被改变有效果,如果变量是完全被replaced,那么就没有用了。

找到一个常量或对象是在哪里创建

require 'objspace'
ObjectSpace.trace_object_allocations_start

Kernel.send(:define_method, :sup) do |obj|
  puts "#{ ObjectSpace.allocation_sourcefile(obj) }:#{ ObjectSpace.allocation_sourceline(obj) }"
end

world = "hello"

sup world
# => /tmp/scratch.rb:10

本文编译自:http://www.schneems.com/2016/01/25/ruby-debugging-magic-cheat-sheet.html


9条Rails数据库最佳实践

参考链接:http://blog.carbonfive.com/2016/11/16/rails-database-best-practices/

1. 让数据库做他们自己擅长做的事情
2. 编写高效并且chainable的Scopes
  • 返回ActiveRecord:Relation对象(比如不要触发Query)
  • 在数据库中Filter数据
  • 在数据库中排序
  • 不要在Scope中添加排序功能(可以将排序单独写成一个Scope)
3. 减少数据库访问次数
  • 如果一个经常访问的页面导致了太多的数据库访问,那么值得花费一些时间来让数据库访问次数变得更少。
4. 使用索引
  • 考虑将所有where条件中会使用的字段和id字段一样都建立索引。
5. 面对复杂查询时,定义和使用单独的查询对象(Query Objects)
6. 避免在Scope和Query Object之外使用临时(Ad-hoc)的query
7. 使用正确的类型
  • 每一种数据库都有比ActiveRecord更精细的类型,了解并正确的使用它们。
8. 考虑使用数据库本身的全文查询(Full-Text Search)
  • 添加更强大的Elastic Search或者Solr框架都会向程序倒入更多的依赖,所以尽量使用数据库本身的全文查询功能,在数据库本身可以做到的情况下。
9. 尽量不要使用存储过程(Stored procedures)
  • 当业务快速增长变化中,存储过程是非常难以更改并且保持正常工作的,而且特别难以测试.

[读书笔记]《让大脑自由》

1. 越运动,大脑越聪明
  • 我们的大脑在步行运动中进化--每天步行12英里!
  • 想要改善思维技能吗?动起来吧!
  • 运动使更多的血液流向大脑,为大脑带来丰富的葡萄糖作为能量,同时还能带走氧气吸附遗留下来的有害电子。运动也能刺激蛋白生成,促使神经元彼此连接。
  • 只要每周两次有氧运动就可以将罹患一般老年痴呆症的风险降低一半,而且将患阿尔茨海默症的风险减少60%。
2. 大脑一直在进化
  • 我们的头颅里不仅只有一个大脑:我们有三个。首先介绍“蜥蜴脑”,它控制着我们的呼吸,然后我们还有一个和猫的大脑一样的大脑,在这两部分大脑上面覆盖着一层类似吉露果子冻薄薄的物质,我们称之为皮层,它是人类大脑的第三个组成部分,也是强大且“人类特有”的大脑。
  • 天气的变化瓦解了我们祖先的食物供应,他们被迫从树上下来,到大草原上生活。之后人类通过适应变化本身接管了地球。
  • 从四条腿走路到两条腿直立行走在大草原上,这节省了能量,让人类的大脑得以发展得更加复杂、精密。
  • 象征推理是人类特有的一项才能。这种能力可能处于我们需要了解彼此的意图、动机、它使人类在一个小团体内的协作成为可能。
3. 每个大脑都不同
  • 日常生活中你做了些什么,学习了什么会实质性地改变你大脑的样子--实际上你的所学所做对大脑进行了重新塑造。
  • 大脑的各个区域在不同人之间以不同的速度发育。
  • 没有两个大脑以同样的方式,在同一地点储存相同的信息。
  • 我们的智能表现在各个方面,其中许多是不能通过智商测试来揭示的。
4. 大脑不关注无聊之事
  • 我们无法对无聊的事情集中精神。
  • 大脑的注意力“聚光灯”一次只能集中在一件事情上:不能多任务处理。
  • 与我们记住细节相比,我们更善于参照模式以及提炼事件的含义。
  • 情绪唤起有助于大脑学习。
  • 听众会在讲座开始的10分钟后走神儿,不过你可以通过讲故事或者制造一个富含情绪的事件来抓住他们的注意力。
5. 短期记忆取决于最初几秒间
  • 大脑有许多类型的记忆系统。其中的一类由如下4个连续的处理阶段:编码,存储,检索和遗忘。
  • 信息一进入到你的大脑就立刻被分裂成碎片,然后被送到大脑皮层的不同区域储存。
  • 那些能够预测学到的东西是否在日后能够被记起的大多数事件,都发生在学习的最初时刻。我们在记忆的最初时刻对其编码得越精细,记忆就越牢固。
  • 如果你能够复制你在记忆某个事情时的周围环境,你可以提高记起这个事情的几率。
6. 长期记忆取决于有规律的重复
  • 大部分的记忆在几分钟之内就消失了,不过那些度过了脆弱期的记忆随着时间的推移在逐渐增强。
  • 长期记忆在海马和大脑皮层之间的双向交流中形成,直到海马切断了与皮层的联系,记忆才被固定在皮层中,这个过程要经历数年时间。
  • 对于现实,大脑只给了我们一个近似的见解,因为它把新知识同过去的记忆混在了一起,并把新知识、旧记忆当成一个事物存储在一起。
  • 使长期记忆变得更加可靠的方式是,将新的信息逐步输入大脑并在固定的时间间隔温习这些信息。
7. 睡得好,大脑才会转得好
  • 大脑中有两股同样由细胞和化学物质所构成的战斗力量,它们处于持续紧张的战斗状态之中,一股力量试图让你睡觉,而另一股力量试图让你清醒。
  • 当你睡着了的时候,大脑的神经元表现出旺盛的节奏性活动,也许此时它正在重放你白天学习的内容。
  • 需要多长时间的睡眠,以及什么时候睡觉,在这个方面人人都不同,但在下午睡一会儿的生物性驱力人人都具有。
  • 睡眠缺失会损伤人的注意力、执行功能、工作记忆、情绪、数学能力、逻辑推理甚至运动灵巧性。
8. 压力会损伤你的大脑
  • 你身体的防御系统通过释放肾上腺素和皮质醇,对严重的、短暂的危险做出即刻的反应,比如,我们的祖先在觅食的过程中遭遇剑齿虎。慢性应激,比如家庭中的矛盾,严重损害了我们身体的防御系统,因为我们身体的防御系统进化之初只是为了处理短时的压力反应。
  • 在慢性应激下,肾上腺素在你的血管壁上造成伤痕,这会导致心脏病发作或引起中风,而皮质醇会伤害海马的细胞,从而消弱你的学习和记忆能力。
  • 对个体而言,最坏的压力是你感觉对问题失去了控制,感到束手无策,无依无靠。
  • 情绪压力对整个社会都有巨大的影响,影响儿童的学习能力,影响员工的工作效率。
9. 大脑喜欢多重感觉的世界
  • 我们通过感官获得某一事件的信息,将其翻译成电子信号(一些信号来自视觉,一些信号来自听觉,等等),然后将这些信号发送到大脑的不同区域,接着对发生的一切进行重建,最后大脑对整体事件有了认知。
  • 大脑似乎部分地依赖过去的经历,以决定如何将这些信号整合,所以两个人可能对同一事件产生完全不同的认知。
  • 我们的感官就是被进化成要在一起协同工作的模式,例如,视觉影响听觉,这意味着同时激发各个感官可能让我们学得更好。
  • 气味具有唤回记忆的不寻常的力量,也许是因为嗅觉信号绕过丘脑直奔自己目的地的缘故,在这些目的地中,就包括那个被称为杏仁核的情绪主管者。
10. 视觉是最有力的感官
  • 视觉是目前我们最重要的感觉器官,占去大脑一半的资源。
  • 我们所看到的,仅是大脑告诉我们应该看到的,并不是百分百准确。
  • 我们的视觉分析分为许多步骤。视网膜将光子组装成像小电影一样的信息流。视觉皮层处理这些信息流,某些区域记录动作,某些区域记录颜色,等等。最后,我们把这些信息重新整合到一起,于是我们可以看到外部的世界了。
  • 图片可以让我们获得最好的学习和记忆,书面或口头信息做不到这一点。
11. 大脑也有性别差异
  • 男性拥有一条X染色体,女性拥有两条--一条是作为备份用的,X染色体是认知的“热点”,它携带了与大脑构造有关的众多的基因。
  • 女性的基因更为复杂,因为其细胞内活跃的X染色体是妈妈和爸爸的混合。而男性的X染色体都来自妈妈,并且他们的Y染色体携带的基因少于100个,而X染色体携带有1500个基因。
  • 男女大脑在结构上和生化上都是不同的,例如,男性的杏仁核大,合成五羟色胺的速度快,但我们不知道,这些差别是否具有重要意义。
  • 对急性应激男性和女性的反应不同:女性激活左半球的杏仁核,并记住情绪的细节;男性激活右半球的杏仁核,并记住要旨。
12. 我们是天生的探险家
  • 婴儿是指导我们如何学习的榜样,他们不是被动地对环境做出反应,相反他们通过积极的观察、假设、实验和总结对周围世界进行探索。
  • 大脑的特定部分帮助人类在探索世界过程中形成了某种科学的态度。大脑的右前额叶皮层检查我们假设中出现的错误(例如“剑齿虎不是对我们没有威胁的动物”),与它毗邻的区域告诉我们应该改变行为(快跑!)。
  • 因为“镜像神经元”的存在,我们可以识别和模仿某些行为,镜像神经元分布在大脑的各个地方。
  • 成人大脑的一些区域像婴儿一样具有可塑性,所以我们可以产生新的神经元,让我们在一生中,都能够学习新事物。

[读书笔记]《少有人走的路》之自律

《少有人走的路》可能是我这么多年来看过的最对口味的一碗鸡汤了,特别是第一大部分关于自律的文章,特别有体会。把一些我认为的重点摘录一遍,仅供自勉吧。

  • 人生苦难重重
  • 解决人生问题的首要方案,乃是自律,缺少了这一环,你不可能解决任何麻烦和困难。
  • 人生是一个面对问题并解决问题的过程。
  • 我们的心灵渴望成长,渴望迎接成功而不是遭受失败,所以它会释放出最大的潜力,尽可能将所有问题解决。
  • 推迟满足感,意味着不贪图暂时的安逸,重新设置人生快乐与痛苦的次序:首先,面对问题并感受痛苦;然后,解决问题并享受更大的快乐,这是惟一可行的生活方式。
  • "我是个有价值的人",有了这样宝贵的认知,便构成了健全心理的基本前提,也就是自律的根基。
  • 自律的核心,就是学习自我照顾,承认自我价值的重要性,并采取一切措施照顾自己,这是走向自立的关键。
  • 除非存在智力障碍,不然只要花时间学习,就没什么问题解决不了。
  • 直面问题会使人感到痛苦。问题通常不可能自行消失,若不解决,就会永远存在,阻碍心智的成熟。
  • 我们必须面对属于自己的问题,这是解决问题的基本前提。
  • 人生一世,正确评估自己的角色,判定该为何人、何事负责,既是我们的责任,也是无法逃避的问题。
  • 推卸责任时,可能感到舒服和痛快,但心智却无法成熟,常常成为集体,社会的负担。
  • 你不能解决问题,你就会成为问题。
  • 我的时间是我的责任,如何安排时间,应又我自行负责,而且只有我本人才有权处理优先次序。
  • 为远离责任带来的痛苦,数不清的人甘愿放弃权力,实则是在逃避自由。
  • 我们越是了解事实,处理问题就越是得心应手;对现实了解得越少,思维就越是混乱。虚假,错觉和幻觉,只能让我们不知所措。
  • 我们对现实的观念就像是一张地图,凭借这张地图,我们同人生的地形、地貌不断协调和谈判。地图准确无误,我们就能确定自己的位置,知道要到什么地方,怎样到达那里;地图漏洞百出,我们就会迷失方向。
  • 只有极少数幸运者能继续努力,他们不停地探索、扩大和更新自己对于世界的认识,直到生命终结。
  • 逃避现实的痛苦和不幸,是人类的天性,只有通过自律,才能逐渐克服现实的痛苦。我们必须尊重事实,尽管这会带来痛苦,但远比我们的个人利益和暂时的舒适更为重要。我们必须淡化暂时的不适之感,应该追求真理而不是幻象,并愿意承受所有的痛苦。要让心灵获得成长,让心智走向成熟,就要竭尽全力,永远尊重事实,乃至献身真理。
  • 智慧,意味着将思考与行动紧密结合。
  • 反省内心世界的痛苦,往往大于观察外在世界的痛苦,所以,很多人逃避前者而选择后者。实际上,愿意献身真理对于我们的非凡价值,将使痛苦显得微不足道。自我反省的快乐,甚至远远大于痛苦。
  • 人之为人,或许就在于我们可以超越本性,乃至改变本性,尝试去做不和本性的事情吧?
  • 接受挑战,才可以带来真正的安慰;心灵接受长期的,甚至经常碰壁的自律,才可能使治疗成功。
  • 尊重事实,献身真理的人,必然心胸坦荡,以诚待人。我嗯必须不断自我反省,在言语和行动上,确保我们与别人自如沟通,诚实地反映认知的事实。
  • 畏惧挑战带来的正常的痛苦,因而不断逃避和撒谎,无异是有意回避有益的痛苦,这就可能产生相应地心理疾病。
  • 一般来说,不说出全部真相,基本上就等于说谎。
  • 敢于面对事实的人,能够心胸坦荡地生活在天地间,也可借此摆脱良心的折磨和恐惧的威胁。
  • 你既要承担责任,也要拒绝不该承担的责任。
  • 在这个复杂多变的世界里,想使人生顺遂,我们不但要有生气的能力,还要具备即便生气,也可抑止其爆发的能力。
  • 我们必须建立一套灵活的情绪系统,提高我们的“情商”。
  • 要使心智成熟,就须在彼此冲突的需要、目标、责任之间,取得微妙的平衡,这就要求我们利用机遇,不断自我调整。
  • 保持平衡的最高原则就是“放弃”。
  • 放弃人生的某些东西,一定会给心灵带来痛苦。失去平衡,远比放弃更痛苦。
  • 时间改变了,我也必须对以前的自我做出调整。我原本以为会对过去的自我念念不忘,实则全然不是那样。
  • 放弃某种心爱的食物--至少是自身熟悉的食物,肯定让人痛苦,但适当放弃过去的自我,才能使心智成熟。
  • "兼容并包"。这是促进心智成熟不可或缺的工具。兼容并包,意味着既要肯定自我,以保持稳定,又要放弃自我,以腾出空间,接纳新的想法和观念,实现自我平衡。
  • 消除熟悉的过去,追求新鲜的未来。为了体验新鲜事物的独特性,我必须以包容一切的姿态,说服既有的成见和观念暂时让位,让陌生、新奇的事物进入感官世界。我必须完全释放自我,甚至不惜把过去的自我完全打破。
  • 人越是活得长久,历经的生与死也就越多,与此同时,也就会经历更多的欢乐和更大的痛苦。
  • 完全接受痛苦,在某种意义上,痛苦就不再存在。
  • 爱,能使我们感受到更多的快乐,更少的痛苦。
  • 最好的决策者,愿意承受其决定所带来的痛苦,却毫不影响其做出决策的能力。
  • 一个人是否杰出和伟大,视其承受痛苦的能力而定,杰出和伟大本身,也会给人带来快乐和幸福。
  • 不经痛苦和折磨,就无法实现灵魂的超越。
  • 为了放弃,首先必须拥有某种事物。你不可能放弃从来没有过的事物。同样,首先确立自我,才能够放弃自我。
  • 自我,包含具有积极意义的四种人生原则,目标都是解决问题,而不是回避痛苦。这四种原则包括:推迟满足感,承担责任,尊重事实,保持平衡。
  • 只要持之以恒地实践,任何人都能够使精神、心理和灵魂达到更高的层次。

14条Rails最佳实践

参考链接:https://www.sitepoint.com/10-ruby-on-rails-best-practices-3/

1. 两个空格的缩紧
2. 定义断言方法时以问号(?)结尾
3. Iteration: 用each替代for
4. 用unless替代!if
5. Short Circuit: 当判断条件确定时,尽早退出

示例:

if user.gender == "male" && user.age > 17
  do_something
elsif user.gender == "male" && user.age < 17 && user.age > 5
  do_something_else
elsif user.age < 5
  raise StandardError
end

Short Circuit代码:

raise StandardError if user.age < 5
if user.gender == "male" && user.age > 17
  do_something
elsif user.gender == "male" && user.age < 17 #we saved a redundant check here
  do_something_else
end
6. 写测试
  • 测试相当于你的程序和特性的详细规范
  • 测试相当于给其他开发者的文档,使他人更好的理解你实现的意图
  • 测试可以更早的发现和消灭bugs
  • 测试可以在重构以及性能调优的时候给你更多信心,保证不会影响现有功能。
7. DRY(不要重复自己)
  • 使用抽象类
  • 使用Modules
8. 聪明的使用Enums

参考代码:

class Book
  enum status: { draft: 0, completed: 1, published: 2 }
  ...
end

...

if book.draft?
  do_something
elsif book.completed?
  do_something
elsif book.published?
  do_something
end
9. 胖Models, 瘦Controllers和Concerns
  • 将响应(response)无关的代码挪出Controllers, 比如业务逻辑以及持久化/模型变更的代码.
  • Controllers应该只调用model的简单queries, 负责的queries应该挪到Model里面并且封装成scopes. Controllers主要负责的是如何处理请求( request handling), 以及如何返回响应(response related logic).
  • 任何跟request和reponse无关并且和Model有直接联系的代码都应该放到对应Model里.
  • 任何包含了数据结构的类都应该放到app/models目录, 作为Non-ActiveRecord model(table-less class).
  • 当业务逻辑是为了一个特定的领域用途(Printing, Library & etc.)并且和已有的model上下文无关, 应该使用PORO(Plain Old Ruby Objects)类, 并且可以放到app/models/some_directory目录. 所有/app下的代码都会在app启动时自动加载. POROs也可以放到app/models/concerns和app/controllers/concerns目录.
  • 如果一些PORO, Modules或者Classes跟具体应用无关(application independent), 并且可以用于其他应用,请放到/app/lib目录下.
  • 使用Modules来抽象一些共用功能(common functionality), 并且放到app/*目录, 或者在和应用无关(independent)情况下放到app/lib目录.
  • "Service"层是经典MVC模式中重要的一环, 当程序代码增长到难以决策该把一些特定逻辑放在哪里的时候. 想象一下, 你需要一个机制来给订阅者发送图书已出版的短信、邮件或者其他类型的通知. 你可以创建一个关于通知的Service, 并且放到/app/services目录.
10. 国际化/本地化(Internationalization/Localization): 将文字放到yml而不是代码中
11. 数据库方面最佳实践
  • 数据库有任何改变时中, 总是向版本管理系统签入最新的db/schema.rb文件.
  • 当在新系统中创建数据库时, 应使用db:schema load而不是db:migrate.
  • 其他所有情况下, 使用db:migrate来应用新的migration.
  • 不要使用migration向数据库添加数据,使用db/seeds.db来做这件事.
12. 使用嵌套(Nested) Resources/Routes当两个resource有从属关系时
13. 使用Time.zone.now替代Time.now
  • 一个最佳实践是宗师定义默认的timezone在config/application.rb里.
  • Date.today和Time.now总是基于当前及其的timezone.
  • Time.zone.now和Time.zone.today可以解决一些开发环境和生产环境之间的timezone方面的不一致和冲突.
14. 不要将太多逻辑放到Views层,放到app/helpers

2017 macOS下的Ruby开发环境设置

又是一年没更新blog,真是越活越懒越没要求。其实总想写点什么,但一直也没有什么太好的灵感和收获值得分享。不过最近做了一个小网站(xNeus.com)。也更新了一下Ruby的相关工具,觉得也许可以记录下,希望有些意义。

homebrew

homebrew应该不需要更多介绍了吧,用mac的开发者应该都了解,就是类似于linux下yum/apt的一个包管理器。

rvm

rvm是一款年头相当悠久的ruby版本管理器了,中间一度说要终止开发后来好像也继续维护了。其他的类似工具还有rbenv,不过鉴于我对rvm也没有过什么不满,所以就一直这么多年用了下来没有换过。

oh-my-zsh

oh-my-zsh是一款基于zsh的小框架,提供了方面灵活的配置来定制自己的zsh shell。譬如在行首的提示符里现实当前环境里rvm使用的ruby版本,gemset名字,以及git本地是否有未提交更改。还有灵活的plugin支持更强大的命令行补全功能。

tmux

tmux是一个类似screen的terminal窗口管理器,可以在一个shell里面开N个terminal(tmux里叫window),并且在一个window里支持多个pane。把屏幕切割成几部分。我当时是看的这本书(《tmux》)学习的。几个月前还出了第二版。我当时学习时根据书上建议加上一些自己的定制后的配置文件在这里,仅供参考。另外,基于tmux有一个gem特别好用,叫做tmuxinator。可以自己写配置文件,然后直接配置好一个需要的tmux session打开。推荐两者一同食用,风味更佳。

iTerm2

iTerm2也是macOS下知名度很高的一款软件,主要就是比系统自带的Terminal App功能强大了许多,具体有哪些好用的功能,看这里就可以了。

vim

vim是我所用过的最方便的编辑器。我8年前最早从事rails开发的时候是用的netBeans,后来很快就转移到了vim的怀抱。中间也尝试过RubyMine之类的重度IDE,也尝试过emacs以及sublimetext、textmate之类的文本编辑器。不过最后感觉还是vim最方便好用吧。特别是自打有了Vundle这个vim常见管理器后,更是如虎添翼。现在网上有一些需要配置好的vim包(如: spf13-vim)可以直接使用,减轻新手的学习曲线,不过我还是一直自己从头定制的,有兴趣的可以看看(vimrcgvimrc)。当然,关于vim如何配置更加方便开发提高效率其实也是需要一定时间和经验的,我打算回头单独在写一篇blog来说,总之如果你目前没有特别偏爱精通的编辑器,我强烈推荐vim。

pry

Pry是一款更强力的ruby自带的IRB shell替代。不得不推荐,反正我是记不得上次shell里敲入irb是啥时候的事儿。

awesome-ruby

awesome-ruby是一份文档列表。分门别类的在每种类别中都推荐了一些不错的ruby的库、工具、框架、软件等。如果你遇到一个新的需求,打算调查一些可能的第三方gem,那么先看一眼这份文档上有什么推荐,是很有必要的事情。

Dash

Dash是一款API文档浏览器,支持150以上不同的APIs。而且现在还可以加载用户发布的API,我目前用到的API,从Ruby的各种Gem到Javascript的各种Library,都应有尽有。没有找不到的。之前在Mac App Store上可以买,但去年10月份不知道什么原因被下架了,现在只能从它自己的官网购买,如果之前在Mac App Store上购买过的用户,也可以直接发邮件给开发者获取一份新的liscense。

目前想到的关于ruby开发的一些常用东西好像也就这些,过了一眼貌没有一样东西是2017年出现的,可能我太寡闻了吧。以后还是要努力精进些,分享一些更新更好玩的东西才是。谢谢。


谁不曾温柔以待

在马代度假的日子里,每天除了无所事事的看海发呆。顺带静下心来看了几部特别温暖的电影,稍作记录。


《A Single Man》

Tim Ford跨界的首部电影,讲述了一个叫做乔治的英国绅士,在得知失去了自己相伴16年的同性恋人后的一天。一个人,一天,一件事儿。

整场放映中,小A的脑海里总会莫名想起一部小说名《更多的人死于心碎》,而影片也确实一直在渲染这种气氛。从早上拿出手枪打算殉情,到依旧努力让自己精致的出门,一样的上课,一样的去和好友聚会。在所有这一切中,乔治都表现的和一个绅士一样,礼貌,微笑,从容。但却能轻易的让人感受到他骨子里的敏感,和失去爱人后对于生活的不眷恋。

乔治和夏洛特的那条线我认为也是刻画得相当成功,从最初希望的爱情,到最后变成了一种更加深刻的友情或者可以说是亲情。当二人喝完酒跳完舞要散场的时候,夏洛特表现出的那种不舍和不甘行,以及乔石的回复:对不起,我曾经真的试过的。突然让我想到了Eason的那首兄妹:

就让我们虚伪 有感情 别浪费

不能亲爱的一对 亲爱像两兄妹

很多时候,人的感情都是错综复杂的。而我们需要学会的就是真诚的面对不同的感情,以及智慧恰当的接受这种和别人间不一致的感情。

影片末期 乔治和他的学生另一个小鲜肉终于互生情愫,小鲜肉也发现了乔治的自杀计划。并偷偷的将手枪藏了起来。当乔治发现这一切突然重新热爱生活打算继续的时候,不行心脏病复杂还是走了。而弥留之际,仿佛看到了自己16年来的爱人向自己走来一吻定情。

生活有时候真的是一个顽皮的孩童,当你充满绝望时,也许它会给你惊喜。当你漫画希望时,也许它会给你致命一击。而作为我们凡夫俗子也并不是无可奈何的。至少,我们可以去珍惜有过的一些,和在每一个现在努力的去感受得到或逝去的一切。


《Big Fish》

听说这部片子曾经被翻译成《大智若鱼》,但我还是觉得就简简单单的翻译成《大鱼》就很好了。

Tim Burton的电影总是充斥着大量的魔幻元素,本片也不例外。不过以这种风格拍摄父与子之间的故事,还是很让人感觉到意外的。

小A的父亲可以说是一位慈父,长这么大基本没打过小A,也基本没有凶过小A。甚至在小A任性表示退学时,父亲也只是抽了一只眼默默的说:我尊重你的决定,但对你只有最低的一条要求,将来无论干什么不要违法进监狱就好。

不过小A周围还是有很多小伙伴和很多中国式传统类型的父亲们。父子之间从来很少沟通,也时常施加暴力。但随着我们的年龄增长,基本就再无此类的了。换来的则是爷俩一块抽支烟,喝点酒。甚至一块洗个桑拿。

我想应该每个人在儿童时期,对于自己的爸爸都认为是世界上最好最棒最厉害的角色吧,无所不能。满足于孩童形形色色的各种需要。然后随着我们长大,随着我们成长。我们发现我们可以用自己的肩膀去撑起自己的天空,也发现父辈们似乎并不是我们之前那么神话。这个认识会造成父子关系变得奇怪一阵子。但或长或短,最终都会过去。当儿子毕业工作,结婚生子。肩上的担子也一如当年父亲一样的时候,我想对自己的父亲的理解肯定又会多一份吧。

不管小时候神话的父亲在我们心智生熟后会发现多么的平庸不足,但那份爱从不会随着我们的成长,成熟而褪色吧。


《放牛班的春天》

这部片是假期里看到的片子里最赞的一部,所以放到最后来写。

小A的童年生涯倒是没有遇到过门老师这么胸怀大爱的老师。但凭着父母的关系,以及可能小A自身成绩一直还算可以。所以老师们对小A还是很好的。

不过小A的一些所谓喜欢调皮捣蛋的小伙伴们就没有这么幸运了。后来小A在想,如果这些小伙伴当年能被老师们更加关爱,更加耐心的培养,也许是不是后来的很多事都不一样。

小A小学的时候有一位挺帅气的男老师,教音乐的。被很多女同学喜爱,但相对的就被小A的小伙伴们讨厌。男孩子嘛,总会编排一些神马男老师见色起意之类的。小A有一次上学路上捡到了一盘巴赫的磁带,想来在那么小的地方,除了这位老师,也不可能是别人的。但小A那会幼小的叛逆心理也不知怎的,就拿到了奶奶家,用录音机把磁带洗了半带子。两天后学校里张贴丢失告示,果然是这位老师的自带。于是虚荣的小A把这洗了一半的磁带交了上去。等下一次音乐课的时候,这位音乐老师把小A叫过去很温柔的问这磁带是怎么捡到的, 有没有后来拿来干什么。小A当时就心虚了,面红气短的。但依旧几个回合死不承认自己做过任何。于是老师也没有再怎样,后来的两年,老师依旧对小A很好,乐于回答小A的各种问题,甚至偶尔让小A在下课时间去音乐教室老师的钢琴那里随便弹玩着什么。知道这位老师不在教小A的时候,小A才知道录音机默认录磁带的时候是可以把人声录进去的。

小A也早已不记得当时自己洗磁带的时候是否录进了自己的声音。但隐隐小A总感觉其实当时这位老师已经知道了小A的小把戏。但并没有拆穿。

这段往事小A事后到如今30了从未对任何人讲起。在这里,小A想由衷的感激一下这位音乐老师的大度吧,维护了小A那幼稚的谎言,并且在后来的日子里也并没有因此对小A区别对待。依旧热心温暖。


三部电影,三类情感。同性的爱情,父子的亲情以及师生情。

在这个总是宣扬男欢女爱让人腻歪的时代。还好有这些美好的电影去讲述去描述这些不同但一样难能可贵的情感。

可以让人呼吸着阴霾的空气,看着暗淡的天空的同时,偶尔回忆往事。时常记起:

我们都曾被温柔以待。


小A是个诗人(001~010话)

(1)

前朝多贤能 才艺压神明 妖艳高冷 八面玲珑 豪杰自人中

黄梁有美梦 叶公不好龙 砟若霓虹 更似哀鸿 一抹断肠咏

假真魔幻 早已混沌如风

(2)

肴 谣 觉

你说还要 别闹

拥抱 美好 笑 操 老

烦恼 骄傲 毒药

(3)

白白的大腿

甜甜小嘴

原始的滋味

干杯喝醉

(4)

望长空 魔心已深重

醉朦胧 无酒亦成疯

瑟瑟秋风 何来钟鸣

谈笑之中 化作真龙

嗯哼 嗯哼

(5)

最好的时光里

无所谓

没有谁等你

亲爱的自己

(6)

最深处的夜幕 无边的悲凉

昏暗的路灯 指不出方向

迷幻的耳鸣声 无处可藏

黎明之前 不若温柔埋葬

(7)

热吻热汤 告别彷徨 四处流浪 未够悲伤 空中飘荡 寻找希望

跟我极仿 不再伪装 同你很像 仍就心慌 若你很烫 我便极狂

(8)

秋雨至 天渐凉

路灯微亮 夜未央

薄雾倾城 无处诉衷肠

(9)

如梦令

李清照:

常记溪亭日暮,沈醉不知归路。

兴尽晚回舟,误入藉花深处。

争渡,争渡,惊起一滩鸥鹭。

小A:

柔肠千回百转,有你便是晴天。

全都是扯淡,相见欢两不厌。

雨天,神烦,去泥马个蛋蛋。

(10)

我心里有一束花 午夜绽放 孤芳自赏

我心里有一束花 凌晨枯萎 也无所谓

逆风飞翔 渴求阳光  繁华霓裳 一梦黄粱


一个人和一点事儿(111~120话)

(111)

最近有不知名群众反馈说小A太稀饭黑基友了 酱紫尊的没问题嘛 特别是稀饭黑小牛 酱紫尊哒好嘛

小A觉得有必要还原下现场,基友群某次聊天:

小A:哥几个 小A最近真的编不粗来段子了 能不能网开一面好好写写乃们当年哒破事儿 让伦家滴读者们乐呵乐呵

小马:哥们别闹了 我这都当爹的人了 你忍心拆散我们一家三口么

小白:哥们别闹了 我这都马上当爹的人了 你忍心造成两尸三命的局面么

小牛:我单身 写我吧 哥们不惧

小A:那就这么愉快哒决定了 顺便提醒一下 虽然你说自己单身没错 但我觉得还是离异更精确吧 不要装一手了谢谢

(112)

貌似上个段子最后还是黑了一下小牛 没办法 就剩他不用考虑家破人亡的case嘛 因为已经破亡了嘛好像

但作为一位有节操的男孩纸 小A还是想说小牛其实人挺好的

譬如小牛当年和某人ex在一起 同居了半年 都木有XXOO过

当然了 是个两居室 当然了 俩人分床睡

当然了 小牛那任ex是学跆拳道的

嗯 所以你看小牛至少在这个故事中表现出了审时度势 客观评价自身实力等等优点 人真的挺好

当然小A想估计ex和小牛分手的时候也应该说过你人真的很好之类的话

(113)

小牛其实年轻的时候其实长得还凑合 虽然脸已经比小伙伴们都大了不少 但因为坚持健身 身材一直很棒

直到小A结婚前一天 来自五湖四海的盆友欢聚一堂边吃边聊 商量明天婚礼肿么折腾小A之际 小牛又一次成功转移了全场注意 在连喝了三杯白酒后 立刻把上身脱了个精光 显摆自己的腹肌

正当小牛作势准备脱下面的时候 小白及时赶到终于制止了小牛哒露阴癖 免去了一场悲剧

而小白作为小A的伴郎 那天原本是计划早点回宾馆休息好备战第二天的

实际上呢第二天小A大发神威 把各路好汉叔叔阿姨喝的一塌糊涂 小白并没有太多表现机会

事后 小A一直很自责

为小白木有喝好 更为小牛木有脱好

(114)

小牛去年终于也结了 婚礼现场 小牛一位远方的基友赶来 喝的兴起一样也开始脱衣服 不同是的为了秀纹身 在一番折腾后 小牛终于打发这位我们并不熟悉的基友的基友回宾馆休息了 不过因为这一折腾 显然让我们这群小伙伴很多人心情不是很美丽

小白:我觉得再折腾5分钟 我就要抄家伙打人了

小马:我觉得我以后就算喝自己的尿都不能和这种人喝酒了

小牛为了安抚众人说道:哎 我这哥们其实平常人挺好的 就是确实不知道喝多了怎么想的 哪有别人结婚 自己脱衣服的

小A:你难道忘记哥们结婚的时候 你干了什么嘛

小A一直很感激当年小A婚礼上木有出手伤人的盆友们

小A一直期望下次再遇见一次这样的情况 好看着小马到时候到底喝神马

(115)

小牛某天在基友群问了一个问题:

论长得丑是一种怎样的体验

小马和小牛纷纷装作不知道

而小A是真不知道

沉默片刻还是小牛打破了这个局面自问自答了起来:

初夜很久就木有了 初吻还在

想想小牛都30了 小A不禁心疼 深深的谴责这个只看颜值的世界 并且作为既得利益者而感到些许不安

(116)

小A最近买了一份保险 早上去做例行体检 当看到黑心秤提示81kg的时候 就郁闷了 早知道应该换个短袖拖鞋并且不穿袜子来减少下负重的 又回160了 这可怎么活

接着看到身高一栏显示178.5 小A就开始愤怒了 黑心秤 喵了个咪的 老纸明明一米八大汉的好嘛

再接着看到护士mm竟然在单子上直接写了一个178,自动把后面的.5省略了就简直想当场打人了 数学是体育老师教的嘛!!! 178.5 这就是将近两米了滋道嘛!!! 就生生给我忽略了

这可真是一个充满恶意的世界

(117)

小A在群里聊天说这次体检 发现多年来的脂肪肝不见了 可这一年多小A没少喝大酒吖? 难道喝酒还治病的么? 小马说:你这不是还锻炼了么? 小A:可正经炼也就3个月不到,效果这么明显? 小马:啪啪啪也算吖。 小A想起了最近努力造人中的小白:那这么说 小白最近应该狂瘦吧。 最近也在健身刚刚学习了有氧无氧运动区别的小马道:不好说,你也知道的,短时间运动并没有什么卵用。

小A想,等小白看到这段聊天记录的时候 一定也会觉得这真是一个充满恶意的世界

(118)

小A买了一台椭圆机放家里 打算好好锻炼下身体 目前为止效果不错

近一个月平均每天差不多跑一个小时 消耗300~350大卡

介于并木有忌口 所以体重还是在160浮动 不过脸部明显瘦了下来

得到了周围盆友们哒一致肯定 成功吸引了注意 并且将常年的开场白:

"卧槽,你这肚子又大了啊"

变成了

"卧槽,你这脸竟然还能瘦下来,快告诉我怎么瘦哒!"

(119)

小A迄今为止最成功了一次减肥经历是在高中

高一下半学期 过完春节 要回学校开始补课

可小A明显还沉溺在节日的气氛中不想上课

于是问前排的小马同学 要不要逃学打游戏去

小马一拍即合 于是俩人直接简单收拾了一下 然后去网吧奋战了一个礼拜的《传奇》

到现在还记得网吧门口有个药店 药店门口有个体重秤

小A去网吧的时候顺手称了下 一周后从网吧出来又称了一下

从122斤立刻变成了109斤 7天13斤

小A觉得这个纪录应该再也超越不了吧

(120)

小A对于体重的执着并不是因为小A多gay多娘 而是小A早早就明白了这是个看脸的世界

小A结婚的时候 通知了很多儿时的小伙伴

一些多年不见的姐们突然接到通知小A结婚后 纷纷表示痛心疾首

大骂小A不厚道 怎么结的这么早 正想着大学念完了 要不要来帝都 好指不定跟一向迟钝的小A发展点神马呢 还没表白呢 小A一个电话就突然说要结了

不过大家还事很克制的 因为在参加完小A婚礼后 这些所谓暗恋小A的姐们没再也没有主动理过小A

当然小A宁愿相信是大家素质比较好 打死都不会承认 因为婚礼那天 小A挺着150斤的肚子 一下子就幻灭了那个多年前在大家记忆中长年保持110斤左右的帅气小鲜肉模样


一个人和一点事儿(101~110话)

(101)

小A在写满100个短篇期间陆陆续续发生了好多好玩的事情

最感动的就是小H

小H特意也发了一条 说对小A的爱已经超越了男女 并且永远不会找不到彼此

小A当场就热泪盈眶了 拿给小C看

小C说她对小A的感情也是差不多的

小A回家后拿给小B看

小B说她对小A的大爱早就已经超越了 一直是这样的

小A很感动 但隐隐觉得好像也有点不对劲儿啊 喵蛋的 为喵都超越男女了啊 到底是特喵真的超越了 还是嫌弃老纸 于是心塞

(102)

某任ex看完小A的100个小故事后

无限缅怀的告诉小A这些让她想起来了当年和小A一起的时光 也是一个爱写点什么的文艺小鲜肉

然后话风一转 下次来帝都必须找小A来一发 并且自夸了很久来证明自己虽然人老珠黄了 但是技术意识已经登峰造极 一定不会令小A失望

故事里好像出现过的和小A暧昧过哒女孩儿也已经在他乡结婚生子 看完后也是无限感慨

特别是得知小A最近要去那边玩后 更是无限激动 打算提前断奶 好和小A好好把酒言欢一下

她说 晚上不能太晚回家 最迟玩到午夜2点

小A说 晚上打算叫上几个其他朋友 估计好多人 咱们先吃饭再K歌 2点差不多了可以散场

她发了一个羞羞的表情说:嗯,那就先定个好点的宾馆吧

小A还有一个女校友 之前只是同校但不同级 所以基本上处于仅仅是认识不太熟悉的关系

后来光阴似箭 小A定居帝都 校友也在他乡有了自己的事业

某次进京 小A特别得体的招待一番后 俩人就变得熟络起来了

最近小A假期有点多 随便吐槽了一句要不去介位同学哒城市 陪老纸喝大酒呢

女校友弱弱的说:酒量有限 估计陪不好 但别的可以

小A觉得自己真的只是想找人喝酒嘛 肿么就这么难 于是礼貌的回绝了这个别的可以的建议

2小时后 半夜1点 又收到了女校友的回复:一个人在外面久了 确实会孤单寂寞 随便都好 来了给我电话

后记:

某日小A在家自饮想起了这些后 看了看自己的钱包 又看了看自己的大肚子 寻思了许久 到底这些破事儿是几个意思 难道乃们就看不粗来哥高贵的灵魂么 好好喝点不比什么强 于是心塞

(103)

算了不说小A了,说说基友们吧

最近大家都有了一些不小不大的变化

小马当爹半年了

小A辞职一季度了

小白媳妇儿怀孕一个月了

于是大家决定是不是应该一块聚一聚 张罗着让小A回去

小A想了一下 觉得回一趟家挺不容易的 也不能随便神马理由就回去啊 然后问小牛有没有神马喜事儿

小牛沉默了片刻,说:结婚一周年算么?

小A听罢想都不想就把动车票买好了,那别的不为,就为这事儿也得回去贺一贺啊

当然 大家的角色也进行着某些转换

譬如小马已经适应了当爹洗尿布

譬如小白已经晋升为准爸爸

譬如小A已经变为大龄无业游民

譬如小牛已经超越了我们哥几个 数月前就成为了离异中年

嗯 现在你们知道为啥小A之前买票买的那么坚决了吧

(104)

好吧 我感觉八成乃们还是想看102类似哒低俗香艳小段子 我争取继续编 只要你们不要随意对号入座 大家都是成年人了 意个淫神马滴多正常 要允许下三路 要允许发挥和艺术加工

只是小A的乐趣貌似不在这里了 想了想前些年街上遇见一个漂亮妹纸就会自动脑补去掉衣服的样子以及各种姿势

如今小A好像更稀饭看帅哥多一点 脑补一下帅哥脱光了会不会有腹肌会不会有胸毛

小A自认性向方面目前还算正常 所以更大的可能性只是年老色衰 荷尔蒙不够用了吧

其实就是这样的 毕竟小A三十了 十年前一夜五次郎这种事情基本都只能算永恒的回忆了吧

(105)

没事儿不能提年纪这个事儿 真心伤感

这一年

小A三十了

小白三十了

小牛三十了

小马,嗯,三十一了。

不过在每几个月不定期举办的花样作死大赛中 小马还是回回第一名

依旧是我们的带头大哥,不过小牛也在突飞猛进 努力赶超中

想听么?关注小A公众号吖 转发此文吖 你说是吧~~~~

(106)

小A和小白是高中认识的

上到高二的时候小白的小学同学小牛复读一年后也来到了这家高中

小白当时给小A介绍小牛的时候是这么说的:

我这个兄弟脑子有点问题 回头您多担待

(107)

好了太久远了 我们继续说现在

小牛前阵子去了一趟西藏 和他的两个基友自驾

但不知道路上发生了神马 等开到拉萨的时候 小牛的两个基友速度就奔机场买了一张回上海的机票

于是留下了孤零零的小牛

小白:你是不是把人家菊花爆了

小马:人家是不是嫌弃你菊花了

小A:不管怎么说 飞回来检查下身体是正经事儿 

小牛弱弱的说:这次出来开的车是特么我的 肿么飞!

(108)

小牛发扬了一贯的浪逼浪精神在大西藏片区契而不舍的上着豆瓣吖陌陌神马的 终于约到了一位驴友也正打算回内陆地区 不知道该说可喜还是可惜 这位驴友也是一汉子

小A那些天就看着盆友圈小牛各种美美的照片介绍着一路向东挺进内陆的景色以及和新基友的各种欢乐

言语中小A感觉小牛这是遇到了真爱

直到小牛他们开到了南京

直到小牛在夜里10点多发了一条盆友圈配图秦淮河 文字大约是这样的:想当年秦淮八艳这河边得有多美好 只可惜现在 小姐都哪去了

直到小牛在第二天早上6点中又发了一条朋友圈 无图 文字大约是这样的:钱包已丢内含银行卡身份证 手机单反也都不见了 请大家不要相信打着小牛旗号的各种借钱神马滴

(109)

早上起床 我们的作死群立刻就炸了 毕竟结合上两条盆友圈 我们都高度一致的认为小牛是喝大又想浪 约炮遇见仙人跳之类的了

于是淡定的等待小牛的出现

当小牛终于换到临时电话卡能上微信后

大家立刻献上了担心和关爱 提醒小牛赶紧看看肾到底还在不在

直到小牛开口,告诉我们。他是被这个路上新认识的基友坑了后

大家立刻陷入到了震惊和沉思 接着纷纷提醒小牛赶紧检查下菊花是不是还好

(110)

作为一个常年被妹纸们嫌弃的大龄青年小牛 终于发现了汉子也都嫌弃自己没安好心 顿时陷入了深深的羞愤中 发誓必须找到这个贼人 一问究竟

南京警察局 警察叔叔听完小牛的哭诉 第一句问道:除了他偷你东西的经济纠纷 到底你俩有木有感情纠纷 当问了三次均得到小牛否认后 警察叔叔终于很不情愿的立案了

不过作为小牛的兄弟们 小A等人一致认为小牛在这件事儿上应该有所隐情

不过作为小牛的兄弟 小A再度响起了当年小白的话语:“我这个兄弟脑子有点问题” 才感到其实当年小白并没有跟自己客气

不过作为即将投奔艺术的中年文青 小A恨铁不成钢的骂道:小牛你早个几年去西藏啊 那特喵还有韩寒什么事儿啊 哥现在就一线导演了好么

距离这段故事发生了也小半年了 小牛之后再也没有出过远门 而且听说好像最近经常拉肚子 菊花也不是特别好 还经常酒后自己哼着邓紫棋的那首《后会无期》