首页 文章 精选 留言 我的

精选列表

搜索[天气应用],共10012篇文章
优秀的个人博客,低调大师

go Flag应用

仿nginx命令行 go语言些命令行程序是不错的选择,所以它可以轻松达到如上图类似nginx命令行的效果 例子 package main import ( "flag" "fmt" "os" ) // var ( h bool v,V bool t,T bool q *bool s string p string c string g string n int64 ) func init(){ flag.BoolVar(&h,"h",false,"this help") flag.BoolVar(&v,"v",false,"show version and exit") flag.BoolVar(&V,"V",false,"show version and configure options then exit") flag.BoolVar(&t,"t",false,"test configuration and exit") flag.BoolVar(&T,"T",false,"test configuration,dump it and exit") //另一中绑定方式 q = flag.Bool("q",false,"suppress non-error messages during configuration testing") //注意’signal‘,默认是 -S string 有了`signal`之后,变为-s signal flag.StringVar(&s,"s","","send `signal` to a master") flag.StringVar(&p,"p","/usr/local/nginx","set configuration `file`") flag.StringVar(&c,"c","conf/nginx.conf","set confiruration `file`") flag.StringVar(&g,"g","conf/nginx.conf","set global `directives` out of configuraton file") flag.Int64Var(&n,"n",0,"set `number`") //改变默认的usage flag.Usage=Usage } func main() { flag.Parse() if h { flag.Usage() } if len(s)!=0{ fmt.Println(s) } if n !=0{ fmt.Println(n) } } func Usage() { fmt.Fprintf(os.Stderr,`nginx version: nginx/1.10.0 Usage:nginx [-hvVtTq] [-n number] [-s signal] [-c filename] [-p prefix] [-g directives] Options: `) flag.PrintDefaults() } 先执行go build或go install 编译代码 执行FlagPrac -h 命令就可以输出帮助信息了 执行FlagPrac -s wang 执行FlagPrac -s wang Flag 概述 参考:标准库—命令行参数解析FLAG 两种定义Flag方式 Flag.Xxx() 其中Xxx可以是Int,String等;返回一个相应类型的指针,如: q = flag.Bool("q",false,"suppress non-error messages during configuration testing") Flag.XxxVar() 将flag绑定到一个变量上,如: flag.BoolVar(&h,"h",false,"this help") 另外还可以创建自定义flag,只要实现flag.Value接口即可 Flag解析 在所有的flag定义完成之后,可以通过调用flag.Prarse()进行解析,命令行flag的语法有如下三种方式: flag //只支持bool类型 flag=x flag x //只支持非bool类型 int类型可以是十进制、十六进制、八进制甚至是负数;bool类型可以是1, 0, t, f, true, false, TRUE, FALSE, True, False。Duration可以接受任何time.ParseDuration能解析的类型 类型和函数 ErrHelp:该错误类型用于当命令行指定了-help参数但没有定义时。 Usage:这是一个函数,用于输出所有定义了的命令行参数和帮助信息(usage message)。一般,当命令行参数解析出错时,该函数会被调用。我们可以指定自己的Usage函数,即:flag.Usage = func(){}

优秀的个人博客,低调大师

KVM实例应用

一、需求 公司近一台DELL T460机器回来,虚拟30台来跑hadoop集群测试的,虚拟化用的KVM技术,这当中第一次使用,在部署安装过程,入了不少坑。故把整个过程写下来。 二、部署步聚 1、所需要软件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@KVMqemu] #rpm-qa|grep-E'qemu|libvirt|virt' virt-what-1.11-1.2.el6.x86_64 libgovirt-0.3.2-1.el6_7.2.x86_64 libvirt-0.10.2-54.el6_7.6.x86_64 virt-viewer-2.0-7.el6.x86_64 libvirt-python-0.10.2-54.el6_7.6.x86_64 qemu-kvm-0.12.1.2-2.479.el6_7.4.x86_64 virt-manager-0.9.0-29.el6_7.1.x86_64 virt- top -1.0.4-3.15.el6.x86_64 python-virtinst-0.600.0-29.el6.noarch gpxe-roms-qemu-0.9.7-6.14.el6.noarch qemu-kvm-tools-0.12.1.2-2.479.el6_7.4.x86_64 libvirt-client-0.10.2-54.el6_7.6.x86_64 qemu-img-0.12.1.2-2.479.el6_7.4.x86_64 在KVM环境上,以上rpm包都是必需的。 2、安装图形化其他组件 1 2 3 4 5 6 #yumgroupinstall"Desktop""DesktopPlatform""DesktopPlatformDevelopment""Fonts""GeneralPurposeDesktop""GraphicalAdministrationTools""GrahicsCreationTools""InputMethods""XWindowSystem""ChineseSupport[zh]""InternetBrowser" #yuminstalllibvirt-client #yuminstallgpxe-roms-qemu-y #yuminstalllibvirt-pythonpython-virtinstqemu-kvm 3、安装桥工具并配置桥接网卡 1 yum install bridge-utils 1 2 3 4 5 6 7 8 9 10 root@KVM~] #cat/etc/sysconfig/network-scripts/ifcfg-br0 DEVICE= "br0" ONBOOT= "yes" NM_CONTROLLED=no BOOTPROTO= "static" TYPE= "Bridge" IPADDR=10.1.2.218 NETMASK=255.255.255.0 GATEWAY=10.1.2.254 DNS1=114.114.114.114 1 2 3 4 5 6 7 8 9 [root@KVM~] #cat/etc/sysconfig/network-scripts/ifcfg-em1 DEVICE=em1 HWADDR=14:18:77:54:2F:A4 TYPE=Ethernet UUID=9183c4ff-432c-4141-ae6a-74c40d58732d ONBOOT= yes NM_CONTROLLED=no BOOTPROTO=none BRIDGE=br0 3、安装VNC 1 2 #yuminstall-ytigervnc #yuminstall-ytigervnc-server 在这里注意了,安装tigervnc,那么用到pc连接过去时,自然也需要要安装tigervnc电脑版 配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@KVM~] #cat/etc/sysconfig/vncservers #TheVNCSERVERSvariableisalistofdisplay:userpairs. # #UncommentthelinesbelowtostartaVNCserverondisplay:2 #asmy'myusername'(adjustthistoyourown).Youwillalso #needtosetaVNCpassword;run'manvncpasswd'toseehow #todothat. # #DONOTRUNTHISSERVICEifyourlocalareanetworkis #untrusted!ForasecurewayofusingVNC,seethisURL: #https://access.redhat.com/knowledge/solutions/7027 #Use"-nolistentcp"topreventXconnectionstoyourVNCserverviaTCP. #Use"-localhost"topreventremoteVNCclientsconnectingexceptwhen #doingsothroughasecuretunnel.Seethe"-via"optioninthe #`manvncviewer'manualpage. #VNCSERVERS="2:myusername" #VNCSERVERARGS[2]="-geometry800x600-nolistentcp-localhost" VNCSERVERS= "1:root" VNCSERVERARGS[1]= "-geometry800x600-depth32" 4、创建磁盘 1 qemu-imgcreate-fqcow2-osize=200G,preallocation= "metadata" /data1/hadoop/images/kvmhadoop222.qcow2 5、使用virt-install创建虚拟机并安装GuestOS 1 virt- install --virt- type kvm--namekvmhadoop222-- ram 16384--cdrom= /root/CentOS-6 .7-x86_64-LiveDVD.iso--diskpath= /data1/hadoop/hadoop2/kvmhadoop202 .qcow2--graphicsvnc,listen=0.0.0.0,port=5903--noautoconsole--os- type =linux--os-variant=rhel6--networkbridge=br0,model=virtio 6、用vnc连接 7、接下来就是安装操作系统了(省略) 注意了,安装完操作系统,然后关闭再重启启动 1 virshdestroykvmhadoop222 1 virshstartkvmhadoop222 8、虚拟机列表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@KVM~] #virshlist IdNameState ---------------------------------------------------- 19kvmhadoop223running 21kvmhadoop228running 22kvmhadoop229running 23kvmhadoop230running 24kvmhadoop231running 25kvmhadoop232running 30kvmhadoop221running 31kvmhadoop222running 36kvmhadoop233running 37kvmhadoop234running 38kvmhadoop235running 39kvmhadoop236running 40kvmhadoop224running 9、修改端口号,到配置文件 1 2 3 4 5 [root@KVMqemu] #pwd /etc/libvirt/qemu [root@KVMqemu] #ls kvmhadoop202.xml.bakkvmhadoop222.xmlkvmhadoop223.xmlkvmhadoop228.xmlkvmhadoop230.xmlkvmhadoop232.xmlkvmhadoop234.xmlkvmhadoop236.xml kvmhadoop221.xmlkvmhadoop222.xml.bakkvmhadoop224.xmlkvmhadoop229.xmlkvmhadoop231.xmlkvmhadoop233.xmlkvmhadoop235.xmlnetworks 10、修改端口,记得从XML配置文件定义一个domian,相当于注册一个domain但是不启动。 1 #virshdefine/etc/libvirt/qemu/kvmhadoop222.xml 11、然后就是启动了 12、宿主机开机自动启动虚拟机设置 1 2 3 4 5 6 7 8 9 10 #/bin/bash #Program #Automaticvirtualmachinecommand #History #2016/04/1qingyunfirstrelease Array=(222223224228229230231232233234235236) for i in ${Array[@]} do virshautostartkvmhadoop$i done 13、开机启动虚拟机脚本 1 2 3 4 5 6 7 8 9 10 #/bin/bash #Program #Automaticvirtualmachinecommand #History #2016/04/1qingyunfirstrelease Array=(222223224228229230231232233234235236) for i in ${Array[@]} do virshstartkvmhadoop$i done 本文转自 zouqingyun 51CTO博客,原文链接:http://blog.51cto.com/zouqingyun/1758928,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- PullToRefresh应用

PullToRefresh 支持ListView、ExpandableListView、GridView、WebView 下载地址:https://github.com/chrisbanes/Android-PullToRefresh 注意,若是要放到android studio中的话,需要在eclipse中以android studio工程的方式导出。 Code 布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MyActivity"> <com.handmark.pulltorefresh.library.PullToRefreshListView android:id="@+id/lv_main" android:layout_width="fill_parent" android:layout_height="fill_parent"></com.handmark.pulltorefresh.library.PullToRefreshListView> </LinearLayout> 配置: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mList = new ArrayList<String>(); for (int i = 0; i < mStr.length; i++) { mList.add(mStr[i]); } mListView = (PullToRefreshListView) findViewById(R.id.lv_main); // mListView.setOnRefreshListener(new MyRefreshListener()); mListView.setOnRefreshListener(new MyRefreshListener2()); mMyAdapter = new MyAdapter(); mListView.setAdapter(mMyAdapter); mListView.setMode(PullToRefreshBase.Mode.BOTH); mListView.getLoadingLayoutProxy().setLastUpdatedLabel("setLastUpdatedLabel"); mListView.getLoadingLayoutProxy().setLoadingDrawable(getResources().getDrawable(R.drawable.ic_launcher)); mListView.getLoadingLayoutProxy().setPullLabel("setPullLabel"); mListView.getLoadingLayoutProxy().setRefreshingLabel("setRefreshingLabel"); mListView.getLoadingLayoutProxy().setReleaseLabel("setReleaseLabel"); } PullToRefreshBase.Mode.BOTH指的是下拉和上拉刷新两张模式。 class MyRefreshListener implements PullToRefreshBase.OnRefreshListener { @Override public void onRefresh(PullToRefreshBase refreshView) { } } class MyRefreshListener2 implements PullToRefreshBase.OnRefreshListener2 { @Override public void onPullDownToRefresh(PullToRefreshBase refreshView) { mList.clear(); for (int i = 0; i < mStr.length; i++) { mList.add(mStr[i]); } new Thread(new MyRunnable()).start(); } @Override public void onPullUpToRefresh(PullToRefreshBase refreshView) { for (int i = 0; i < mStr.length; i++) { mList.add(mStr[i]); } new Thread(new MyRunnable()).start(); } } 这里有两个监听器,我们来简单说一下PullToRefreshBase.OnRefreshListener2 ,很明显,分别指的是一个是上拉,一个是下拉的刷新的回调。 public class MyActivity extends Activity { private PullToRefreshListView mListView;//pulltorefresh控件 private List<String> mList;//存放数据 private String[] mStr = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"};//数据 private MyAdapter mMyAdapter;//适配器 //一个延时,然后处理 private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: Log.i("handleMessage", "handleMessage"); mListView.onRefreshComplete(); mMyAdapter.notifyDataSetChanged(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mList = new ArrayList<String>();//初始化 for (int i = 0; i < mStr.length; i++) { mList.add(mStr[i]);//准备数据 } mListView = (PullToRefreshListView) findViewById(R.id.lv_main); // mListView.setOnRefreshListener(new MyRefreshListener()); mListView.setOnRefreshListener(new MyRefreshListener2());//设置监听器 mMyAdapter = new MyAdapter();//初始化适配器 mListView.setAdapter(mMyAdapter); mListView.setMode(PullToRefreshBase.Mode.BOTH);//模式为上拉和下拉 mListView.getLoadingLayoutProxy().setLastUpdatedLabel("setLastUpdatedLabel"); mListView.getLoadingLayoutProxy().setLoadingDrawable(getResources().getDrawable(R.drawable.ic_launcher));//loading的时候的图片 mListView.getLoadingLayoutProxy().setPullLabel("setPullLabel"); mListView.getLoadingLayoutProxy().setRefreshingLabel("setRefreshingLabel"); mListView.getLoadingLayoutProxy().setReleaseLabel("setReleaseLabel"); } class MyRefreshListener implements PullToRefreshBase.OnRefreshListener { @Override public void onRefresh(PullToRefreshBase refreshView) { } } class MyRefreshListener2 implements PullToRefreshBase.OnRefreshListener2 { @Override public void onPullDownToRefresh(PullToRefreshBase refreshView) { mList.clear(); for (int i = 0; i < mStr.length; i++) {//添加数据 mList.add(mStr[i]); } new Thread(new MyRunnable()).start();//执行延时 } @Override public void onPullUpToRefresh(PullToRefreshBase refreshView) { for (int i = 0; i < mStr.length; i++) {//添加数据 mList.add(mStr[i]); } new Thread(new MyRunnable()).start();//执行延时 } } class MyAdapter extends BaseAdapter { @Override public int getCount() { return mList.size(); } @Override public Object getItem(int i) { return mList.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if (view == null) { view = LayoutInflater.from(MyActivity.this).inflate(R.layout.item, null); TextView tv = (TextView) view.findViewById(R.id.txt); tv.setText(mList.get(i)); } else { TextView tv = (TextView) view.findViewById(R.id.txt); tv.setText(mList.get(i)); } return view; } } class MyRunnable implements Runnable { @Override public void run() { try { Thread.sleep(2000);//延时2s } catch (InterruptedException e) { e.printStackTrace(); } Log.i("MyRunnable", "MyRunnable"); mHandler.sendEmptyMessage(1); } } } 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4166123.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

ansible应用总结

1、常用的自动化运维工具 CFengineChefPuppet基于Ruby开发,采用C/S架构,扩展性强,基于SSL认证SaltStack基于Python开发,采用C/S架构,相对于puppet更轻量级,配置语法采用YMAL,使得配置脚本更为简单Ansible基于Pyton开发,分布式,无需客户端,轻量级,配置语言采用YAML 2、为何选择ansible 相对于puppet和saltstack,ansible无需客户端,更轻量级ansible甚至都不用启动服务,仅仅只是一个工具,可以很轻松的实现分布式扩展更强的远程命令执行操作不输于puppet和saltstack的其他功能 3、ansible基本架构 4、ansible基本组成 核心:ansible核心模块(Core Modules):这些都是ansible自带的模块 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块插件(Plugins):完成模块功能的补充剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件主机群(Host Inventory):定义ansible管理的主机 5、ansible安装 配置epel源(略过) yum install ansible -y 6、ansible常用模块 file:用于配置文件属性yum:用于安装软件包cron:配置计划任务copy:复制文件到远程主机command:在远程主机上执行命令raw:类似于command模块,支持管道user:配置用户group:配置用户组service:用于管理服务ping:用于检测远程主机是否存活setup:查看远程主机的基本信息mount:配置挂载点 7、ansible简单配置 [root@martin-1 ansible]# cd /etc/ansible/ [root@martin-1 ansible]# ls ansible.cfg hosts roles [root@martin-1 ansible]# vim hosts [web]#组的名称 172.16.6.236# 这里是被ansible管理的主机 172.16.6.246 172.16.6.183 8、建立免秘钥登陆 [root@martin-1 ~]#ssh-keygen-trsa [root@martin-1 ~]#ssh-copy-id-i/root/.ssh/id_rsa.pub172.16.6.236 [root@martin-1 ~]#ssh-copy-id-i/root/.ssh/id_rsa.pub172.16.6.246 [root@martin-1 ~]#ssh-copy-id-i/root/.ssh/id_rsa.pub172.16.6.183 实例介绍 Command模块 9、palybook简介 playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务 tasks 任务,即调用模块完成的某操作 variables 变量 templates 模板 handles 处理器,由某事件触发执行的操作 roles 角色 简单示例 [root@ansible scripts]# cat 2.yml - hosts: web remote_user: root tasks: - name: install apache yum: name=httpd state=latest - name: install configuration file for apache copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: - restart httpd - name: start httpd service service: enabled=true name=httpd state=started handlers: - name: restart httpd service: name=httpd state=restarted 安装haproxy+keepalived [root@martin-1 ansible]# tree . ├── hosts ├── roles │ ├── haproxy │ │ ├── defaults │ │ ├── files │ │ │ ├── haproxy-1.5.14-3.el7.x86_64.rpm │ │ │ └── install_haproxy.sh │ │ ├── handlers │ │ │ └── main.yml │ │ ├── meta │ │ ├── tasks │ │ │ └── main.yml │ │ ├── templates │ │ │ └── haproxy.cfg.j2 │ │ └── vars │ ├── keepalived-master │ │ ├── defaults │ │ ├── files │ │ │ ├── install_keepalived_master.sh │ │ │ └── keepalived-1.2.13-7.el7.x86_64.rpm │ │ ├── handlers │ │ │ └── main.yml │ │ ├── meta │ │ ├── tasks │ │ │ └── main.yml │ │ ├── templates │ │ │ └── keepalived.conf.j2 │ │ └── vars │ ├── keepalived-slave │ │ ├── defaults │ │ ├── files │ │ │ ├── install_keepalived_slave.sh │ │ │ └── keepalived-1.2.13-7.el7.x86_64.rpm │ │ ├── handlers │ │ │ └── main.yml │ │ ├── meta │ │ ├── tasks │ │ │ └── main.yml │ │ ├── templates │ │ │ └── keepalived.conf.j2 │ │ └── vars 10、Zabbix-agent 安装详细说明 在/目录下面建立 ansible文件夹 [root@martin-1 ansible]# pwd /ansible 目录结构如下 [root@martin-1 ansible]# tree . ├── hosts ├── roles │ └── zabbix-agent │ ├── defaults │ ├── files │ │ ├── zabbix-agent-3.2.0-1.el7.x86_64.rpm │ │ └── zabbix_agent_install.sh │ ├── handlers │ │ └── main.yml │ ├── meta │ ├── tasks │ │ └── main.yml │ ├── templates │ │ └── zabbix_agentd.conf.j2 │ └── vars │ └── main.yml └── site.yml 9 directories, 8 files 目录名称是固定的,没有用到的可以不创建如defaults目录 [root@martin-1 ansible]# cat hosts [zabbix-agent] 172.16.6.67定义需要安装zabbix-agent的服务器ip 172.16.6.65 172.16.6.76 172.16.6.77 [root@martin-1 ansible]# cat site.yml 入口文件 -name: install zabbix agent hosts: zabbix-agent remote_user: root roles: - zabbix-agent [root@martin-1 ansible]# cat roles/zabbix-agent/tasks/main.yml --- - name: cp zabbix-agent-3.2.0-1.el7.x86_64.rpm to all client copy: src=zabbix-agent-3.2.0-1.el7.x86_64.rpm dest=/tmp/ - name: cp zabbix_agent_install.sh to all client copy: src=zabbix_agent_install.sh dest=/tmp/ mode=0755 - name: execute scripts to install zabbix agent shell: /bin/bash /tmp/zabbix_agent_install.sh - name: configure zabbix agent conf template: src=zabbix_agentd.conf.j2 dest=/etc/zabbix/zabbix_agentd.conf notify: restart zabbix agent - name: Start zabbix agent service: name=zabbix-agent state=started enabled=yes 这里是自定义的任务列表,第一行表示任务名称,第二行表示使用相应的模块执行任务,所以这里需要对ansible的基本模块及常用参数有个基本了解,常用模块在上面已经说明过了,这里就不再详细说明 http://docs.ansible.com/ansible/modules_by_category.html官方各大模块说明 [root@martin-1 ansible]# cat roles/zabbix-agent/files/zabbix_agent_install.sh #!/bin/bash cd /tmp if [ ! -f zabbix-agent-3.2.0-1.el7.x86_64.rpm ];then exit 0 fi rpm -ivh zabbix-agent-3.2.0-1.el7.x86_64.rpm if [ $? -eq 0 ];then echo "zabbix-agent install succefull" else echo "zabbix-agent install failed" fi /usr/bin/cp /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.$(date +%F).ori 安装脚本 该任务的总体意思就是将安装包和安装脚本拷贝到远程客户端服务器上面,然后执行该安装脚本,并修改配置文件,启动zabbix-agent客户端,从这个列子可以看到ansible只是其中一个环节,假如是apigw任务(使用haproxy+keepalived来实现),需要对如下知识点比较熟悉才能较好的完成这个任务的编写 1、ansible基本模块和参数的使用 2、ansible-playbook yaml 任务格式的写法 3、负载均衡软件haproxy的需要熟悉 4、高可用软件keepalived的需要熟悉 由此:使用ansible编写任务是一个综合性的过程,并不仅仅局限于ansible本身 在安装前检查客户端是否安装了zabbix-agent 可以看到都没有安装,接下来运行palybook任务 [root@martin-1 ansible]# pwd /ansible [root@martin-1 ansible]#ansible-playbook -i hosts site.yml 检查zabbix-agent在客户端的安装和启动情况 可以看到zabbix-agent已经安装和启动完成 更多内容请参考官方网站 http://docs.ansible.com/ansible/

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册