整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

VESTA官方手册 - 第十七章:输入和输出文件

VESTA官方手册 - 第十七章:输入和输出文件

十七章:输入和输出文件

17.1 体数据的文件格式

体数据由三维空间中的规则网格组成。每个栅格点的体积元素“体元”表示栅格点上的值。体元类似于像素,它表示2D图像数据。

通常,有两种类型的格式用于记录文件中的体数据:常规栅格和周期栅格。图17.1示意性地说明了这两种格式的一般概念。

常规栅格是一个均匀的网格,位于分子边界框和晶体单位晶胞内。对于晶体结构,由于数据的周期性,常规栅格中的部分数据是冗余的。例如,(1,1,1)处的数值等于原点处的数值,即(0,0,0)。省略了这些冗余点的网格称为周期栅格。

VESTA自动将网格类型与文件扩展名区分开来。对于周期栅格格式的体数据,VESTA通过添加冗余数据点在内部生成常规栅格。在使用自制脚本或程序准备体数据时,用户必须自己注意文件的栅格类型。

:不可约数据点:冗余点(周期性副本)

图17.1:平面上体数据的两种网格。(A) 常规栅格和(B)周期栅格

17.2 用户设置目录

VESTA在用户设置目录中加载并保存两个文件,VESTA.ini和style/default.ini,分别存储程序和图形的用户设置。在同一目录中还创建了一个用于存储临时文件的目录tmp。设置目录的位置取决于操作系统,并按以下优先级顺序确定。

17.2.1 Windows

· 定义环境变量VESTA_PREF时,将使用指定的目录。

· 当%HOMEPATH%\AppData\Roaming\中存在名为VESTA的目录时,将使用该目录。

(%HOMEPATH%表示用户主目录的完整路径,%HOMEPATH%\AppData\是一个隐藏目录。)

· 当用户有权在VESTA的程序目录中写入时,将使用该目录,以免使主目录混乱。

· 第一次执行VESTA时创建目录%HOMEPATH%\AppData\Roaming\VESTA\,并使用该目录。

17.2.2 macOS

· 定义环境变量VESTA_PREF时,使用指定的目录。要为GUI应用程序定义环境变量,必须在名为environment.plist的文本文件中对其进行描述。该文件位于隐藏目录~/.MacOSX下。为了更容易定义VESTA_PREF,一个名为set_VESTA_PREF.app的应用程序,包含在RIETAN-VENUS软件包中;有关详细信息,请参阅set_VESTA_PREF.app中的Readme_mac.pdf文件。

· 第一次执行VESTA时创建目录~/Library/Application Support/VESTA/,并使用该目录。请注意,~/Library是主目录(~/)下的一个隐藏目录。

17.2.3 Linux

· 定义环境变量VESTA_PREF时,将使用指定的目录。

· 第一次执行VESTA时创建隐藏目录~/.VESTA/,并使用该目录。

17.3 VESTA使用的文件

表17.1:VESTA使用的文件

17.4 输入文件

17.4.1 结构数据

1、VESTA格式(*.vesta)

包含整个结构数据和图形设置的文本文件。VESTA保存的*.vesta文件,可能包含体数据文件的相对路径,以及当*.vesta文件再次打开时,自动读取的晶体数据文件。如果*.vesta中包含IMPORT_STRUCTURE、IMPORT_ORFFE、IMPORT _DENSITY和IMPORT_TEXTURE中的任何一个关键字,且后面是指定数据文件相对路径的行,当*.vesta文件打开时,VESTA也会输入这些数据文件。

使用RIETAN-FP进行Rietveld分析后,如果*.vesta和*.ins在同一个文件夹中,*.vesta中的晶格和结构参数会自动更新。

2、VICS格式(*.vcs)

http://fujioizumi.verse.jp/visualization/VENUS.html

VICS是VESTA结构图部分的前身,现已过时。尽管如此,VESTA仍支持此格式以保持兼容性。

3、American Mineralogist Crystal Structure Database美国矿物学晶体结构数据库(*.amc)

http://rruff.geo.arizona.edu/AMS/amcsd.php

在部分AMCSD文本文件中,空间群名称附加了额外的字符,并使用了非标准的空间群符号。某些非标准空间群设置可能无法正确读取。在这种情况下,请适当修改空间群符号,然后根据需要在Edit Data对话框的Unit cell选项卡中更改设置编号。有时,如果采用《国际结晶学表》A卷中未描述的非标准设置,则必须自行转换分数坐标。

4、asse(*.asse)

http://www.nims.go.jp/cmsc/staff/arai/asse/

5、Chem3D(*.cc1)

http://openbabel.org/docs/2.3.1/FileFormats/3D_viewer_Formats.html

6、Crystallographic Information File晶体学信息文件(CIF; *.cif)

http://www.iucr.org/resources/cif/

CIF有多种晶体数据格式。可以从上述网站获得有关CIF的详细信息。例如,CIF文件可能包含笛卡尔坐标,但VESTA无法输入它们。请注意,VESTA不支持CIF格式中允许的所有格式。例如,CIF中包含的笛卡尔坐标不能输入到VESTA;CIF中只应给出分数坐标。有关可读格式,请参阅VENUS/examples/VICS/CIF中的示例*.cif文件。

在*.cif包含多相数据的情况下,所有数据都输入到同一个选项卡中,并且相互重叠。要在这种情况下仅可视化一个相,请选择菜单栏中的Edit | Edit Data | Phase...。在列表中选择一个不必要的相,然后按下Delete按钮。

CIF范式提供了多种输入空间群对称性的方法。VESTA按以下顺序搜索条目:

如果*.cif文件中给出了上述条目之一,VESTA识别空间群对称性。例如,SHELX-97通过WinGX创建的CIF既不包含空间群编号,也不包含空间群符号,但具有对称操作列表。

如果以上条目均未正确给出,则空间群被视为P1。在这种情况下,请在打开此类文件后,在Edit Data对话框的Unit cell选项卡中设置空间群,或按以下方式修改CIF中与空间群相关的行:

7、CrystalMaker text file(*.cmt, *.cmtx)

http://www.crystalmaker.comCrystalMaker

是一个用于构建、显示和操作各种晶体和分子结构的商业程序。

8、Crystal Structure Search and Retrieval晶体结构搜索与检索(CSSR; *.cssr)

http://www.maciejharanczyk.info/Zeopp/input.html

在CSSR格式的文件中,可以在“OPT=”后给出设置编号。遗憾的是,没有关于以这种格式设置编号的信息。如有必要,请在Edit Data对话框的Unit cell选项卡中进行更改。

9、Cambridge Structural Database剑桥结构数据库(CSD/FDAT; *.csd, *.fdt)

http://www.ccdc.cam.ac.uk/Solutions/CSDSystem/Pages/CSD.aspx

10、DL_POLY格式(CONFIG, REVCON, *.config)

https://www.scd.stfc.ac.uk/Pages/DL_POLY.aspx

11、FEFF输入文件(feff.inp)

http://www.feffproject.org/

FEFF是原子团簇X射线吸收精细结构(XAFS)和X射线吸收近边结构(XANES)谱从头算多重散射的自动程序。FEFF的输入文件名必须为feff.inp或FEFF.inp。

12、FHI-aims输入文件(*.in)

https://aimsclub.fhi-berlin.mpg.de/

FHI-aims为计算材料科学提供准确的全电子、全电势电子结构代码包。

13、Elk FP-LAPW代码的输出文件(GEOMETRY.OUT)

Elk是一种全电子全电势线性增强平面波(FP-LAPW)代码,用于测定晶体固体的性质。

14、GSAS格式(*.EXP)

http://www.ncnr.nist.gov/xtal/software/gsas.html

15、Inorganic Crystal Structure Database无机晶体结构数据库(ICSD; *.ics)

http://www2.fiz-karlsruhe.de/icsd_home.html

ICSD的两个检索程序,用于MS-DOS的RETRIEVE和用于Windows的FindIt,输出格式完全不同的文本文件。VESTA能够读取两种类型的晶体数据文件。

在这些*.ics文件中,有时会将额外字符附加到空间群名称,例如“P 42/n m c S”,应该是“P 42/n m c”(P42/nmc)。此外,ICSD文本文件中有时会给出完整的Hermann-Mauguin空间群符号。在这种情况下,文本区域和消息框中都会显示错误消息。请仔细阅读以进行下一个操作。遇到此类错误时,强烈建议输出CIF而不是*.ics。

16、ICSD-CRYSTIN:(*.cry)

17、MDL Molfile(*.mol)

http://en.wikipedia.org/wiki/Chemical_table_file

18、Crystallographic Database for Minerals矿物晶体学数据库(MINCRYST; *.min)

http://database.iem.ac.ru/mincryst/

在部分MINCRYST文本文件中,空间群名称附加了额外的字符,并使用了非标准的空间群符号。在这种情况下,文本区域会显示错误消息。应适当修改空间群名称。根据需要在Edit Data对话框的Unit cell选项卡中更改设置编号。

19、MOLDA(*.mld)

http://www3.u-toyama.ac.jp/kihara/cc/mld/readme.html

MOLDA的网站已经关闭,因为其作者Hiroshi Yoshida于2005年去世。这里简要解释*.mld的MODRAST/MOLDA格式。此格式由以下行组成:

(a) 第1行:关于化合物的注释,例如其名称

(b) 第2行:化合物中的原子数na

(c) 第3~(3+na)行:笛卡尔坐标(x、y和z)和原子序号

(d) 第(4+na)行:化合物中的键数nb

(e) 第(5+na)~(5+na+nb)行:原子序号对

例如,如果是乙烯,其中na=6,nb=5,则需要以下行:

20、Protein Data Bank 蛋白质数据库(PDB; *.pdb)

http://www.wwpdb.org/PDB

有多种晶体数据格式。可以在http://www.wwpdb.org/docs.html网页中获取PDB的详细信息。请注意,VESTA不支持这两种格式中允许的所有格式。有关可读格式,请参阅VENUS/examples/VICS/PDB中的*.pdb文件。

21、RIETAN-FP/2000的输入文件(*.ins)

http://fujioizumi.verse.jp/download/download_Eng.html

VESTA无法输入早于RIETAN-2000的RIETAN版本(例如,RIETAN-94)的*.ins文件。如果*.ins中包含多相数据,只输入第一相的晶体数据。

在*.ins中,根据RIETAN-FP中的规范,国际表格的卷名不应为“I”,而应为“A”。例如,“A-230-2”是空间群Fd-3m的第二个设置的输入。输入“I-230-2”会导致错误。晶格参数必须按以下方式在一行内给出:

22、RIETAN-FP的输出文件(*.lst)

http://fujioizumi.verse.jp/download/download_Eng.html

谨防RIETAN-2000输出的*.lst文件的输入。

23、SHELXL的输入文件(*.ins)

24、STRUCTURE TIDY的输出文件(*.sto)

25、USPEX输出的结构数据文件(gatheredPOSCARS, BESTgatheredPOSCARS)

http://han.ess.sunysb.edu/~USPEX/

26、WIEN2k(*.struct)

http://www.wien2k.at/

27、XMol XYZ(*.xyz)

http://en.wikipedia.org/wiki/XYZ_file_formathttp://openbabel.org/docs/2.3.1/FileFormats/XYZ_cartesian_coordinates_format.html

明尼苏达超级计算机中心开发的XMol是一种用于创建和查看分子图像的实用程序。

28、SCAT的F01,和contrd的C04D

http://www.dvxa.org/

如果结构模型与体数据重叠,VESTA除了需要读取f01外,还需要读取contrd的输入文件c04d。为此,需要使用c04d中的边界框(体数据输出到文本文件的区域)尺寸。有关contrd的详细信息,请参阅VENUS软件包中的Readme_contrd.txt。当然,c04d和f01应该放在同一个文件夹中。如果VESTA未输入c04d,原子坐标将在笛卡尔坐标系中处理,就像*.xyz文件的情况一样。在这种情况下,体数据*.scat和*.sca不能与结构模型重叠。

f01中记录的所有原子必须包含在上述边界框内。否则,通过假设周期性,原子坐标将在边界框内标准化,这将导致图形区域中出现不正确的结构。

在执行一系列电子状态计算时,使用Hidemaru Editor的DV-Xα方法辅助环境非常方便。

冈山理工大学Genta Sakane的网站:

http://www.chem.ous.ac.jp/~gsakane/

对于想要将contrd计算的物理量可视化的研究者来说非常有用。详细的日语文档《DV-Xα方法辅助环境简介》,适合初学者使用DV-Xα法和VESTA。

29、MXDORTO/MXDTRICL(FILE06.DAT, FILE07.DAT)

http://kats-labo.jimdo.com/mxdorto-mxdtricl/

MXDORTO和MXDTRICL是分子动力学模拟的Fortran程序。

30、XTL格式(*.xtl)

Cerius2(Accelrys,Inc.)中使用的文本文件。GULP和GSAS能够以这种格式输出晶体数据。

17.4.2 体数据

31、二进制格式的MEM密度(*.pri, *.prim)

http://fujioizumi.verse.jp/visualization/VENUS.html

http://jp-minerals.org/dysnomia/en/

PRIMA或Dysnomia输出的3D电子和核密度二进制文件以及ALBA输出的Patterson函数二进制文件。这些文件中记录的电子密度(严格来说,电子数密度)单位是?-3,核密度单位为fm ?-3。

32、文本格式的MEM密度(*.den)

PRIMA、Dysnomia、MEED、MEND和ENIGMA输出的3D电子和核密度文本文件。这些文件中记录的电子密度单位是?-3,核密度单位为fm ?-3。

33、Energy Band能带(*.eb)

与*.rho格式几乎相同的文本文件。文件*.eb用于根据能带结构计算程序(如WIEN2k)获得的结果可视化费米面。为了方便起见,在*.eb中的所有能量本征值上加上一个常数,使它们大于或等于零。因此,在设置等值面数值时必须考虑到这种修改。

NIMS的Masao Arai在他的网站上提供了有关*.eb的详细信息:

http://www.nims.go.jp/cmsc/staff/arai/

34、通用体数据(文本文件格式)(*.?ed)

具有通用体数据格式的文件存储根据Tsirelson提出的程序从电子密度转换而来的以下物理量之一(见14.15节):

?2ρ(r):电子密度的拉普拉斯算符(*.led)。

g(r):电子动能密度(*.ked)。

ν(r):电子势能密度(*.ped)。

he(r):电子能量密度(*.ted)。

格式(扩展名为?ed的所有文件通用):

标题:标题最多80个字符。

a、 b、c、α、β、γ:晶格参数,两个参数之间至少有一个空格(自由格式)。

N1+1、N2+1、N3+1:分别沿a、b和c轴的体元数量,两个整数之间至少有一个空格(自由格式)。

接下来为三维数组元素D:

每行中有任意数量的数据,两个真实数据之间至少有一个空格(自由格式)。请注意,N1+1、N2+1和N3+1的体元分别位于x=1、y=1和z=1。一个示例*.ted文件的初始几行如下所示:

VESTA输入的*.grd文件,应在傅里叶计算设置中选择选项““C – Select section (X, Y, or Z) selection”,然后输入“X”以显示提示“Enter section desired (X,Y,Z - choose Z for DSN6 maps”。

文件格式基本上与通用体数据格式相同,但三维数据数组D的输出范围如下:

VESTA同样允许以这种格式导出体数据。

36、通用体数据格式(二进制格式)(*.ggrid)

37、周期体数据(二进制格式)(*.pgrid)

38、压缩体数据格式(*.m3d)

39、SCAT体数据格式(*.sca, *.scat)

http://www.dvxa.org/

利用contrd从F09和F39文件计算的电子密度、静电势和波函数,通过SCAT输出。使用名为contrd.bat的批处理文件创建的文本文件(CHG3D.SCA、POT3D.SCA、WXXX-3D.SCA、WXXXU-3D.SCA和WXXXU-3D.SCA),可以直接由VESTA输入,其中XXX表示分配给波函数的整数。如要了解*.SCA文件的详细信息,请参阅软件包中的Readme_contrd.txt文件。记录于*.SCA或*.SCAT的三维数值数据在绘制时不用进行任何转换。

电子密度、静电势和波函数的单位分别是bohr-3, Ry (rydberg)和bohr-3/2,其中bohr是长度的原子单位,即1 bohr=a0=5.29177211×10-11 m=0.529177211 ?(a0:玻尔半径),1 Ry=Eh/2=2.179 871 9×10-18 J(Eh:hartree)。

DV-Xα方法的辅助环境及其用日语编写的详细文件见17.4.1节第23条。

40、WIEN2k(*.rho)

http://www.wien2k.at/ (WIEN2k)

http://www.nims.go.jp/cmsc/staff/arai/wien/venus.html (wien2venus.py)

NIMS的Masao Arai用Python编写的脚本wien2venus.py,可以将用WIEN2k计算的电子密度导出到文本文件*.rho中,之后使用VESTA将其可视化。这个文件中存储的电子密度单位是bohr-3。

41、WinGX 3D傅里叶映射(*.fou)

http://www.chem.gla.ac.uk/~louis/software/wingx/

WinGX输出的3D Fourier Maps文本文件。如要创建可以用VESTA输入的*.fou文件,从菜单栏中的Maps | FOURIER MAP | Slant plane,打开WinGX的“FOURIER MAP Control Panel”。选择“33D Fouier (Beevers-Lipson)”和“Write MarchingCubes File”选项,并在Z轴设置“Projection”。对于所有X、Y和Z轴,“Summation limits”的最小值和最大值应设置为0和1。考虑到以下问题,应仔细设置每个轴的分辨率。

在这种格式中,沿每个轴的数据点不是均匀分布的,而是以给定分辨率的间隔放置的。当轴的长度为L且分辨率设置为d时,数据点的数量NPIX设置为L/d+1的整数部分。仅当L/d接近整数时,输出文件具有近似正确周期的通用网格格式。建议特殊位置正好位于数据网格上。例如,如果镜像平面位于x=1/4和x=3/4,则L/d应为4的倍数。

42、X-PLOR/CNX(*.xplor)

http://en.wikipedia.org/wiki/X-PLOR (CNX)

http://superflip.fzu.cz/ (Superflip)

Superflip是用电荷翻转法从头算求解晶体结构的计算机程序。Superflip使用X-PLOR格式在文件*.x-plor中输出单位晶胞中的电子密度,可由VESTA直接显示。

17.4.3 结构和体数据

43、CASTEP(*.cell, *.charg_frm)

http://www.castep.org/

文件*.cell包含晶体结构数据,而文件*.charg_frm以?-3为单位存储电子密度。当*.cell在VESTA中打开时,仅显示结构模型。另一方面,打开*.charg_frm时,显示结构模型和电子密度分布。因为单位晶胞尺寸未记录在*.charg_frm文件中,必须同时打开*.cell。

44、GAMESS输入文件和MacMolPlt输出的体数据文件

http://www.msg.ameslab.gov/GAMESS/GAMESS.html (GAMESS)

https://brettbode.github.io/wxmacmolplt/ (MacMolPlt)

GAMESS输入文件*.inp,可以很容易地使用MacMolPlt从GAMESS日志文件*.log中获得。首先,使用文本编辑器检查该文件中收敛后的最终笛卡尔原子坐标单位。然后,运行MacMolPlt打开*.log。在Windows菜单中,通过*.log名称选择“Coordinates”,并检查笛卡尔坐标的单位是?还是bohr (au)。与VESTA一样,单位应为?。如果单位为bohr,请选择菜单栏中的Molecule | Convert to Angstroms。然后,在Windows菜单中,通过*.log名称选择“Input Builder”,并单击Write File按钮,创建*.inp存储原子符号和笛卡尔坐标。接下来是体数据文件*.mmp,必须输出其中记录的3D网格原点。在Windows菜单中,通过*.log名称选择“Surfaces”。从“3D Orbital”、“3D Total Electron Density”和“3D Molecular Electrostatic Potential”中指定项目。在随后出现的对话框中,适当更改网格点的数量和网格大小,选择一个轨道(在“3D Orbital”的情况下),然后单击Update按钮。等值面和球棍模型将出现在*.log窗口中。单击Parameters...按钮,可显示网格点的数量、原点和网格增量。然后,单击Export...按钮。指定与*.inp同名的*.mmp文件的名称和位置。请注意*.inp和*.mmp必须在同一文件夹中。

45、Gaussian Cube格式(*.cube, *.cub)

http://www.gaussian.com/

存储使用Gaussian计算的电子密度、自旋密度、静电势、波函数等的文本文件,关键字为“Cube”。Cube文件也可以由Firefly(以前称为PC GAMESS)创建。

46、VASP(*.vasp, CHG, CHGCAR, PARCHG, LOCPOT, ELFCAR, POSCAR, CONTCAR)

http://www.vasp.at/

http://www.materialsdesign.com/medea(商业软件MedeA,包含VASP为其组件)

以上文件均为存储VASP输出的晶体结构和体数据的文本文件

CHG存储晶格矢量、原子坐标和总电荷密度乘以单位晶胞体积V。PAW单个中心占据率添加到CHGCAR中。虽然CHG和CHGCAR提供了相同的价电子信息,但由于数值数据的精度较低,CHG的文件大小小于CHGCAR。PARCHG具有与CHG相同的格式,存储特定k点和/或带的部分电荷密度。当读取这些文件以可视化等值面和切面时,数据值除以V(单位为bohr3)。因此,VESTA输入的电荷密度单位为bohr-3。LOCPOT包含晶格矢量、原子坐标和库仑势(单位:eV),即无交换相关分量的总电势(除非LEXCHG=-1行在main中被注释掉)。ELFCAR的格式与CHG相同,它存储无量纲电子局域化函数(ELF)。POSCAR和CONTCAR包括晶格矢量、原子坐标,以及用于分子动力学计算的可选初始速度和预测-校正坐标。POSCAR和CONTCAR分别对应于计算任务结束时VASP输出的初始结构和最终结构;CONTCAR可用于计算任务续算。由于这些文件中没有元素符号或原子序数,它们必须与另一个文件OUTCAR一起显示结构模型。OUTCAR可以重命名为*.out,与*.vasp具有相同的名称。只有OUTCAR顶部“POTCAR:”后面的行才能读取元素符号

读取文件进行表面着色时,除非文件名为CHGCAR或PARCHG,否则不会缩放数据值。

47、XCrySDen XSF格式(*.xsf)

http://www.xcrysden.org/ (XCrySDen)

http://www.abinit.org/ (ABINIT)

http://www.abinit.org/documentation/helpfiles/for-v6.4/users/cut3d_help.html (Cut3D)

http://www.quantum-espresso.org/ (Quantum ESPRESSO)

用于材料性质从头算的ABINIT软件包具有输出存储电子密度、静电势和波函数的二进制文件的功能。它们可以使用名为Cut3D的转换器,转换具有XCrySDen的XSF格式的文本文件*.xsf。电子密度的单位是bohr-3。Cut3D支持数据类型13(XCrySDen/VENUS波函数实数数据),因此可以直接在*.xsf中输出波函数。用于材料量子力学模拟的Quantum ESPRESSO还具有输出XSF格式文件的功能。有关XSF格式的详细信息,请访问http://www.xcrysden.org/doc/XSF.html

一般来说,*.xsf由一些以关键字开头的部分组成。VESTA从BEGIN_BLOCK_DATAGRID部分读取体数据。为了使等值面与结构模型重叠成为可能,*.xsf还应包含(1)PRIMEVEC和PRIMCOORD部分或(2)CONVVEC和CONVCOORD部分。此外,PRIMVEC或CONVVEC部分中的晶格矢量必须与BEGIN_DATAGRID部分中的生成矢量一致。在XSF格式中,基本晶格矢量(PRIMVEC)和笛卡尔坐标的单位是?。

17.5 输出文件

17.5.1 数据文件

结构数据

1、VESTA原始格式(*.vesta)

当前显示的数据的全部信息保存在VESTA格式的文本文件*.vesta中。VESTA格式的文件包含所有结构数据和图形设置,而体数据不直接记录在*.vesta中,而从外部文件导入。存储体数据的文件的目录和名称记录在*.vesta中,作为从*.vesta的目录到体数据文件的相对路径。它可以将当前数据的全部信息保存在一个小文件中,而无需复制庞大的体数据。

可以选择以相同的方式从外部文件导入结构数据。防止结构数据直接记录在*.vesta中,使用带有Link选项的Import Data对话框导入结构数据(见6.3.6节)。文件名*。ORFFE输出的*.ffe文件的名称也记录在*.vesta中,因此在重新打开*.vesta文件后,*.ffe中记录的几何参数将自动列在Geometrical Parameters对话框中(见14.2节)。使用RIETAN-FP进行Rietveld分析后,如果*.vesta文件和标准输入文件*.ins在同意文件夹中,*.vesta中的晶格和结构参数会自动更新。

2、Chem3D(*.cc1)

http://openbabel.org/docs/2.3.1/FileFormats/3D_viewer_Formats.html

3、Crystallographic Information File晶体学信息文件(CIF; *.cif)

http://www.iucr.org/resources/cif/

4、DL_POLY输入文件(*.config)

https://www.scd.stfc.ac.uk/Pages/DL_POLY.aspx

5、Protein Data Bank蛋白质数据库(PDB; *.pdb)

http://www.wwpdb.org/

6、RIETAN-FP/2000的用户输入文件(*.ins)

http://fujioizumi.verse.jp/download/download_Eng.html

输出*.ins的功能,使得能够使用VESTA读取各种格式的晶体数据文件,模拟粉末衍射图谱,并使用RIETAN-FP进行后续的Rietveld精修。请注意,RIETAN-2000和RIETAN-FP的标准输入文件彼此不兼容。VESTA使用模板文件导出RIETAN-FP/2000的输入文件,默认模板文件template.ins,具有RIETAN-FP格式。如果需要RIETAN-2000格式的标准输入文件,请在Preferences对话框中将模板文件更改为RIETAN2000格式的文件(请参见第16章)。

在Rietveld精修或使用RIETAN-FP模拟粉末衍射图谱时,应选择嵌入RIETAN-FP的STRUCTURE TIDY的以下标准晶格设置:

· 单斜晶系:b轴单独设置(β≠90°),

· 三方晶系:六边形晶格(a=b≠c,γ=120°),

· 中心对称空间群:反演心位于原点处(原点选择2)。

除非采用这三种标准设置,被纳入RIETAN-FP中的LAZY PULVERIX无法生成正确的衍射指数hkl及其多重性。因此,VESTA在导出RIETAN-FP/2000格式的*.ins时,会自动将晶体结构的晶格设置转换为标准晶格设置。

需要指出的是,数据库中记录的部分晶体数据中的分数坐标的有效位数太小,例如0.3333而不是0.333333。在这种情况下,请在输出*.ins之前将有效位数增加到6或7。

7、VASP(POSCAR, *.vasp)

http://www.vasp.at/

8、VRML(*.wrl)

http://www.web3d.org/x3d/specifications/vrml/

9、XMol XYZ(*.xyz)

http://en.wikipedia.org/wiki/XYZ_file_format

http://openbabel.org/docs/2.3.1/FileFormats/XYZ_cartesian_coordinates_format.html

10、P1结构(*.p1)

存储晶格参数和单位晶胞中所有原子的原子位置的简单文本文件。原子位置用分数坐标表示,晶体的空间群被转换成P1(三斜晶系,第1号)。在计算模拟中建立初始原子构型时,此格式非常有用。

11、分数坐标(*.xtl)

xtl文件格式的简单文本文件,存储当前图形区域中显示的所有原子的原子位置。原子位置用分数坐标表示。为了方便起见,晶体的空间群被视为P1(三斜晶系,第1号)。

12、MADEL输入文件(*.pme)

虽然VESTA可以执行MADEL(见14.5节),但MADEL的输入文件*.pme,应手动编辑,以计算间隙(空位)位置的静电位势,其分数坐标必须输入*.pme尾部的FORMAT(3F9.6)。强烈建议使用RIETAN-FP系统分发文件中包含的RIETAN-FP–VENUS集成辅助环境,编辑*.pme并运行MADEL将其输入Hidemaru Editor。有关上述辅助环境的详细信息,请阅读分发文件中的Readme_macros.txt。

使用此格式导出文件时,系统会提示输入两个参数,RADIUS和REGION(请参见14.5节)。有关要输入*.pme的这些参数的详细信息,请参阅MADEL的用户手册。13、STRUCTURE TIDY输入文件(*.sto)

体数据

14、PRIMA二进制格式(*.pri)

15、通用体数据格式(*.3ed)

16、周期性体数据格式(*.grd)

17、通用体数据格式(二进制)(*.ggrid)

导出体数据时,最推荐使用通用体数据格式。它是无损的,但是这种格式的文件大小比文本格式甚至其他一些二进制格式的文件小得多。对于周期性体数据,由于更好的压缩效率,下面描述的*.pgrid是首选的。

18、周期性体数据格式(二进制)(*.pgrid)

此文件格式与*.ggrid格式相似,但假设网格具有周期性以最小化数据冗余。当有两个以上的对称操作(由空间群信息集生成或由用户直接编辑)时,只有非对称单元中的网格数据记录在*.pgrid中。

19、压缩体数据格式(*.m3d)

二维数据

假设已打开2D Data Display窗口,在Create New Slice对话框中选择选项“(hkl)plane defined by two vectors”或“project along [hkl] axis”(参见15.5节)。然后,就可以通过从File菜单中选择2D Data Display项,输出2D Data Display窗口中显示的二维数据。请注意,当选择第一个选项“(hkl) plane in the bounding box”时,此功能将被禁用。

例如,金红石型TiO2中距离原点0.5d的(100)晶面上的电子密度输出如下:第六行中的两个整数(65和65)是沿x轴和y轴的分隔数。每个数据行中的三个数据分别是X、Y和密度,其中X和Y分别是从二维图的原点算起的X和Y坐标(单位:?)。

17.5.2 光栅图像

1、BMP

2、EPS

3、JPEG

4、JPEG 2000

5、PNG

6、PPM

7、RAW

8、RGB(SGI)

9、TGA

10、TIFF

图形区域和2D Data Display窗口中显示的结构和体数据的图像可以记录在具有各种图形格式的文件中。保存存储位图图像的文件时,在File菜单中选择Export Raster Image...。导出的图形文件的图像大小将放大为图形区域大小的倍数。在文件选择对话框中输入文件名后,将输入比例因子。VESTA可以导出超出窗口最大宽度和高度的巨大图像,这些图像在启动VESTA后显示在文本区域,例如:

对象的分辨率,即原子和键的叠层和切片数,也由Preferences对话框中设置的两个因子Scale和Increasing factor for stacks/slices进行缩放(请参见12.1.2、12.1.3节和第16章)。

17.5.3 矢量图像

1、封装式PostScript(EPS)

2、便携式文档格式(PDF)

3、PostScript(PS)

4、可缩放矢量图形(SVG)

图形区域和主窗口中显示的结构和体数据的图像可以保存为矢量图像。当保存存储矢量图像的文件时,在File菜单中选择Export Vector Image...。导出矢量图像有一些限制。根据体数据着色的等值面和切面的颜色不能用矢量图像格式表示。多面体、晶面和等值面的半透明多边形在除PDF以外的所有格式中都变得不透明。

17.5.4 输出文本

通过在File菜单中选择Save Output Text...,可以将文本区的内容保存为文本文件。

欲善其事,必先利其器。要想开发速度高,开发工具要选好。

接下来给大家推荐10款CSS代码编辑器。

Visual Studio Code

与其他代码编辑器相比,VisualStudioCode是一个相对较新的代码编辑器,它已迅速成为当前最流行的代码编辑器之一,尤其是在web开发人员中。

它为许多现成的语言提供了大量语法高亮显示,包括CSS和CSS预处理器,如SCSS和LESS。一些扩展,如CSS IntelliSense、CSS Peek和CSS模块,使其在使用CSS时更加强大。

显著特点:速度快,可与Gulp和Grunt等多种语言和工具以及大量扩展一起开箱即用。

Notepad++

一个免费的源代码编辑器,尤其是Windows中的“记事本”替代品。它简单、运行速度快,支持多种语言,包括CSS,并具有Word完成、函数完成和函数参数提示等功能,以帮助在编写CSS时提高效率。

显著特点:语法高亮显示和折叠、宏录制和回放以及文档映射。

WebStorm

JetBrain的IDE实现了包括CSS在内的所有内容的正确自动完成,您还可以随时获得有关CSS问题的通知。它还集成了Styleint等开箱即用的工具,可以帮助您格式化并保持CSS代码的一致性。

显著特点:与Stylent、Grunt、Gulp和NPM等web开发工具无缝集成。用于调试和跟踪的内置工具,以及更智能的自动完成。

Coda

一个内置CSS编辑器的高级代码编辑器,为您提供两种CSS编辑模式,以获得更灵活的设计体验,能够在更改后立即看到结果。除此之外,您还可以在编辑器中的实时预览工具中覆盖网站的CSS。

显著特点:TouchBar集成、实时预览和内置SFTP/FTP。

Atom

Github构建的免费开源代码编辑器。它不仅仅具有代码编辑功能。它有一个与GitHub无缝集成的嵌入式Git控件。您还可以为CSS安装许多附加组件,以增强CSS编辑的体验。

显著特点:可通过各种API轻松扩展和破解,可与CSS和流行的CSS预处理器一起使用。

Sublime Text

一个流行的web开发代码编辑器。它跨平台工作,本机支持多种语言和标记语言,包括CSS,并提供多种扩展以改善编辑器中的CSS编辑体验。它可以说是现代代码编辑器的基本灵感。它引入了多行选择、"Go to Anywhere"和"Command Pallete"等功能,这也提高了开发人员的工作效率。

值得注意的功能:超快的高级代码编辑功能,如"Go to Anywhere"和多行选择,以及subl CLI。

Brackets

由Adobe Systems专门为web开发创建的免费轻量级编辑器。它是用JavaScript、HTML和CSS编写的,并且本机支持CSS预处理器。

它介绍了使用所谓的“内联编辑”进行编辑的独特体验。您可以按Command/Ctrl+E,它将在内联窗口中显示具有该ID的所有CSS选择器,并允许您直接在当前文件中编辑CSS选择器,而不是在多个文件之间跳转。

Espresso

用于代码编辑的漂亮macOS应用程序。它带有一个很好的GUI工具,可以轻松编辑CSS样式。编辑样式表时,此工具将显示在右侧边栏的下半部分。它允许您调整文本样式、文本颜色、对齐方式、字体、大小、行高以及布局,如填充、边距、显示样式、浮动等。

显著特点:用于编辑CSS的GUI工具,本机SCSS和LESS支持,自动完成。

TextMate

macOS的代码编辑器,具有一些高级编辑功能,并支持多种编程语言(包括CSS)。TextMate因其TextMate语法.tmLanguage而颇受欢迎,该语法被许多流行的代码编辑器(如Atom和Sublime Text)采用,以创建语言的自定义语法高亮显示。

显著特点:本机宏支持自动化重复任务、代码段和Shell集成

bbEdit

bbEdit也称为TextWrangler,是为macOS构建的轻量级但高级的代码编辑器。除了一些基本功能,如各种编程语言的语法着色、代码折叠和代码自动完成,bbEdit还内置了SFTP/FTP支持,并与各种macOS功能(如AppleScript、Automator和Unix脚本)无缝集成。

值得注意的功能:macOS集成,以及用于编辑HTML的内置GUI工具。

着环境问题越来越严重,人们越来越重视低碳环保的生活方式。作为码农的我们自然也应该为环保做出应有的贡献。那么什么是低碳环保,简而言之就是就是低能量、低消耗、低开支的生活方式,映射到我们的工作中就是以最低的消耗的来完成组织交给我们的任务。

以下就以 Android 开发为例从库和语言两方面来讨论如何实现低碳环保的编程方式。

从第三方库来说

充分利用现存资源,尽可能不重复造轮子。从以往来看,如果你对现存的轮子有各种不满试图从头写,那么最终结局中可能性最大的就是只写了部分后直接放弃转而成为某个轮子的支持者,写完且比现有轮子要好的可能性还不如转行去大学城门口卖炒面。当然如果你写的是就是 SDK 之类的基础工具,那还是尽量减少依赖为好。

那么该如何挑选第三方库呢?Android 的应用层开发虽然使用 Java 语言,但并不是 Java 上的库都适合 Android 开发。Android 使用的不是 Oracle JDK 也不是 Open JDK,而是 Google 改写过的 Apache Harmony JDK,很多 Oracle JDK 自带的类(特别是 javax 包下的)在 Android 中并不存在,所以使用这些方法的库 Android 不能使用。

此外 Android 存在 65536 问题,这个坑体现在以下两点:

1)Android 机器在应用的安装过程中,系统会运行 dexopt 工具,将 .dex 文件优化为 .odex 文件,其中 dexopt 工具使用了固定的缓冲区大小来保存方法的元信息,低版本的 Android 机器上该缓冲区非常小,所以一旦方法数过多会直接导致 dexopt 崩溃,应用无法运行。

2)Dalvik 指令集对于一个 .dex 文件只能保存 65536 个方法的索引,所以一个 .dex 文件即使可以拥有很多方法,但是那些多余的方法也都是无法运行的。详细信息可以阅读官方的 dalvik-bytecode 的 invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB 条目。

因此选择 Android 的第三库需要严格注意控制方法的总数量。

Android 常用库 vs J2EE 常用库

以下我总结了一些 J2EE 和 Android 上的常用库的对比以供参考,使用这些库可以有效提供编程效率,减少能量消耗:

功能J2EEAndroid备注
JSON 解析JacksonGsonJackson 功能全面,但太大;Gson 速度一般但胜在体积
RestfulJerseyRetrofitJersey 面向服务端,符合 JAX-RS 标准, Retrofit 面向客户端,不符合 JAX-RS 标准
依赖注入GuiceDaggerGuice 使用反射,Dagger 使用预编译,效率不是一个等级的
NoSQLMongoDBRealmRealm 兼容 Android,iOS,ReactNative,比起 Sqlite3 快得多
单元测试JUnitRobolectric + EspressoJUnit 只能运行在 JVM 上,Robolectric 使 Android 代码可以运行在 JVM 上,Espresso 简化 UI 测试流程(虽然很多情况下 UI 测试没什么用)
异步调用CompletableFuture/RxJavaRxJava + RxAndroid +RxLifecycle三合一基本是标配,除此之外还可以加上 RxBinding,RxPermissions,RxAndroidAudio 等等组成完整的 Rx 大家族
网络请求-OkHttp/VolleyOkHttp 功能强大,Fluent API 可以写出更优秀的代码;Volley 由 Google 开发,代码量小容易扩展,有非常优秀的队列机制
时间处理Java 8/Joda-Time-Java 原生时间处理 API 非常糟糕,因此 Java 8 直接加入了 Joda-Time。Joda-Time 虽然易用,但一个只是处理时间的库有 5000 多方法对于 Android 显然不实际,尽管有 joda-time-android 库但通常 Android 端需要处理时间的代码不多,建议还是直接调用难用的原生 API

其它方法

  • 构建良好的 Android 架构,尽量将 Context 相关的一切和业务逻辑进行分离,使业务逻辑能够脱离于 UI 组件进行本地测试。MVC,MVP,MVVM,Flux 之类的只有适合自己才是最好的。也可以参考下 Google 最近开始编写的 Android 架构的示例代码,不得不说 Google 这一步做得是实在有点晚。

  • 引入 Fragment 后 Android 应用的生命周期 过于恐怖,所以尽管 Google 提倡使用 Fragment,但还是能少用就尽量少用。

  • 使用 Timber + Hugo 记录 Log 信息而不是使用原生的 Log 工具,这样无需再自己拼接类名,方法名,参数名和参数值,也不用为了使 Log 更容易被识别加上一堆=========afafaf=============或者 ~~~~~~~~~~~~~~~~~~~~~ 这样的提示符。

  • 使用 Android DataBinding,尽管你不一定喜欢它的数据绑定方式。但是使用了 DataBinding 后你无需调用 findViewById 后再强制进行类型转换,也不用使用 Butter Knife 之类的库编写各种注解。

  • 对于图像加载注重质量和包大小可以使用 Picasso,注重加载速度或者需要支持 GIF 类型和大图片可以使用 Google 人出品的 Glide。除此之外还有老牌的 Universal Image Loader 和相对较新的 Facebook 出品的 Fresco(Fresco 在这里面是重量级选手,无论是功能还是体积,刚推出时坑不少,还有非常严重的内存泄露,目前该库已经作为 React Native 的图片加载库,不知道这些问题都解决了么)

  • 使用 IDEA Live Template 保存常用的类或方法的模板,这是我最常使用的方式,这样有时甚至可以减少近一半的工作量。

  • 强制竖屏,Android 上除了视频播放和游戏大部分情况下竖屏足以,根据 2-8 法则很多时候专门适配横屏是很大的资源浪费

从语言本身来说

以上的方法在实现低碳环保的功能上还是非常有限的,还有一种方法比较偏的方法就是直接从最根本的语言层面进行着手。

使用 Lambda 表达式

使用 Lambda 表达式可以省去不少代码,可惜直到 Java 8 才支持,索性的是 Android 上有一些解决方法。

使用 Retrolambda Gradle Plugin

Retrolambda Gradle 插件可以在编译时通过字节码转换使 Android 能够使用 Lambda 表达式。

开启 Jack 与 Jill

在介绍 Jack 与 Jill 之前先来看看 Android 那坑爹的构建系统,以下图片来自 Google 官方文档,请注意这只是一个大纲,而且有些过时,实际更复杂,想想如果没有 IDE 自己手动敲的痛苦吧:

而 Jack 与 Jill 就是在 Android M 时 Google 为了简化以上流程而推出的构建工具。

以前的主要流程

为了减小 I/O 读取的次数,dx 工具将所有 .class 文件合并成 .dex 文件

javac (.java --> .class) --> dx (.class --> .dex)

使用 Jack 与 Jill

Jill 将第三方 .class 文件和 .jar 文件转换为 .jayce 文件。

Jack 将 .java 和 .jayce 文件合并后转换为优化过的 .dex 文件。

Jack (.java --> .jack --> .dex)

Jill (.class --> .jayce)

当然 Jack 实际是一个工具链,除了以上功能 Jack 还包含了 multidex, proguard 等大量功能,直接替代了原来构建过程中的很多工具。

使用 Jack 与 Jill 还有一个吸引人的特点是可以在今年将发布的 Android N 平台使用上大部分 Java 8 的功能。感兴趣的人可以现在就去尝试一下,但是需要注意的是 IDE 必须大于 Android Studio 2.1 (preview),SDK 平台必须为 Android N Preview SDK。

此外由于 Java 8 提供的 Lambda 表达式实际就是通过函数式接口实现的,所以在使用 Jack 与 Jill 后这一功能也可以直接使用在 Android N 以前的平台,而不用使用 Retrolambda 这些第三方工具(当然其它的 Java 8 功能都不支持)

目前来说 Jack 与 Jill 有一个很大的缺点就是速度较慢,不支持 Instant Run。此外由于不生成中间状态的字节码文件,所以开启 Jack 与 Jill 后基于字节码的各种工具(如 JaCoCo, Mockito)都将无法使用。(注:Gradle 插件在 1.5 版本提供了 Transform API,可以让我们直接对生成的 dex 文件进行处理,但是目前 Jack 与 Jill 不支持,所以使用该种方式 JaCoCo 仍然无法使用)

换种语言

相比较 Lambda 表达式也许换种语言是种更有效的方法。以下就介绍一下适用于 Android 开发的其它语言,当然这并不是说真的需要在实际工作中应用。更多得是因为如果你只会用锤子,那你眼里的所有东西都是钉子,换种语言是为了开拓思路,了解在其它语言中是如何实现同样的功能的。

Java + Native

该方案以 Java 代码为主,以少量 Native 代码为辅。主要有两种实现方式:

Java + C/C++

很明显这种方法非常不环保,基于 NDK 的开发非常复杂,出了错误也不好调试,目前这种方式主要用于 Cocos2D-X 这种游戏引擎。

Java + Go

Go 从 1.5 版本开始同时支持 Android 和 iOS 开发。由于 Go 是 Google 亲儿子所以 1.5 出来时大家对未来都非常期待。不过至今为止实际发展非常缓慢,文档非常稀少。相比较使用 C/C++ 方式使用 Go 有这么几个特点:

优点:

  • 语法简单,开发迅速,不用写头文件,不用写 Makefile,不用手动写 Native 方法,借助插件 Go 代码会被直接编译成包含 .so 文件的 .aar 库,导入 Android 工程后就像写原生 Java 代码一样直接使用即可。

缺点:

  • 文档奇缺,发展缓慢剧。

  • 目前只支持 arm 架构。

  • 有 Bug,我写的代码编译版本选择 API 22 正常运行,选择 API 23 上直接奔溃。

Native + Java

该方案以 Native 代码为主,以少量 Java 代码为辅。最大的特点就是提倡以同一种语言为不同平台编写不同代码,而不是一套代码到处运行。主要代表有以下几种:

RubyMotion

RubyMotion 由 MacRuby 的开发者发明,可以通过 Ruby 代码编写 iOS 和 Android 代码。

优点:

  • 提供了 Android 上的几乎所有的 API 的 Ruby 实现,也可以直接使用 Java 库。

缺点:

  • iOS 还有些文档,Android 方面则没有任何像样的官方文档。导致我在写的时候需要打开 IDEA 先用 Java 写一遍大致框架然后再用 Ruby 进行改写。

  • 不支持直接调用 Java 代码,必须使用打包好后的 Java 库。

  • 除了官方发布的包,不支持其它任何 Gem 上的包。

  • 由于没有钱付正式版,所以我使用的是试用版,使用时不但难以调试,速度慢,而且还 Bug 满天飞,完全没有写 Ruby 的爽快感,正式版估计会好点。

ReactNative

ReactNative 由 Facebook 在去年发布,一经发布瞬间成为 Github 上的网红。可以使用 JavaScript 进行代码的编写以及动态更新是其最大特点。然而相比较 iOS 来说 Android 版本并没有发布多少时间,目前还有不少问题。由于最近在看 ReactNative 所以这里写得稍微详细点:

优点:

  • 使用 JavaScript 编写,ES 6 语法对于 Java 程序员可能更有亲和力。

  • Flex 布局和 JSX 语法和 Android 原生布局方式非常相近,很多属性几乎就是换个名字,容易上手。

  • 支持 HotLoad,写个界面刷一下就行了,Android 开发者终于不用忍受 Gradle 那漫长的编译过程。

缺点:

  • 目前只是 0.2x 版本,不稳定,并且 React Native 本身使用了不少已经标示为废弃的 API, API 有很大可能会大更新。

  • 如果碰到框架本身 Bug,基本没有修复的可能性,只能被动等待官方出解决方案或者切换为 Java 平台。

  • 原生 Android 开发就有各种兼容性问题,特别是对于国内小米,华为,魅族等平台,国外的 React Native 是否能处理得好不得而知。

  • ReactNative 框架自身绑定了不少第三方库,虽然这些库都挺有名的,但也不能保证人人喜欢,人人用得到。

  • 没有重用机制,导致 ListView 效率问题。

  • 没有布局管理器,组件间嵌套严重,实际代码中会有大量 嵌套 的情况,不适合写复杂的布局。

  • Android 有多种类型 Resource 文件,还有 10 多种限定修饰符,React Native 基本都无法使用,意味着在面对屏幕适配,i18n,切换主题等问题时会非常蛋疼。

  • 目前只支持老式的 Drawable 目录下的图片资源,不支持 5.0 以后的 Mipmap 目录下的资源。

  • Flux 和在其基础上的 Redux 架构与 Android 传统开发理念不符,很难吸引到广大码农。

除了以上两个之外 Xamarin 也属于这一类,不过上周微软的一些决定使我个人并不看好它,有兴趣的人可以自行到 Reddit 和 Twitter 上查阅 Xamarin + Libgdx + Microsoft 的相关信息。

其它 JVM 语言

相比较以上方案,使用其它 JVM 语言的最大特点就是可以和 Java 进行无缝切换,开发方式上没有什么变更,很容易让人接受。

Groovy

Groovy 官方从 2.4 开始就支持了 Android 开发。Groovy 本身是动态语言,效率较低。但是可以通过开启静态编译来提高效率。由于 Groovy 在处理 XML 方面是一绝,所以如果你的应用服务器是基于 SOAP 的话,那么使用 Groovy 替换 Java 无疑是更好的选择,原生的 DOM,SAX,PULL 方式使用起来都太痛苦了。

替换成 Groovy 后最大的优点就是上手没有任何什么难度, 毕竟所有 Android 开发者都写过 Groovy (build.gradle 实际就是 Groovy 源文件),而缺点就是编译速度会更慢。

Scala

Android 应用中常常需要将上下文传来传去,所以很多人都会在每个 Activity 写上 mContext=this 这样没营养的代码。而使用了 Scala 后借助隐式参数 + 隐式转换 + 隐式类这三兄弟就不用写这些没有营养的代码。除此之外借助 Scala 各种 FP 特性代码量也可以得到大量减少。

但是替换成 Scala 后有一个致命的弱点就是主流的 Scala 的 2.11.x 版本核心方法多达 5w。这意味着加上 Android 的原生代码,即使你一行代码没写,仅仅是集成 Scala 运行环境后就超过了 65536 的限制。即使开启了 proguard 删除掉那些不用的代码这个问题也没办法根本解决,所以或许将 Scala 搬到 Android 平台并不是一个好的解决方案。

Kotlin

Kotlin 是 JetBrain 研发的一门运行在 JVM 上的语言,官方支持 Android 开发,语法和其之后发布的 Swift 非常相似,所以也有人开发出了 Kotlin 2Swift 的工具,详细对比可以见Swift is like Kotlin。Kotlin 的语法可以看做是 Scala++—,其语法借鉴了 Scala,但是也去除了 Scala 中大量复杂的概念。

在所有 JVM 语言中,目前个人最推荐使用 Kotlin 进行 Android 开发。有以下几个原因:

  • Kotlin 由 JetBrain 开发,所以对 Android Studio 有很好的支持。

  • Android 界举足轻重的 Jake Wharton 大神和其所在的公司 Square 都很欣赏 Kotlin,将一些 Android 库改写为了 Kotlin 版本。

  • Google Android 项目组也对 Kotlin 感兴趣,目前我们常使用的 Databinding 的编译器就是 Kotlin 写的。

  • Kotlin 的运行库只有不到 7000 个方法,这意味着它比 v4 还要小。

  • Google 目前和 Oracle 的官司越演越烈,以前有传言 Google 会使用 Go 作为 Android 的一类语言,但是目前从发展速度来看可能性很小。近日又有传言 Google 会使用 Swift 来代替 Java,个人觉得相比较而言不如说 Kotlin 可能性更大。(补:写完这段不久后 Swift 就仓库就出现了 For Android 的 Pull Request,看了下这玩意是基于 JNI 的,属于上面说的 Java + Native 的开发方式,对于编写应用来说用处不大,不过相信会被不少人炒作一段时间)

  • Kotlin 学习 Clojure 也分为 Kotlin on JVM 和 Kotlin on JavaScript 两个版本。其中 Kotlin on JavaScript 目前内置了 JQuery,但是本身功能很弱,只能写些原始的 JS 代码。如果发展起来的话,说不定将来可以用于编写 ReactNative 代码。

  • Kotlin 没有什么历史负担,增加新特性时无需像 Java 一样思考再三。以下为 Kotlin 目前的 RoadMap,可以看到诸如协程之类的功能 Kotlin 都会在语言层面实现,而不用像 Java 一样必须依赖 Quasar 这种第三方库在字节码方面做文章才行。如果等 Java 实现的话搞不好需要等到 Java 20.

就我个人开发中常使用的 Kotlin 功能有这么几种:

  • 方法扩展,该功能可以给已存在的类添加方法,本质上其实现类似 Scala 中的隐式类。所以你可以直接给 Activity 添加 toast, alert 功能。

  • 使用 DSL 语句来编写界面

  • internal 访问权限。我们知道 Java 中包与包是没有任何关系的,这意味这 a.b 和 a.b.c 实际是两个包。所以在分层时 a.b.c 中不得不暴露大量的 public 方法给 a.b 包中所在的类。而在 SDK 开发中为了有良好的封装性,尽量暴露更少的接口,所以往往不得不将大部分类都放在同一个包中,然后通过 default 访问权限来限制外部访问。类少的时候还能够忍受,类的一多的话就会非常混乱。Kotlin 中的 internal 访问权限可以限制只能属于同一个模块中的类进行访问,其它模块无法访问。那么什么是模块?在 Kotlin 中就是一个 jar 包,所以这功能对 SDK 来说就是神器。

  • Kotlin Android Extension。使用后无需修改任何代码,直接就可以在代码中使用 Xml 中声明的任何的控件。

最后附上一段简单的 kotlin 代码

relativeLayout {

textView {

id=android.R.id.text1

text="Loading..."

}.lparams {

centerInParent()

}

editText {

id=android.R.id.edit

hint="Page Count for retain"

inputType=InputType.TYPE_NUMBER_VARIATION_NORMAL

}.lparams {

below(android.R.id.text1)

centerInParent()

}

button("click") {

}.lparams {

below(android.R.id.edit)

centerInParent()

}.onClick {

println("hello world")

}

}.style {

when(it){

is TextView -> it.textSize=20f

}

}

扯了这么多可能有很多人觉得就这些怎么可能实现低碳环保的编程。没错,你想的很对,要实现低碳环保的编程方式说到底只有唯一一个有效的方法就是说服你的项目经理或者其他有话语权的人取消或修改掉那些不环保的需要,仅此而已。本次扯淡到此为止。以上 Go 和 Ruby 编写 Android 应用的示例可以见 AndroidDemoInOtherLanguages。其它 JVM 语言编写 Android 应用的示例可以见 AndroidDemoIn4Languages。

?―――――――――↓―――――――――?

原文作者来自 MaxLeap 团队_UX成员:Sidney Xu

欢迎关注微信订阅号:从移动到云端

欢迎加入我们的MaxLeap活动群:555973817,我们将不定期做技术分享活动。