Rails ActiveRecord数据库关系1:1

如图所示,在demo数据库中有suppliers和accounts两张表。一个supplier有一个account,一个account属于一个supplier,是一个1:1关系。

1-1

Read on →

Go学习笔记-类型与接口

如果说go语言的其他内容看起来和c/c++语言没什么太大的区别,那么它的接口设计一定会让人大吃一惊,是的,有时它真的让我产生我使用的是一种动态语言的幻觉。

Read on →
go

Go学习笔记-go Routine

Go routine indeed

本段结论引用自:goroutine背后的系统知识,让我了解为什么goroutine这么轻量级,以及其优势劣势。

Go语言通过goroutine提供了目前为止所有(我所了解的)语言里对于并发编程的最清晰最直接的支持,Go语言的文档里对其特性也描述的非常全面甚至超过了,在这里,基于我们上面的系统知识介绍,列举一下goroutine的特性,算是小结:

(1) goroutine是Go语言运行库的功能,不是操作系统提供的功能,goroutine不是用线程实现的。具体可参见Go语言源码里的pkg/runtime/proc.c

(2) goroutine就是一段代码,一个函数入口,以及在堆上为其分配的一个堆栈。所以它非常廉价,我们可以很轻松的创建上万个goroutine,但它们并不是被操作系统所调度执行

(3) 除了被系统调用阻塞的线程外,Go运行库最多会启动$GOMAXPROCS个线程来运行goroutine

(4) goroutine是协作式调度的,如果goroutine会执行很长时间,而且不是通过等待读取或写入channel的数据来同步的话,就需要主动调用Gosched()来让出CPU

(5) 和所有其他并发框架里的协程一样,goroutine里所谓“无锁”的优点只在单线程下有效,如果$GOMAXPROCS > 1并且协程间需要通信,Go运行库会负责加锁保护数据,这也是为什么sieve.go这样的例子在多CPU多线程时反而更慢的原因

(6) Web等服务端程序要处理的请求从本质上来讲是并行处理的问题,每个请求基本独立,互不依赖,几乎没有数据交互,这不是一个并发编程的模型,而并发编程框架只是解决了其语义表述的复杂性,并不是从根本上提高处理的效率,也许是并发连接和并发编程的英文都是concurrent吧,很容易产生“并发编程框架和coroutine可以高效处理大量并发连接”的误解。

(7) Go语言运行库封装了异步IO,所以可以写出貌似并发数很多的服务端,可即使我们通过调整$GOMAXPROCS来充分利用多核CPU并行处理,其效率也不如我们利用IO事件驱动设计的、按照事务类型划分好合适比例的线程池。在响应时间上,协作式调度是硬伤。

(8) goroutine最大的价值是其实现了并发协程和实际并行执行的线程的映射以及动态扩展,随着其运行库的不断发展和完善,其性能一定会越来越好,尤其是在CPU核数越来越多的未来,终有一天我们会为了代码的简洁和可维护性而放弃那一点点性能的差别。

Read on →
go

Go学习笔记-函数和包

函数定义

go语言中使用func关键字定义函数,如main函数的定义:

func main() {
	 fmt.Println("main function")
}

定义一个具有参数和返回值的函数:

func sum(a int,b int) int {
	return a+b
}
Read on →
go

Shell字符串处理

1.获取字符串长度

${#string}

-

[jason@localhost ~]$ str="hello,world"
[jason@localhost ~]$ echo ${#str}
11

2.获取子串

${string:position}
${string:position:length}
$(string:(-postion)) 如果使用负数,表示从右开始计数,注意负数必须使用括号 -

[jason@localhost ~]$ str=ABCDEFGHIJKLMN
[jason@localhost ~]$ echo ${str:1}
BCDEFGHIJKLMN
[jason@localhost ~]$ echo ${str:1:2}
BC
[jason@localhost ~]$ echo ${str:(-2)}
MN
Read on →

Code Snippets

ruby文件utf-8编码

# -*- coding: UTF-8 -*-

退出ssh登录后继续执行命令

如果long_run_cmd是一个长时间执行的命令,而我们又想在退出ssh后不至于中断该命令:

nohup long_run_cmd &
Read on →

Rake-ruby’s Make

Rake,顾名思义,就是Ruby的Make工具。

Rake的特性

Rakefile就是rake版本的makefile文件,它使用的就是标准的ruby语法。不需要编辑XML文件,也不需要记忆古怪的makefile语法。

  • 可以定义任务(task),并为任务定义依赖。
  • rake支持利用规则模式来合成隐式任务。
  • 灵活的文件列表,可以像列表一样操作。
  • 预置的库使得编写rakefile变得更加简单。
  • 支持并行执行多个任务。

所以说,rakefile文件没有特殊的格式,仅仅是一个包含ruby代码的文件,不过,仍然有一些关于rakefile的约定,遵循这些约定,使得rake能够更好地处理任务和行为。

Read on →

天道酬勤-在追逐梦想的路上

还记得大概一年前,也是在CSDN博客上读过一篇文章,拜读某个大牛描述了他为心仪的公司准备的过程,当时觉得很受触动,于是在博客下留言自勉,还记得他回复的话说:跨专业,更要提早准备。而现在,作为一个机械专业的学生,一路过关斩将拿到百度offer,除了激动之余,我能清晰的感觉到,自己的梦想画卷才刚刚展开。

Read on →

Ruby之周期性任务

1.前言

无论是用ruby做系统管理,还是用rails做web开发,都可能遇到周期性任务,它们按照一定时间周期(1小时,2天……)持续地触发。在ruby中,我认为一次性任务使用sidekiq来完成是非常方便的,而周期性的任务就需要用到whenever,sidetiq,clockwork等等gem了。

Read on →

学算法并非和语言无关

1. 写在前面

算法这个东西,本来不是什么特别复杂的东西,就是为了解决某个问题提出的一个解决方案,说白了,就是一种思路。基本上,所有的算法书上都默认选用了伪代码来表达算法,因为这样可以脱离具体的语言,让算法学习者能够直面算法的本质,理解算法的核心,然后使用自己常用的语言来重新表达,写出能够运行的代码。实际上,在我接触到ruby这类高表达力的语言前,我也这么认为。虽然我能够理解很多算法的核心本质,但往往在实际用C或者java来实现时,总是被一些数组索引等细枝末节的问题所折磨,我通常会告诉自己,嗷,我还没有深刻领悟它,再去看看算法图述和伪码。

但是,今天我想说,我错了。也许,有的语言能够更好地表述算法,表述算法的好的语言应该能够以最接近人类语言的方式表达出来,而且基本就能够运行出结果。

Read on →