Archerda's Blog

Programmer. Meditating.


  • 首页

  • 归档

  • 标签

JVM 参数设置及分析

发表于 2015-08-22

JVM 相关参数

参数名称 含义 默认值 备注
-Xms 初始堆大小 物理内存的1/64且<1G 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.
-Xmx 最大堆大小 物理内存的1/4且<1G 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制.
-Xmn 新生代大小(JDK 1.4 or lator) 此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-XX:SurvivorRatio Eden区与Survivor区的大小比值 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:+TraceClassLoading 输出虚拟机的类加载列表 * *
-verbose:gc 输出JVM的GC情况 * *
-XX:+PrintGCDetails 打印GC的详细情况 * *
-XX:+HeapDumpOnOutOfMemoryError 让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照 * *
-Xss 设置每个线程的栈大小 1024k *

JavaEE Servlet核心接口解析

发表于 2015-08-22

简介

在Java中,每一个Servlet程序都必须直接或间接实现javax.servlet.Servlet这个接口。当编写一个Servlet类时,直接实现它,当扩展一个实现这个接口的类时(如GenericServlet),则间接实现它。它独立于协议,控制着每个Servlet的生命周期。

Servlet接口是Servlet与Servlet容器(如Tomcat)之间的一个约定。这个约定总结起来就是说:Servlet容器会把Servlet类加载到内存中,并在Servlet实例中调用特定的方法。而且在一个应用中,每个Servlet类型只能有一个实例。


核心属性

ServletConfig

封装Servlet的配置信息。Servlet容器初始化一个Servlet对象时,会为这个Servlet对象创建一个ServletConfig对象,包含了Servlet的初始化参数信息。此外,ServletConfig对象还与ServletContext对象关联。ServletContext对象有以下方法:

  • public String getServletName(); 返回servlet的名字,即web.xml中的servlet-name的子元素的值。如果没有配置这个子元素,则返回servlet类的名字。
  • public ServletContext getServletContext();
    返回一个servletContext()对象.
  • public String getInitParameter(String name);
    根据给定的初始化参数,返回匹配的初始化参数值。
  • public Enumeration<String> getInitParameterNames();
    返回一个Enumeration对象,里面包含了所有的初始化参数。

ServletContext

ServletContext是Servlet和Servlet容器之间直接通信的接口。Servlet容器在启动一个Web应用时,会为这个应用创建一个ServletContext对象。每一个Web应用有且只有一个ServletContext对象。同一个Web应用中的各个Servlet对象共享一个ServletContext对象。Servlet对象可以通过ServletContext来共享各种资源。

Web应用范围具有2层含义:

  • 表示由Web应用的生命周期构成的时间段;
  • 表示在Web应用生命周期内所有Web组件的集合;

ServletContext对象的3种获取方式:

  1. Javax.servlet.http.HttpSession.getServletContext();
  2. Javax.servlet.jsp.PageContext.getServletContext(); PageContext是JSP的隐式对象,所以可以在JSP页面直接获取ServletContext对象。
  3. Javax.servlet.ServletConfig.getServletContext();
    这就是ServletConfig和ServletContext关联的地方。

ServletRequest

封装当前的请求的配置和数据,以便Servlet开发者不必解析和操作原始的请求数据。

ServletResponse

当前请求的响应,它的作用是使得将响应传回用户更容易。


核心方法

init()、service()、destroy()是Servlet生命周期方法。Servlet容器将会按照以下原则调用这3个方法。

init()

public void init(ServletConfig config) throws ServletException
如果Servlet的配置参数load-on-startup=1,那么Servlet容器启动时就会调用这个方法。如果load-on-startup=0,那么第一次请求Servlet时,Servlet容器才会调用这个方法。在后续的请求中,将不会再调用这个方法。

可以利用这个方法来编写一些应用程序初始化相关的代码。在调用这个方法时,Servlet容器会传递一个ServletConfig参数。一般来说,会将ServletConfig参数赋值给一个类级变量,以便Servlet类中其他方法也可以使用这个对象。

service()

public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
每次请求Servlet时,容器都会调用这个方法。必须在这里编写要Servlet完成的响应的代码。第一次请求Servlet时,容器会调用init方法和service方法;对于后续的请求,容器只调用service方法。

destroy()

public void destroy();
要销毁Servlet时,容器就会调用这个方法。它通常发生在卸载应用程序,或者关闭Servlet容器的时候。一般来说,可以在这个方法中编写一些资源清理相关的代码。

getServletConfig()

public ServletConfig getServletConfig();
返回由Servlet容器传给init方法的ServletConfig。但是为了让getServletConfig()返回非null值,你肯定已经为传给init方法的ServletConfig赋给了一个类级变量。

getServletInfo()

public String getServletInfo();
返回Servlet的描述。可以返回可能有用的任意字符串,甚至可能是null。


最后

必须要注意的一点是线程安全性。因为一个Web应用中所有的用户将公用一个Servlet实例,所以不建议使用类级变量,以免引起资源争夺导致混乱。除非它们是只读的,比如JUC. atomic包中的成员。

以上。


Java 自带工具常用命令

发表于 2015-08-21

Javap

javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作.

  • 查看帮助信息:javap -help
  • 查看版本:javap -version
  • 输出行和局部变量表:javap -l
  • 仅显示public类和成员:javap -public
  • 显示protected/public类和成员:javap -protected
  • 显示package/protected/public类和成员 (默认):javap -package
  • 显示所有类和成员:javap -p javap -private
  • 输出内部类型签名:javap -s
  • 对代码进行反汇编:javap -c
  • 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本:javap -v javap -verbose
  • 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5散列):javap -sysinfo
  • 显示静态最终常量:javap -constants

JPs

jps(Java Process Status),虚拟机进程状态工具。可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()方法所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。

jps [options][hostid]

  • 只输出LVMID,不输出主类名字:jps -q
  • 输出虚拟机进程启动时传递给主类main函数的参数:jps -m
  • 输出主类的全名,如果是jar包则输出jar包路径:jps -l
  • 输出虚拟机进程启动时JVM参数:jps -v

JStat

jstat(Java Statistics Monitoring Tool),虚拟机统计信息监视工具。用于监视虚拟机各种运行状态信息的命令行工具,它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾回收、JIT编译等运行数据。在没有GUI情况下,这是运行期定位虚拟机性能问题的首选工具。

jstat [option vmid [interval[s|ms] [count]]]

命令格式中的VMID和LVMID需要说明下,如果是本地虚拟机进程,那么VMID和LVMID是一致的,如果是远程虚拟机进程,那VMID格式是

[protocol:][//]lvmid [@hostname[:port] / servername]

参数interval和count代表查询间隔和次数,如果省略这两个参数,那么只查询一次。option代表用户希望查询的虚拟机信息,主要包括3类:类装载、垃圾回收、运行期变异状况。具体如下。

  • 监视类装载、卸载数量、总空间以及类装载所耗费时间:jstat -class
  • 监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等:jstat -gc
  • 输出Java堆各个区域使用到的最大、最小空间:jstat -gccapacity
  • 输出已使用空间占总空间的百分比:jstat -gcutil
  • 输出上一次GC的原因:jstat -gccause
  • 监视新生代GC状况:jstat -gcnew
  • 监视新生代GC状况,关注使用到的最大、最小空间:jstat -gcnewcapacity
  • 监视老年代GC状况:jstat -gcold
  • 监视老年代GC状况,关注使用到的最大、最小空间:jstat -gcoldcapacity
  • 输出永久代的最大、最小空间:jstat -gcpermcapacity
  • 输出JIT编译器编译过的方法、耗时等信息:jstat -compiler
  • 输出已经被JIT编译的方法:jstat -printcompilation

JInfo

jinfo(Configuration Info for Java),Java配置信息工具。作用是可以实时地查看和调整虚拟机各项参数。

jinfo [ option ] < pid >

  • 查看所有参数:jinfo -flags <pid>
  • 查看未被显示指定的参数的系统默认值:jinfo -flag [name] <pid>
  • 查看未被显示指定的参数的系统默认值(JDK1.6-):java -XX:+PrintFlagsFinal
  • 修改运行期虚拟机参数:jinfo -flag [+/-] name jinfo -flag <name>=<value>
  • 输出虚拟机进程的System.getProperties()的内容:jinfo -sysprops <pid>

JMap

jmap(Memory Map for Java),Java内存映像工具,用于生成堆转储快照(一般称为heapdump文件或dump文件)。jmap的作用不仅仅是获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细,如空间使用率、当前用的是哪种回收器等。

jmap [ option ] vmid

  • 生成Java堆转储快照:jmap -dump [live, ] format=b, file=<filename>
  • 当虚拟机对-hump 选项没有响应时,强制生成dump快照,只在Linux/Solaris平台有效:jmap -F
  • 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台有效:jmap -finalizerinfo
  • 显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。只在Linux/Solaris平台有效:jmap -heap
  • 显示堆中对象统计信息,包括类、实例对象、合计容量:jmap -histo
  • 以ClassLoader为统计口径显示永久代内存状态,只在Linux/Solaris平台有效:jmap permstat

JHat

jhatzhuanch (JVM Heap Analyisi Tool),虚拟机堆转储快照分析工具。


JStack

jstack(Stack Trace for Java),Java堆栈工具,用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内为每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者在等待什么资源。

jstack [ option ] < vmid >

  • 当正常输出的请求不被响应是,强制输出线程堆栈:jstack -F
  • 除堆栈外,显示显示关于锁的附加信息:jstack -l
  • 如果调用本地方法,显示C/C++的堆栈:jstack -m

在JDK1.5中,java.lang.Thread新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码就完成了jstack的大部分功能,在实际项目中可以调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。


JConsole

JConsole(Java Monitoring and Management Console),是一种基于JMX的可视化监视、管理工具。它管理部分的功能是针对JMX MBean进行管理,由于MBean可以使用代码、中间件服务器的管理控制台或者所有符合JMX规范的软件进行访问,所以重点是使用JConsole的监视功能。


JVisualVM

JVisualVM(All-in-One Java Troubleshooting Tool),Java多合一故障处理工具。是目前为止随JDK发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。而且还有很多高效的插件可以使用。

其他

  • 运行期间dump出class类: sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" -Dsun.jvm.hotspot.tools.jcore.filter=sun.jvm.hotspot.tools.jcore.PackageNameFilter -Dsun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList=<package-name> sun.jvm.hotspot.tools.jcore.ClassDump <pid>

Git 常用命令

发表于 2015-08-18

设置

  • 设置全局用户名:git config --global user.name <your-user-name>
  • 设置全局邮箱:git config --global user.email <your-email>
  • 查看全局设置:git config --global --list
  • 设置项目用户名:git config user.name <your-user-name>
  • 设置项目邮箱:git config user.email <your-email>
  • 查看项目设置:git config --list

基本操作

  • 查看Git状态:git status
  • 查看远程仓库地址:git remote -v
  • 查看日志:git log
  • 查看常用帮助:git help
  • 查看全部帮助:git help -a
  • 查看某个命令帮助:git help <command-name>
  • 查看版本:git --version
  • 初始化:git init
  • 关联远程仓库:git remote add origin <git-url>
  • 克隆项目到本地:git clone <git-url>
  • 更新:git pull
  • 把master的更新merge到dev分支:git checkout dev; git merge master
  • 添加某个文件到版本控制中:git add [dir-name/]<file-name>
  • 添加某个文件夹到版本控制中:git add <dir-name>
  • 添加所有文件到版本控制中:git add .
  • 从版本控制中删除某个文件:git rm [dir-name/]<file-name>
  • 提交修改:git commit -m "<your-commit-note>"
  • 推送到远程仓库:git push [origin master]
  • 创建本地分支:git checkout -b [new branch name]
  • 推送本地分支到远程分支:git push origin localBranchName:remoteBranchName
  • 删除本地分支:git branch -D [local branch name]
  • 删除远程分支:git push origin :[remote branch name] (origin后面有空格)
  • fork后同步源更新内容:
    1. 查看远程状态:git remote -v
    2. 确定一个将被同步给fork库的远程上游仓库:git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
    3. 再次查看远程状态:git remote -v
    4. 从上游仓库 fetch 分支和提交点,提交给本地 master,并会被存储在一个本地分支 upstream/master :git fetch upstream
    5. 切换到本地主分支(如果不在的话):git checkout master
    6. 把 upstream/master 分支合并到本地 master 上,这样就完成了同步,并且不会丢掉本地修改的内容:git merge upstream/master
    7. 如果想更新到 GitHub 的 fork 上,直接:git push origin master

检查

工作目录:git clone 后获得的一份本地的代码,也包括新编辑的,尚未加入版本控制的代码;
暂存区域:git add 后暂存起来,尚未 git commit 的代码;
本地仓库:git commit 后正式被版本控制记录起来的代码;

  • 查看工作目录和暂存区域区别:git diff
  • 查看暂存区域和本地仓库区别:git diff --staged git diff --cached

取消修改

  • 取消尚未add的修改:git checkout -- <file-name>
  • 取消已经add到未commit的修改:git reset HEAD <file-name>
  • 覆盖上次提交,用于已commit:git commit --amend
  • 撤销远程commit(回滚到某次commit): git log; git reset [--hard] <commit-id>; git push --force
  • 撤销最近一次本地commit:git reset HEAD~1
  • 恢复删除的文件:
    • git log --diff-filter=D --summary 查看所有删除的文件;
    • git checkout $commit~1 filename 恢复文件,其中$commit是上面获取到的commitId;

参考文档

  • Git常用命令:程序员的场景
  • 廖雪峰的网站:Git教程

Java 类初始化顺序

发表于 2015-08-15

这几天看java单例模式的时候,对类的加载机制和初始化顺序产生了疑问。于是在OSC发了一个技术贴关于java内部类加载顺序的问题,现在综合大家的回答总结下。

阅读全文 »

为何我从虾米转向网易云音乐

发表于 2015-08-14

对于音乐播放器,我自认为还是有点要求的.先说说自己对音乐播放器的要求吧.

  • 界面必须要美观简洁;
  • 操作要一目了然,没有各种杂项功能;
  • 歌曲资源库要足够丰富;
  • 必须有提供漫游类似歌曲的功能;
  • 全平台同步;
  • 功能稳定;

大概需求就这么多.先说一下为什么不用像酷狗和酷我这几款很大众的播放器,其实原因也很简单-不够喜欢.因为界面不足以吸引我,然后歌曲库质量良莠不全,搜歌的代价相比之下大不少.至于另外一个大众皆知的播放器- QQ 音乐.其实说真的, QQ音乐的 PC 和 Mac 版本做的真的一般,界面就不说了,有时候带着耳机想选个音质好点的,可以啊,充绿钻啊!顿时无语.关于腾讯的产品,其实大部分做的在行业来说都是算前列的,只是个人有个不好的习惯—只要有足够能力替代腾讯产品的,我都有优先考虑非腾讯系.

下面来说说虾米和网易云音乐吧.

1. 虾米

我应该算是比较早使用虾米的一批用户了,那时候阿里还没有收购虾米.当初为何选择虾米,只因为一个最吸引我的功能—查找类似的歌曲,这对于我这种没有很大动力去关注歌手和专辑的人说,简直是一个福音.每次听到自己喜欢的歌曲,都会很自然去点击下”寻找类似歌曲”, 而结果也往往能发现很多不错的歌曲是适合自己的.而且那时候虾米还有电台,质量还是非常高的(对比酷狗等),所以第一次用过之后就一直用虾米了,包括 PC 和 Android, iPhone.

可是最近却慢慢觉得虾米做的越来越不好了.

  • 收藏的歌曲有很大的概率不能播放.最近播放收藏列表的时候,经常会出现这种情况:可以播放前面几首歌曲,但是播了几首之后,后面的歌曲一首接着一首被跳过,几乎跳过了收藏列表后面的所有歌曲.然后整个播放器就停止了.而且,而且,还没有任何提示.就算是因为版权问题下架了歌曲,也应该给个提示吧.这是我放弃虾米最重要的原因之一.

  • Android 端不能登录.这是年前还是用 Nexus5的时候,那时候更新了虾米后,死活登录不上去,导致我无法听歌.我们也知道虾米没有登录是不能播放歌曲的,那时候也知道可能是这个版本的问题,应该很快就可以修复的.但是虾米出现这么严重的问题,我也开始觉得这个产品越来越不用心了.好感度递减.

由于多次经受第一个问题的困扰,最终我决定更换自己使用了2年多的播放器了.

2. 网易云音乐

其实之前也用过网易云音乐,初体验总体感觉体验不错,包括界面,操作,资源等.但是由于自己的收藏都是在虾米那边,也就一直没有考虑过转过来.自从有了换播放器的想法之后,第一反应就是网易云音乐.

  • 开题的需求基本满足;
  • 对于网易的产品,我一直都觉得还是比较良心的.比如有道词典,有道云笔记等,一直对网易的印象不错,所以对网易云音乐有信心,产品的迭代和更新应该都会比较及时,这也是我选择它最重要的原因;
  • 网易云音乐的社交功能还是蛮有兴趣,可以看见别人分享的音乐,体验起来效果不错.这个是虾米也没有的;
  • 最后一个,其实不是虾米的错.虾米无法分享音乐到朋友圈.有时候自己有某个特别喜欢的歌曲,总想分享到朋友圈让大家听听.然后因为腾讯和阿里的关系,虾米躺枪了.而网易云音乐没有这个困扰.

鉴于上面的原因,我最终决定放弃虾米,转向网易云音乐. iPhone 和 Mac上 会首先替换,接着也会把收藏的歌曲转过来.


利用Flickr做图床

发表于 2015-08-14

自从用 Markdown 记录博客后,图片一直没有很好的解决方案。虽然可以放在的VPS上面,但是这VPS因为某种大家都懂的原因,所以不太放心。

之前有个同学用的是微博发布图片,然后直接使用其作为外链的方法。可是这就要求我专门有个微博号来做这个事情,麻烦,而且不优雅。所以改尝试其他。所以,直接Google啦。然后看到 Flickr 。

Flickr 是雅虎旗下的图片分享网站,里面有很多图片分享。但本文只说如何利用它来做图片外链。

永远有个第一步

不管什么服务,上来都是要注册的了。如果你有 Yahoo 的邮箱,直接用来登录 Flickr 就行了。如果没有就注册一个。地址在这 Flickr相機膠卷.

##上传图片,获取外链
其实上传图片有 2 种方式,一个是直接在网页上上传,另一个方法是下载一个 Flickr 的客户端。前者比较麻烦,每次都要点开网页去弄,效率不高。后者上传比较方便,安装后选定一个同步文件夹,把图片放在里面就可以自动上传了(跟 Dropbox 类似)。但是外链始终还是要使用网页来获取,客户端提供了一个快捷方式让我们快去前往相册。

前往 Flickr 的相片空间, 点击你想外链的图片打开大图-右下角的下载按钮-检视全部尺寸,在这里你可以选自己喜欢的尺寸(良心功能,大赞)。然后右键点击图片-复制图片链接。完工。

秀一波

  • 75 x 75
  • 240 x 135
  • 500 x 281
  • 800 x 450

说在最后

Flickr 给我们提供的空间是 1TB! 1TB! 1TB!,完全够用啦!所以不用考虑容量的问题。

完。


抓取高考录取数据

发表于 2015-08-14

2015年高考转瞬即逝,转眼间我也快大四了,不由感慨。学业未成,仍需努力。

写这个脚本的原因

  • 我们学校有一个高中的校友会,大家互相帮助,受益良多。每年的这个时候,校友会的同学都需要去一个个找看哪位师弟师妹录到我校了,然后就会主动去联系他们,让他们加入校友会这个大家庭。然而大家一个个问高中的师弟师妹不太科学,而高中的龙虎榜又需要开学才张贴,所以校友会的同学们的工作进展的不是很顺利。这个时候这个脚本的出来了。
  • 脚本的大部分是星尘大师兄去年写的,但当初比较赶,写的比较乱,而且数据没有持久化。这样不利于校友会后续的同学们继续使用。而今年星尘大师兄毕业工作了,所以完善工作就落在我身上了。

原理

  • 先说下大概思路吧。www.5184.com/gk里面提供了高考录取的查询接口,我们可以用Fiddler抓包,看HTTP请求的相关参数有什么。
  • 其实高中学子每个地区每个学校的考号段都是固定的,比如我们学校的就是前4位是1802,后6位也有分布规律。
  • 综上,使用Python来遍历某个考号段,获取返回的数据,判断是否是所需数据,是的话保存,不是的话丢弃。
阅读全文 »

搭建一个Django工程

发表于 2015-08-14

写在前面

如果用Python写Web的吧,那就不得不提及Django了。我们先借助wiki来了解下吧。

Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don’t Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。—维基百科

上面那段话,我们只需知道Django很好用很快捷就好了。下面我们来看看怎么去搭建一个Django工程。由于操作的时候是在Windows上,所以这里就只写Windows平台了。

安装Python

因为Django是基于Python的,所以安装Django之前我们需要先安装好Python,这个有Python的下载地址 。由于Django最新稳定版推荐使用Python3,所以我们就直接下载最新稳定版的python。下载安装后,我们还需要把Python的安装目录和脚本目录添加到环境变量。如下:

C:\Python34\;C:\Python34\Scripts;

然后我们打开cmd, 输入python

C:\Users\archerda> python

如果能看见下面这个输出,就说明安装Python成功了。

C:\Users\archerda>python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
>>>

安装Django

安装Django有 2 种方式,第一种是用 python 自带的 pip,另一种是下载压缩包安装。

1. pip方式(推荐)

因为pip放在python目录下的Scripts目录下,所以我们必须先把Scripts文件夹的路径放在环境变量中。然后依次执行以下步骤。

  • 用管理员权限打开cmd;
  • 执行

pip install Django

  • cmd输出以下语句,安装Django成功

Installing collected packages: Django
Successfully installed Django-1.8.3

2. 压缩包方式

先下载压缩包Latest release: Django-1.8.3.tar.gz,下载后放在任意文件夹上,比如

C:\Django-1.8.3

然后cmd切换到该目录,执行以下命令安装Django

python setup.py install


以上 2 种方式安装完成后,会生成以下文件夹

C:\Python34\Lib\site-packages\django

这就是Django的安装目录了。在这里我们需要添加Django环境变量

C:\Python34\Lib\site-packages;

至此, Django安装完毕。我们可以在cmd检测下。

C:\Windows\system32> django-admin –version
1.8.3

阅读全文 »

Vim 常用命令

发表于 2015-08-14

视觉模式

  • 选中一个或多个字符:v
  • 选中一行:V
  • 向后翻页(PageDown):ctrl+f
  • 向前翻页(PageUp):ctrl+b

插入模式

  • 进入编辑模式:
    • 插入在光标之前:i
    • 插入到行首:I
    • 插入在光标之后:a
    • 插入到行尾:A
  • 新开一行:o O
  • 退出插入模式:Esc

编辑

  • 撤销:u
  • 回滚撤销:ctrl+r
  • 重复上次命令:.
  • 合并下行到上行:J

复制剪切

  • 删除一行:dd
  • 删除多行:<first-line>, <end-line>"d" 如3,45d
  • 删除一个单词:dw
  • 删除后一个字符:x
  • 删除前一个字符:X
  • 删除行最后一个字符:D
  • 复制一行或N行:[N]yy
  • 粘贴:p

退出

  • 保存::w
  • 保存并关闭::wq
  • 关闭::q
  • 强制关闭::q!

搜索

  • 搜索:/pattern
  • 往后搜索:?pattern
  • 光标到达搜索结果的前一个目标:n
  • 光标到达搜索结果的后一个目标:N

其他设置

  • 设置行号::set nu :set number
  • 取消行号::set nonu :set nonumber
  • 跳到指定行::line
  • 语法高亮开关:syntax <on | off>
  • 设置文件语法类型:set syn = <syntax-type>
  • 设置自动缩进:set autoindent
  • 开启当前行高亮: set cursorLine
  • 设置高亮行样式:in CursorLine cterm=NONE ctermbg=white ctermfg=green guibg=NONE guifg=NONE
  • 搜索匹配项高亮:set hlsearch

1…678
archerda

archerda

71 日志
37 标签
GitHub Email
© 2015 - 2019 archerda
由 Hexo 强力驱动
主题 - NexT.Muse