参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf.int/display/OPTR/ecCodes%3A+GRIB+data+decoding+and+encoding+software+2018

基本解码流程

1. 指定打开方式(“读”或“写”),打开一个或多个GRIB文件;

2. 根据不同加载方式,加载一个或多个GRIB messages到内存:
  有两种函数:codes_grib_new_from_file 和 codes_new_from_index。调用后会返回一个唯一的identifier,用于对已加载的GRIB messages进行操纵。

3. 调用codes_get函数对已加载的GRIB messages进行解码; (可以解码需要的数据)

4. 释放已经加载的GRIB messages:
  codes_release  

5. 关闭打开的 GRIB 文件.

此外,eccodes还有以下功能:

  eccodes的主要目的是提供一个高水平的方法,用以从一个加载的GRIB messages对象去提取和计算出更多额外的信息:

· 返回平均,最小,最大,特定的经纬度等的关键字;

· 计算经纬度和值:codes_grib_get_data;

· 提取值的子例程:
  codes_grib_find_nearest 去提取出距离给定地理点最近位置的点的值
  codes_get_element 从列表中提取值

· 基于索引访问(indexed access)的子例程:这些是随机访问的方法,通常比顺序访问更快。

-----------------------------------------------------------------

顺序访问方式:

大致思路:

-> codes_open_file

-> codes_grib_new_from_file -> codes_get -> codes_release

-> codes_grib_new_from_file -> codes_get-> codes_release

-> codes_close_file

示例代码:

索引访问方式(通常比顺序访问快):

注意,eccodes中的index文件(后缀为.idx)与GrADS中后缀为.idx的文件不能通用!

大致思路:

-> codes_index_create(从grib文件创建index) 或 codes_index_read(读取已有index)

-> codes_index_select 选取键值

-> codes_new_from_index -> codes_get -> codes_release

-> codes_new_from_index -> codes_get -> codes_release

-> codes_index_release

示例代码:

-----------------------------------------------------------------

一些ecCodes命令行工具:

参考 https://confluence.ecmwf.int/display/GRIB/GRIB+tools

grib_filter 筛选

grib_filter [options] rules_file grib_file gribfile ...

options

-f  强制执行

-o  输出index文件。如果没指定输出文件,那么输出GRIB文件写在filtered.out

-M  关闭多场支持。关闭在单GRIB message中多要素场的支持。

-V  版本

-g  复制GTS头

-G  兼容GRIBEX模式

-T T|B  message类型。T -> GTS, B -> BUFR, 输入文件类型根据messgae解释

-7  当message长度错误时候不报错

-v  verbose模式

例子

1. grib_filter程序对于输入文件中的所有GRIB message顺序处理,对其中各项均应用rules。输入消息可以使用“write”声明写入输出文件。write语句可以parameterised以便输出发送到多个文件,根据键值定义输出文件的名字。如果我们写一个rules_file包含唯一的声明:

write "../data/split/[centre]_[dataDate]_[dataType]_[levelType].grib[edition]";

将这个rules_file应用到 "../data/tigge_pf_ecmwf.grib2"文件将会在 ../data/split 目录下得到几个文件,包含根据键值分割的字段

> grib_filter rules_file ../data/tigge_pf_ecmwf.grib2
> ls ../data/split
ecmf_20060619_pf_sfc.grib2
ecmf_20060630_pf_sfc.grib2
ecmf_20070122_pf_pl.grib2
ecmf_20070122_pf_pt.grib2
ecmf_20070122_pf_pv.grib2
ecmf_20070122_pf_sfc.grib2

2. 通过明确指示冒号后所需的类型,也可以以不同的格式获取文件名中的键值。

  • :s  整型
  • :d  双精度
  • :s  字符串

以下语句的工作方式与前一个示例略有不同,包括输出文件名中的center和dataType的整数值。

write "../data/split/[centre:i]_[dataDate]_[dataType:i]_[levelType].grib[edition]";

再次运行相同的命令,我们获得了不同的文件列表。

> grib_filter rules_file ../data/tigge_pf_ecmwf.grib2
> ls ../data/split
98_20060619_4_sfc.grib2
98_20060630_4_sfc.grib2
98_20070122_4_pl.grib2
98_20070122_4_pt.grib2
98_20070122_4_pv.grib2
98_20070122_4_sfc.grib2

3. grib_filter语法中允许使用其他语句:

  • 以#开头的注释
  • print "string to print also with key values like in the file name"
  • transient keyname1 = keyname2;
  • set keyname = keyvalue;
  • 定义(keyname)以检查message中是否定义了关键字
  • 缺少(keyname)来检查关键字的值是否设置为MISSING
  • 要将键值设置为MISSING,请使用“set key = MISSING;” (见示例)
  • if(condition){block of rules} else {block of rules} 
    条件可以使用==,!=,并使用||和&& 连接单个块条件 
    语句可以是任何有效语句也是另一个嵌套条件
  • 您也可以使用“assert(condition)”进行断言。如果condition为false,它将中止filter。
    例如:assert(edition == 1);

grib_filter规则的一个复杂示例如下是在GRIB版本1文件中更改温度。

# This filter should only be run on GRIB edition ; abort otherwise
assert( edition == ); # Temperature
if ( level == && indicatorOfParameter == ) {
print "found indicatorOfParameter=[indicatorOfParameter] level=[level] date=[dataDate]";
transient oldtype = type ;
set identificationOfOriginatingGeneratingSubCentre=;
set gribTablesVersionNo = ;
set indicatorOfParameter = ;
set localDefinitionNumber=;
set marsClass="od";
set marsStream="kwbc";
# Negatively/Positively Perturbed Forecast
if ( oldtype == || oldtype == ) {
set marsType="pf";
set experimentVersionNumber="";
}
# Control Forecast
if ( oldtype == ) {
set marsType="cf";
set experimentVersionNumber="";
}
set numberOfForecastsInEnsemble=;
write;
print "indicatorOfParameter=[indicatorOfParameter] level=[level] date=[dataDate]";
print;
}

4. 以下是将键与字符串进行比较的IF语句示例。注意,必须对字符串使用“is”关键字而不是“==”。并且,为了否定,您需要在整个条件之前添加“!”:

# Select Geopotential Height messages which are not on a Reduced Gaussian Grid
if (shortName is "gh" && !(gridType is "reduced_gg" )) {
set step = ;
}

5. switch语句是if语句的替代版本。其语法如下:

switch (key1) {
case val1:
# block of rules;
case val2:
# block of rules;
default:
# [ block of rules ]
}

作为switch语句的参数给出的键的每个值都与case语句中指定的值匹配。如果存在匹配,则执行与匹配的case语句对应的块或规则。否则,执行默认情况。如果case声明没有包含所有可能性,则默认情况是强制性的。“〜”运算符可用于匹配“任何”。

以下示例显示了switch语句的用法:

processing paramId=[paramId] [shortName] [stepType]
switch (shortName) {
case "tp":
set stepType="accum";
case "10u" :
set typeOfLevel="surface";
default:
}

grib_get 获取数据

Get values of some keys from a GRIB file. It is similar to grib_ls, but fails returning an error code when an error occurs (e.g. key not found).

grib_get [options] grib_file grib_file ...

options

-f  强制执行

-p key[:{s/d/i}],key[:{s/d/i}],...
  声明打印的关键字。可以要求字符串型(keys:s),双精度(keys:d)或者整型(keys:i)的关键字。默认类型是字符串

-F format  C样式格式的浮点值。

-l Latitude,Longitude[,MODE,file]
  
 接近的纬度/经度点的值。允许的MODE有:

  • 4   默认 (打印距离点最近四个点的值)
  • 1   打印距离点最近的值
  • file  文件被用于mask。打印距离mask值>=0.5时候,最近的点的值

-P key[:{s/d/i}],key[:{s/d/i}],...  As -p adding the declared keys to the default list.

-w key[:{s/d/i}]{=/!=}value,key[:{s/d/i }]{=/!=}value,...
  
只有满足所有设置键/值约束的GRIB message才会被处理。一个有效的键值约束类似于key=value或者key!=value。对于任意一个关键字,可以是字符串型(keys:s),双精度型(keys:d)或者一个长整型(keys:l)。默认类型为字符串型。在值中同样可以使用上斜杠“/"去指定一个 或 条件。(即一个逻辑析取)

-n namespace  打印所有属于namespace的关键字。一些有用的namespace是:“time”,“parameter”,“geography”和“statistics”。

-s key[:{s/d/i}]=value,key[:{s/d/i}]=value,...
    需要设置的关键字数值。对于每一个关键字,可以定义为字符串(key:s)、双精度(key:d)或者整型(key:i)这些类型。默认情况是设置为native type

-V  Version.

-W width  输出行的最小宽度。默认是10

-M  关闭多场支持。关闭在单GRIB message中多要素场的支持。

-g  复制GTS头

-G  兼容GRIBEX模式

-T T|B  message类型。T -> GTS, B -> BUFR, 输入文件类型根据messgae解释

-7  当message长度错误时候不报错

-i index  打印对应于给定index的值。注意这个index是从零开始的,所以第一个值是在索引0。

例子

1. 如果关键字没有找到,grib_get 失败

> grib_get -p gribname ../data/tigge_pf_ecmwf.grib2

2. 为了获取文件中第一个GRIB message中step的值

> grib_get -w count= -p step ../data/tigge_pf_ecmwf.grib2

grib_index_build 创建索引

grib_index_build [options] grib_file grib_file ...

options

-f  强制执行

-o  输出index文件。如果没指定输出文件,那么输出文件写成“gribidx”

-k  keys1,keys2... 给定需要索引的关键字。默认输入文件将用MARS关键字索引。可以要求字符串型(keys:s),双精度(keys:d)或者整型(keys:i)的关键字。

-V  版本号

-M  多变量场支持关闭。关闭单独GRIB message中多变量场的支持

-N  不要压缩索引。默认情况下,索引移除了只有一个值的关键字,用以压缩。

例子

1. 默认情况下,grib_index将会用MARS关键字进行索引

> grib_index_build ../data/reduced*.grib1 ../data/regular*.grib1 ../data/reduced*.grib2

2. 如果要给索引设置默认的关键字,使用-k选项。

> grib_index_build ../data/reduced*.grib1 ../data/regular*.grib1 ../data/reduced*.grib2

注意!因为并非所有keys都会被保存在grib文件中,一些keys是通过其它keys计算得到的。而在利用grib_index_build命令时候,默认只存储部分keys,如果需要在index中保存额外的keys,还需要打开-N选项:

$ grib_index_build -k time,name,level,longitude,latitude,month,day,year,shortName -N  *.grb -o outindex
--- grib_index_build: processing t..grb
--- grib_index_build: keys included in the index file outindex:
--- time, name, level, longitude, latitude, month, day, year, shortName
--- time = { , , , }
--- name = { Temperature }
--- level = { , , , , , , , , , , , , , , , , , , , , , , , , , , , }
--- longitude = { undef }
--- latitude = { undef }
--- month = { }
--- day = { }
--- year = { }
--- shortName = { t }
--- messages indexed

如果不加-N选项,那么一些用户定义的keys就没有保存到index文件中

$ grib_index_build -k time,name,level,longitude,latitude,month,day,year,shortName   *.grb -o outindex
--- grib_index_build: processing t..grb
--- grib_index_build: keys included in the index file outindex:
--- time, level
--- time = { , , , }
--- level = { , , , , , , , , , , , , , , , , , , , , , , , , , , , }
--- messages indexed

如上图,一些变量就没有保存到index文件中。

grib_dump 显示一个索引文件的内容

grib_dump [options] grib_file grib_file ...

options

-O  Octet(八进制?)模式。WMO文档形式的输出

-D  调试模式

-d  仅在C模式下可用。打印所有数据值。

-C  C编码模式。一个C编码程序生成的GRIB message被输出

-t  打印类型信息

-H  以十六位格式打印八位内容

-a  打印别名(aliases)

-w key[:{s/d/l}]{=/!=}value,key[:{s/d/l}]{=/!=}value,...  
    只有满足所有设置键/值约束的GRIB message才会被处理。一个有效的键值约束类似于key=value或者key!=value。对于任意一个关键字,可以是字符串型(keys:s),双精度型(keys:d)或者一个长整型(keys:l)。默认类型为字符串型。

-s key[:{s/d/i}]=value,key[:{s/d/i}]=value,...
    需要设置的关键字数值。对于每一个关键字,可以定义为字符串(key:s)、双精度(key:d)或者整型(key:i)这些类型。默认情况是设置为native type

-M  关闭多场支持。关闭在单GRIB message中多要素场的支持。

-T T|B|A  message类型。T -> GTS, B -> BUFR, A -> Any (Experimental). 输入文件类型根据messgae解释

-7  当message长度错误时候不报错

-V  版本

-X offset  输入文件offset量(单位字节)。处理输入文件将从“offset”开始。

例子

1. 用hexadecimal octet的方式(-H),用WMO文档的形式输出。

> grib_dump -OH ../data/reduced_gaussian_model_level.grib1

2. 添加关键字别名和类型信息

> grib_dump -OtaH ../data/reduced_gaussian_model_level.grib

3. 获得一个grib文件中所有的关键字名称(包括已经计算得到的关键字)

> grib_dump -D ../data/regular_latlon_surface.grib1

grib_copy 复制GRIB文件的内容打印一些键的值

grib_copy [options] grib_file grib_file ... output_grib_file

options

-f  强制执行

-r   重新包装数据。有时在设置一些涉及打包算法属性的键之后,需要重新打包数据。执行此重新打包时,设置此-r选项

-p key[:{s/d/l}],key[:{s/d/l}],... 
Declaration of keys to print. For each key a string (key:s) or a double (key:d) or a long (key:l) type can be requested. Default type is string.

-P key[:{s/d/l}],key[:{s/d/l}],... 
As -p adding the declared keys to the default list.

-w key[:{s/d/l}]{=/!=}value,key[:{s/d/l}]=value,... 
    只有满足所有设置键/值约束的GRIB message才会被处理。一个有效的键值约束类似于key=value或者key!=value。对于任意一个关键字,可以是字符串型(keys:s),双精度型(keys:d)或者一个长整型(keys:l)。默认类型为字符串型。
    Where clause. Only grib messages matching the key/value constraints are copied to the output_grib_file.
    A valid constraint is of type key=value or key!=value.
    For each key a string (key:s) or a double (key:d) or a long (key:l) type can be defined. Default type is string.
    In the value you can also use the forward-slash character "/" to specify an OR condition (i.e. a logical disjunction)

-B order by directive 
Order by. The output will be ordered according to the "order by" directive. For example: "step:i asc, centre desc" (step numeric ascending and centre descending) 
-V  版本号
-W width 
Minimum width of each column in output. Default is 10.

-M   多变量场支持关闭。关闭单独GRIB message中多变量场的支持 Multi-field support off. Turn off support for multiple fields in single grib message.

-T T | B
Message type. T->GTS, B->BUFR. The input file is interpreted according to the message type.

-g 
Copy GTS header.

-G 
GRIBEX compatibility mode.

-7 
Does not fail when the message has wrong length

-v 
Verbose.

例子

1. To copy only the pressure levels from a file

> grib_copy -w levtype=pl ../data/tigge_pf_ecmwf.grib2 out.grib

2.To copy only the fields that are not on pressure levels from a file

> grib_copy -w levtype!=pl ../data/tigge_pf_ecmwf.grib2 out.grib

3.To copy only the first three fields from a file

> grib_copy -w count=1/2/3 ../data/tigge_pf_ecmwf.grib2 out.grib

4. A grib_file with multi field messages can be converted in single field messages with a simple grib_copy

> grib_copy multi.grib simple.grib

5. Use the square brackets to insert the value of a key in the name of the output file (This is a good way to split a large GRIB file)
Note: we need to quote the name of the output so the shell does not interpret the square brackets

> grib_copy in.grib 'out_[shortName].grib'

6. To copy fields whose typeOfLevel is either "surface" or "meanSea"

> grib_copy -w typeOfLevel=surface/meanSea orig.grib out.grib

7. To copy selected fields and apply sorting (sorted by level in ascending order)
Note: we need to specify the ":i" to get a numerical sort. By default values are sorted as strings so a level of 100 would come before 20!

> grib_copy -w typeOfLevel=heightAboveGround -B"level:i asc" tigge_af_ecmwf.grib2 out.grib

-----------------------------------------------------------------

部分函数参考:

codes_get (msgid, key, value, status)
  Get the value for a key from a grib message
  从grib message中获取键值。
  输入一个msgid和key,返回关键字的值。 在某些情况下,值可以是数组而不是标量。 作为数组键的示例,我们分别具有“values”,“pl”,“pv”数据值,简化网格中每个纬度的点数列表以及垂直级别列表。 在这些情况下,值数组必须由调用者分配,并且可以使用codes_get_size获取其所需的维度。值可以是整数(4),实数(4),实数(8),字符。 虽然每个键都有自己的本机类型,但是可以检索整数类型的键(使用codes_get)作为real(4),real(8)或character。 尽可能提供类似的转换。 对于任何其他类型,非法转换对整数和字符都是真实的。msgid引用内存中加载的消息。
  [in] msgid id of the message loaded in memory
  [in] key key name
  [out] value value can be a scalar or array of integer(4),real(4),real(8),character. Arrays must support the allocatable attribute.
  [out] status CODES_SUCCESS if OK, integer value on error

codes_get_element (msgid, key, kindex, value, status)
  Get a value of specified index from an array key
  从一个关键字数组中获取给定索引的值。给定 message id、关键字名称、和索引,得到相应的值。 索引是从0开始的(即第一个元素的索引是0,第二个元素索引为1,依此类推)。 如果索引参数是数组,则返回与索引数组对应的所有值。
  [in] id   加载到内存的ID。 ID of the message loaded in memory
  [in] key  关键字名称 key name
  [in] index  可以是一个标量或者数组。单精度整型 index can be a scalar or array of integer(4)
  [out] value  可以是一个标量或者数组。单精度整型,单精度或双精度实型数组。 value can be a scalar or array of integer(4),real(4),real(8)
  [out] status   CODES_SUCCESS if OK, integer value on error

codes_get_error_string (error, error_message, status)
  Get the error message given an error code.
  输入错误码,返回错误消息
  error       错误码
  error messages   错误消息
  status      如果成功返回CODES_SUCCESS,错误返回整数值

codes_get_message_size (msgid, nbytes, status)
  Get the size of a coded message
  得到编码message的大小

codes_get_size (msgid, key, size, status)
  Get the size of an array key
  得到键数组的大小

codes_grib_find_nearest_single (gribid, is_lsm, inlat, inlon, outlat, outlon, value, distance, kindex, status)

  获得距给定经纬度点最近的点的位置及值。
  输入gribid,逻辑值
  返回最近的一个点 (或最近的四个点) 的值,基于零的索引 (可在 code_get_element中使用) ,及其与给定点的距离。使用以下公式: radius * acos( sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2) ).
  如果is_lsm flag是. true。输入场网格被认为是land sea mask, 返回最近的陆地点。
  在四个相邻点中, 最近的陆地点是:
    land sea mask值 > = 0.5 的最近点
    如果这四个相邻点的land sea mask 值都 < 0.5, 则在没有任何其他条件的情况下最近的。
  可以提供经纬度的数组 (real(8), 以便通过一个调用来查找数组中列出的所有 lat/lon 点的值、索引和距离。
  如果提供了单个纬度/经度点, 并且outlat, outlon, value, 距离, 索引被定义为具有四个元素的数组, 返回四个最近点的 lat/lon 坐标和value、距离和索引。
  如果出现错误, 如果未给出状态参数 (可选), 程序将退出并显示错误消息。否则, 可以使用codes_get_error_string 收集错误消息。
  [in] gribid  加载到内存中的值
  [in] is_lsm  逻辑值,如果要求最近的点,则为.true.,否则为.false.
  [in] inlat  点的纬度
  [in] inlon  点的经度
  [out] outlat  最近点的纬度
  [out] outlon  最近点的经度
  [out] distance  给点和最近点的距离
  
[out] kindex  基于0的索引
  [out] value  最近点的值
  [out] status  状态 CODES_SUCCESS if OK, integer value on error 

codes_grib_get_data (gribid, lats, lons, values, status)
  Get latitude/longitude and data values. 
  得到经纬度和数据值

codes_index_add_file (indexid, filename, status)
  Add a file to an index.
  将一个文件加入到索引文件中

codes_index_create (indexid, filename, keys, status)
  to create the index of the content of a file 创建文件内容索引
  indexid  新建索引文件的id
  filename  被索引messages的文件的名称
  keys    用逗号分隔的关键字关键字的类型可以在后面追加(:l,表示长整型,:i短整型,:d双精度,:s字符串)如果没有显式声明类型,那么假设类型默认。
  status   如果成功返回CODES_SUCCESS,错误返回整数值

codes_index_get (indexid, key, values, status)
  Get the distinct values of the key in argument contained in the index. 
  得到包含在索引中声明的特定关键字的特定值

codes_index_get_size (indexid, key, size, status)
  to get the dimension of a key in the index
  得到索引的关键字的维数

codes_index_read (indexid, filename, status)
  Load an index file previously created with codes_index_write.
  加载一个索引文件(该索引文件之前已由codes_index_write命令创建)

codes_index_release (indexid, status)
  释放index
  indexid   id of an index created from a file.
  status    CODES_SUCCESS if OK, integer value on erro

codes_index_select (indexid, key, value, status)
  Select the message subset with key==value.
  用key==valued选取消息子集

codes_index_write (indexid, filename, status)
  Saves an index to a file for later reuse.
  保存索引文件便于以后使用

codes_new_from_file (ifile, msgid, product_kind, status)

  从该文件中加载一个message 到内存。输入文件id、数据类型,并返回message id
  可以通过msgid直接访问该message,msgid一直可用,调用codes_release函数之前。

codes_new_from_index (indexid, msgid, status)
  在选定key值后,从一个index创建一个新的handle。
  在调用这个函数前,index的所有keys都比必须确定。 连续调用这个函数 将返回index keys中 所有符合定义的handles。当没有更多的可用处理从索引中返回一个空指针变量,并且err变量值设置为CODES_END_OF_INDEX。

codes_new_from_message(msgid, message, status)
  Create a new message in memory from an integer or character array containting the coded message. 在包含编码消息的整型或字符型数组 中在内存中创建新消息

codes_grib_new_from_samples (gribid, samplename, status)
  Create a new valid gribid from a GRIB sample contained in a samples directory pointed by the environment variable ECCODES_SAMPLES_PATH.
  在ECCODES_SAMPLES_PATH环境变量指定的样本路径中的GRIB样本,创建新的可用的gribid.(编码时候用)
  gribid   id of the grib loaded in memory 输出量,加载到内存中的message的id
  samplename   name of the sample to be used 输入量,样本名称
  status   CODES_SUCCESS if OK, integer value on error 输出量,是否成功

codes_open_file (ifile, filename, mode, status)
  Open a file according to a mode. 根据模式打开文件
  ifile   id of the opened file to be used in all the file functions.
  filename   name of the file to be open
  mode   open mode can be 'r' (read only), 'w' (write only) or 'a' (append)
  status   如果成功返回CODES_SUCCESS,错误返回整数值

codes_read_bytes (ifile, buffer, nbytes, status)
  Reads nbytes bytes into the buffer from a file opened with codes_open_file

codes_read_from_file (ifile, buffer, nbytes, status)
  Reads a message in the buffer array from the file opened with codes_open_file.

codes_release (msgid, status)
  Free the memory for the message referred as msgid.

codes_set (msgid, key, value, status)
  Set the value for a key in a message.
  在message中设置键值

codes_write_bytes_int4 (ifile, buffer, nbytes, status)
  Write nbytes bytes from the buffer in a file opened with codes_open_file.

注 :ERROR CODES列表参考 http://download.ecmwf.int/test-data/eccodes/html/group__errors.html

编译示例

引用时候用-leccodes_f90这个库

假设存放eccodes的头文件和库文件路径的环境变量分别是ECCODES_INCLUDE和ECCODES_LIB

jlz@dell:~/test$ ifort test.f90 -I$ECCODES_INCLUDE -L$ECCODES_LIB -leccodes_f90 -o test.out

最新文章

  1. Restful资源文章
  2. Mysql基础代码(不断完善中)
  3. EXT.NET 使用总结(2) ---TreePanel(带右键菜单,节点自定义属性)
  4. WPF入门教程系列二十一——DataGrid示例(一)
  5. 《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数016,xld,xld轮廓
  6. AAS代码运行-第11章-2
  7. 浅谈 Python 的 with 语句
  8. 【Linux】鸟哥的Linux私房菜基础学习篇整理(八)
  9. mysql--学生课程成绩表
  10. fir.im 持续集成技术实践
  11. arm指令bne.w改成b,即无条件跳转
  12. Java面试题整理:这些Java程序员面试中经常遇见的题目,必须掌握才能有好结果
  13. Window 下载Android系统源代码
  14. Linux下键盘值 对应input_evnet的code值。
  15. 搭建Hexo博客(四)-设置
  16. Kafka笔记1(初步认识)
  17. QueryHelper
  18. vuex是什么?怎么使用?哪种功能场景使用它?
  19. 颜色选择器 rgb 与16进制 颜色转换
  20. hadoop2.7的目录结构

热门文章

  1. innodb_locks_unsafe_for_binlog分析
  2. 中式台球 规则 ( ChinaBilliards )
  3. Git如何永久删除文件(包括历史记录)
  4. Matlab feval函数(转)
  5. 乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array
  6. October 16th 2017 Week 42nd Monday
  7. Beta 冲刺 (1/7)
  8. 剑指offer.从未到头打印链表
  9. A. Pride
  10. 支持向量机通俗导论(理解SVM的三层境界)【非原创】