薛定谔的风口猪

站在巨人的肩膀上学习,猪都能看得很远

什么时候应该使用“静态类”而不使用单例?

经常我们都会使用单例,而有时候我们又会贪图方便而使用一个类然后全部都使用静态方法。那么,到底什么时候我们才应该使用这种都是静态方法的类呢(注:java没有静态类)?

  1. 所有方法都是一些工具类的方法,如Math
  2. 不希望被gc回收又不想自己去处理实例。
  3. 很确定这个类将来也不会是有状态的(stateful)而且你确定你不需要多个实例。

注:

如果我们使用单例模式的话,将来假如我们需要多个实例,将非常轻松的改变,但是使用static方法的类就不行。而且使用单例的话,将很好地利用继承、多态等方法。

stackoverflow相关讨论:

为什么java8引进了Lambda表达式

我们借用官方文档的例子:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#approach1

看看Lambda 怎么样让我们的代码更具有可读性,而且更为简洁。

我们假如需要输出一个人的信息,我们可能有以下的类

public static void printPersons(
    List<Person> roster, CheckPerson tester) {
    for (Person p : roster) {
        if (tester.test(p)) {
            p.printPerson();
        }
    }
} 



interface CheckPerson {//接口,用于对于Person对象的验证
    boolean test(Person p);
}



class CheckPersonEligibleForSelectiveService implements CheckPerson {具体的CheckPerson实现 
    public boolean test(Person p) {
        return p.gender == Person.Sex.MALE &&
            p.getAge() >= 18 &&
            p.getAge() <= 25;
    }
}

然后当我们调用的时候,我们会写:

printPersons(roster, new CheckPersonEligibleForSelectiveService());

显然,Person的确是一个重要的对象,但是CheckPersonCheckPersonEligibleForSelectiveService呢? 是不是一定需要一个新建一个对象来只调用一次他的方法?其实,我们只是需要这样做(面向对象中,必须要有一个类,然后新建他的实例(非静态的话),才能调用他的方法),所以才这样做。

那假如封装的只是一个函数,然后我们可以简单的传递这样一个函数就能做到这些的话,是不是就很好了呢?这样的话,我们就不需要又创建一个实现类,又自己说动新建一个对象来仅仅只是调用一个函数了。

这时候,我们就需要Lambda了。

printPersons(
    roster,
    (Person p) -> p.getGender() == Person.Sex.MALE
        && p.getAge() >= 18
        && p.getAge() <= 25
);

这样的代码极为的简洁而且具有可读性。而且,我们不需要手动去新建一个CheckPersonEligibleForSelectiveService实现类,而且也不需要手动去新建这样的对象,lambda都帮我们做好了。

当然,我们原本也可以使用匿名类去解决这个问题

printPersons(
    roster,
    new CheckPerson() {
        public boolean test(Person p) {
            return p.getGender() == Person.Sex.MALE
                && p.getAge() >= 18
                && p.getAge() <= 25;
        }
    }
);

但,我们问问自己,我们真的有必要创建一个对象就仅仅为了去做Person验证吗?这样非常的反直觉。

如果我们需要的仅仅是一个函数而不是一整个对象,那么我们就应该关注在这个函数本身,而不是为了这个函数而衍生出一个类,一个对象。

更多本问题讨论请参考:http://stackoverflow.com/questions/23097484/why-lamda-expression-are-introduced-in-java8

Cookie 与 Session的区别

我们有时候会对于cookiesession糊涂,因为总的来说,他们都是保存用户信息的,而有时候我们在浏览器中选择“delete cookies”的时候,为什么session就没了呢?感觉这两个东西是不是一样的?

其实不是。

session是服务端的文件用于存储用户信息,而cookie是存储用户信息的客户端文件。

cookie是一个短的字符串,用于在客户端和服务端来回发送。我们可以保存类似于name=bob&password=asdf在cookie然后在两端来回发送。 这样做就像,去银行办业务,而银行的业务员极为健忘,然后他需要我们每次进行交易的时候都出示身份。当然,如果我们用cookie取存储这种敏感的信息的话是极为不安全的,而且cookie本身也有大小的限制。

那么,如果这个业务员意识到了自己的健忘病,他可以在纸上记下你的相关信息然后递给你一个号码,然后以后你再办业务的时候你就可以简单的说 “我是12号客户”,这样就不需要每次都出示身份证啊,银行个人账号去标识自己了。

对应着在Web服务器,服务器会记录相关的信息在一个session对象,然后创建一个session ID然后发送给客户端保存在cookie中。当客户端发送这个cookie回来的时候,服务端就能简单的用session ID去查找session对象。

所以,如果我们删除了cookie(如在浏览器中清空历史记录),这个session就丢失了。

还有一种方法是,用URL来交换session id,例如有一个link www.myserver.com/myApp.jsp, 然后我们可以重写每一个url让他成为类似于www.myserver.com/myApp.jsp?sessionID=asdf 甚至even www.myserver.com/asdf/myApp.jsp 用于标识session id

更多解析,可参考stackoverflow: Differences between cookies and sessions?

Windows7上配置和使用Octopress

本文翻译自: setup octopress on windows 7


准备工作:

  1. 安装Git
  2. 安装ruby,例如:Ruby 1.9.3-p194,并配置环境变量PATH 到rubyhome/bin
  3. 安装 Development Kit.如 use DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe and 解压到文件夹 C:/RubyDevKit.
  4. 建立一个文件夹,例如在C:/github

配置Octopress:

cd c:/github
git clone git://github.com/imathis/octopress.git octopress #clone一个仓库,此处替换 octopress 成为 username.github.io
cd octopress #进入clone出来的项目
ruby --version # 应该会报出ruby 版本如 Ruby 1.9.3

然后进行相关初始化:

cd C:/RubyDevKit
ruby dk.rb init
ruby dk.rb install

安装依赖:

cd c:/github/octopress #replace octopress with username.github.io
gem install bundler//若出现https连接不上,到home目录下找.gemrc文件,然后在source修改https为http
bundle install   //若需要代理,提前设置相关环境变量:export http_proxy=http://user:password@host:port。若https连接不上,到GemFile中的source的https修改为http

安装默认的OctoPress 主题:

rake install

建立Github的仓库

命名为:你的名字.github.io

部署

rake setup_github_pages

这样做的结果是:

  1. 询问你的Github Pages 的仓库URL。
  2. 从origin重命名指向imathis/octopress 的remote 到octopress
  3. 增加你的Github pages 的仓库为默认的 origin remote
  4. 当前branch 从master 转换到source
  5. 配置你的博客url
  6. 在_deploy文件下下配置一个master 分支用于开发

发布:

rake generate
rake deploy

这样就会生成你的博客,复制生成的文件到_deploy/下,并增加到git,commit 和push到master分支。

最后,commit源文件

git add .
git commit -m '提交信息'
git push origin source

现在,访问你的用户名.github.io就可以访问你的博客了。(第一次可能会延迟十几分钟)


新增博文

rake new_post["title"]

这里会生成一个markdown文件到source/_posts下

修改此markdown文件,再次发布,即可看到新的博文。


有关markdown的语法和使用请参看http://wowubuntu.com/markdown/basic.html

更多octopress命令是查看:http://octopress.org/docs/blogging/