Chris's Blog

Keep Walking......

基于Spring Mobile开发移动Web应用

最近在开发FX Trading的Dashboard的时候,发现用到的一些Bootstrap的样式在手机上的显示效果很不好,而且每笔trade包含的信息也比较多,用手机看实在是不方便,于是就萌生了做一版针对mobile的想法。

Spring Mobile还在1.0的beta版的时候就有了解过,但当时的版本还比较简陋,有些功能都不够完整,其实现在也都比较简单,总共也没多少代码,不过也足以解决mobile相关的一些问题了。Spring Mobile是基于Spring MVC的,如果你的项目本身使用的就是Spring MVC,那基本没多少额外的工作量。我们的项目就是基于Spring MVC的,现在也只是想增加针对mobile的展示,所以controller都可以重用,只需做一些针对mobile的页面就可以了。

Spring Mobile实现的功能主要包括以下四块,也都是配置一下就可以使用了,所以你只需要专注于页面的展示。

Device Resolution

访问设备的识别,默认采用LiteDeviceResolver作为实现,通过分析HTTP Header来进行识别,如User-Agent,Accept等。

若是一些特殊的User-Agent被识别成了mobile,可以将这些特殊的User-Agent的关键字定义为一个List,作为LiteDeviceResolver的构造函数的参数,这些User-Agent将会被作为PC来处理。

每个request被处理之前,将会先识别设备类型Device,然后保存在request的currentDevice参数中。

Go语言基础

Go语言常被拿来和C与Python进行比较,Go语言在语法上确实和C与Python有很多的相似性,不过这两种语言我都不太擅长,C语言仅局限在大学的课本上,Python倒是之前用来写过一些安装脚本。总之,我是不够资格去评论Go与这两种语言的差别了,在学习的过程中,倒是会与Java做些比较,其实多少也有些相似性。

package

package <pkgName> 定义当前文件属于哪个包。

包名如果是main,则表明它是一个可独立运行的包,它在编译后会产生可执行文件。除了main包之外,其它的包最后都会生成*.a文件(也就是包文件),并放置在$GOPATH/pkg/$GOOS_$GOARCH中(以Mac为例就是$GOPATH/pkg/darwin_amd64)。

每一个可独立运行的Go程序,必定包含一个package main,在这个main包中必定包含一个入口函数main,main函数既没有参数,也没有返回值。

包名和包所在的文件夹名可以是不同的,<pkgName> 即为通过 package <pkgName> 声明的包名,而非文件夹名。

Postgresql常用命令

Postgresql提供了很多快捷的命令,可以很方便的在命令行中使用。以\开头的命令需要进入psql执行。

数据库管理

创建用户

CREATE USER chris WITH CREATEDB ENCRYPTED PASSWORD '123456';

更改用户

ALTER USER chris WITH ENCRYPTED PASSWORD 'chris123';

列出所有的Roles

SELECT rolname FROM pg_roles;

or

\du 

创建Database

CREATE DATABASE dbname;

or

createdb dbname

Grant Right

GRANT ALL PRIVILEGES ON DATABASE mydb to chris;

创建Database并指定Role

CREATE DATABASE dbname OWNER rolename;

or

createdb -O rolename dbname

删除Database

DROP DATABASE name;

or

dropdb dbname

列出所有的Databases

SELECT datname FROM pg_database;

or

\l

切换Database

\c dbname

列出所有的Tablespaces

SELECT spcname FROM pg_tablespace;

or

\db

列出当前Database的所有Tables

\dt

查看Table

\d tablename

列出当前Database的所有Functions

\df

Getting Start With GoLang

Go语言以简单、并行、高效等优点已推出了好几年,但真正影响到很多人去关注的,应该是在最近一年,Go被成功运用到云计算等领域,也出现了越来越多的拥护者。最近因为工作的需要,也开始关注一些并行计算方面的东西,并行作为Go的一大卖点,自然要去了解一下。

我在Mac下先用HomeBrew安装了Go,不过发现安装出来的包不够全,没有godoc,其它还少了什么东西就没去仔细看了,然后还是从官方下载tar包来用。

安装完之后,除了将bin目录加入到path中,还要设置更重要的一个环境变量GOPATH。完成之后就可以开始体验Go了。

GOPATH

GOPATH为工作目录,也就是我们写Go程序的workspace。

按照约定,通常有以下三个子目录:

src:存放源代码(比如:.go等)
pkg:编译后生成的文件(比如:.a)
bin:编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中)

PostgreSQL Installation on MAC

  1. Use MacPorts install PostgreSQL server

     sudo port install postgresql93-server
    
  2. Create Database Instance

     sudo mkdir -p /opt/local/var/db/postgresql93/defaultdb  
     sudo chown postgres:postgres /opt/local/var/db/postgresql93/defaultdb  
     sudo su postgres -c '/opt/local/lib/postgresql93/bin/initdb -D /opt/local/var/db/postgresql93/defaultdb'  
     sudo mkdir -p /opt/local/var/log/postgresql  
     sudo chown postgres:postgres /opt/local/var/log/postgresql  
    
  3. Start Database Server

     sudo su postgres -c '/opt/local/lib/postgresql93/bin/postgres -D /opt/local/var/db/postgresql93/defaultdb'  
    

    or

     sudo su postgres -c '/opt/local/lib/postgresql93/bin/pg_ctl -D /opt/local/var/db/postgresql93/defaultdb -l /opt/local/var/log/postgresql/postgres.log start'
    
  4. Set PATH environment variable

     export PATH=/opt/local/lib/postgresql93/bin:$PATH
    

    Make sure you set the PostgreSQL path before /usr/bin to ensure that you are using the latest versions and not the default Apple provided, otherwise will encounter error when execute operation.

  5. Create User

     createuser --superuser Chris -U postgres
    
  6. Create Database

     createdb mydb
    

    If below error encountered, that caused by you use old version PostgreSQL which provide by Apple, change PATH environment variable to solve.

      createdb: could not connect to database postgres: could not connect to server: No such file or directory   
         Is the server running locally and accepting
         connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?
    
  7. Accessing Database

     psql mydb
    

    mydb=# means you are a database superuser, otherwise display mydb=>.

  8. Exit psql

     mydb=> \q
    
  9. Shutdown Database Server

     sudo su postgres -c 'pg_ctl -D /opt/local/var/db/postgresql93/defaultdb -l /opt/local/var/log/postgresql/postgres.log stop'
    

Scala学习笔记

断断续续总算是读完了《Scala程序设计 - Java虚拟机多核编程实战》,习惯了Java中规中矩的语言规范,面对这种灵活的语法,着实有点不知所措,之前学习Python的时候,也有过类似的感受,不过这次学习Scala的感觉更强烈点。这本薄薄的不到两百页的书,硬是让我看了个把月,但也总算是对Scala有了初步的认识。对于这本书,只能算是入门书籍,很多东西都只是提到,但讲的不够详细。下面是学习过程中记下来的一些笔记,之后再对一些重要语法详细了解吧。

val vs. var

用val定义的变量是不可变的,用var定义的变量是可变的。在Scala中应尽量使用val以提升不变性。

遍历

RichInt中的两个方法to和until都返回一个Range的实例。
to() 产生的范围包含了上界和下界。

i <- 1 to 3

until() 产生的范围排除上界。

i <- 1 until 3

foreach()属于Range类,以一个函数值作为参数。

(1 to 3).foreach(i => print(i))

<- 左边为定义的val变量,右边为生成器表达式。
=> 左边为参数列表,右边为实现。

The Redis Introduction

Redis是REmote DIctionary Server的缩写,它采用了单请求处理线程的架构,避免了管理并发的复杂问题,也简化了实现,但同时也带来CPU的瓶颈,当单线程被阻塞时整个Redis都会停止响应。

Redis Key

Key不能太长,推荐的格式为:<object type>:<id>:<field>,用“:”分隔域,用“.”作为单词间的连接。

KEYS命令可返回匹配指定模式的key,模式支持通配符,具体可参考:http://redis.readthedocs.org/en/latest/key/keys.html

SORT命令可对集合按数字或字母顺序排序后返回或另存为list,还可以关联到外部key等。可参考:http://redis.readthedocs.org/en/latest/key/sort.html

Key超时操作常用的命令:EXPIREEXPIREATPERSISTTTL

其它关于Key的常用命令:EXISTSDELRANDOMKEYRENAMERENAMENXTYPE

Mac使用技巧

一些常用的Mac使用技巧,记下来以方便查阅。

文件管理

删除文件:command+delete

清空废纸篓(有确认):shift+command+delete

清空废纸篓(无确认):shift+option+command+delete

打开文件:command+o

全屏幕截图(图片默认存放在桌面):shift+command+3

鼠标选取截图(图片默认存放在桌面):shift+command+4

选取文本:用command+鼠标,可以选中不同位置的文本内容。 用option+鼠标,可以对文本进行块选。

粘贴纯文本:我们在网页或其他文档上复制文字的时候,会把文字格式一并复制下来,command+v会把文字格式都粘贴过去,如果我们只想粘贴纯文本,可以使用shift+option+command+v。

定位Spotlight搜索结果的文件夹:用Spotlight搜索的时候,搜到文件时,若需要打开该文件所在的文件夹,只需按住command键,点击文件即可打开Finder,并定位到该文件所在文件夹。

XML文件比较工具

最近公司的新产品准备上线,因为涉及到多个系统之间的集成,所以要做几轮的模拟测试,以保证系统间的稳定运行以及数据的准确性。对于其中一个Batch Job,我们需要生成多种XML给其它系统使用,这个Batch并不是全新的,在之前的版本就有,但是这次数据模型有变动,一些业务逻辑也有少许变动,但期望生成的数据是一样的,所以就需要比较两个版本的系统所生成的XML。

现在真是越来越不喜欢XML,超过30M的文件,基本就不可能用NotePad++打开了(与我的机器配置太差也有关系)。通常对于一些小的文件,还可以用Beyond Compare之类的比较工具,而我们Batch生成的XML文件可能会超过100M,那就不可能通过一些桌面软件去做比较了,而且数量太大,肉眼比较的准确性也不能保证。

Git常用命令

Git配置

/etc/gitconfig:系统中对所有用户都普遍适用的配置。若使用git config时用 –system 选项,读写的就是这个文件。
~/.gitconfig:用户目录下的配置文件只适用于该用户。若使用git config时用 –global选项,读写的就是这个文件。
.git/config:这里的配置仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/giconfig 中的同名变量。

文件状态

untracked:未加入版本控制管理的文件。
tracked:已纳入版本控制管理的文件。
unmodified:未做过修改,并且已经在版本控制管理中的文件。
modified:做过修改的受版本控制管理的文件。
staged:已放入暂存区的文件。untracked或者modified的文件,执行过git add后,就进入了暂存区。