Blog Archives

Google FlatBuffers 跨平台序列化工具

作者:Bin Liu 1. 什么是FlatBuffers Google发布了FlatBuffers,一个跨平台,提供了C++/Java接口,注重性能和资源使用的序列化(Serialization)类库。 尤其是FlatBuffers更适用移动设备,他们要求更高的新能,更低的资源需求(内存、带宽、CPU等)。 1.1. 它的特点如下: 不需要打包/解包。它的结构化数据都以二进制形式保存,不需要数据解析过程,数据也可以方便传递。 省内存、性能好(见附录1) 强类型系统,在编译阶段就能预防一些bug的产生 跨平台(C++11/Java) 等等。 1.2. 和Protocol Buffers的不同之处 FlatBuffers和Protocol Buffers很像,他们的最大不同点是在使用具体的数据之前,FlatBuffers不需要解析/解包的过程。 1.3. 和JSON的不同之处 JSON作为数据交换格式,被广泛用户各种动态语言之间(当然也包括静态语言)。它的有点事易于理解(可读性好),同时它的最大的缺点那就是解析时的性能问题了。而且因为它的动态类型特点,你的代码可能还需要多写好多类型、数据检查逻辑。 2. FlatBuffers的使用方法 简单来说使用FlatBuffers需要遵循以下步骤。 编写一个用来定义数据结构的schema(IDL,接口定义)文件 使用FlatBuffer编译器flatc生成数据结构源代码(C++头文件或者Java类) 使用FlatBufferBuilder类创建flat的二进制buffer 保存或者发送buffer 接收并buffer并读取数据内容 这里是一个简单的例子。 将上述代码保存为monster.fbs之后,即可使用flatc来“编译了”。 生成的Java文件有如下代码(Java的使用方法有点怪怪的,估计是作者的C++背景太强了?)。 附录: [1] 性能数据,来源于http://google.github.io/flatbuffers/md__benchmarks.html FlatBuffers (binary) Protocol Buffers LITE

Posted in Tech Tagged with: , , ,

不可变基础设施 – Immutable Infrastructure

本文禁止转载! 3/8号参加了Docker Beijing Meetup,这是一份迟来的总结。 不过这里我倒不想多说Docker的东西,那天我的话题参见这里(http://glide.so/liubin0329/746ff18f318ba1baaf77)。 本文主要想说的是“Immutable Infrastructure”,即“不可变基础设施”这个概念。 这个词汇最初应该是由Chad Fowler提出的,关于Chad Fowler,熟悉Ruby的人都应该知道,是一个热情的Ruby/Rails信者,活跃于各种conferences上,现在也是比较有名的TODO软件公司6Wunderkinder的CTO。 什么是 Immutable Infrastructure? Immutable Infrastructure,直译过来就是不可变基础设施,所谓基础设施,可以认为是我们平常运维中涉及到的所有硬件、软件等的组合。而所谓的不可变,即安装一次,不做修改,用过即扔。有点像一次性产品,或者可以称为即抛型。 按照“The Codeship Workflow: Immutable Infrastructure”给出的定义,不可变基础设施可以定义为如下: Automate the setup and deployment for every part and every layer of your infrastructure. Never change any part of your system

Posted in Docker, Tech Tagged with: , , , , , , ,

Serf初体验

随着互联网的发展,尤其是最近几年的移动互联网,能接入网络的设备越来越多,访问量也越来越大,这也就需要越来越多的服务器,所以说现在IT公司的运维也发生了很大的变化。随之而来的是各种运维相关的理念、工具层出不穷。即使不做运维,你也总该听说过DevOps、Puppet、Chef这些东西吧。不过这里我们来介绍一个叫做Serf的东西。 Serf是什么呢,按照官方定义: Serf is a service discovery and orchestration tool that is decentralized, highly available, and fault tolerant. 即它是一个服务发现,编配(应用集群管理等)工具,它去中心化,高可用并且能故障恢复(容忍)。 Serf使用Gossip协议,采用Go语言编写。 说起Serf,还要再顺便提一下Vagrant这个虚拟机管理用工具,因为这两个工具同出自一家公司:HashiCorp,这家公司还有一个产品交Packer(Packer是一个从配置文件为各种平台创建OS镜像的工具)。 Serf主要是为了解决下面几个问题: ・成员关系(Membership) 可以感知集群中各服务器的状态变化。 ・故障检测和恢复 定期进行Serf agent活性检测,并尝试恢复。 ・事件广播 Serf能在集群中广播各种事件(包括系统定义,用户自定义),你可以通过事件来做各种操作,比如部署,同步配置文件等。 下面我们就来按照它的入门文档简单体验一下吧。 1. 安装 这里不多说了,我的测试环境为HOST:Mac,通过Vagrant(VirtualBox)装了一台Ubuntu(GUEST)。 两个OS里都需要安装Serf软件,去这里下载即可,解压后就是一个可执行文件,直接放到PATH里即可。 注意:按照官方文档,即使是在同一台机器上,也可以启动若干个Serf的代理。不过我这里还是用了两个OS。 2. 配置 需要配置一下HOST和GUEST上的IP地址就行了。 比如HOST:10.10.10.1 GUEST:10.10.10.2

Posted in go, Tech Tagged with: , , , , , ,

【翻译】DockerUI:Go编写的Web版Docker管理工具

原作者:cpw(http://cpw.hatenadiary.jp/about ) 原文:http://cpw.hatenadiary.jp/entry/2013/08/29/225457 翻译:刘斌(http://liubin.org) Docker的架构非常优秀,很简单的就可以创建可执行的容器。但是目前的很多操作都是基于CUI的,我在想要不要用Node.js做一个GUI的工具出来呢? Node.js非常有意思,想用它来做点东西。我在调查Docker的时候,发现了DockerUI(https://github.com/crosbymichael/dockerui)这个软件,这不正是我想做的么?本来还想通过做个小东西来学学Node.js呢。。。。先把Node.js放一边,试试DockerUI吧。 安装 DockerUI主页里有安装说明,最简单的方法是直接使用官方制作好的Docker镜像。 $ sudo docker pull crosbymichael/dockerui 由于DockerUI使用了Docker的Remote API,所以也需要做这方面的设置。像下面那样修改/etc/init/dockerd.conf文件,在启动docker守护进程的时候加上-H参数和-api -enable-cors参数。 description “Docker daemon” start on filesystem or runlevel [2345] stop on runlevel [!2345] respawn exec /usr/local/bin/docker -d -H=”unix://var/run/docker.sock” -H=”tcp://172.16.35.134:4243″ -api-enable-cors 修改配置文件后需要重启一下dockerd服务。 $ sudo stop dockerd $

Posted in Docker, go, Tech Tagged with: ,

【翻译】基于Docker的Rails集群+Ruby负载均衡代理

原作者:Muriel Salvan 原文地址:http://x-aeon.com/wp/2014/02/06/rails-cluster-with-ruby-load-balancer-using-docker/ 翻译:liubin (http://liubin.org/) 最近我发现了 Docker 这个东西。 并且我在 2014年2月的rivierarb的meet up 上做了一次演讲,资料可以在slideshare上下载(文档下载地址 https://speakerdeck.com/murielsalvan/ruby-and-docker-on-rails slideshare:http://www.slideshare.net/MurielSalvan/ruby-and-docker-on-rails,需翻墙)。 我打算做一个比较酷的使用Docker的例子:一个Rails集群,以及集群前面的一个Ruby负载均衡服务。我曾想过使用若干不同的机器(每台机器都有自己的IP地址和端口)来运行同样的Rails服务,然后在外部配置一台负载均衡的代理服务器,在各Railf服务之间进行请求分配。 不过使用Docker的话,在一台机器上就可以模拟集群环境了。 这里我们将演示一下如何来创建这个集群环境。 你可以从我的Github项目上下载所有这次测试的源代码。 创建Docker镜像 首先我将创建两个Docker镜像,1个用来运行Rails服务,1个运行Ruby代理服务。 1. 首先我制作了一个可信Docker构建(Trusted Docker build),构建脚本也在我的Github上( Github project docker-ruby )。使用这个构建脚本创建的镜像为 murielsalvan/ruby ,它基于Ubuntu Precise,并且安装了Ruby 2.1.0p0。 docker pull murielsalvan/ruby 2. 接着我基于murielsalvan/ruby来创建一个Docker容器,用来执行一个bash shell,然后在里面安装Rails并创建一个Rails应用程序。这个应用程序只有一页,它将打印出它所在服务器的主机名和IP地址(集群里的每台Rails服务都有不同的主机名和IP地址)。你可以从这里查看这个测试程序的源代码。这步的最后,我将把这个容器提交,生成一个新的镜像,并命名为murielsalvan/server,这个镜像执行的时候,会启动Rails服务,并监听3000端口号(容器内的端口号)。 docker run -t -i murielsalvan/ruby bash docker commit

Posted in go, Rails, Ruby, Tech, Web Tagged with: , ,

在Mac OS X下使用Docker 0.8安装Ruby环境

前不久(2014年2月4日)Docker 0.8发布了,对OS X的支持也更好了。由于Docker基于LXC技术,所以非Linux内核的系统很难使用Docker,如果想用的话,必须要装虚拟机软件来模拟运行Linux。不过OS X怎么说也是基于BSD的,跟Linux即使算不上兄弟,也算近亲吧。下面我们就按照官方文档来试着在Mac 下用一下Docker吧。 (实际上还是用到了虚拟机:-() 在本文里我们将完成两部分工作:  在最新版的Mac OS X下安装Docker 0.8  创建一个安装了Ruby 2.1的镜像,并且发布到官网仓库(index服务) 本文将不会涉及到docker各命令的具体说明。 1. 安装VirtualBox 这是前提条件,请到 https://www.virtualbox.org/wiki/Downloads 下载并安装VirtualBox,这里就不多说了。 2. 安装 boot2docker 一个非常精简的Linux发布版本。 $ curl https://raw.github.com/steeve/boot2docker/master/boot2docker > boot2docker $ chmod +x boot2docker $ sudo cp boot2docker /usr/local/bin 或者随便放到哪里。如果不加到PATH里,运行的时候要记得写全路径。 $ which

Posted in go, Tech Tagged with: , , , , , , ,

Ruby中生成QR Code(二维码)那些事

在程序中要想生成二维码,除了各种网络服务,还可以利用各种本地library。 在Ruby下有很多,这里只简单介绍三个:qrencoder,rqrencoder-magick和rqrencoder,rqrcode_png。 实际上这三个库,都需要qrencoder这个东西。 1. 安装qrencoder 我用的homebrew,安装如下: liubin:eventbox liubin$ brew install qrencode ==> Downloading http://fukuchi.org/works/qrencode/qrencode-3.4.2.tar.gz ######################################################################## 100.0% ==> ./configure –prefix=/usr/local/Cellar/qrencode/3.4.2 ==> make ==> make install /usr/local/Cellar/qrencode/3.4.2: 11 files, 196K, built in 17 second 2. 安装qrencoder(Ruby GEM) qrencoder主页:https://github.com/harrisj/qrencoder 这是对一个开源库的C扩展,当然主要是为了速度。 代码最后更新时间大概在两年之前。 安装qrencoder的话需要指定额外的include和lib路径,否则出错。 checking

Posted in Rails, Ruby, Tech Tagged with: , , , , , ,

COOKPAD所使用的技术 — 基础设施篇

序: 本系列文章主要基于日本技术评论社的杂志的《WEB+DB Press》(总)第66卷(2012年1月25日发行,数据有点老,2年了。)的专题“COOKPAD开发Know How大公开”整理而成,部分数据可能会根据网上能搜集到的信息加以修改。 本特辑主要分为5部分,分别是: 1. 严守200毫秒 — 基础设施篇 主要介绍采用AWS,图像分发、处理,异步加载,缓存等内容。终极任务:确保服务器响应时间在200毫秒之内。 2. 大规模项目快速开发流程 TDD(测试驱动),原型法,频繁发布 3. 以用户为中心的开发 model user,用户访谈,EOGS 4. 高效的智能机应用开发 如何选择App和Web?自己独自的库,code snippet 5. 跨公司的团队氛围 DevOps、全部门工程师体制、AARRR指标 本文主要是第一章,基础设施,也就是infrastructure。 COOKPAD是什么公司? COOKPAD网站是1998年上线的,当然,那时还没有Rails。2005年曾经一度尝试过使用过Rails,但是没有成功。直到2008年后,才开始逐渐的转移到Rails。我曾在Ruby Kaigi 2007上见过他们的演讲,当时还在招聘Rails工程师。直到现在,每次Ruby或者Rails的各种会议,都有他们招聘的身影。 选择Rails的原因 当初选择Rails主要基于以下两点: 1. DRY,编写风格良好的代码,利于复用。 2. 框架本身鼓励测试。 基础架构 系统工程师有5人,架构也很普通:反向代理+应用服务器+数据库。具体来说如下: ■ 负载均衡 使用了Amazon的ELB(Elastic

Posted in Rails, Ruby, Tech Tagged with: , , , , ,

使用Vagrant安装rails环境(rails-dev-box)

1. 什么是Vagrant 简单来说,Vagrant是一个虚拟机管理软件,你可以使用它脱离虚拟机容器(类似VirtualBox之类的软件)来管理(启动、停止、配置等)虚拟机(镜像文件)。使用它,你可以快速的进行在干净的环境下进行测试,部署等。(有点类似Docker,不过我感觉Docker比传统的虚拟机更高一层,灵活性更高,效率也会高很多。) 2. 安装 2.1. 安装VirtualBox 首先,需要安装VirtualBox,这个不多说,从官方(https://www.virtualbox.org/wiki/Downloads )下载即可。 我下载的VirtualBox-4.3.6-91406-OSX.dmg有118.6M。 除了Mac版的,还有Windows和Linux,以及Solaris版本的。 2.2. 安装Vagrant 接着,安装Vagrant。 从官方选择一个(100%的人会选择最新版吧)版本下载: http://downloads.vagrantup.com/ 我下的Vagrant-1.4.2.dmg有33.9M 2.3. 安装rails-dev-box rails-dev-box(https://github.com/rails/rails-dev-box )是一个为了开发Rails 本身而准备的环境,而不是为了开发普通的Rails应用程序。 安装方法见项目主页的说明,基本就是这样: $ git clone https://github.com/rails/rails-dev-box.git Cloning into ‘rails-dev-box’… remote: Reusing existing pack: 275, done. remote: Counting objects: 1, done. remote:

Posted in Rails, Ruby, Tech Tagged with: , ,

从代码里取todo信息提交到Gitlab

最近写了个小工具:gitlab_todo (https://github.com/liubin0329/gitlab_todo)。 这个工具的主要功能就是根据代码里写的注释,找出todo信息,在提交代码的时候,将新增加的todo,作为issue添加到Gitlab该项上的issue列表里。同时添加todo作为标签,将assignee设为自己。 当然,也支持在删除todo注释的时候,将相应的todo删除。 本工具不保存任何数据信息(比如todo和issue id的对应关系等),也不修改任何commit或者代码信息。所有信息匹配都是通过todo内容的字符串(todo:后紧跟的字符串,以及issue里title的值)。 1. 安装方法: 1.1. 将todo.rb拷贝到$PATH里,然后增加git的hook $ cat .git/hooks/post-commit todo.rb 如果不想把todo.rb放到PATH里,也可以在post-commit里写上绝对路径。 1.2. 设置gitlab的地址和private token export GITLAB_HOST = … export GITLAB_TOKEN = … 然后,在代码的注释里,按照这样的格式写todo就可以了: [TODO: xxxxx ] 其中,中括号和大写的TODO加冒号必不可少,xxx是todo内容,也是issue的title 2. 截图   2.1. 在代码里添加注释并提交 从diff可以看出,增加了注释并且包含TODO关键字 git commit后,会将此todo加入到issue里。 2.2.

Posted in Ruby, Tech Tagged with: , , ,

无觅相关文章插件,快速提升流量