如何提升个人执行力

摆正心态 首先,要摆正自己的心态,就是执行力是一项非常有益的能力,无论是对公司还是对个人的生活。我们是主动的去培养这项能力,而不仅仅是为了企业的要求而去刻意的对工作执行,在生活中又是一副拖延的样子。 所以,用心去改掉自己爱拖延的坏毛病,去提升自己的执行力。 列举出自身的缺点(相对于执行力) 找出一张纸,列举出自身相对于执行力的一些缺点,而且,最好让身边的朋友也写这样一份清单,与你自己写的对照一下,因为有时候自己看自己会很宽容,朋友会‘旁观者清’的更能贴近你的真实情况。 这些都是提升自身执行力的拦路虎,要一一去克服它们。 先制定一项作息计划 先制定一个作息计划,或者是运动计划,然后严格的去执行,无论遇到神马特殊情况。这是对于身体上让你有一个意识,就是制定计划后,就一定要执行到底,得出结果,让身体的生物钟去影响你的思维。 一次只做一件事 每天工作或周末在家的时候,一个时间段内只做一件事情,无论有什么其他外界干扰因素,都不分心。例如你在做一个文档,有同事在群里说团购你想买的衣服之类的,要强迫自己不去看。 所以,要想有执行力,就必须能够禁得起诱惑。 重过程,更要结果 百科上对执行力的解释是:执行力是有效利用资源,保质保量达成目标的能力;是贯彻战略意图,完成预定目标的操作能力。 所以一件工作,不是执行就完了,更重要的是执行过后的结果,如果只有过程没有结果,从公司的角度来看,就是在做无用功,仅仅是一个听话办事的机器。 及时总结 执行力的另外一个非常重要的表现就是:即时总结。每件工作都有它自己的目标,执行过后都要总结一下目标的完成情况及其成果。 成功了,就是执行好;失败了,肯定有执行的问题或者不可抗力的因素。甚至在执行过程中,如果有意外情况发生,也要适时改变策略。]]>

SQL Server 批量删除用户表的方法

DECLARE @Table NVARCHAR(30) DECLARE tmpCur CURSOR FOR SELECT name FROM sys.objects WHERE TYPE=’U’ AND name LIKE N’%’ OPEN tmpCur FETCH NEXT FROM tmpCur INTO @Table WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @sql VARCHAR(100) SELECT @sql = ‘drop table ‘ + @Table EXEC(@sql) FETCH NEXT FROM tmpCur INTO @Table END CLOSE tmpCur DEALLOCATE tmpCur ]]>

docker项目简介

什么是 Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。 Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。 在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。 下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。 传统虚拟化 Docker

为什么要使用 Docker?

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。 首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。 具体说来,Docker 在如下几个方面具有较大的优势。

更快速的交付和部署

对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

更高效的虚拟化

Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

更简单的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

对比传统虚拟机总结

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

基本概念

Docker 包括三个基本概念
  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期。

Docker 镜像

Docker 镜像就是一个只读的模板。 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。 镜像可以用来创建 Docker 容器。 Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

Docker 容器

Docker 利用容器来运行应用。 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 *注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

Docker 仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问。 当然,用户也可以在本地网络内创建一个私有仓库。 当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。 *注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。  ]]>

java 多线程实现方法

线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法, 我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样. 你简单的调用run方法是没有这样效果的,所以你必须调用Thread类的start方法来启动你的线程.所以你启动线程有两种方法 一是写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程 二是写一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable target).start()方法来启动 这两种方法都必须实现RUN方法,这样线程起动的时候,线程管理器好去调用你的RUN方法. 你的TestThread没有继承自Thread类,怎么可能会有start方法呢? 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口; Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的 run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子: package org.thread.demo;   class MyThread extends Thread{   private String name;   public MyThread(String name) {   super();   this.name = name;   }   public void run(){   for(int i=0;i<10;i++){   System.out.println(“线程开始:”+this.name+”,i=”+i);   }   }   } package org.thread.demo;   public class ThreadDemo01 {   public static void main(String[] args) {   MyThread mt1=new MyThread(“线程a”);   MyThread mt2=new MyThread(“线程b”);       // thread1,thread2,按顺序进行   mt1.run();   mt2.run();   }   } 但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动 start()方法启动线程: package org.thread.demo; public class ThreadDemo01 { public static void main(String[] args) { MyThread mt1=new MyThread(“线程a”); MyThread mt2=new MyThread(“线程b”);   //乱序进行       mt1.start();   mt2.start(); } }; 这样程序可以正常完成交互式运行。那么为啥非要使用start()方法启动多线程呢? 在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了private native void start0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface) ·Runnable接口 在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。   public interface Runnable{   public void run();   } 例子: package org.runnable.demo; class MyThread implements Runnable{ private String name; public MyThread(String name) { this.name = name; } public void run(){ for(int i=0;i<100;i++){ System.out.println(“线程开始:”+this.name+”,i=”+i); } } }; 但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable target) 此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多 线程。(start()可以协调系统的资源): package org.runnable.demo; import org.runnable.demo.MyThread; public class ThreadDemo01 { public static void main(String[] args) { MyThread mt1=new MyThread(“线程a”); MyThread mt2=new MyThread(“线程b”); new Thread(mt1).start(); new Thread(mt2).start(); } } · 两种实现方式的区别和联系: 在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比 继承Thread类有如下好处: ->避免点继承的局限,一个类可以继承多个接口。   ->适合于资源的共享 以卖票程序为例,通过Thread类完成: package org.demo.dff; class MyThread extends Thread{ private int ticket=10; public void run(){ for(int i=0;i<20;i++){ if(this.ticket>0){ System.out.println(“卖票:ticket”+this.ticket–); } } } }; 下面通过三个线程对象,同时卖票: package org.demo.dff; public class ThreadTicket { public static void main(String[] args) { MyThread mt1=new MyThread(); MyThread mt2=new MyThread(); MyThread mt3=new MyThread(); mt1.start();//每个线程都各卖了10张,共卖了30张票 mt2.start();//但实际只有10张票,每个线程都卖自己的票 mt3.start();//没有达到资源共享 } } 如果用Runnable就可以实现资源共享,下面看例子: package org.demo.runnable; class MyThread implements Runnable{ private int ticket=10; public void run(){ for(int i=0;i<20;i++){ if(this.ticket>0){ System.out.println(“卖票:ticket”+this.ticket–); } } } } package org.demo.runnable; public class RunnableTicket { public static void main(String[] args) { MyThread mt=new MyThread(); new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一 new Thread(mt).start();//个实例化对象mt,就会出现异常 new Thread(mt).start(); } }; 虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。 Runnable接口和Thread之间的联系: public class Thread extends Object implements Runnable 发现Thread类也是Runnable接口的子类。]]>