分类 技术类 下的文章

MAC JDK版本切换

通过命令'jdk7', 'jdk8'轻松切换到对应的Java版本:

  • 1.首先安装所有的JDk



    • Mac自带了的JDK6,安装在目录:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/下。
    • JDK7,JDK8,JDK9则需要自己到Oracle官网下载安装对应的版本。自己安装的JDK默认路径为:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk
  • 2.配置
    编辑~/.zshrc文件(我是zsh的shell,所有配置该文件,如果是bash,则配置.bash_profile)

在最下面加入下面的代码

#设置jdk版本
export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home


#alias命令动态切换JAVA_HOME的配置
alias jdk7='export JAVA_HOME=$JAVA_7_HOME'
alias jdk8='export JAVA_HOME=$JAVA_8_HOME'


export JAVA_HOME=$JAVA_7_HOME

输入完成后保存,然后执行下面命令

source ~/.zshrc
  • 3.验证

使用:jdk7、jdk8即可切换jdk版本

java反编译

jad.exe文件,将它设置到环境变量path,(复制到 %JAVA_HOME%\BIN的目录下)
或者拷到其他已经了环境变量path的地方,或者在cmd中转到此文件目录下。

简单的方法是

jad -o -r -d F:\src -s java F:\classes\**\*.class 

-o - overwrite output files without confirmation (default: no) 无需确定覆写文件

-r - restore package directory structrure 恢复包目录结构

-s - output file extension (by default '.jad') 如果不设置为-s java,则默认扩展名为.jad

其他的,F:\classes***.class 中的两颗接连的星,表示任意层次的子目录

phpstorm 配置

<p>一些技巧<br/>
http://phpstorm.tips/tips</p>

<h2 id="toc_0">修改 editor 主题</h2>

<p>默认的主题不太多,可以自己添加自定义的主题。</p>

<p>网站 Daylerees 有许多主题的预览,选择自己喜欢的主题;</p>

<p>所有的主题可以在 Github 上找到,选择 jetbrains 文件夹,查看自己喜欢的主题;</p>

<p>查看该主题的 raw,复制浏览器中的地址,比如:https://raw.githubusercontent.com/daylerees/colour-schemes/master/jetbrains/peacock.icls;</p>

<p>在 mac 中,打开 ~/Library/Preferences/PhpStorm2016.3/colors 文件夹,使用 wget 下载该主题;</p>

<p>Windows 中的目录好像是 Users/用户名/PhpStorm2016.3/config/colors;</p>

<p>重启 PhpStrom,在 Preferences>Editor>Color&Fonts 中选择指定的主题;</p>

<h2 id="toc_1">修改 Project 栏的颜色</h2>

<p>在修改了 editor 的主题之后,左边的 Project 栏的颜色跟 editor 不一致,可以使用 color 插件来实现一致的主题。</p>

<p>打开 Preferences,选择 Plugin,打开 Browse repositories;</p>

<p>搜索 Color ide 插件,安装;</p>

<p>重启 PhpStorm,这样 Project 栏和 Editor 的主题颜色已经一致;</p>

<h2 id="toc_2">修改 Phpstorm 默认的文件类型图标</h2>

<p>打开 Preferences>Plugin,点击 Browse repositories 然后搜索 Material Theme UI;</p>

<p>配置清单:</p>

<p>主题-material default 【默认自带】</p>

<p>字号:12</p>

<h1 id="toc_3">phpstorm 配置</h1>

<p>一些技巧<br/>
http://phpstorm.tips/tips</p>

<h2 id="toc_4">修改 editor 主题</h2>

<p>默认的主题不太多,可以自己添加自定义的主题。</p>

<p>网站 Daylerees 有许多主题的预览,选择自己喜欢的主题;</p>

<p>所有的主题可以在 Github 上找到,选择 jetbrains 文件夹,查看自己喜欢的主题;</p>

<p>查看该主题的 raw,复制浏览器中的地址,比如:https://raw.githubusercontent.com/daylerees/colour-schemes/master/jetbrains/peacock.icls;</p>

<p>在 mac 中,打开 ~/Library/Preferences/PhpStorm2016.3/colors 文件夹,使用 wget 下载该主题;</p>

<p>Windows 中的目录好像是 Users/用户名/PhpStorm2016.3/config/colors;</p>

<p>重启 PhpStrom,在 Preferences>Editor>Color&Fonts 中选择指定的主题;</p>

<h2 id="toc_5">修改 Project 栏的颜色</h2>

<p>在修改了 editor 的主题之后,左边的 Project 栏的颜色跟 editor 不一致,可以使用 color 插件来实现一致的主题。</p>

<p>打开 Preferences,选择 Plugin,打开 Browse repositories;</p>

<p>搜索 Color ide 插件,安装;</p>

<p>重启 PhpStorm,这样 Project 栏和 Editor 的主题颜色已经一致;</p>

<h2 id="toc_6">修改 Phpstorm 默认的文件类型图标</h2>

<p>打开 Preferences>Plugin,点击 Browse repositories 然后搜索 Material Theme UI;</p>

<p>配置清单:</p>

<p>主题-material default 【默认自带】</p>

<p>字号:12</p>

<p>View菜单<br/>
<br/>
</p>

<p>window菜单<br/>
</p>

<p>运行配置<br/>
</p>

phpstorm配置.zip

DockerFile 编写小记

## DockerFile命令指南

### 格式
Dockerfile 中所有的命令都是以下格式:

```
INSTRUCTION argument
```
指令(INSTRUCTION)不分大小写,但是推荐大写。
### FROM 命令
`FROM `,例如

```
FROM ubuntu
```

所有的 Dockerfile 都用该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像;可以在同一个 Dockerfile 中多次使用 FROM 命令用于创建多个镜像。

### MAINTAINER 命令
`MAINTAINER `用于指定镜像创建者和联系方式。
例如

```
MAINTAINER Victor Coisne victor.coisne@dotcloud.com
```
### RUN 命令

```
RUN
```
用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。
### ADD 命令

```
ADD
```

用于从将` `文件复制到` ` 文件:`` 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件 url,` `是容器中的绝对路径。

### CMD 命令
CMD 命令有三种格式:

- CMD ["executable","param1","param2"]:推荐使用的 exec 形式。
- CMD ["param1","param2"]:无可执行程序形式
- CMD command param1 param2:shell 形式。

CMD 命令用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件:不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为ENTRYPOINT的参数。

> 一个 Dockerfile 中只能有一个CMD,如果有多个,则最后一个生效。

> CMD 的 shell 形式默认调用 /bin/sh -c 执行命令。

> CMD命令会被 Docker 命令行传入的参数覆盖:

> ```
> docker run busybox /bin/echo Hello Docker
> ```
> 会把 CMD 里的命令覆盖。

### ENTRYPOINT 命令
ENTRYPOINT 命令的字面意思是进入点,而功能也恰如其意:他可以让你的容器表现得像一个可执行程序一样。

ENTRYPOINT 命令也有两种格式:

- ENTRYPOINT ["executable", "param1", "param2"] :推荐使用的 exec 形式
- ENTRYPOINT command param1 param2 :shell 形式

> 一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。

关于 CMD 和 ENTRYPOINT 的联系请看下面的例子
仅仅使用 ENTRYPOINT:

```
FROM ubuntu
ENTRYPOINT ls -l
```
执行 `docker run 306cd7e8408b /etc/fstab `和 `docker run 306cd7e8408b` 结果并不会有什么差别:

```
命令 # docker run 306cd7e8408b /etc/fstab
total 64
drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin
drwxr-xr-x 2 root root 4096 Apr 10 2014 boot
drwxr-xr-x 5 root root 360 Apr 24 02:52 dev
drwxr-xr-x 64 root root 4096 Apr 24 02:52 etc
drwxr-xr-x 2 root root 4096 Apr 10 2014 home
……
```
但是我们通常使用 `ENTRYPOINT `作为容器的入口,使用` CMD` 给 `ENTRYPOINT `增加默认选项:

```
FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["ls"]
```

然后执行这个容器:
不加参数便会默认有 `-l`参数:

```
命令 # docker run 89dc7e6d0ac1
total 64
drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin
drwxr-xr-x 2 root root 4096 Apr 10 2014 boot
drwxr-xr-x 5 root root 360 Apr 24 02:47 dev
drwxr-xr-x 64 root root 4096 Apr 24 02:47 etc
drwxr-xr-x 2 root root 4096 Apr 10 2014 home
drwxr-xr-x 12 root root 4096 Mar 20 05:21 lib
drwxr-xr-x 2 root root 4096 Mar 20 05:20 lib64
drwxr-xr-x 2 root root 4096 Mar 20 05:19 media
drwxr-xr-x 2 root root 4096 Apr 10 2014 mnt
drwxr-xr-x 2 root root 4096 Mar 20 05:19 opt
dr-xr-xr-x 386 root root 0 Apr 24 02:47 proc
drwx------ 2 root root 4096 Mar 20 05:22 root
drwxr-xr-x 7 root root 4096 Mar 20 05:21 run
drwxr-xr-x 2 root root 4096 Apr 21 22:18 sbin
drwxr-xr-x 2 root root 4096 Mar 20 05:19 srv
dr-xr-xr-x 13 root root 0 Apr 24 02:47 sys
drwxrwxrwt 2 root root 4096 Mar 20 05:22 tmp
drwxr-xr-x 11 root root 4096 Apr 21 22:18 usr
drwxr-xr-x 12 root root 4096 Apr 21 22:18 var
```

加了`/etc/fstab` 参数便会覆盖原有的 -l 参数:

```
命令 # docker run 89dc7e6d0ac1 /etc/fstab
/etc/fstab
```

### EXPOSE 命令

```
EXPOSE [...]
```
命令用来指定对外开放的端口。
例如 `EXPOSE 80 3306`,开放 80 和 3306 端口。

### WORKDIR命令

```
WORKDIR /path/to/work/dir
```
配合 RUN,CMD,ENTRYPOINT 命令设置当前工作路径。
可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。默认路径为/。

例如:

```
FROM ubuntu
WORKDIR /etc
WORKDIR ..
WORKDIR usr
WORKDIR lib
ENTRYPOINT pwd
```
docker run ID 得到的结果为:`/usr/lib`

### USER命令

```
USER
```
为容器内指定 `CMD`、 `RUN`、 `ENTRYPOINT` 命令运行时的用户名或UID。

### VLOUME 命令

```
VOLUME ['/data']
```
允许容器访问容器的目录、允许容器之间互相访问目录。
`VOLUME` 仅仅是允许将某一个目录暴露在外面,更多的操作还需要依赖 Docker 命令实现。
更多的内容可以参考 [深入理解 Docker Volume(一)](http://dockerone.com/article/128)

### ENV 命令
参考 export 的用法咧:

```
ENV LC_ALL en_US.UTF-8
```

实例
Dockerfile 的写法已经讲述完毕,这儿有一个示例的 Dockerfile:

```
#Dockerfile
FROM centos6-base
#指定centos6系统
MAINTAINER zhou_mfk
#我抄的他的 Dockerfile
RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key
#创建私钥
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
#修复SSH登录,否则登陆后的用户会被秒退。
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
#创建root用户的ssh文件夹
EXPOSE 22
#开放端口
RUN echo 'root:redhat' | chpasswd
#root用户改密码为redhat
RUN yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
RUN yum install tar gzip gcc vim wget screen -y
#安装epel和安装一些软件
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
#系统环境变量
CMD ["/usr/sbin/sshd", "-D"]
#启动sshd
#End
```

## docker run
### 语法:

```
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
```
### OPTIONS说明:

```
-a, --attach=[] 登录容器(以docker run -d启动的容器)
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
-d, --detach=false 指定容器运行于前台还是后台
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
-h, --hostname="" 指定容器的主机名
-i, --interactive=false 打开STDIN,用于控制台交互
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
-m, --memory="" 指定容器的内存上限
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置,待详述
-P, --publish-all=false 指定容器暴露的端口,待详述
-p, --publish=[] 指定容器暴露的端口,待详述
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="" 指定容器停止后的重启策略,待详述
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
-t, --tty=false 分配tty设备,该可以支持终端登录
-u, --user="" 指定容器的用户
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
-w, --workdir="" 指定容器的工作目录
```
详情见:http://blog.csdn.net/one_clouder/article/details/39224767

## docker Build
### 语法:

```
docker build [OPTIONS] PATH | URL | -
```

### OPTIONS说明:

```
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
-q :安静模式,成功后只输出镜像ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
```
## docker commit
### 语法:

```
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
```
### OPTIONS说明:

```
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
```

网页保存为图片、PDF

近日工作需要,需要输入一个网址,然后将网站保存为图片格式以及pdf格式
找了半天,发现还是phantomjs好用,之前phantomjs做爬虫的时候接触过一些,没想到这么强大
PhantomJS是一个基于webkit的javascript API。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON、html5、Canvas、SVG等,同时也提供了处理文件I/O的操作,从而使你可以向操作系统读写文件等。PhantomJS的用处可谓非常广泛,诸如网络监测、网页截屏、无需浏览器的 Web 测试、页面访问自动化等。
如果做自动化测试的小伙伴应该很熟悉这个,我这个门外汉也就接触过一点皮毛。
命令如下:
先找到phantomjs的安装路径,然后进入安装目录下面的examples目录。运行下面这行命令即可
phantomjs rasterize.js 网址 保存的名字

保存的名字后缀为pdf 则将网页保存为了pdf格式的文档,如果保存的名字后缀为png,则将网页保存为截图

下面是rasterize.js的代码,官方自带的一个js,挺好用的

"use strict";
var page = require('webpage').create(),
    system = require('system'),
    address, output, size;

if (system.args.length < 3 || system.args.length > 5) {
    console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]');
    console.log('  paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"');
    console.log('  image (png/jpg output) examples: "1920px" entire page, window width 1920px');
    console.log('                                   "800px*600px" window, clipped to 800x600');
    phantom.exit(1);
} else {
    address = system.args[1];
    output = system.args[2];
    page.viewportSize = { width: 600, height: 600 };
    if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") {
        size = system.args[3].split('*');
        page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' }
                                           : { format: system.args[3], orientation: 'portrait', margin: '1cm' };
    } else if (system.args.length > 3 && system.args[3].substr(-2) === "px") {
        size = system.args[3].split('*');
        if (size.length === 2) {
            pageWidth = parseInt(size[0], 10);
            pageHeight = parseInt(size[1], 10);
            page.viewportSize = { width: pageWidth, height: pageHeight };
            page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight };
        } else {
            console.log("size:", system.args[3]);
            pageWidth = parseInt(system.args[3], 10);
            pageHeight = parseInt(pageWidth * 3/4, 10); // it's as good an assumption as any
            console.log ("pageHeight:",pageHeight);
            page.viewportSize = { width: pageWidth, height: pageHeight };
        }
    }
    if (system.args.length > 4) {
        page.zoomFactor = system.args[4];
    }
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
            phantom.exit(1);
        } else {
            window.setTimeout(function () {
                page.render(output);
                phantom.exit();
            }, 200);
        }
    });
}

1234.png
用phantomjs去截取中文页面的网站可能会出现乱码的情况,也就是截图中中文的位置全是方框。
解决办法就是安装字体。
在centos中执行:yum install bitmap-fonts bitmap-fonts-cjk
在ubuntu中执行:sudo apt-get install xfonts-wqy
这样再去截图中文的页面就不会出现一堆的方框了。