Vi 寄存器操作,及使用系统剪贴板

使用 Vi 不得不提它强大的寄存器功能,一般操作系统只支持单例的剪贴板操作,而 Vi 借助于寄存器,相当于有几十个剪贴板可以使用。Vi 中针对内容的操作会记入到寄存器中,包括复制,粘贴,删除,以及只读的寄存器和与系统剪贴板交换内容的寄存器。本文最初目的是怎么与系统剪贴板交换内容。

在 Vi 中使用 :reg (:registers 或 :dis/:display) 命令显示寄存器中的内容

vi-registers

主要寄存器

阅读全文 >>

Vi Buffer 的基本操作

在 vi 中打开过多个文件时,每个文件都是存放在各自的 buffer  中,可以用命令 ls (buffers 或 files,三个命令中拣你最喜欢的一个即可,ls 输入方便,buffers/files 更表意) 显示所有的 buffer。显示出来的结果如下:

vi-list-buffers

可以看到

每个 Buffer  的编号,分别是 1, 4, 5, 6
% 表示的是当前窗口中的 Buffer
+ 表该 Buffer  中的内容有修改
Buffer 中的文件名称 阅读全文 >>

Scala 函数式编程学习视频 -- 条件和值定义

Scala 的 if 和 Java 中的用法差不多,但它在 Scala 是个表达式而不仅是条语句,它是有返回值,这让我们用起来很方便。在 Java 中我们一般先声明一个变量,在 if 语句中不同条件下赋不同的值。Scala 中就一条赋值表达式

val a = if (x == 5) 100 else if(x == 10) 200 else 300

val 关键字是用来定义值的,value 的缩写,就是 Java 中的常量 public static final

这里也同样涉及到了 call-by-name, call-by-value,到 Scala 控制台下试下

scala> val a = (1 to 1000000000).foldLeft(0){(a,b)=>a+b} //定义时就要算出 foldLeft 的值,所以需要耗费些时间
a: Int = -243309312

scala> def b = (1 to 1000000000).foldLeft(0){(a,b)=>a+b} //定义时很快,每次使用 b 时计算,其实就是定义一个方法,应该好理解
b: Int

阅读全文 >>

Scala 函数式编程学习视频 -- 求值策略和终止

本视频继续讲了 CBN(Call By Name) 和 CBV(Call By Value),它们就是一种求值策略。一般的 Scala 是采用 call-by-value,当函数的参数是使用的 => 来声明参数,就是 call-by-name, => 是 Lambda 用的符号,y 有点像是个函数参数。=> 就是告诉这个参数会采用 call-by-name。看个例子:

def constOne(x: Int, y: => Int) =1 //函数返回一个常数,x, y 分别是 CBV, CBN
constOne(23, (1 to 1000000000).foldLeft(0){(a,b)=>a+b}) //CBN, 把 foldLeft 表达式传给 constOne,希望在 constOne 中计算,所以很快
constOne((1 to 1000000000).foldLeft(0){(a,b)=>a+b}, 23) //CBV, 计算出 foldLeft 后值传给 constOne,所以很慢

上面的 constOne(x: Int, y: => Int) = 1 用 scalac 编译后再 javap -c 反编译看到的是:

public int constOne(int, scala.Function0<java.lang.Object>);
Code:
0: iconst_1
1: ireturn

阅读全文 >>

Java 解析 XML 时如何屏蔽掉 “[Fatal Error]” 的输出

我们在用 Java 解析 XML,当文档不是一个合法的 XML 时,可能会收到 [Fatal Error] 的控制台输出,即使把整个代码都 catch 住,仍然不能抑制住 [Fatal Error] 的信息输出。比如常见到这样的输出:

[Fatal Error] :1:1: Content is not allowed in prolog.

为什么不能禁掉它呢,本来 catch 了异常对程序已经有了很好的保护,想眼不见心不烦,但还是避之不及。

因为,因为这个 XML 解析器用 System.error.print() 输出来了,当然你可以用 System.setErr(PrintStream) 重定向掉错误输出,但不现实,波及面太大。我们需要找到源头,首先交代解决方案就是覆盖掉默认的 ErrorHandler。

看下这段 XML 解析代码: 阅读全文 >>

Scala 函数式编程学习视频 -- 编程元素

进到 Scala 的 REPL (Read-Eval-Print-Loop) 有两种方式,scala 或 sbt console。函数式的任务就是求值(reduction steps),Scala 把表达式和方法进行了统一,Scala 的变量和函数也应作一致性思考。Substitution Model, no side effects, λ-calculus -> immutable。 Call-by-name vs call-by-value ,是调用者还是被调用者来对参数求值的问题。val 定义值时,会做 call-by-value 操作,def 则会做 call-by-name 操作,或者可以说是静态与动态求值。

Scala Call-By-Name vs Call-By-Value

要指定函数参数 y 以 Call-By-Name 传递,要这么定义 def test(x: Int, y: => Int) = x * x,这样就避免了 test(3, 2*4) 调用时 2*4 被求值,这里把 y 转换成了函数参数 y: => Int

阅读全文 >>

Scala 函数式编程学习视频 -- 编程范式

开始真正进入 Scala 编程的世界。

范式是一个比较抽象的概念,可以理解规范和模式,此视频让我们了解编程语言范式分类。我们原来接触过指令式,过程式及一直广泛应用的面向对象式编程,面向方面不算数。Scala 让我们进入到了函数式编程,不像 Haskell, Scala 把面向对象与函数式编程很多的连接了起来。进到 Scala 的世界,一定要时常性的用函数式编程思维武装自己的头脑,并且在多核的时代尽可能的 Immutable

有狭义和广义函数式编程语言之分,狭义函数式没有变量,没有赋值操作,没有循环等指令式控制结构--代表用 Pure List, XSLT 等;广义函数式更宽松,尽量用 immutable, 函数是第一等公民,像 Scala, Clojure 等。

阅读全文 >>

Scala 函数式编程学习视频 -- 总目

Coursera 上的 Functional Programming Principle in Scala 视频教程,合成了英文字幕,应该没有多大必要性翻译成中文字幕,本人觉得大家的英语都比我强,因为它是我永久的,历史的伤口。

该课程共有七周的课时,算下来每天十至二十多分钟的时间。

开始教程

第一周:函数和求值 阅读全文 >>

Scala 函数式编程学习视频 -- 指导: 编程作业

基本上每个阶段过后都有一个不小的练习,本视频告诉我们怎么下载练习并导入到 Scala IDE,可在 SBT 下提交代码,不在 Cousera 上学习的话,也没法提交。可以从这里把那几个练习下载过来试试身手。

有兴趣的同学可以从下面的链接下载红练习项目:

example   recfun   funsets  objsets   patmat  forcomp  streams

阅读全文 >>