shangsinian Time is limited, To be a better man

使用Python进行海洋科学研究

Python简介

Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。

Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议[1] 。 Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。

Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。

用Python做科学计算

随着NumPy, SciPy, Matplotlib, Enthought librarys等众多程序库的开发,Python越来越适合于做科学计算、绘制高质量的2D和3D图像。和科学计算领域最流行的商业软件Matlab相比,Python是一门通用的程序设计语言,比Matlab所采用的脚本语言的应用范围更广泛,有更多的程序库的支持。虽然Matlab中的许多高级功能和toolbox目前还是无法替代的,不过在日常的科研开发之中仍然有很多的工作是可以用Python代劳的。

Python与海洋科学

本文主要介绍一些海洋相关的Python模块,并在linux环境中进行正确配置。

1.安装Python基本环境和Python科学计算的相关模块

sudo apt-get install build-essential python-dev gfortran
sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose m4
sudo apt-get install python-mpltoolkits.basemap
sudo apt-get install python-pip

2.安装HDF5

文件格式是指计算机存储和处理数据的方式 。目前常用的图像文件格式很多, 如 GIF , JPG , PCX ,TIFF 等 。这些格式共同的缺点是结构太简单 ,不能存放除影像信息外其他的有用数据 ,像遥感影像的坐标值、参数等都无法在其中保存 ,而且用不同格式存储影像数据使得读取 、传输、共享变得复杂, 因此,有必要建立一种标准格式以解决上述问题。

HDF(Hierarchical Data File)是美国国家高级计算应用中心(National Center for Supercomputing Application,NCSA)为了满足各种领域研究需求而研制的一种能高效存储和分发科学数据的新型数据格式 。HDF可以表示出科学数据存储和分布的许多必要条件。

HDF 最初产生于 20 世纪 80 年代 , 到现在已经具有两个不同的产品。从 HDF1 到 HDF4 的各个版本在本质上是一致的 , 因而 HDF4 可以向后兼容早期的版本 。HDF5 推出于 1998 年, 相较于以前的HDF 文件, 可以说是一种全新的文件格式, 它与HDF4 只在概念上一脉相承 ,而在数据结构的组织上却截然迥异。HDF5 的产生与发展反映了 HDF 在不断适应现代计算机发展和数据处理日益庞大复杂的要求。HDF5 紧跟时代变化也为其自身注入活力,使它被愈来愈多的领域采纳、运用 ,许多遥感影像采取HDF 格式存取, 一些大的图像处理软件也开始提供接口读取 HDF 文件。 HDF 强大的机制适应了遥感影像的特点 ,能够有条不紊 、完备地保存遥感影像的属性和空间信息数据 , 同时使查询和提取相关数据也很方便容易 。

随着计算机软硬件的不断发展, 要处理的数据量和数据类型都变得十分庞大 , 原有的 HDF4 已经无法适应这种要求了。 HDF5 正是在克服 HDF4 缺点基础上应运而生的。 HDF4 不能存储多于 2 万个复杂对象, 文件大小不能超过 2G 字节 ,其数据结构不能完全包含它的内容, 随着对象的增多,数据类型也受到限制,库代码过时 , 过于琐碎 ,不能有效执行并行 I/O , 难于运用到线程程序中 。HDF5 的产生解决了上述问题, 不但能处理更多的对象 ,存储更大的文件 ,支持并行 I/O ,线程和具备现代操作系统与应用程序所要求的其他特性, 而且数据模型变得更简单 ,概括性更强。HDF5 的逻辑格式如图 3 所示 。HDF5 只有两种基本结构 :组(group)和数据集(dataset)。组包含 0 个或多个数据集。HDF4 的 8 种数据类型除注释外都统一为 HDF5 的数据集。在HDF5 中用一个小数据集 Attribute 表示注释信息。

安装hdf5之前要先安装zlib

cd zlib-1.2.8/
./configure 
sudo make
sudo make install

安装hdf5

cd hdf5-1.8.15-patch1/
./configure --prefix=/usr/local/hdf5
sudo make
sudo make install

3.安装NetCDF4

NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。目前,NetCDF广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。用户可以借助多种方式方便地管理和操作 NetCDF 数据集。

NetCDF数据集(文件名后缀为.nc) 的格式不是固定的,它是使用者根据需求 自己定义的。一个NetCDF数据集包含维(dimensions)、变量(variables)和属性(attributes)三种描述类型,每种类型都会被分配一个名字和一个ID,这些类型共同描述了一个数据集,NetCDF库可以同时访问多个数据集,用ID来识别不同数据集。变量存储实际数据,维给出了变量维度信息,属性则给出了变量或数据集本身的辅助信息属性,又可以分为适用于整个文件的全局属性和适用于特定变量的局部属性,全局属性则描述了数据集的基本属性以及数据集的来源。一个NetCDF文件的结构包括以下对象:

NetCDF name{
Dimensions:… //定义维数
Variables:… //定义变量
Attributes:… //属性
Data:…//数据
}

安装NetCDF4之前要先安装好HDF5,HDF5的安装在上一节中已经叙述过了。

cd netcdf-4.3.3.1/
LDFLAGS=-L/usr/local/hdf5/lib CPPFLAGS=-I/usr/local/hdf5/include ./configure --prefix=/usr/local/netcdf4  --enable-shared --enable-netcdf-4 --with-zlib=/usr/local
sudo make
sudo make install

然后安装NetCDF4的Python模块,在安装Python模块之前要将NetCDF4和HDF5的安装目录写到系统环境中,比如/etc/profile或者.bashrc

export HDF5_DIR=/usr/local/hdf5
export HDF5_INCDIR=/usr/local/hdf5/include
export HDF5_LIBDIR=/usr/local/hdf5/lib
export NETCDF4_DIR=/usr/local/netcdf4
export NETCDF4_INCDIR=/usr/local/netcdf4/include
export NETCDF4_LIBDIR=/usr/local/netcdf4/lib

然后手动安装NetCDF4模块

cd netCDF4-1.2.0/
python setup.py build
sudo python setup.py install

4.安装NCL

NCL(The NCAR Command Language)是一种专门为科学数据处理以及数据可视化设计的高级语言,很适合用在气象数据的处理和可视化上。NCL包含了现代编程语言的许多常见功能:条件语句、循环、数组运算等。此外,NCL还包括许多有用的内置函数和过程用来进行处理和操作数据,其中包括统计函数、插值、EOF分析、波谱分析等。

NCL的设计目标是为了方便地从各种格式的文件中读取数据,进行数据处理,数据可视化。NCL有两种运行模式:第一种是命令行交互式运行,用户每输入一个命令或表达式就会立即得到执行。第二种是批处理模式,通过编写NCL脚本,一次性完成所有操作。

NCL主要包括以下三个方面的功能:首先是文件I/O功能。NCL有独特的语法,可以访问数据文件中的变量。也可以访问变量的其他信息(元数据 metadata),比如网格坐标信息、单位、缺测值等。第二是NCL的数据处理功能,比如求数据的平均值,做线性回归等。想要掌握这部分功能需要具备一定的编程经验,也需要对NCL语言有相当程度的了解。最后是数据可视化。使用NCL绘图的语法命令很简单,但是使用时会比较复杂。

这里要注意要选择6.0.0的版本

sudo mkdir /usr/local/ncl
cd /usr/local/ncl/
sudo tar zxvf /你下载的目录/ncl_ncarg-6.0.0.Linux_Debian_x86_64_gcc432.tar.gz 

写环境变量

export NCARG_ROOT=/usr/local/ncl
export PATH=$NCARG_ROOT/bin:$PATH

 5.安装PyNGL与PyNIO

PyNGL是一个地球科学领域绘制出版级二维可视化图像的Python模块。PyNGL可以绘制等高线、向量、流线、XY坐标图以及一些地图项目。PyNGL图像是基于NCAR Command Language 和 NCAR Graphics图形库。

安装PyNGL之前首先要安装相关依赖,具体内容请查看INSTALL文件

sudo apt-get install libX11-dev libXext-dev libXtst-dev libXrender-dev libxmu-dev libxmuu-dev
sudo apt-get install libssl0.9.8
sudo apt-get install libpng12-dev libz-dev libxrender-dev libfontconfig1-dev
sudo apt-get install libcairo2-dev

写依赖文件的环境变量

export HAS_CAIRO=1
export F2CLIBS=gfortran
export F2CLIBS_PREFIX=/usr/local/lib

export PNG_PREFIX=/usr/include/libpng12/
export ZLIB_PREFIX=/usr/local/include
export CAIRO_PREFIX=/usr/include/cairo/
export FREETYPE_PREFIX=/usr/include/freetype2/
export NCARG_ROOT=/usr/local/ncl

安装PyNGL

python setup.py build
sudo python setup.py install

最后将安装后的NCARG目录写入环境变量,并将PyNGL写入Python的PATH目录

export PYNGL_NCARG=/usr/local/lib/python2.7/dist-packages/PyNGL/ncarg
export PYTHONPATH=/usr/local/lib/python2.7/dist-packages/PyNGL/:$PYTHONPATH

node.js如何遍历读取文件夹文件

在使用nodejs模块时,经常需要对文件夹进行遍历读取。

function scanFolder(path){
    var fileList = [],
        folderList = [],
        walk = function(path, fileList, folderList){
            files = fs.readdirSync(path);
            files.forEach(function(item) {  
                var tmpPath = path + '/' + item,
                    stats = fs.statSync(tmpPath);

                if (stats.isDirectory()) {  
                    walk(tmpPath, fileList, folderList); 
                    folderList.push(tmpPath); 
                } else {  
                    fileList.push(tmpPath); 
                }  
            });  
        };  

    walk(path, fileList, folderList);

    console.log('扫描' + path +'成功');

    return {
        'files': fileList,
        'folders': folderList
    }
}

Sublime Text 快捷键及插件

Sublime Text快捷键:

  • Ctrl+Shift+P:打开命令面板
  • Ctrl+P:搜索项目中的文件
  • Ctrl+G:跳转到第几行
  • Ctrl+W:关闭当前打开文件
  • Ctrl+Shift+W:关闭所有打开文件
  • Ctrl+Shift+V:粘贴并格式化
  • Ctrl+D:选择单词,重复可增加选择下一个相同的单词
  • Ctrl+L:选择行,重复可依次增加选择下一行
  • Ctrl+Shift+L:选择多行
  • Ctrl+Shift+Enter:在当前行前插入新行
  • Ctrl+X:删除当前行
  • Ctrl+M:跳转到对应括号
  • Ctrl+U:软撤销,撤销光标位置
  • Ctrl+J:选择标签内容
  • Ctrl+F:查找内容
  • Ctrl+Shift+F:查找并替换
  • Ctrl+H:替换
  • Ctrl+R:前往 method
  • Ctrl+N:新建窗口
  • Ctrl+K+B:开关侧栏
  • Ctrl+Shift+M:选中当前括号内容,重复可选着括号本身
  • Ctrl+F2:设置/删除标记
  • Ctrl+/:注释当前行
  • Ctrl+Shift+/:当前位置插入注释
  • Ctrl+Alt+/:块注释,并Focus到首行,写注释说明用的
  • Ctrl+Shift+A:选择当前标签前后,修改标签用的
  • F11:全屏
  • Shift+F11:全屏免打扰模式,只编辑当前文件
  • Alt+F3:选择所有相同的词
  • Alt+.:闭合标签
  • Alt+Shift+数字:分屏显示
  • Alt+数字:切换打开第N个文件
  • Shift+右键拖动:光标多不,用来更改或插入列内容
  • 鼠标的前进后退键可切换Tab文件
  • 按Ctrl,依次点击或选取,可需要编辑的多个位置
  • 按Ctrl+Shift+上下键,可替换行

Sublime Text插件:

  • ZenCoding

    不得不用的一款前端开发方面的插件,Write less , show more.安装后可直接使用,Tab键触发,Alt+Shift+W是个代码机器。

  • Alignment

    代码对齐,如写几个变量,选中这几行,Ctrl+Alt+A,哇,齐了。

  • Prefixr

    写 CSS可自动添加 -webkit 等私有词缀,Ctrl+Alt+X触发。

  • Clipboard History

    剪贴板历史记录,显示更多历史复制,Ctrl+Shift+V触发。

  • SideBarEnhancements

    侧栏右键功能增强,非常实用

  • Theme – Soda

    完美的编码主题,用过的都说好,Setting user里面添加”theme”: “Soda Dark.sublime-theme”

  • GBK to UTF8

    将文件编码从GBK转黄成UTF8,菜单 – File里面找

  • SFTP

    直接编辑 FTP 或 SFTP 服务器上的文件,绝对FTP浮云

  • PHPTidy

    整理排版PHP代码

Git简易使用指南

1. 创建新仓库

  • 创建新文件夹,打开,然后执行git init以创建新的 git 仓库。

2. 工作流

你的本地仓库由 git 维护的三棵“树”组成。

  • 第一个是你的 工作目录,它持有实际文件。
  • 第二个是 缓存区(Index),它像个缓存区域,临时保存你的改动。
  • 最后是 HEAD,指向你最近一次提交后的结果。

Git work flow

3. 添加与提交

  • 你可以计划改动(把它们添加到缓存区),使用如下命令:git add <filename>git add *这是 git 基本工作流程的第一步;
  • 使用如下命令以实际提交改动:git commit -m "代码提交信息"

现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

4. 推送改动

  • 你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:git push origin master 可以把 master 换成你想要推送的任何分支。

  • 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:git remote add origin <server> 如此你就能够将你的改动推送到所添加的服务器上去了。

在git服务器上初始化一个仓库

mkdir shang.git

git init --bare --share

chown root:git test.git/ -R

chmod g+w . -R