<餐巾纸上的创业课>读书笔记

https://book.douban.com/subject/4168140/

很喜欢这种风格,把很多道理融入在故事中,让人忍不住一口气读完。下面是从中摘录的一些笔记:

每个公司企业看似都有自己独特的成长模式,其实这些模式顶多不过三四种。

创业,失败率高达90%以上

地雷总埋藏在你意想不到的地方

没有人能带着成功全身而退。

扁平化组织:老板必须拥有绝对的领导地位。管理部门完全听从老板的指示行事,没有实权。

我们必须熟知模式,才有跳脱模式发展自己的可能;要知道自己正走在埋有地雷的道路上,遇上时才能够妥善处理。

More

Ruby Quick Start (4) -- Array, String, Closure

《Ruby语言入门教程v1.0》笔记(4)


第八章 Ruby中的数组、字符串、闭包

1. Ruby中的数组

1.1 建立数组

arr1 = []
arr2 = Array.new
arr3 = ['4 ', '5 ', '6 ']
print arr1, "\n"
print arr2, "\n"
print arr3, "\n"


1.2 访问数组元素

arr = [3, 4, 5, 6, 7, 8, 9]
puts arr[0]    # 3
puts arr.first    # 3
puts arr[arr.length-1]    # 9
puts arr[arr.size-1]    # 9
puts arr.last    # 9
puts arr[-1]    # 9
puts arr[-2]    # 8
print arr[1..3] ,"\n"    # 456
print arr[-3, 2] ,"\n"    # 78

数组的索引从 0 开始,一直到数组的长度减去 1

负数表示从数组末尾开始的索引;

用一对数字来索引数组,第一个数字表示开始位置,第二数字表示从开始位置起的元素数目。



1.3 增加、删除数组元素

Ruby 的数组大小是动态的,你能够随时增加、删除数组元素。

More

Ruby Quick Start (3) -- Module, Mix-in

《Ruby语言入门教程v1.0》笔记(3)



第六章 模块、命名空间、Mix-in

1. Ruby中的模块

在程序中,相关的、不相关的代码的组合,叫作模块。一般情况下,我们总是把功能相关的代码放在一个模块里。

把功能相关的程序代码放在一个模块里, 体现了模块的第一个作用: 可以被其它程序代码重复使用。

数学中常用的函数, Ruby 中的 Math 模块都提供了。 每个使用 Math 模块的程序员无须再重复编写这些常用的函数与常数。

puts Math.sqrt(2)    # 1.4142135623731
puts Math::PI    # 3.14159265358979

定义模块用 module...end

模块与类非常相似,但是:

  • 模块不可以有实例对象;
  • 模块不可以有子类。

    More

Notes of Scala course on Coursera -- Week 3

Here are my notes for the week 3’s lecture of Functional Programming Principles in Scala on Coursera.




1. Class Hierarchies

1.1 Abstract Classes

Consider the task of writing a class for sets of integers with the following operations.

abstract class IntSet {
  def incl(x: Int): IntSet
  def contains(x: Int): Boolean
}

IntSet is an abstract class.

Abstract classes can contain members which are missing an implementation (in our case, incl and contains ).

Consequently, no instances of an abstract class can be created with the operator new.



1.2 Class Extensions

Let’s consider implementing sets as binary trees.

There are two types of possible trees: a tree for the empty set, and a tree consisting of an integer and two sub-trees.

Here are their implementations:

class Empty extends IntSet {
  def contains(x: Int): Boolean = false
  def incl(x: Int): IntSet = new NonEmpty(x, new Empty, new Empty)
}

class NonEmpty(elem: Int, left: IntSet, right: IntSet) extends IntSet {
  def contains(x: Int): Boolean =
    if (x < elem) left contains x
    else if (x > elem) right contains x
    else true
  def incl(x: Int): IntSet =
    if (x < elem) new NonEmpty(elem, left incl x, right)
    else if (x > elem) new NonEmpty(elem, left, right incl x)
    else this
}

Empty and NonEmpty both extend the class IntSet .

This implies that the types Empty and NonEmpty conform to the type IntSet

  • an object of type Empty or NonEmpty can be used wherever an object of type IntSet is required.


More

Ruby Quick Start (2) -- Objects in Ruby

《Ruby语言入门教程v1.0》笔记(2)


第四章 Ruby面向对象初探

1. 封装

让我们来定义一个类, 类名是 Person类名首字母要大写; 属性有姓名@name、年龄@age、国籍@motherland,实例变量用@开头;
方法有一个,叫 talk, 方法名和参数名应该用一个小写字母开头或者用一个下划线开头。

class Person
  def initialize(name, age = 18)
    @name = name
    @age = age
    @motherland = "China"
  end  # 初始化方法结束
  def talk
    puts "my name is " + @name + ", age is " + @age.to_s
    if @motherland == "China"
      puts "I am a Chinese."
    else
      puts "I am a foreigner."
    end
  end  # talk方法结束
  attr_writer :motherland  # @motherland的setter
end

p1 = Person.new("Yilin", 23)
p1.talk

p2 = Person.new("Ben")
p2.motherland = "ABC"
p2.talk

initialize 是初始化方法,相当于构造函数。
参数 age 有一个缺省值 18,可以在任何方法内使用缺省参数,而不仅仅是 initialize。 如果有缺省参数, 参数表必须以有缺省值的参数结尾。

注意我们定义了@motherland成员变量的setter:

More

Ruby Quick Start (1) -- A Glimpse of Syntax

学习Ruby时在网上找到了一本小册子《Ruby语言入门教程v1.0》,虽然是07年的东西了,但是作为快速熟悉Ruby基本语法还是很有帮助的,做一下笔记。

开始前先问下自己两个问题。

(1) 我为什么要学习Ruby?

为了Web开发。

(2) 为什么选择Ruby,而不是Python,PHP?

看了知乎上的这个答案

  • 假如你想帮他尽快找个活儿, 赚到钱, 推荐 PHP
  • 假如你想让他成为一个高效工程师, 推荐 Python
  • 假如你想让他爱上他的工作, 推荐 Ruby

无论如何,别人的答案只能作为参考,自己尝试过后才有资格评价,所以最好的方法就是亲自动手学习下Ruby。

More

《编写高质量代码:改善C++程序的150个建议》读书笔记(2)

《编写高质量代码——改善C++程序的150个建议》读书笔记(1)



第二部分 编码习惯和规范篇

建议81:避免无意中的内部数据裸露

对于const成员函数,不要返回内部数据的句柄,因为它会破坏封装性,违反抽象性,造成内部数据无意中的裸露,这会出现很多“不可思议”的情形,比如const对象的非常量性。

建议82:积极使用const为函数保驾护航

const的真正威力体现在几个方面:

  1. 修饰函数形式的参数:const只能修饰输入参数,对于内置数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”;
  2. 修饰函数返回值;
  3. 修饰成员函数:用const修饰成员函数的目的是提高程序的健壮性。const成员函数不允许对数据成员进行任何修改。

关于const成员函数,须遵循几个规则:

  1. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数;
  2. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的;
  3. const成员函数不可以修改对象的数据,不管对象是否具有const性质。

建议83:不要返回局部变量的引用

局部变量的引用是一件不太靠谱的事儿,所以尽量避免让函数返回局部变量的引用。同时也不要返回new生成对象的引用,因为这样会让代码层次混乱,让使用者苦不堪言。

建议84:切忌过度使用传引用代替传对象

相较于传对象,传引用的优点:它减少了临时对象的构造与析构,所以更具效率。但须审慎地使用传引用替代传对象,必须传回内部对象时,就传对象,勿传引用。

建议85:了解指针参数传递内存中的玄机

用指针参数传回一块动态申请的内存,是很常见的一种需求。然而如果不甚小心,就很容易造成严重错误:程序崩溃+内存泄露,解决之道就是用指针的指针来传递,或者换种内存传递方式,用返回值来传递。

// 指针型变量在函数体中需要改变的写法
void f(int *&x)    // 使用指针变量的引用
{
    ++x;
}

More

《编写高质量代码:改善C++程序的150个建议》读书笔记(1)

前一段时间看了这本《编写高质量代码——改善C++程序的150个建议》,感觉和Effective C++有点类似。看完还是有不少收获的,在此整理、记录一下。



第一部分 语法篇

建议1:区分0的4种面孔

  1. 整型0,32位(4个字节);
  2. 空指针NULL,指针与int类型所占空间是一样的,都是32位;
  3. 字符串结束标志’\0’,8位,一个字节,与’0’有区别;
  4. 逻辑FALSE/falseFALSE/TRUEint类型,而false/truebool类型。

建议5:不要忘记指针变量的初始化

  1. 可以将其初始化为空指针0(NULL);
  2. 对于全局变量来说,在声明的同时,编译器会悄悄完成对变量的初始化。

建议6:明晰逗号分隔表达式的奇怪之处

  1. 在使用逗号分隔表达式时,C++会确保每个表达式都被执行,而整个表达式的值则是最右边表达式的结果
  2. 在C++中,逗号分隔表达式既可以用作左值,也可以用作右值

建议9:防止重复包含头文件

注意在大型项目中的形式应类似下面:

#ifndef _PROJECT_PATH_FILE_H
#define _PROJECT_PATH_FILE_H
// ...
#endif

建议10:优化结构体中元素的布局

把结构体中的变量按照类型大小从小到大依次声明,尽量减少中间的填充字节

More

Notes of Scala course on Coursera -- Week 2 (2)

Here are my notes for the week 2’s lecture of Functional Programming Principles in Scala on Coursera.




4. Example: Finding Fixed Points

4.1 Finding a fixed point of a function

A number x is called a fixed point of a function f if

For some functions f we can locate the fixed points by starting with an initial estimate and then by applying f in a repetitive way.

until the value does not vary anymore (or the change is sufficiently small).

More