如何使用xmind鱼骨头

一、概述

鱼骨图因常常被用于问题的分析以及解决方法,所以又被称为因果图。

二、使用方式

可以通过模板创建鱼骨头:

模板创建xmind鱼骨头

也可以通过调整思维导图结构来实现鱼骨头:

思维导图结构调整

三、分析类型

鱼骨头通过有两种类型:原因分析型和对策分析型。

1. 原因分析型

鱼头向右

针对分析“为什么”这类问题。

2. 对策分析型

鱼头向左

针对分析“如何、怎样”类型的问题。

四、应用实例

1. 原因分析型实例

鱼骨头案例-线上服务异常

2. 对策分析型实例

鱼骨头案例-2017年度计划

五、参考文档

图片占位符placeholder.js

图片占位符,图片由于诸如过大导致浏览器渲染慢、服务器端响应时间过长、页面需要加载的图片过多等原因导致图片未加载。
某些图片未成功渲染场景下,希望页面结构能大致保持不变。

注: 同类型的先驱:http://holderjs.com/
由于当前placeholder.js已经满足需求,因此暂不对比更加广泛使用的holderjs

一、简介

placeholder.js是一款轻量级的可在浏览器端生成占位图片的javascript库插件。该图片占位插件大小小于1kb,不依赖于任何js框架,并提供完善的配置参数和简单的方法。

二、使用步骤

1. 引用类库

1
<script src="http://cdn.bootcss.com/placeholder.js/3.1.0/placeholder.js"></script>

2. 使用方法

Programmatic use API to process image: placeholder.getData(opts)

通过js程序设置图片src内容。

1
document.getElementById('img_holder').setAttribute('src', window.placeholder.getData(opts));

Image onerror event

在img标签上添加onerror监听事件。

1
onerror="this.src=placeholder.getData({size: '256x128', text: 'Image 404'})"

Use image config attribute.

1
2
3
<img class="placeholder">
<img options="size=256x128&text=Hello!" class="placeholder">
<img options="size=256x128&text=Hello%2525%26%3DWorld" class="placeholder">

这种方式,有几点使用注意事项:

  • 需要在所有img标签后添加渲染语句

    1
    2
    3
    4
    <script type="text/javascript">
    // 使用第3类方式需要,执行此方法
    placeholder.render()
    </script>
  • options内text值需要做encodeURIComponent

  • img标签必须包含名为placeholder的class属性值

三、实例

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
<!DOCTYPE html>
<html>
<head>
<title>placeholder实例</title>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="http://cdn.bootcss.com/placeholder.js/3.1.0/placeholder.js"></script>
</head>
<body>
<p>1. Programmatic use API to process image: placeholder.getData(opts)</p>
<pre>document.getElementById('img_holder').setAttribute('src', window.placeholder.getData(opts));</pre>
<img id="img_holder" src="">
<script type="text/javascript">
var opts = {
size: '256x128',
font: {
style: 'oblique',
},
text: 'Hello World'
}
document.getElementById('img_holder').setAttribute('src', window.placeholder.getData(opts));
</script>
<p>2. Image onerror event</p>
<pre>onerror="this.src=placeholder.getData({size: '256x128', text: 'Image 404'})"</pre>
<img id="img_holder2" src="404.png" onerror="this.src=placeholder.getData({size: '256x128', text: 'Image 404'})">
<p>3. Use image config attribute.</p>
<pre>&lt;img class="placeholder"&gt;</pre>
<img class="placeholder">
<pre>&lt;img options="size=256x128&text=Hello!" class="placeholder"&gt;</pre>
<img options="size=256x128&text=Hello!" class="placeholder">
<pre>&lt;img options="size=256x128&text=Hello!&bgcolor=#ccc&color=#969696&fstyle=oblique&fweight=bold&fsize=40&ffamily=consolas" class="placeholder"&gt;</pre>
<img options="size=256x128&text=Hello!&bgcolor=#ccc&color=#969696&fstyle=oblique&fweight=bold&fsize=40&ffamily=consolas" class="placeholder">
<script type="text/javascript">
// 使用第3类方式需要,执行此方法
placeholder.render()
</script>
</body>
</html>

四、参考文档

官方地址:http://placeholder.cn/
使用实例:http://placeholder.cn/doc/demo.html

samba搭建

简介

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务.

安装

注意:要安装samba必须有机器的root权限

  1. 下载samba-3.5.8.tar.gz到/home/work/xxx/(此处可以用自己指定path)
  2. 解压tar zxvf samba-3.5.8.tar.gz
  3. 执行 cd samba-3.5.8/source3
  4. 执行 ./configure && make -j 4
  5. root权限执行 make install

配置

  1. 执行 cd /usr/local/samba/ (默认安装到该路径下)

  2. 执行 vi lib/smb.conf (将下面的内容粘贴到smb.conf)

    [global]
    diplay charset = utf8
    unix charset = gbk
    dos charset = gbk
    workgroup = work
    netbios name = work
    server string = uc
    security = user
    [work]
    comment = uc
    path=/home/work
    create mask = 0664
    directory mask = 0775
    writable = yes
    valid users = work
    browseable = yes

  3. 配置项说明

    [global] 标识全局配置: 前三行是对编码的配置。
    workgroup:设置服务器所要加入的工作组的名称,会在Windows 的“网上邻居”中能看到work工作组,可以在此设置所需要的工作组的名称。
    netbios name:设置出现在“网上邻居”中的主机名。默认情况下,则使用真正的主机名。
    server string:设置服务器主机的说明信息,当在Windows 的“网上邻居”中打开Samba 上设置的工作组时,在Windows 的资源管理器窗口,会列出“名称”和“备注”栏,其中“名称”栏会显示出Samba服务器的NetBios名称,而“备注”栏则显示出此处设置的“Samba Server”。当然,可以修改默认的“Sambe Server”,使用自己的描述信息。
    security:设置Samba服务器的安全等级。默认情况下,使用user等级。
    Samba服务器一共有四种安全等级:
    (1)share:使用此等级,用户不需要帐号及密码可以登陆Samba服务器。
    (2)user:使用此等级,由提供服务的Samba服务器检查用户帐号及密码。
    (3)server:使用此等级,检查帐号及密码的工作可指定另一台Samba服务器负责。
    (4)domain:使用此等级,需要指定一台Windows NT/2000/XP服务器(通常为域控制器),以验证用户输入的帐号及密码。
    [work]标识Samba文件共享配置(中括号中名称任意)
    comment: 针对共享资源所作的说明、注释部分。
    path: 若共享资源是目录,则指定目录的位置;若为打印机,则指定打印机队列的位置。
    create mask: 设置文件的访问权限,默认值为0744。
    directory mask: 设置目录的访问权限,默认值为0755。
    writeable: 设置共享的资源是否可以写入。若共享资源是打印机,则不需设置此参数
    valid users: 设置合法用户名。
    browseable: 设置用户是否可以看到此共享资源。默认值为yes,若将此参数设置为no,用户虽然看不到此资源,但是拥有权限的用户仍可直接输入该资源的网址来访问该资源

启动和使用samba

  1. 执行 vi ~/.bash_profile(在文件里添加如下内容), 保存退出

    export LD_LIBRARY_PATH=/usr/local/samba/lib:$LD_LIBRARY_PATH

  2. 执行 . ~/.bash_profile

  3. 执行 ./bin/smbpasswd -a work (设置work的密码)

  4. 执行 cd /usr/local/samba/sbin

  5. 执行 ./smbd -D (启动samba)

  6. ps auxf | grep smbd 查看进程是否启动; netstat –npl 查看samba端口号,默认会使用139、445两个端口号

chrome插件:随机图片欣赏

完整源码参见:https://github.com/yeshaoting/chrome-plugin-study/tree/master/start

一、插件文件

1. 清单文件:manifest.json

清单是chrome插件的入口,所有插件都要有这个文件。

包含插件的一些描述信息,例如:插件名称、版本号、允许请求的地址、展示的图标等。

注:文件名称必须为maifest.json

内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"manifest_version": 2,
"name": "图片欣赏",
"description": "随机图片欣赏",
"version": "1.0",
"permissions": [
"https://secure.flickr.com/"
],
"browser_action": {
"default_icon": "images/icon.png",
"default_popup": "popup.html"
}
}

2. 资源文件

清单文件添加的图标(images/icon.png)、插件点击后弹出页面(popup.html)等。

资源文件都是在清单中定义的,通过清单描述找到。

二、插件内页

1. 功能

本插件要实现的功能:

  • 展示一批图片
  • 批量更换所有图片
  • 更换单个图片

2. 随机图片接口

现成的API接口:https://unsplash.it/300/300/?random=1

其中,random后面的值可以随机。

注:接口存在一个问题,在同一个页面random值相同的话,页面展示的图片是相同的。因此,要保证初始页面的所有random值不一致。

3. 点击事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$(document).ready(function() {
// 换一批
$("div.head a.refresh").click(function(event) {
var images = $("a.thumbnail img").each(function() {
change_img($(this));
});
});
// 单独更换
$("a.thumbnail img").click(function(event) {
change_img($(this));
});
function change_img($obj) {
var url = "https://unsplash.it/300/300/?random=" + Math.random();
$obj.attr("src", url);
}
});

三、插件加载

进入chrome扩展程序,勾选右上方开发者模式,然后点击“加载已解压的扩展程序”。

在弹出的文件查看对话框,选择开发的插件在磁盘上的存放位置。

确认完成后,就能看到开发的插件“图片欣赏”,展示在下面的扩展程序列表里了。

在chrome地址栏右侧的扩展插件中,就能看到并使用刚开发的插件了。

加载插件

四、效果图

1. 插件效果图

插件效果图

2. 独立页面效果

独立页面效果

五、参考文档

命令行监控工具Innotop

命令行监控工具Innotop

一、工具简介

innotop是一个基于命令行的监控工具,在某种方面模拟了UNIX中的top工具。

类似的命令行监控工具还有mtop和mytop,不过都不如innotop功能强大。

INNOTOP是一个通过文本模式显示MySQL和InnoDB的监测工具。INNOTOP是用PERL语言写成的,这使它能更加灵活的使用在各种操作平台之上,它能详细的监控出当前MYSQL和INNODB运行的状态,以DBA根据结果,可以合理的优化MYSQL,让MYSQL更稳定更高效的运行。(摘自:参考文档3)

二、功能特性

既然说到innotop功能很强大,到底能用来帮助我们做什么事情呢?

可以看一下innotop的功能特性如下:

  • 事务列表可以显示INNODB当前的全部事务。
  • 查询列表可以显示当前正在运行的查询。
  • 可以显示当前锁和锁等待的列表。
  • 以相对值 显示服务器状态的变量和汇总信息。
  • 有多种模式可用来显示INNODB内部信息,例如:缓冲区、死锁、外键错误、I/O活动情况、行操作、信号量以及其他更多的内容。
  • 复制监控,将主服务器和从服务器的状态显示在一起。
  • 显示任意服务器变量的模式。
  • 服务器组可以更方便地组织多台服务器。
  • 在命令行脚本下可以使用非交互式模式。

三、工具安装

1. 源码安装

最早innotop代码被托管到google code上,后来迁移到了github:innotop

下载innotop源码,运行标准的make install安装过程即可。

PS:八过网上的安装方式大多针对于linux系统而言。本人尝试在本机MAC系统下安装并没有那么简单,卡在安装perl的mysql连接库这块。MAC用户可以尝试使用下面的方法安装。

2. brew安装

通过MAC包管理工具brew搜索并安装innotop。

1
2
brew search innotop
brew install innotop

本人安装的innotop版本为1.11.1。

1
2
yerba-buena:~ yeshaoting$ innotop --version
innotop Ver 1.11.1

设置系统history

设置系统history

一、history 记录设置

1. 历史记录增加时间:HISTTIMEFORMAT

1
HISTTIMEFORMAT='%F %T ' #注意有个空格,为了显示时日期与命令之间有空格分割。

2. 历史命令记录显示行数:HISTSIZE

1
2
HISTSIZE=3000
HISTFILESIZE=3000

3. 历史文件名称更改:HISTFILE

1
HISTFILE=/var/history/$USER-$UID.log

4. 剔除连续重复的条目:HISTCONTROL

1
HISTCONTROL=ignoredups //保存退出

5. 多终端共享history

1
shopt -s histappend

由于bash的history文件默认是覆盖,如果存在多个终端,最后退出的会覆盖以前历史记录,改为追加形式。

6. 实时追加history

1
PROMPT_COMMAND="history -a"

实时追加当前session历史命令记录到history文件。

history -w则是会用当前session的历史命令替换history文件,而history -w则是会用当前session的历史命令替换history文件。

二、定期清理和保留 history 记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# archive linux command history files
# written by vpsee.com
umask 077
maxlines=2000
lines=$(wc -l < ~/.bash_history)
if (($lines > $maxlines)); then
cut=$(($lines - $maxlines))
head -$cut ~/.bash_history >> ~/.bash_history.sav
sed -e "1,${cut}d" ~/.bash_history > ~/.bash_history.tmp
mv ~/.bash_history.tmp ~/.bash_history
fi

代码高亮类库prismjs

一、简介

Prism 是一款轻量、可扩展的代码语法高亮库,使用现代化的 Web 标准构建。

二、为什么选择 Prism.js ?

  • 极致易用
    引用 prism.css 和 prism.js,使用合适的 HTML5 标签(code.language-xxxx),搞定!
  • 天生伶俐
    语言的 CSS 类是可继承的,所以你只需定义一次就能应用到多个代码片段。

  • 轻如鸿毛
    代码压缩后只有 1.6KB。每添加一个语言平均增加 0.3-0.5KB,主题在 1KB 左右。

  • 快如闪电
    如果可能,支持通过 Web Workers 实现并行。
  • 轻松扩展
    定义新语言或扩展现有语法,或者新增功能都非常简单。
  • 丰富样式
    所有的样式通过 CSS 完成,并使用合理的类名如:.comment, .string, .property 等。

三、简单用法

1. head添加主题样式

1
<link rel="stylesheet" href="http://prismjs.com/themes/prism.css">

2. 文档末尾添加Prism 类库

1
<script src="http://prismjs.com/prism.js"></script>

3. 添加测试代码

遵循 HTML5 标准,Prism 使用语义化的 pre 元素和 code 元素来标记代码区块。

1
<pre class="language-css"><code>p { color: red }</code></pre>

4. 完整代码

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
<head>
<title>代码高亮类库Prism.js</title>
<link rel="stylesheet" href="http://prismjs.com/themes/prism.css">
</head>
<body>
<pre class="language-css"><code>p { color: red }</code></pre>
<script src="http://prismjs.com/prism.js"></script>
</body>
</html>

5. 输出样式

Prism高亮效果

Python菜鸟教程学习笔记 - 循环语句

一、概述

程序在一般情况下是按顺序执行的。
编程语言提供了各种控制结构,允许更复杂的执行路径。
本章要介绍的循环语句,允许我们执行一个语句或语句组多次。

1. 循环类型

循环类型 描述
while循环 在给定的判断条件为 true 时执行循环体,否则退出循环体。
for循环 重复执行语句
嵌套循环 你可以在while循环体中嵌套for循环

2. 循环控制

控制语句 描述
break 语句 在语句块执行过程中终止循环,并且跳出整个循环。
continue 语句 在语句块执行过程中终止当前循环,跳出该次循环,执行下一次循环。
pass 语句 pass是空语句,是为了保持程序结构的完整性。

二、while循环

Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。

1. 语法格式

while 判断条件:
执行语句……

2. 实例

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
#coding=utf8
count = 0;
while count < 9:
print 'The count is :', count
count = count + 1;
print "Good bye!"

yelee主题最近访客挂件

一、前言

最近将博客hexo主题由原来的jacman换成高大上的yelee。
原来在jacman主题自定义了一些挂件,例如:多说的最近访客。
希望将原来的 最近访客 挂件迁移到yelee主题。

二、菜单项

1. 查找菜单项文件

通过chrome开发者工具,查看菜单 关于我 菜单项内容元素。

1
2
3
<section class="switch-part switch-part4">
<div id="js-aboutme">只求成为一名靠谱的码农</div>
</section>

然后,根据元素标签特征(这里选 switch-part4 ),在yelee主题目录搜索layout目录下包含 switch-part4 的文件内容。

1
2
yerba-buena:yelee yeshaoting$ grep -ir "switch-part4" layout/
layout//_partial/left-col.ejs: <section class="switch-part switch-part4">

可以看到,该文件内容存在于 layout//_partial/left-col.ejs 目录。

2. 添加菜单项

在left-col.ejs文件里,找到tips-box元素块,并类似aboutme添加visitor,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div class="tips-box hide">
<div class="tips-arrow"></div>
<ul class="tips-inner">
<li><%= __('index.menu') %></li>
<li><%= __('index.tags') %></li>
<%if(theme.friends && theme.friends.length != 0){%>
<li><%= __('index.friends') %></li>
<%}%>
<%if(theme.aboutme){%>
<li><%= __('index.about') %></li>
<%}%>
<%if(theme.visitor){%>
<li><%= __('index.visitor') %></li>
<%}%>
</ul>
</div>

3. 菜单项名称

由于主题支持多语言,因此通过 __('index.visitor') 这些的方法从语言包里获取对应的内容。
该语言文件在主题的languages目录。我的设置为:

1
2
3
4
5
6
7
8
9
# zh-Hans: Chinese (Simplified) 大陆简体
index:
menu: 菜单
tags: 标签
friends: 友情链接
about: 个人签名
visitor: 最近访客
more: 阅读全文
copy: 复制

4. 开启菜单项

注意到主题配置文件里,通过aboutme来开关“关于我”菜单项。
同样,我们也在配置文件里添加一项来控制“最近访客”菜单项是否展示。如下:

1
2
#是否开启“最近访客”功能。
visitor: true

5. 效果图

![最近访客菜单项]http://o7kubqw1j.bkt.clouddn.com//images/article/yelee主题最近访客/2016-08-20 13-41-17.jpg)
![最近访客菜单项]http://o7kubqw1j.bkt.clouddn.com//images/article/yelee主题最近访客/2016-08-20 13-41-17.jpg)

java范围映射

一、背景

近期一个功能开发涉及到一个核心业务规则为:根据消费额实行阶梯计价,额度处于的阶梯档位不同,对应的单价不同,需要根据给定的消费额找到对应的消费单价。

二、问题分析

阶梯计价翻译成编码逻辑,先容易想到是一个映射,即:Map。
不过特殊的地方在于,这是一个范围映射,将一个范围的键值映射到一个固定的值。
下来我们来看一下这种范围映射逻辑如何使用java程序来表现。

三、范围映射分类

范围映射按其连续性,可以简单分为如下两类情形:

1. 连续的范围映射

例如:计价阶梯就是连续的范围映射。
大多数情况下,计价阶梯都是连续的情况。

场景举例

举个大家都熟悉的场景:北京移动套餐外流量资费。这一流量资费在某个时期就是阶梯计价的,消费阶梯是连续的。
具体的阶梯计价映射关系如下:

流量消费阶梯 流量单价
[0,100MB) 0.15元/MB
[100MB,500MB) 0.08元/MB
[500MB,1GB) 0.05元/MB
[1GB,2GB) 0.04元/MB
[2GB,15GB) 0.03元/MB
[15GB,∞) 0.01元/MB
|