天地一沙鸥

Just For Fun

本月的3号,苹果的WWDC 2014开始了,当时我还苦逼地在火车上摇啊摇,用时断时续的3G信号马马虎虎地了解了新发布的Yosemite的新特性之后心中一阵激动。等到好不容易终于摇到家里,顾不上休息,打开电脑就开始升级,一切顺利,除了在最后显示1 minute remaining那里实际停留了一个多小时之外,重启,顺利进入新系统。哇,界面给人的感觉还是很舒服的,哇,居然有毛玻璃效果了,哇……等等,怎么bartender弹出对话框说,对不起,它歇菜了,因为调用了私有的API,在Yosemite中挂掉了;启动CleanMyMac 2,这货吭都没吭,直接崩溃了;打开iBooks,点击搜索,崩溃了……虽然有这样那样的问题,但是Yosemite和iOS 8的整合还是让我舍不得放弃,还是继续坚持使用,倒也没什么其它大问题,直到第二天我到了办公室很愉快地打开电脑准备工作的时候悲剧了:系统启动到登录界面之后,苹果那可爱的彩球就一直飘啊飘,在google上翻了一阵也没见有什么有用的信息,只好又重新装回Mavericks,用的覆盖安装的方式,结果各种小问题,比Yosemite还不稳定,只好将盘格掉全新安装。然后几天后,在v2ex上看到了解决登录界面卡住问题的帖子,真是欲哭无泪啊,怎么不早点贴出来呢……

阅读全文 »

一年一度的WWDC开始了,除了虽然没有亮瞎我的双眼但也很吸引我的OS X Yosemite(iCloud Drive是我期待很久的功能了)以及iOS 8之外,最让人感兴趣的当然就是苹果新推出的Swift语言了。由于还没有看WWDC 2014的Keynote,于是我先在网上搜索了一下关于Swift的一些评价,结果和任何一种新事物一样,网上对它的评价褒贬不一,有人认为它是很棒的Objective-C的替代者,也有人认为它是一个脆弱的玩具语言,压根儿就不是用来干正事的。看来从这些口水仗里看不出什么东西来了,还是自己动手,亲自实践一下吧。

阅读全文 »

在进行Grails的开发时,我们经常需要查看GORM所产生的sql语句,需要在Datasource.groovy文件中加入下列配置:

1
2
3
4
5
dataSource {
...
logSql = true
...
}
为了让输出的sql语句清晰好读,还可以进行进一步配置,即在Datasource.groovy中加入:
1
2
3
4
5
hibernate {
...
format_sql = true
use_sql_comments = true
}
但是有的时候我们不仅需要查看生成的sql语句,还需要查看在执行sql语句时实际传入的参数,这时需要在Config.groovy文件中加入下列配置信息:
1
2
3
4
log4j = {
debug "org.hibernate.SQL"
trace "org.hibernate.type.descriptor.sql.BasicBinder"
}
经过以上这些配置后就能很方便的查看生成的sql语句及其参数了。

参考资料

  1. 《Grails in Action, 2nd Edition》

在继承一个第三方的实体类时出现这样一个问题,所继承的类已经定义了一个用作标识符的字段,类型为String,名字也叫做id:

1
2
3
4
5
6
7
8
class Parent {
...
String id
...
}

class Child extends Parent {
}
结果在对Child类进行持久化操作时就会出现Grails自动产生的id会覆盖掉父类定义的id字段,因此需要重新定义Child类的标识符:
1
2
3
4
5
class Child extends Parent {
static mapping = {
id generator: 'assigned', name: 'id'
}
}

参考资料

  1. Grails / GORM: Changing default id name and type from an entity

我其实不是一个博客系统的重度用户,写博客的频率并不高,在先先后后注册的若干个博客里面都躺着我开个了头然后就没有了结尾的帖子。但是,我也确实越来越觉得坚持写博客是一件好事, 是一个忠实记录自己的心路历程的过程,也是让自己飘忽的思想能够有一个落脚点的地方,于是又兴起了开一个新博客的念头,原打算花点钱买个wordpress空间折腾一下,念及自己去年 的失败经历,花了钱却总共没写到十篇博客,今年也不敢保证,所以虽然钱不多却也不想浪费了,还是决定找个免费空间来用,但是这个免费空间一定要稳定、可靠。转了一圈也没发现满意 的,正准备放弃时,看到了基于GitHubJekyll搭建博客的文章,正好满足自己的需求,经过一番折腾,算是将基本框架 搭建起来了,下面就是我的折腾日记,也算作开篇吧。

整个折腾过程大致可以分为以下几个部分:

  • 搭建基本环境
  • 绑定域名
  • 使用reStructuredText

本篇博客主要讲的就是基本环境的搭建,不过需要说明的是,因为我使用的是Mac OS的系统,所以全部的步骤都是按Mac OS的情况来进行的。

  1. 基本运行环境

    由于GitHub Pages事实上是用Jekyll来生成的静态页面,所以我们在写博客时要遵守其规则,而为了测试是否确实符合,我们需要在自己的机器上按照Jekyll,而Jekyll实际上使用Ruby 写的一个工具,因此还需要Ruby运行环境;又由于事实上整个博客就是一个Git仓库,所以还需要安装Git。 如果安装了Homebrew的话就很好办了:

    $ brew install ruby
    
    $ sudo gem install jekyll
    
    $ brew install git
  2. 注册GitHub账号

    前往GitHub,用自己喜欢的用户名注册一个账号,要注意的是,如果打算绑定到自己的域名上,那么注册的用户名要和打算绑定的域名一致才行。这步很简单, 只要看得懂基本的英文就没问题了。

  3. 安装Jekyll-Bootstrap

    $ git clone https://github.com/plusjade/jekyll-bootstrap.git USERNAME.github.com
    
    $ cd USERNAME.github.com
    
    $ git remote set-url origin git@github.com:USERNAME/USERNAME.github.com.git
    
    $ git push origin master

    这里的USERNAME就是你在GitHub上所注册的用户名。这一步其实不是必需的,你完全可以按照这里的说明从零开始,但是使用Jekyll-Bootstrap的话可以让你的博客有一个不错的初始模板,再在这个基础上根据自己的需要进行修改就方便多了。完成之后, 最多等个10分钟左右,访问USERNAME.github.com,应该就可以看到搭建好的博客首页了。

参考文档

前几天将最新的jdee下载了下来,配置进Emacs后启动就报错,使用–debug-init启动后看到错误信息说是”Wrong number of arguments”,再看看出错的位置,是在jde-bug.el的buffer position 61164,于是用M-x goto-char 61164去到出错的地方,发现是说传给semantic-add-minor-mode这个函数的参数个数不对,看看它的定义,应该是是接受两个参数,但是在调用时却实际传递了三个参数。怎么改呢?看看函数说明,把传递的三个参数的第一个去掉,看起来只是一个quote而已,应该没什么问题,再把第三个参数放在第一的位置上,保存,重新启动,Emacs又在启动时报了jde-jdb.el和jde-plugins.el两个文件中的类似错误,依样修改之后就能正常启动了。不过在状态栏上显示有jdbinvalid的字样,可能还有点什么问题,等碰到了再修改吧,至少现在能够跑起来了,呵呵。

更新:刚才google了一下 semantic-add-minor-mode这个函数,发现在Emacs 23中它确实是接受三个参数,第三个参数是可选的。还找到一个针对这个问题的 patch,解决方案和我是一样的,只是它将三个文件中相应的调用的第三个参数直接去掉了,唔,应该更正确一些吧,因为事实上第三个参数是可选的,要不要问题都不大。这样更改之后,果然上面提到的问题也消失了:-)

Clojure的基本理念

原文地址 客户和相关人员都对诸如JVM这样的行业标准平台的性能、安全性以及稳定性进行了大量投资,并且对其感到满意。虽然Java开发者可能会对动态语言的简洁、灵活性及生产力感到嫉妒,但是他们要考虑在客户允许的基础结构上运行、访问已有的代码库以及性能等方面的问题。除此之外,他们还要面对使用原生线程和加锁处理并发时所持续不断出现的问题。Clojure就是在这样一种背景下所做出的实用动态语言设计的努力。它致力于成为一种Java所适用的那些领域中的通用语言。它反映出这样一个现实,对于将来的并发编程来说,现在普遍存在的、不受约束的状态变化必然会消失。

Clojure通过以下几点来达到它的目的:

  • 拥抱行业标准的开放平台——JVM
  • 对一门值得尊敬的语言——Lisp进行现代化改造
  • 通过不变的持久化数据结构来促进函数式编程
  • 通过软件事务内存和异步代理提供内建的并发支持

我们最终得到的是一门健壮、实用而快速的语言。

Clojure对于状态和同一性采取了一种与众不同的方式。

为什么会有Clojure?

我为什么还要再编写一门程序语言?大体而言,因为我想要:

  • 一种Lisp
  • 函数式编程
  • 与已稳固建立的平台共生
  • 为并发而设计

但是我却没有找到这样一种语言。下面是对Clojure背后的一些动机的概述:

Lisp是个好东西

  • 经常被模仿/洗劫,但是仍未被复制
  • Lambda演算产生出一个非常小的核心
  • 几乎没有语法
  • 核心优势仍然是代码即数据以及语法抽象
  • 标准的Lisp(Common Lisp和Scheme)的状况
    • 标准化之后缓慢/没有革新
    • 核心的数据结构是可变的,并且不可扩展
    • 规范中没有涉及到并发
    • JVM上已经有了良好的实现(ABCL,Kawa,SISC等)
    • 标准的Lisp自身即是一个平台
  • Clojure是一种没有向后兼容性约束的Lisp
    • 将“代码即数据”的范式推广到了map和vector
    • 默认数据是不可改变的
    • 核心的数据结构是可扩展的抽象
    • 拥抱平台(JVM)

函数式编程是个好东西

  • 数据不可变+函数为一等“公民”
  • 总是能够根据行规/惯例用Lisp完成
    • 但是如果数据结构是可变的,那么假设数据不会被改变是很危险的事情
    • 在传统的Lisp中,只有list数据结构在结构上才是可递归的
  • 纯粹的函数式语言总是倾向于强静态类型
    • 并非对每个人、每个任务都合适
  • Clojure是一种强调动态性的函数式语言
    • 所有的数据都不可变&可持久化,且支持递归
    • 不同类型的集合、返回类型
    • 动态的多态

语言和平台

  • 虚拟机,而不是操作系统,才是未来的平台,它提供了:
    • 类型系统
      • 动态执行和安全性
      • 抽象了OS
      • 大量的工具
      • 内建和第三方
    • 内存及其它资源管理
      • GC是一个平台,而不是语言、工具
    • 字节码+JIT编译
      • 硬件抽象
  • 语言即平台 vs 语言+平台
    • 老的方式——每种语言定义自己的运行时
      • GC、字节码、类型系统、库等
    • 新的方式(JVM,.NET)
      • 独立于语言的通用运行时
  • 为平台构建的语言 vs 移植到平台的语言
    • 许多新的语言仍然采用“语言即平台”的方式
    • 移植时存在着平台到平台的问题
      • 内存管理、类型系统、线程问题
      • 重复的库
      • 如果原来的语言基于C的话,一些用C写的扩展库并未移植过来
  • 平台是由客户指定的
    • 必须运行在JVM或.NET上 vs 必须运行在Unix或Windows上
    • JVM已经建立了追踪记录和信任级别
      • 现在也已经开源了
    • 需要和其它代码交互
      • 现在光有C的连接是不够的
  • Java/JVM是语言+平台
    • JVM
    • Java单调乏味,表达力也不够
      • 函数不是一等公民,缺乏类型推断等
    • 调用/使用Java的能力至关重要
  • Clojure是语言,JVM是平台

OO被高估了

  • 起源于模仿,如今用在每个地方,即使并不合适也在用
    • 由于Java/C#缺乏对其它功能的(惯用的)支持,因此OO受到了它们的鼓励
  • 状态可变的对象成了新的意大利面条式代码
    • 难于理解、测试和推理
    • 并发灾难
  • 继承不是实现多态的唯一方式
  • “让100个函数操作一个数据结构要比让10个函数操作10个数据结构好“——Alan J. Perlis
  • Clojure将数据结构建模为由接口表示的不可变对象,不另外提供自己的类系统
  • 在少数几个主要数据结构(seq、map、vector和set)上定义了许多函数
  • 使用Java编写Java,从Clojure使用和扩展Java

多态是个好东西

  • Switch语句、结构匹配等导致脆弱的系统
  • 多态可以带来灵活的、可扩展的系统
  • Clojure的多方法机制将多态与OO和类型分离开来
    • 支持多种分类方法
    • 通过静态、动态、外部属性、元数据等方式进行派发

并发及多核未来

  • 不变性让许多问题都消失了
    • 在线程间自由共享
  • 对于模拟和程序与外部世界之间的代理来说,状态改变是一个现实
  • 上锁(locking)非常困难,不可能每次都能正确实现
  • Clojure的软件事务内存(software transaction memory)和代理系统(agent system)解决了困难的地方

简而言之,我认为Clojure作为JVM上一种对并发有很强支持的、能够实际运行的Lisp占据了一个独特的位置。看看Clojure的一些特点或者开始使用Clojure

作为我第一个正儿八经的博客上的第一篇帖子,起个什么样的标题首先就让我纠结了一阵,想了一想,刚好碰上2012年的开始,自己对过去的一年有不少的感触,对新的一年也有不少想法和期许,而且按照自己过去的习惯,应该写一篇年终总结和来年的计划的,于是就写下了这样一个标题,这篇博客也就当做年终总结和来年计划来写了。

回首2011年,杂七杂八的事情还真不少,工作上的,生活上的,简而言之有这么几项吧:

首先是自己负责主持的一个省级项目终于算是告一段落了,虽然过程磕磕绊绊,不是太尽如人意,但是就结果而言还是达到了预期的目的,没有出现自己所担心的全盘崩溃的情况;另外自己在项目管理和软件工程方面的经验也得到了进一步的锻炼和提升,也算是不小的收获。顺便说一句,像项目管理和软件工程这种东西个人觉得事实上是和实践结合非常紧密的东西,非自己操刀上阵演练一番难得有切身体会,光看书本的话是足以让人昏昏欲睡,敬而远之的;

其次是理顺了管理上的一些东西,我所负责的部分的运作情况比原来应该说又顺畅了许多,自己也在这个过程中积累了一些管理的经验,虽然耽误了自己一些钻研技术的时间,但是我认为还是值得的。我始终认为,技术是为了人的实际需求而存在的,因此技术要发挥最好的功效,必然涉及到与人的互动和组织,而这正是许多技术人员存在的问题,与机器打交道轻车路熟、扮演着上帝一样的角色,但是在与人打交道时就如机器一样木讷了,不能将自己的观点和想法有效地传达给别人,从而使自己能够发挥的作用大打折扣,可能许多技术人员大有怀才不遇之感也是因为这个原因吧。

另外人手紧张的问题终于得到了暂时缓解,让我在安排事情上不再那么捉襟见肘,能够比较有效从容应对了。这样产生的一个好的结果是我终于能腾出一些时间来做一些乱七八糟的设想和计划,并有资源(包括人的和物的)来调配安排来开展这些想法。

最后,对于我来说生活中最重要的一件事情就是女儿满了三岁了。带儿方知父母恩啊,这一年被小家伙也折腾得够呛,但是却也心甘情愿,充满了欢喜和满足感,深深体会到了为人父母的辛苦和欢欣。当然,在这一年的与小家伙的斗争中,老婆大人是发挥了不可替代的、中流砥柱的作用,我在这里也向她深表感谢,抛以媚眼无数:-)。 唠叨完过去,就该放眼将来了。本年度主要要完成这么几件事情:

养成良好的时间管理习惯。现在乱七八糟的事情太多,自己的想法也太多,不有效组织的话自己是没有办法来完成自己想要做的事情的。这方面主要以《Getting Thinkgs Done》、《One Year to an Organized Life》和《One Year to an Organized Work Life》为指导,辅以工具软件(OmniFocus,iPad版和iPhone版的,都是狠了心把牙咬碎了才买下来的,几百RMB啊)的支持;

把计算机的一些基础知识过一遍。主要是自己想做做数据分析及其相关方面的一些研究和开发,在过去一年的折腾过程中深感操作系统、算法、编译原理这些基础知识的重要性和不可或缺性;还有就是将统计概率方面的知识也好好梳理一下,现在是越来越觉得这两样东西的重要和有趣了,只是可惜当初大学里老师的授课,真是让人泪奔啊!

看看育儿方面的一些书籍,《Pink Brain, Blue Brain》和《What’s going on in there》两本书都不错,是从刘未鹏的博客上发现的,已多多少少翻了一些了,有空写几篇读书心得。

还有,呃,《资治通鉴》也要读几册吧,买回来这么久还只把第一册读了一些,实在惭愧,读的进度和我最近买回来的《廿二史札记》的读书进度差不多,有罪啊有罪,一定要把功课补上。 零零碎碎写了这么多,其实还有一些计划,但是自己也还没想好,就先这样吧,我这个人写博客一向都很懒的,写一点就想完事了,看看我原来的博客的草稿箱里那可怜的十多篇草稿啊,最早的都是09年的了,还在那里睡大觉,有空还是把它们整理出来放在这里吧。对了,今年还要做的一件重要的事情就是一定要坚持写博客,把自己的所想所感记下来,善哉善哉!

0%