AppDeploy是一个通过SSH实现的命令行工具,可完成应用部署和远程运维管理。当前工具实现为两个版本:普通版(伪代码描述语言)和Python版。Python版使用Python语法规则,可实现您的各种应用需求;普通版语法简单、容易上手,是对Python版本的精简。两个版本当前都是免费使用。下载地址如下: 
普通版: 
http://market.aliyun.com/products/53690006/cmgj000331.html?spm=5176.900004.4.2.iTWBiC 
Python版: 
http://market.aliyun.com/products/53690006/cmgj000321.html?spm=5176.9000004.0.0.8AlNTY 
 
1 介绍一下AppDeploy的主要功能 
1).远程应用部署: 
    可以将本地应用安装部署到远程云服务器,软件包可以在本地编译打包好,也可以选择在云服务器编译安装; 
 
2).远程运维管理: 
    您可以使用AppDeploy远程执行shell脚本,让操作命令感觉在本地执行一般,大大的提高开发者的工作效率; 
 
3).一键环境安装: 
    一键安装Web环境,当前支持Java、Nginx、Apache、Tomcat、PHP、Mysql等多款环境,可以根据具体业务选择适合工具的适合版本进行安装; 
 
4).一键应用部署: 
    可以一键编译、打包、部署常见的应用,支持Maven、Ant等打包部署的安装方案; 
 
5).一键式更新源: 
    执行AppDeploy自定义命令(update_source)更新系统源,支持Ubuntu、Centos、Redhat、Opensuse、Debian等系统的主流版本; 
 
6).文件上传下载: 
    您可以使用AppDeploy在本地主机和远程服务器间实现上传、下载文件(夹)的功能;不仅实现了ftp的功能,还可以远程执行管理命令; 
 
7).并发控制机器: 
    基于软件的部署场景,提供同时在多台服务器部署的功能,且可以选择顺序执行或者并发执行的运行模式;上面叙述的功能都可以使用并发模式在多服务器间同时运行。 
 
8).账号密码管理: 
    提供灵活、易用的账号管理功能,用户可以设置免密码输入运行,且可为不同主机设置不同密码; 
 
 
2.AppDeploy的安装& 配置 
AppDeploy支持在Windows、Linux、Mac系统下使用,远端服务器当前只支持Linux系统。根据不同系统分别介绍安装步骤(以Python版为例,普通版类似): 
 
Linux系统平台安装: 
请预先安装好python2.7;(一般安装在/usr/local/lib/python2.7) 
1).通过阿里云市场下载AppDeploy源码安装包 - AppDeploy-Python-1.0.0.tar.gz; 
 
2).解压:$ tar –zvxf AppDeploy-Python-1.0.0.tar.gz;得到AppDeploy-Python-1.0.0-Linux.tar.gz; 
    解压:$ tar –zvxf AppDeploy-Python-1.0.0-Linux.tar.gz; 
 
 
3).执行:$ cd AppDeploy-Python && sudo python setup.py install 安装appdeploy; 
 
 
4).执行:$ adep命令,若果能找到命令说明安装完成(下图表示安装成功); 
     
Windows系统安装: 
预先安装好python2.7;(一般安装在C:/Python27); 
1).通过阿里云市场下载AppDeploy windows安装包 - AppDeploy-Python-1.0.1.zip; 
 
 
2).解压:$ tar –zvxf AppDeploy-Python-1.0.1.tar.gz ->AppDeploy-Python-1.0.1-Windows.tar.gz; 
 
 
3).解压:$ tar –zvxf AppDeploy-Python-1.0.1-Windows.tar.gz;解压后可以发现一个安装文件setup.exe安装包,即为AppDeploy的安装文件; 
 
 
4).双击setup.exe,双击setup.exe(确定预先安装python2.7),出现如下AppDeploy的安装视图,安装目录应该选择Python2.7的安装目录下的Lib\site-packets子目录; 
     
5).根据向导直到安装完成; 
6).设置环境变量: 
  环境变量一般为自动设置,不过这里您可以确认一下,以保证正常运行; 
  右键“计算机” – 选择属性– 选择“高级系统设置”– 选择高级– 选择“环境变量”:添加环境变量,名字(APPDEPLOY)值(C:\Python27\Lib\site-packages);在path系统变量中添加“C:\Python27;%APPDEPLOY%; C:\Python27;”,分别为Python2.7的安装目录和AppDeploy的安装目录; 
 
 
7).验证:打开cmd命令行工具, 
  输入:python,如果能运行,则说明python已经可用; 
  输入:adep,如果显示下面日志,则说明安装成功; 
    

 
Mac系统安装:(请预先安装好python2.7)
1).下载AppDeploy-python-1.0.1.tar.gz,解压可以得到AppDeploy- python-1.0.1-Mac.zip 的压缩包,解压AppDeploy- python-1.0.1-Mac.zip,得到pycrypto-2.6.1.tar.gz& AppDeploy- python-1.0.1.tar.gz;
 
2).若您系统中尚未安装pycrypto-2.6.1.tar.gz,解压后进入pycrypto-2.6.1,执行$ sudopython setup.py install;若已经安装,直接进入步骤3;
3).解压AppDeploy-python-1.0.1.tar.gz,进入appdeploy-python-1.0.1后执行$ sudo pythonsetup.py install;

4).进入命令行执行$ adep,出现如下视图说明安装成功:

  

3.基本使用方法 
AppDeploy的使用格式是在命令行执行adep + 参数 的命令格式运行,其执行的任务依据是根据其当前工作目录下的appdeploy.py(默认)这个python文件作为执行描述文件,若用户有自定义的描述文件,可用”-f”参数指定。使用方式细分有两种: 
 
 
1)通过命令行,直接执行命令 
格式:$ adep[options] -- [shell command]

   Option:为命令选项定义执行参数; 
  “--”:双横线,为分割符将前面的参数和后面的shell命令分开; 
    [shell command]:shell命令,会被在远端服务器执行;

常用的option选项: 
      
例如:查看服务器nginx运行情况 
$ adep -H '101.200.184.144' -u root -p xxxx -- ps-aux | grep nginx 
     
PS:上面方式使用方便,可以灵活、快速的执行您想执行的命令,但实现的功能相对简单,大部分情况下,您可以使用下面的方式实现您的具体任务; 
 
 
2)通过编辑appdeploy.py文件,以任务方式执行 
在appdeploy.py文件中定义函数(任务的实现细节),并在命令行的当前目录下执行$ adeptask1 task2(文件中定义的函数名)的方式依次执行定义的任务; 
appdeploy.py的编写规则: 
    

下面分别介绍AppDeploy自定义的环境变量、操作命令、修饰符、并发执行等细节。
 

4.获取设置Access Key 
因为AppDeploy工具基于阿里云产品设计实现,其某些功能会基于阿里云OpenApi实现,所以需要设置Access Key的值以获取调用OpenApi的资格。 
 
 
获取Access Key的方法请参考:http://bbs.aliyun.com/read/253666.html?spm=5176.7189909.0.0.l1LU3c&fpage=2 
得到的Access KeyID和Access Key Secret通过以下方式配置到AppDeploy中:

在Appdeploy.py描述文件中设置env.ak_id(Access Key ID)和env.ak_sec(AccessKey Secret)变量;如下图所示:

 
5.环境变量

AppDeploy工具通过自定义的环境变量来提高程序的可读性、以及描述文件的灵活性等;以下是常用的环境变量及其说明:
   
Hosts变量详细说明:
用来定义需要连接的服务器地址集,在执行appdeploy.py中任务时会在hosts定义的每个服务器上运行一遍;定义格式:
env.hosts = ['host1', 'host2']: 表示两个远端服务器,分别是host1和host2.

env.hosts = ['host1', 'user2@host2', 'host3']: 表示一共三个远端服务器host1、host2、host3,其中host2使用user2用户名登录,host1和host3的用户名使用env.user定义的值;
 
例如:在appdeploy.py中定义:
env.hosts = ['host1', 'host2']

def task1():
    run(ls)
则执行:$ adeptask1时,会在host1、host2上分别执行ls命令;
 
User详细说明:
定义远程服务器的登录名,如果没有定义,则默认为本地机器的当前用户名;
例如:
env.user = 'user1'
 
Password & Passwords详细说明:
首先推荐使用SSH提供的密钥管理机制来实现免密码输入模式,可查阅资料;这里着重介绍AppDeploy提供的密码管理方案。
 
AppDeploy提供了两层管理密码的机制:
如果您的servers的密码都相同,可以通过在env.password中设置统一密码;
如果每个server的密码不同,可以在env.passwords中设置host与password对应表(Json格式),对每个server设置单独的密码;host的格式:user@host:port;
例如:
env.password=’xxxxx’; 统一密码;
env.passwords={'root@101.200.184.144:22':’xxx’, 'root@123.57.228.240:22':’yyy’}
 
parallel详细说明:
Parallel设置时表明指定的任务在不同的服务器之间并发执行;格式为在任务前面:@parallel(pool_size=5),其中pool_size指最多同时并发的个数,若不指定pool_size,则默认不加限制;
定义了parallel只是一个任务在多个服务器之间并行,但不同的任务之间还是顺序执行;
例如:
@parallel

def task1():
    pass
def task2():
    pass
$ adep -H host1,host2,host3 task1task2
结果:
Task1 on host1, host2, andhost3
Task2 on host1
Task2 on host2
Task2 on host3
 
Roledefs & Roles详细说明:
AppDeploy可以为服务器地址定义组,用户可以基于不同组完成不同集群的部署,这样用户可以根据自己的业务定义不同的组群。格式为JSON实现格式。
Roles与Hosts一样,都可以指定服务器地址集合,只是Roles引用的服务器地址是经过Roledefs定义的组名。
例如:
env.roledefs = {

   'apphosts': [‘host1', 'host2', 'host3'],
   'webhosts': ['host3', 'host4']
}
@roles('apphosts')
@hosts('host3', 'host5')
def task1():
    run('ls/var/www')
执行:$ adeptask1
会在host1、host2、host3、host5依次执行,host3出现两次,被合并;
 

6.执行命令 
环境变量定义任务执行的相关环境参数:如用户名、密码等,而任务的具体执行是很多具体指令组成的,下面是AppDeploy自定义的执行命令集; 
  

Get命令详细说明:
Get命令的功能是下载远端服务器上的文件或文件夹,根据不同常见可以如下格式:
get('/path/to/remote_file.txt', 'local_dir')
新建local_dir并保存文件;
get('/var/log/apache2/access.log', '%(path)s')
下载access.log的文件,保存在相同目录;
get('/var/log', '%(path)s')
递归下载/var/log下面所有文件;
get('/var/log', ‘%(host)s/%(path)s’)
多个host时,保存在不同目录;
 
Put命令详细说明:
Put命令功能是将本地的文件、文件夹上传到远端服务器(一台或多台);
put('/path/test.txt', '/root/') 将本地文件test.txt上传到指定的服务器/root下;

put('/path/test', '/root/') 将本地文件夹下面所有文件上传到指定服务器/root下;
put('/path/test.txt', '/root/') 将本地文件test.txt上传到指定的服务器/root下,并设置权限;
 
Prompt命令详细说明:
Prompt命令为用户提供一种交互式的选择功能,可以在程序运行时跳出选项供选择:
env = prompt('Please specify target environment: ')可以在运行时输入内容,并保存在env中;

prompt('Specify dish: ', 'dish', default='spam & eggs')设置默认输入内容,不输入是用默认值;
prompt('Please specify level: ', key='nice', validate=int)设定输入的内容只能是整数;
 

7.修饰符

AppDeploy通过定义修饰符来灵活的执行appdeploy.py中的任务,常用的修饰符有:hosts、parallel、roles、serial、task等,分别用例子描述他们的使用方法;
 
Hosts修饰符:
hosts即为环境变量的名字,也可以用作修饰符来定义任务目标服务器。
 
@hosts('user1@host1', 'host2','user3@host3')
def task1():
    pass
上例表明task1会在host1、host2、host3三个服务器上执行,其中在host1、host3上分别用user1和user3登录,host2上用env.user定义的用户名登录。
 
Parallel修饰符
@parallel修饰符表明修饰的任务会在多个服务器之间并发执行;
env.hosts = [‘host1’, ‘host2’]

@parallel
def task1():
    pass
执行$ adeptask1时,task1会在host1、host2上同时执行;
 
Task修饰符:
@task含义是:如果一个appdeploy.py中使用了@task,则所有函数都不再默认为任务(不对adep命令可用),除非其前面标示了@task标示。如果appdeploy.py中没有任务前面使     用@task标示,则所有函数都会默认为任务,可以被用户调用;
例如:
@task

def task1():
   run("ls")
def task2():
    run("pwd")
$ adep –list
结果是:task2被看作appdeploy.py的内部函数,不被暴漏给用户使用。
Available commands:
    task1
 
serial修饰符:
@serial的含义和@parallel相反,作用是:如果全局设置了并发执行,但某个任务前面使用了@serial参数,则这个任务依然用顺序执行模式。
 

以上内容从AK设置、环境变量、自定义命令、修饰符等方面描述了AppDeploy的使用方法,下面以一个具体例子将上面内容展现出来。

 
# -*- coding: utf-8 -*-  
from src.api import * 
 
env.ak_id="xxx"                                          
env.ak_sec="xxx"                                         
env.user = 'root'                                           
env.password='xxx'                                       
env.hosts = ['101.200.184.144','root@123.57.53.193:22'] 
env.roledefs = {                                         
   'apphosts': ['101.200.184.144'], 
   'webhosts': ['root@123.57.53.193:22'] 

 
@task                                                   
def file_copy(): 
   put('./test', '/root/')                              
   get('/root/test', './test')                          
 
@task 
@roles('webhosts')                                       
def remote_exec(cmd): 
   local('echo "run your cmd on remote hosts"')         
   run(cmd)                                             
 
def useless():                                           
   run('pwd')
 
 
 
 
# Access Key ID 
# Access Key Secret 
# 统一用户名 
# 统一密码 
# 定义hosts变量 
# 定义不同用户组 
 
 
 
 
# 表明这个函数可以被执行 
 
# 上传文件夹 
# 下载文件夹 
 
 
# 指定服务器集群 
 
# 本地执行命令 
# 远程执行命令 
 
# 没有@task,不能被执行

8.上传下载文件(夹) 
 
 
AppDeploy对文件的上传、下载提供两种实现方式: 
一种方式:是在appdeploy.py中定义文件上传下载的任务,然后再命令行执行$ adep task以实现文件的上传下载功能。这种方式可以实现复杂逻辑的上传下载功能,例如:上传不同目录下、不同服务器的文件,但使用稍微繁琐,简单的上传下载功能参考方式二。 
 
 
另一种方式:直接使用adep 的命令行,格式如下: 
$ adep put:local_file,remote_dir 
$ adep get:remote_file,local_dir 
注意上述命令中没有空格,若目录中空格,可以用引号扩起来。下面是一些例子供参考: 
 
 
1)将本地文件a.txt上传到服务器/root/目录下; 
    
2)本地”D:\ProgramFiles\”目录下的b.txt上传到服务器/root/目录下; 
    
3)将服务器/root/b.txt文件下载到本地; 
    
4)将本地的./test/目录(及包含文件)上传到服务器/root/下面; 
    
5)下面服务器/root/test目录到本地的./test1/目录下; 
    
9.远程执行命令 
AppDeploy工具内置了run指令做远程执行命令,在编辑appdeploy.py中的任务时使用run命令可以轻松实现远程执行,而在命令行想执行一个远程命令如何实现呢? 
AppDeploy提供了两种实现方式: 
 
 
一种方式:在命令行执行$ adep [options] -- [shell command], option为命令的参数。 
例如:查看服务器/root/test/文件夹里的文件列表; 
     
另一种方式:在命令行中使用 $ adep run:”shell command”,需要注意的是run和后面的shell 命令之间用“:”连接,且无空格,如果shell命令有空格,请用引号将其引起来。 
     
10.一键更新源站 
买好了ECS机器,安装完了系统,大部分用户都需要更新系统源这个任务。AppDeploy为大家搜集了阿里云服务器上最常用、高效的源站链接,并提供一键更新的功能。此功能已经支持Ubuntu、Centos、Fedora、Opensuse、Debain等Unix系统。 
 
 
更新源站命令: $ adep update_source 
        
11.并发执行

Appdeploy默认是串行执行所有命令的。但在设定参数的情况下可以实现并发执行任务。
AppDeploy有两种方式并发执行任务:
1)在命令行执行任务时添加-P 选项,则执行的所有任务都会在不同的服务器之间并发执行,但不同任务之间依然按照顺序执行进行;
例如:
$ adep -P -H host1,host2update reload
执行结果
update on host1 and host2
reload on host1 and host2
 
2)通过在appdeploy.py文件中的任务前面添加@parallel来表明某个任务会被并行执行;
例如:
def task1():
    pass
@parallel
def task2():
    pass
$adep -H host1,host2,host3 task1 task2
结果:
Task1 on host1
Task1 on host2
Task1 on host3
Task2 on host1,host2, and host3
$adep -P -H host1,host2,host3 task1 task2
结果:(-P参数会覆盖appdeploy中的定义)
Task1 on host1,host2, and host3
Task2 on host1,host2, and host3

此类命令是基于用户工作习惯的总结,如果您有想新添加的功能或快捷方式,请与我们联系,我们会考虑将您需要的功能添加到工具的下个版本。 
 
 
AppDeploy设计之初的重点研究对象就是应用部署,然而工具在开发初期更多的侧重于底层信息流的互通和通用功能的实现。当前AppDeploy工具对应用部署的支持还不是很全面,这正是我们近期需要加强的地方。 
 
 
应用的部署相关工作可分为:服务器端的运行环境安装、应用的编译打包、应用的上传部署; 
 
 
12.服务器端的运行环境安装 
当前[font=&amp]AppDeploy更多侧重w[font=&amp]eb服务器安装,[font=&amp]AppDeploy支持常用W[font=&amp]eb环境的一键安装功能,支持的环境和版本见下表: 
       
然而上述有些环境在不同操作系统上依赖库、安装细节等都不相同,所以当前无法保证以上工具能在所有操作系统环境安装无误,若出现安装失败,请查看错误日志或联系我们的邮箱。 安装步骤如下: 
1)编辑appdeploy.py文件,输入希望运行的web环境组件。 
2)定义一个任务,任务中调用appdeploy的内置函数:install_runtime(para),参数para为想要安装的web组件细节,使用json格式输入。  
3)在命令行执行执行:$adep runtime即可。 
 
例子1:服务器上安装Jdk-1.7.0和Tomcat-7.0.63的运行环境 
1)在appdeploy.py中定义任务runtime,并调用install_runtime(compontens)函数,参数为要安装的jdk、tomcat版本号,用json格式输入。

def runtime():   componets={"jdk"    :"1.7.0", 
           "tomcat"  :"7.0.63"  } 
    install_runtime(componets)

2)在命令行执行:$ adep runtime执行安装过程, 
     
 
3)IE中输入访问地址,验证安装结果,下图表明tomcat已经安装成功。 
    [attachment=81519] 
 
例子2:服务器上安装apache和Tomcat-7.0.63的运行环境 
1)在appdeploy.py中定义任务runtime,并调用install_runtime(compontens)函数,参数为要安装的Apache、PHP版本号,用json格式输入。

def runtime():    componets={" apache"    : " 2.2.31", 
           "php"        : "5.0",              } 
    install_runtime(componets)

2)在命令行执行:$ adep runtime执行安装过程, 
    [attachment=81520] 
 
3)IE中输入访问地址,验证安装结果,下图表明PHP已经安装成功(hello.php是环境安装后放到php指定目录下的文件); 
    [attachment=81521] 
 
13.应用打包部署 
例子1:将本地Java应用部署到服务器。 
结合上面环境安装的例子(1),将本地一个java应用部署到服务器。 
 
1)在appdeploy.py中添加如下任务,任务中定义:打包工具、本地项目目录、服务器端的web应用目录,并调用打包、部署命令package和deploy接口。

def pack_deploy():   componets={"package_tool": "maven", 
              "project_dir" : "/home/xxx/src/example/maven/myFirstWebApp",               
              "web_dir"   :"/alidata/server/tomcat/webapps" 
               }  
    package(componets) 
    deploy(componets)

2)在命令行输入命令:$ adep pack_deploy执行打包部署任务,如下: 
    [attachment=81522] 
 
3)在IE上输入应用地址,检查部署效果。下图表示应用部署成功: 
    [attachment=81523] 
 
应用部署是AppDeploy以后重点研究方向,我们深知当前做的还很有限,也正是借此机会和广大开发者交流,希望您能把工具的不足之处和您自己的需求发送给我们,一起把应用部署方案做到更新、更方便使用。

旺旺账号:阿云开发者效率
 
欢迎下载使用阿里云AppDeploy,期待您的反馈和建议!!

普通版: 
http://market.aliyun.com/products/53690006/cmgj000331.html?spm=5176.900004.4.2.iTWBiC 
Python版: 
http://market.aliyun.com/products/53690006/cmgj000321.html?spm=5176.9000004.0.0.8AlNTY

阿里云运维部署工具AppDeploy详细教程|云虚拟主机 - 开发者论坛
https://bbs.aliyun.com/read/253884.html

阿里云运维部署工具AppDeploy详细教程的更多相关文章

  1. 使用Chef管理windows集群 | 运维自动化工具

    但凡服务器上了一定规模(百台以上),普通的ssh登录管理的模式就越来越举步维艰.试想Linux发布了一个高危漏洞的补丁,你要把手下成百上千台机器都更新该补丁,如果没有一种自动化方式,那么至少要耗上大半 ...

  2. 阿里云ECS服务器部署HADOOP集群(四):Hive本地模式的安装

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建. 本地模式需要采用MySQL数据库存储数据. 1 环境介绍 一台阿里云ECS服务器:master ...

  3. Istio的运维-诊断工具(istio 系列五)

    Istio的运维-诊断工具 在参考官方文档的时候发现环境偶尔会出现问题,因此插入一章与调试有关的内容,便于简单问题的定位.涵盖官方文档的诊断工具章节 目录 Istio的运维-诊断工具 使用istioc ...

  4. 做一个能对标阿里云的前端APM工具(下)

    上篇请访问这里做一个能对标阿里云的前端APM工具(上) 样本多样性问题 上一小节中的实施方案是微观的,即单次性的.具体的.但是从宏观上看,我需要保证性能测试是公允的,符合大众预期的.为了达到这种效果, ...

  5. Ansible运维自动化工具19个常用模块使用实例【转】

    一.模块列表 1.setup 2.ping 3.file 4.copy 5.command 6.shell 7.script 8.cron 9.yum 10.service 11.group 12.u ...

  6. unigui在阿里云服务器上部署

    unigui在阿里云服务器上部署 客户租用了阿里云WINDOWS2008服务器,部署UNIGUI发现死活不行,WINDOWS2008自带的IE9浏览器打开URL,卡死在loading...... 我远 ...

  7. 阿里云服务器 ECS 部署lamp:centos+apache+mysql+php安装配置方法 (centos7)

    阿里云服务器 ECS 部署lamp:centos+apache+mysql+php安装配置方法 (centos7) 1.效果图 1 2. 部署步骤 1 1. mysql安装附加(centos7) 7 ...

  8. thinkphp项目阿里云ECS服务器部署

    [日记]thinkphp项目阿里云ECS服务器部署   项目本地开发告一段落.准备上传到服务器上测试 技术组成 thinkphp+mysql+阿里ECS  代码管理方式git 一.阿里ECS服务器配置 ...

  9. spring-boot-plus运维部署(八)

    spring-boot-plus运维部署 线上部署 打包环境为prod mvn clean package -Pprod 打包后的目录 cd target/spring-boot-plus-1.2.0 ...

随机推荐

  1. http访问tomcat server的一个流程

    Tomcat Server处理一个http请求的过程 假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080 ...

  2. javascript中top、clientTop、scrollTop、offsetTop的讲解(转载加总结)

    scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最 ...

  3. ADOdb 支持的数据库包括哪些?

    ADOdb 支持的数据库包括 MySQL, PostgreSQL,Interbase,Firebird,Informix,Oracle,MS SQL 7,Foxpro,Access,ADO,Sybas ...

  4. jdk 与jre

    1. 定义JRE(Java Runtime Enviroment)是Java的运行环境.面向Java程序的使用者,而不是开发者.如果你仅下载并安装了JRE,那么你的系统只能运行Java程序.JRE是运 ...

  5. ubuntu ndk 开发

      参考 https://developer.android.com/ndk/index.html   配置 下载android-ndk-r10d-linux-x86_64.bin  ,运行自解压. ...

  6. The "get" method should be used when the form is idempotent---正交的两个概念 get 幂等

    https://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.1 17.13.1 Form submission method The me ...

  7. iOS-CoreLocation地理编码(转载)

    一.简单说明 CLGeocoder:地理编码器,其中Geo是地理的英文单词Geography的简写. 1.使用CLGeocoder可以完成“地理编码”和“反地理编码” 地理编码:根据给定的地名,获得具 ...

  8. php 实现 二维码 扫描登录

    本人简单实现的示例,使用任意二维码工具打开二维码对应链接 http://www.54php.cn/demo1/scan 原理介绍: 第一步:访问登录页面,生成唯一key,例如MkhjDFL=,并且将此 ...

  9. The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:

    运行环境: Intellij idea 14 在改了项目名称. 运行时候出现了 The APR based Apache Tomcat Native library which allows opti ...

  10. mySql的普通索引和复合索引

    有关普通索引和组合索引问题: 索引分单列索引和组合索引:单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引:组合索引,即一个索包含多个列.   MySQL索引类型包括:   ...