spring容器标签前缀

一般地,spring容器标签bean元数据格式为<bean></bean>。但是,奇怪的是有的时候必须使用<beans:bean></beans:bean>,否则会报错。

一、为什么会这样?

这与spring容器xml配置当前主要的命名空间(xmlns)设置有关。
由于在同一个xml配置文件中可能会加载多个文档结构定义(DTD),因此需要使用命名空间来区分开多个DTD中可能相同的文档标签。

例如:spring tx schema包含annotation-driven(<tx:annotation-driven/>),同时,spring mvc schema也包含annotation-driven(<mvc:annotation-driven/>)

二、小结

对于以上问题描述情况,不需要使用beans前缀的,xmlns是如下情况:

1
2
3
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:beans="http://www.springframework.org/schema/beans">
</beans>

而对于需要使用beans前缀的,xmlns被修改了,可能是:

1
2
3
<beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:beans="http://www.springframework.org/schema/beans">
</beans>

由此可知

使用主命名空间里的标签,命名空间前缀并不是必须的。

三、参考文档

http://bbs.csdn.net/topics/340026084
http://www.w3school.com.cn/tags/tag_prop_xmlns.asp

git多仓库配置

一、密钥选择

默认情况下,git会使用id_rsa与id_rsa.pub的密钥对,与git代码服务器进行通信。但是,对于同一台机器需要与不同的git代码服务器进行通信的需求,则需要进行特别指定。

例如:需要针对于github使用非默认的密钥对,则可向~/.ssh/config添加如下配置:

1
2
3
4
Host github.com
HostName github.com
User git
IdentityFile /Users/yeshaoting/.ssh/id_rsa_github

二、用户配置

代码提交的用户信息。

1. 全局配置

1
2
git config --global user.name "叶绍亭"
git config --global user.email "yeshaoting@meituan.com"

会在用户目录生成或修改~/.gitconfig文件。
默认情况下,会使用此文件里的配置内容。

2. 仓库配置

1
2
git config user.name "yeshaoting"
git config user.email "yeshaoting@163.com"

会修改当前仓库.git/config文件内容。
此文件里的配置会覆盖全局配置里相同的配置内容。

三、参考文档

High一下

一、前言

本文内容基于wuchong的Jacman主题。

让网站元素动起来,从酷壳网站抄过来的,套到hexo博客菜单里。

二、代码

代码:themes/jacman/layout/_partial/header.ejs

找到 ==theme.menu== 位置,代码在菜单遍历输出后,添加如下代码:

1
<li><a title="把这个链接拖到你的Chrome收藏夹工具栏中" href='javascript:(function(){function c(){var e=document.createElement("link");e.setAttribute("type","text/css");e.setAt    tribute("rel","stylesheet");e.setAttribute("href",f);e.setAttribute("class",l);document.body.appendChild(e)}function h(){var e=document.getElementsByClassName(l);for(var t=0;t<e.length;t++){document    .body.removeChild(e[t])}}function p(){var e=document.createElement("div");e.setAttribute("class",a);document.body.appendChild(e);setTimeout(function(){document.body.removeChild(e)},100)}function d(e    ){return{height:e.offsetHeight,width:e.offsetWidth}}function v(i){var s=d(i);return s.height>e&amp;&amp;s.height<n&amp;&amp;s.width>t&amp;&amp;s.width<r}function m(e){var t=e;var n=0;while(!!t){n+=t    .offsetTop;t=t.offsetParent}return n}function g(){var e=document.documentElement;if(!!window.innerWidth){return window.innerHeight}else if(e&amp;&amp;!isNaN(e.clientHeight)){return e.clientHeight}re    turn 0}function y(){if(window.pageYOffset){return window.pageYOffset}return Math.max(document.documentElement.scrollTop,document.body.scrollTop)}function E(e){var t=m(e);return t>=w&amp;&amp;t<=b+w}    function S(){var e=document.createElement("audio");e.setAttribute("class",l);e.src=i;e.loop=false;e.addEventListener("canplay",function(){setTimeout(function(){x(k)},500);setTimeout(function(){N();p    ();for(var e=0;e<O.length;e++){T(O[e])}},15500)},true);e.addEventListener("ended",function(){N();h()},true);e.innerHTML=" <p>If you are reading this, it is because your browser does not support the     audio element. We recommend that you get a new browser.</p> <p>";document.body.appendChild(e);e.play()}function x(e){e.className+=" "+s+" "+o}function T(e){e.className+=" "+s+" "+u[Math.floor(Math.r    andom()*u.length)]}function N(){var e=document.getElementsByClassName(s);var t=new RegExp("\\b"+s+"\\b");for(var n=0;n<e.length;){e[n].className=e[n].className.replace(t,"")}}var e=30;var t=30;var n    =350;var r=350;var i="//s3.amazonaws.com/moovweb-marketing/playground/harlem-shake.mp3";var s="mw-harlem_shake_me";var o="im_first";var u=["im_drunk","im_baked","im_trippin","im_blown"];var a="mw-st    robe_light";var f="//s3.amazonaws.com/moovweb-marketing/playground/harlem-shake-style.css";var l="mw_added_css";var b=g();var w=y();var C=document.getElementsByTagName("*");var k=null;for(var L=0;L<    C.length;L++){var A=C[L];if(v(A)){if(E(A)){k=A;break}}}if(A===null){console.warn("Could not find a node of the right size. Please try a different page.");return}c();S();var O=[];for(var L=0;L<C.leng    th;L++){var A=C[L];if(v(A)){O.push(A)}}})()'>High一下!</a></li>

jacman主题集成百度分享

一、前言

本文内容基于wuchong的Jacman主题。

1. 默认分享样式

默认分享样式如下图所示:
默认分享

2. 代码位置

分享按钮位置:themes/jacman/layout/_partial/post/footer.ejs
代码块:

1
2
<div class="article-share" id="share">
</div>

二、集成百度分享

jacman主题默认不支持百度分享,只需要如下简单几步工作即可集成:

1. 登录或注册百度

登录百度分享,完成登录或注册。

2. 主题配置

修改主题配置文件themes/jacman/_config.yml,如下:

1
2
bdshare:
enable: true ## if you use baidu share as your share tool,the built-in share tool won't be display.

:enable前有二个空格(表示层级关系),在代码里,可能通过theme.bdshare.enable获取其值。

3. 代码逻辑

代码:themes/jacman/layout/_partial/post/footer.ejs

百度分享相关代码逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="article-share" id="share">
<% if(theme.bdshare.enable){ %>
<%- partial('bdshare') %>
<% } else { %>
<% if(theme.jiathis.enable){ %>
<div class="share-jiathis">
<%- partial('jiathis') %>
</div>
<% } else { %>
<div data-url="<%- item.permalink %>" data-title="<% if (item.title){ %><%= item.title %> | <% } %><%= config.title %>" data-tsina="<%= theme.author.tsina %>" class="share clearfix">
</div>
<% } %>
<% } %>
</div>

在原来theme.jiathis.enable代码块外层包一层theme.bdshare.enable判断,优先判断是否使用百度分享。

<%- partial('bdshare') %>语法表示加载当前目录下的bdshare.ejs文件。

4. 百度分享模块

代码:themes/jacman/layout/_partial/post/bdshare.ejs

新建bdshare.ejs,并复制如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
<% if (theme.bdshare.enable){ %>
<div class="bdsharebuttonbox">
<a href="#" class="bds_more" data-cmd="more"></a>
<a href="#" class="bds_sqq" data-cmd="sqq" title="分享到QQ好友"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网"></a>
<a href="#" class="bds_count" data-cmd="count"></a>
</div>
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"1","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"24"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
<% } %>

5. 检测分享代码版本

1
2
//打开已安装分享代码的页面,在控制台中执行:
javascript:b=(window.bdShare||window._bd_share_main);alert(b?'\u5F53\u524D\u9875\u9762\u7684\u5206\u4EAB\u4EE3\u7801\u7248\u672C\u4E3A\uFF1A'+(b.version||'1.0'):'\u5F53\u524D\u9875\u9762\u6CA1\u6709\u5B89\u88C5\u5206\u4EAB\u4EE3\u7801\u3002')

参见:检测分享代码版本

三、分享效果展示

分享按钮样式:
jiathis分享

内容分享给QQ好友:
分享给QQ好友

内容分享到微博:
分享到微博

四、小结

百度分享最大的一个优点在于更能提高在百度的搜索排名。另外,个人感觉百度分享生成代码过程更加友好。
内容分享描述比较简单,仅仅只支持标题是硬伤。

jacman主题开启jiathis分享

一、前言

本文内容基于wuchong的Jacman主题。

1. 默认分享样式

默认分享样式如下图所示:
默认分享

2. 代码位置

分享按钮位置:themes/jacman/layout/_partial/post/footer.ejs
代码块:

1
2
<div class="article-share" id="share">
</div>

二、开启jiathis分享

jacman主题默认支持jiathis分享,只需要如下简单几步工作即可开启:

1. 注册jiathis

登录jiathis网站,完成注册。
进入账号设置,在基本资料栏可以获取用户ID:2084038。

2. 主题配置

修改主题配置文件themes/jacman/_config.yml,如下:

1
2
3
4
5
#### Share button
jiathis:
enable: true ## if you use jiathis as your share tool,the built-in share tool won't be display.
id: 2084038 ## e.g. 1889330 your jiathis ID.
tsina: 1873363984 ## e.g. 2176287895 Your weibo id,It will be used in share button.

:enable, id, tsina前有二个空格(表示层级关系),在代码里,可能通过theme.jiathis.enable获取其值。

3. 代码逻辑

代码:themes/jacman/layout/_partial/post/footer.ejs

jiathis分享相关代码逻辑:

1
2
3
4
5
6
7
8
<% if(theme.jiathis.enable){ %>
<div class="share-jiathis">
<%- partial('jiathis') %>
</div>
<% } else { %>
<div data-url="<%- item.permalink %>" data-title="<% if (item.title){ %><%= item.title %> | <% } %><%= config.title %>" data-tsina="<%= theme.author.tsina %>" class="share clearfix">
</div>
<% } %>

<%- partial('jiathis') %>语法表示加载当前目录下的jiathis.ejs文件。

4. 调整分享按钮顺序

代码:themes/jacman/layout/_partial/post/jiathis.ejs

调整后的顺序:

1
2
3
4
5
6
7
8
9
<div class="jiathis_style_24x24">
<a class="jiathis_button_cqq"></a>
<a class="jiathis_button_qzone"></a>
<a class="jiathis_button_weixin"></a>
<a class="jiathis_button_tsina"></a>
<a class="jiathis_button_renren"></a>
<a href="http://www.jiathis.com/share" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
<a class="jiathis_counter_style"></a>
</div>

三、分享效果展示

分享按钮样式:
jiathis分享

内容分享给QQ好友:
分享给QQ好友

内容分享到微博:
分享到微博

四、小结

1. 分享内容丰富

jiathis分享最大的一个优点在于主流的社交平台分享的内容更加丰富:描述会带上一部分正方内容,另外会附带上正文中的图片。

2. 累计分享次数统计

较多说分享而言,jiathis多出一个累计分享次数统计功能。
较百度分享而言,找了好久才在别人的博客里找到百度分享累计分享次数的代码,未在百度分享网站显目位置有说明介绍。

vim高亮显示ejs格式内容

一、简介

官方介绍如下:

EJS is a client-side templating language that was originally part of JavaScriptMVC, which has now been replaced by DoneJS.

二、解决方法

方法一 视ejs格式为html格式

1
au BufNewFile,BufRead *.ejs set filetype=html

详细au命令参见:AUTOCMD

方法二 定制ejs格式语法高亮

1. 下载ejs语法文件

下载ejs.vim文件到~/.vim/syntax/目录。
下载地址:https://github.com/emilis/emilis-config/blob/master/.vim/syntax/ejs.vim

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
runtime! syntax/html.vim
unlet b:current_syntax

" Include Java syntax
syn include @ejsJavaScript syntax/javascript.vim

syn region ejsScriptlet matchgroup=ejsTag start=/<%/ keepend end=/%>/ contains=@ejsJavaScript
syn region ejsExpr matchgroup=ejsTag start=/<%=/ keepend end=/%>/ contains=@ejsJavaScript

" Redefine htmlTag so that it can contain jspExpr
syn clear htmlTag
syn region htmlTag start=+<[^/%]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster,ejsExpr,javaScript


" syn keyword ejsPrint contained print
syn match javaScriptType /\<\zsvars\ze\./
syn match javaScriptSpecial /\<\zsexports\ze\./
syn match javaScriptFunction /\<\zsprint\ze(/
syn match javaScriptFunction /\<\zsinclude\ze(/
syn match javaScriptFunction /\<\zsincludeObject\ze(/
syn match javaScriptFunction /\<\zsfetch\ze(/
syn match javaScriptFunction /\<\zsfetchObject\ze(/

command -nargs=+ HiLink hi def link <args>
HiLink ejsTag htmlTag
delcommand HiLink

let b:current_syntax = "ejs"

2. 设置ejs格式语法

1
au BufNewFile,BufRead *.ejs set filetype=ejs

三、参考文档

Syntax highlight for .ejs files in vim

Charles使用手记

一、 安装&破解

官方网站下载原版:https://www.charlesproxy.com/latest-release/download.do

破解文件下载:charles 3.11 mac版 注册码&破解
适用于Charles3.11.x,含Windows版和Mac版。
使用方法:下载并解压后,选择响应平台的charles.jar并替换安装目录下对应的同名文件即可。替换后记得重启Charles哈。

二、设置Wifi热点

  1. 在“系统偏好设置”中找到共享,并打开,如下图所示:
    ![共享]http://o7kubqw1j.bkt.clouddn.com//images/article/charles使用手记/234626efeiiiee0ie0de1d.png)
    ![共享]http://o7kubqw1j.bkt.clouddn.com//images/article/charles使用手记/234626efeiiiee0ie0de1d.png)

  2. 设置wifi
    ![设置wifi]http://o7kubqw1j.bkt.clouddn.com//images/article/charles使用手记/234626dfzl5ddirvab0wlf.png)
    ![设置wifi]http://o7kubqw1j.bkt.clouddn.com//images/article/charles使用手记/234626dfzl5ddirvab0wlf.png)

  3. 设置互联网共享
    ![互联网共享]http://o7kubqw1j.bkt.clouddn.com//images/article/charles使用手记/234626zltkgqegkdk9egk9.png)
    ![互联网共享]http://o7kubqw1j.bkt.clouddn.com//images/article/charles使用手记/234626zltkgqegkdk9egk9.png)

参见:将你的Mac设置为共享的Wifi热点

文件遍历选取脚本

一、脚本说明

1. 应用场景

身为QA的女友,有一堆自动化的测试用例跑,随着自动化case的增加,导致每次回归测试过程时间过长。
有些时候上线功能只是修改了某些业务逻辑,仅仅只需要执行一部分case即可。
因此,需要从一堆现有case里选取若干文件即可。

2. 脚本内容

脚本主要分为二部分内容:文件遍历和文件选择。

文件遍历:将指定路径下特定后缀的case选取出来,存入到数组files中,并以序号、数组内容格式输出。
文件选择:等待用户输入序号(多个使用空格隔开),然后根据用户输入的多个序号从数组files中选取对应的文件即可。

二、选取脚本

1. 脚本源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash

BASE_PATH=/Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article
FEATURE='*.md'

if [[ $# -ge 1 && $1 != '-' ]]
then
BASE_PATH=$1
fi

if [[ $# -ge 2 && $2 != '-' ]]
then
FEATURE=$2
fi

echo "BASE_PATH: $BASE_PATH"
echo "FEATURE: $FEATURE"

declare -a files

# 文件遍历
function file_traverse {
echo "-----------------------------------------"
IFS=$'\n'
#echo -n "$IFS" | od -b


files=($(find $BASE_PATH -name "$FEATURE"))
for str in ${!files[@]}
do
echo -e "$str\t${files[$str]}"
done
}

# 文件选择
function choose_file {
echo "-----------------------------------------"
read -p "请通过序号选择文件:" ids
echo "你选择的序号为:${ids[@]}"


IFS=$' \t'
for id in ${ids[@]}
do
if [ $id -lt ${#files[@]} ]
then
echo "文件: "${files[$id]}
fi
done
}


file_traverse
choose_file

2. 脚本输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
yerba-buena:shell yeshaoting$ sh print_blog_file.sh /Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article/shell/
BASE_PATH: /Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article/shell/
FEATURE: *.md
yerba-buena:shell yeshaoting$ sh print_blog_file.sh /Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article/shell/
BASE_PATH: /Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article/shell/
FEATURE: *.md
-----------------------------------------
0 /Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article/shell/shell关联数组基本用法.md
1 /Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article/shell/了解IFS.md
2 /Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article/shell/遍历博客文章.md
-----------------------------------------
请通过序号选择文件:2 0
你选择的序号为:2 0
文件: /Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article/shell/遍历博客文章.md
文件: /Users/yeshaoting/java/workspace/github/hexo-blog/source/_posts/article/shell/shell关联数组基本用法.md

了解IFS

一、介绍

内部字段分隔符IFS用作文本分隔符,用于将分隔文本成一个个词。默认的分隔符为空格、制表符以及换行。

通过命令man bash可以查看到bash的帮助文档,其中有一段内容如下:

The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command.
The default value is <space><tab><newline>.

二、相关知识

1. IFS内容查看

由于IFS默认包含的字符都是非可见字符,所以需要将字符内容转换成ASCII码或者八进制等查看。

1
2
3
4
echo $IFS | od -a (Output named characters.)
echo $IFS | od -b (Output octal bytes.)
echo $IFS | od -c (Output C-style escaped characters.)
echo $IFS | od -x (Output hexadecimal bytes.)

2. 自定义IFS

一般情况,修改IFS只需给IFS这个全局变量赋值即可。
例如:设置默认分隔符为冒号IFS=.

特别地,对于空格、\n,\t等特殊字符或转义字符需要进行转义处理,如:IFS=$'\n'

三、应用实例

1. 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

str="172.30.29.173"
arr=($str)
echo -e "默认分隔>> 长度:${#arr[@]} 内容:${arr[@]}"

IFS=.
arr=($str)
echo -e "冒号分隔>> 长度:${#arr[@]} 内容:${arr[@]}"

str="172 30.29 173"
IFS=$' '
arr=($str)
echo -e "空格分隔>> 长度:${#arr[@]} 内容:${arr[@]}"

2. 输出

1
2
3
4
yerba-buena:tmp yeshaoting$ sh ifs.sh
默认分隔>> 长度:1 内容:172.30.29.173
冒号分隔>> 长度:4 内容:172 30 29 173
空格分隔>> 长度:3 内容:172 30.29 173

四、参考文档

  1. SHELL中的IFS详解
  2. [Shell学习笔记] 内部字段分隔符IFS、脚本调试DEBUG
  3. Shell中的IFS解惑
  4. What is the meaning of IFS=$’\n’ in bash scripting ?

hexo使用进阶

一、后端管理插件hexo-admin

插件可以直接在网页端创建、编辑markdown文章内容,并将内容发布到_posts里。
另外,对我而言,最方便的是可以很方便的给文章加标题、分类、打标签。

参见:

1. 安装

1
2
3
npm install --save hexo-admin
hexo server -d
open http://localhost:4000/admin/

2. 配置

在_config.yml最后添加类似如下内容:

1
2
3
4
admin:
username: myfavoritename
password_hash: be121740bf988b2225a313fa1f107ca1
secret: a secret something

username:后端登录用户名
password_hash:后端登录用户密码对应的md5 hash值
secret:用于保证cookie安全

3. 预览

hexo-admin界面如下:
screenshot-1
screenshot-2

|