brew 安装软件404

mac 下的brew是一个非常好用的包管理器。

安装mysql什么的,非常方便。

今天打算安装一个ghostscript

brew install ghostscript

但是发现下载链接是404.。

所以干脆修改他的安装脚本

brew edit ghostscript

编辑他的安装教程,修改他的下载链接为github上的release版本,并且计算他的sha256值,在脚本修改即可。

shasum -a 256 /xxxx.tar.gz

然后继续安装

brew install ghostscript

最近

换了个工作,好好工作!做到自己能做到的最好!

然后

最近想把golang好好学好。

静态在手,天下我有。。。

还有跟朋友一起玩的开源项目,也得加把劲了~

有点脑袋跟不上的感觉……(就是累)

BDD与TDD

目前这家公司其实非常少些测试……(有测试妹子)

后来发现这种不写测试的方式,真是的蛋疼!

尤其是当项目越来越大,如果不写测试,那么坑会越来越大!

所以开发者们想出了一些方式方法来提高(保证)开发者的代码质量。

所以就有了BDD(行为驱动开发)和TDD(测试驱动开发)

之前我就在想:有时候你不知道如何设计某个功能的时候,那么你就先写你要如何使用(调用)这个代码,再来设计代码。

有这么个BDD的意思吧。

最近把BDD和TDD都用一用,把以前的老代码都拿出来走走测试 。。。

越来越感觉。。。没有测试的代码。。。好危险。。。

中间件——Rack

Rails玩家如果不知道Rack的话,岂不是很尴尬?

什么是Rack中间件?

Rack中间件就像他的名字一样,他是一个“中间件”:中间层。

因为他处于HTTP请求的中间层:

Puma(或其他应用服务器)  <—>  Rack <—> Rails(Sinatra等)

Rails也好,Sinatra也好,他们都是基于Rack中间件的Rack应用程序。

Rack其实做的工作也很简单,将请求“转发”给Rack应用程序(Rails等),然后Rack应用程序返回body等数据给Rack,Rack再返回给应用服务器(Puma等),再发送给浏览器(或者给Nginx,再返回给浏览器)。

如何运行一个Rack应用?

rails中的config.ru中有这两行代码:

当然,如果你有自定义的中间件,你可能会在config.rb中的run之前加入

use会在每一次http请求时调用。

并且将环境变量 env传给use的HelloWorld类。

在HelloWord中,获取请求的数据,并且做一些中间层的工作,例如将清空session啊,修改body啊,修改headers啊等等

最后将env丢给Rails,就是HelloWorld中间件修改后的数据了~

Rack其实是不是挺简单的~~?

Rails源码:ActiveRecord::Base 类

上一章写的是Controller的基类Metal,有木有有一种豁然开朗的赶脚啊~~~

好吧,再看看model的基类:ActiveRecord::Base!

rails中,每一个model都集成自 ActiveRecord::Base, 这个类非常屌,一打开页面就可以看到这样的代码:

看到core_ext 这个文件夹名就知道:核心的扩展。

他扩展了hash,string等等ruby标准库中的类,有的朋友如果是从rails直接开始学ruby的话,可能就尴尬了,因为有点分不清谁是ruby的标准方法,谁是rails扩展的方法。

比如莫粒经常使用的一个方法:try()

有时候你是不是会经常写这样的判断:

如果使用try()就可以这样写:

try其实就是rails扩展的ruby中Object的类:

ruby中的Object是一个非常基础的类,几乎所有的对象都继承自Object,所以try扩展在了Object类中,这样,即便 nil.try() 都可以调用哦。因为nil也是一个对象~ 但是细心的朋友会看到NilClass也实现了一遍try方法,直接返回nil~

说这么多,其实就是想说,rails利用ruby的猴子补丁特性,扩展了非常多的标准库的方法,使其更加方法,给广大rails开发者提供了很多方便呢~

回到rails的 model 的base类。

先看看base类的initialize方法:

主要是一些属性和数据的描述,初始化工作。

再看base类的底部:

原来base类也扩展了非常多的行为呢!比如常用的验证,回调。

现在说说最重要的:rails如何根据表中字段自动生成一个类的变量的呢?

比如表 Student 字段 name

那么 Student类如何直接 Student.new.name 呢?

最开始我想了几种实现:

Struct 实现:ruby中的Struct是可以直接创建属性的,或者OpenStruct实现。

class_eval实现:直接使用class_eval创建属性也是可以的。

define_method实现:这个也是可以动态的创建方法的(ruby中的方法也可以像使用属性一样调用呢)

method_missing实现:理论上也是可以的呀~

不管了,先看看rails是怎么做的:

/activerecord-4.0.0/lib/active_record/core.rb

/activerecord-4.0.0/lib/active_record/attribute_methods.rb

 

看这些代码的时候,我是有点懵的,找了好久……

 

Rails 源码:ActionController::metal类

Metal其实是rails中的一个非常初级的类,他是一切rails controller的基类。

他是ruby和rack 中间件的桥梁。

如果你的controller直接继承 Metal,其实就是一个非常基础的controller,几乎没有你需要的功能,这个controller的action如此输出数据给浏览器:

能忍?

看他的成员变量,就知道这个类是干什么的了,直接操作返回的状态,headers等等,能忍?是非常基础的操作。

所以我们常使用的ActionController::Base 又继承了 ActionController::Metal ,并且加入了常用的模块:

Base类其实是很重的,如果你用来开发api什么的,会有种大炮打蚊子的感觉,如果你是写api,并且不需要cookie,flash等等组件,那么可以试试直接继承 metal,来输出api,效率会更高一些。

 

https在cdn下如何获取真实ip

当你使用cdn的时候,难免会遇到一个问题,就是https如何获取用户的真实ip呢?也就是当你没有后端服务器证书的情况下,纯tcp转发的情况下,如何获取用户的ip地址?

基本思路就是使用 jsonp技术。

如上。

摘自:https://www.ipify.org/
这样就获取到了用户的真实ip地址。

第一次获取后,写入cookie或者提交到后端,写入session中即可~

SourceTree cat-file

最近想把rubymine戒掉,用Atom。

但是git有时候要对比文件,可视化还是看着舒服一点,并且有时候想cat某个commit下的文件。

一般我们用命令

但是在sourceTree中并不提供这种功能~ 提供的快速查看用的mac的默认工具预览,可是有的文件后缀根本没法预览。

所以还是用git cat-file 吧。

如何添加呢?

在SourceTree中有个自定义操作:

屏幕快照 2016-08-01 22.20.14

添加这个操作后,就可以用鼠标cat commit中的这个文件啦!

屏幕快照 2016-08-01 22.22.01

选择cat-file就可以读取文件内容啦了~

但是后多时候我们需要读取当前这个文件父commit的的文件,也就是当前commit中的文件修改之前的文件内容。

所以我又写了一个脚本

屏幕快照 2016-08-02 01.42.57

注意,运行的是一个shell脚本

没办法,读取父类的内容比较复杂一些了,一堆命令SourceTree好像搞不定。

这样就可以读取当前commit修改的文件之前的内容。

Rust语言 Atom作为IDE

最近发现rust很不错啊,性能跟c/c++差不多,语法更“安全”。

所以想学习学习。

写代码嘛,有的人喜欢vim,有的人喜欢ide。

我个人比较喜欢atom。

如果要配置rust的ide,推荐的插件如下:

tokamak, rustfmt, language-rust

有这3个够了~

之前其实玩go语言都上手了~ 还写了一个proxy。 可是这语言效率上不如c/c++,虽然写并发非常爽,感觉没其他的优点,所以学下rust玩玩。

 

rails在IE浏览器下无法保存session的问题

锐壳是用的rails写的。

一直有一个bug,就是IE浏览器下,可能无法登陆账号,也就是session无法存储。

这个我一直没重现(工作用mac),今天突然用台式机,IE登陆账号,发现一直登陆不了。

于是找了半天,终于知道是什么原因了。。

XXX/config/initializers/session_store.rb

将abc_123改成 abc123

不能有 下划线!!

终于好了……扯犊子啊。。

近期文章

最新评论

  • 正在加载...

分类目录

标签云

统计