你想要的生活都会还给你

你正在为自己的未来打拼,也许有时候会感觉看不到尽头。但你要相信,度过这一段努力得自己都能感动自己的日子之后,你想要的岁月统统都会还给你!

随手拍

一个旅行者,在一条大河旁看到了一个婆婆,正在为渡水而发愁。已经精疲力竭的他,用尽浑身的气力,帮婆婆渡过了河,结果,过河之后,婆婆什么也没说,就匆匆走了。

旅行者很懊悔。他觉得,似乎很不值得耗尽气力去帮助婆婆,因为他连“谢谢”两个字都没有得到。

哪知道,几小时后,就在他累得寸步难行的时候,一个年轻人追上了他。年轻人说,谢谢你帮了我的祖母,祖母嘱咐我带些东西来,说你用得着。说完,年轻人拿出了干粮,并把胯下的马也送给了他。

不必急着要生活给予你所有的答案,有时候,你要拿出耐心等等。即便你向空谷喊话,也要等一会儿,才会听见那绵长的回音。也就是说,生活总会给你答案,但不会马上把一切都告诉你。

其实,岁月是一棵纵横交错的巨树。而生命,是其中飞进飞出的小鸟。如果哪一天,你遭遇了人生的冷风冻雨,你的心已经不堪承受,那么,也请你等一等,要知道,这棵巨树正在生活的背风处为你营造出一种春天的气象,并一点一点靠近你,只要你努力了。

回报不一定在付出后立即出现。只要你肯等一等,生活的美好,总在你不经意的时候,盛装莅临。

使用 Swiftype 创建一个随心所欲的搜索引擎

Swiftype 是个什么东东?

Swiftype 可以为网站及移动 app 提供内置搜索引掣服务。其部署十分简单,只须输入 URL 地址平台即可执行对用户网站的抓取,插入 JavaScript 代码嵌入网站就即完成搜索引擎的创建。Swiftype 还提供了分析服务,供网站检索分析用户的搜索行为和使用偏好。Swiftype 还支持对搜索结果排序进行定制。

Swiftype 有什么优点?

  • 无须你在后端写任何代码,仅仅创建一个引用,引入脚本即可在网站展现一个搜索界面
  • 抓取的内容全,当输入URL时,无论你是静态的还是动态的网页,都将把每个URL抓回去,若有些链接没抓到,也可以通过手动提交地址
  • 灵活定制,例如搜索框的定制,搜索结果页的定制,展示的字段也可以定制,抓取规则的过滤定制
  • 接口丰富,可通过很多种方式去请求搜索api,然后获取搜索后返回的数据
  • 安全机制校验,不用担心数据会被其他人盗用
  • 支持跨域请求,支持搜索关键词统计等等
  • 支持智能提示,自定义排序等

查看更多

gojs 学习笔记(1)

gojs 入门讲解 ———-作者 Peng8

gojs 是一款非常强大的绘图工具,可以用来画流程图、树图、关系图、力导图、甘特图、电流图等等一些很复杂炫酷的图形。以下是我学习的笔记,帮助大家理解,如有不对的地方请谅解

下载

官方网站下载gojs相关的资源包,里面包含了例子、API等资源文件 传送门

一个简单的流程图

1
var $ = go.GraphObject.make;

注释:按照我自己的理解,这个全局变量相当于一个画笔,即定义一个画笔工具。之后我们就可以通过$符号来调用它自身的一些方法、属性、枚举对象等。
有了画笔,那我们还需要画布,于是我们需要定义一个画布用来装载一些具体内容

1
2
3
4
5
6
7
8
var myDiagram =$(go.Diagram, "myDiagram",{
initialAutoScale: go.Diagram.Uniform,
contentAlignment: go.Spot.Center,
layout:$(go.ForceDirectedLayout,{
defaultSpringLength: 30,
defaultElectricalCharge: 100
})
});

注释:go.Diagram 就是我们要定义的画布,注意了,第二个参数 “myDiagram” ,这里是要渲染的DIV 的Id 名称,contentAlignment是内容的对齐方式,layout 代表画布里的元素布局方式,采用了力导图自然排列。
这个画笔可以绘制节点、链接、区域、图案、形状、文本等,例如我们要写一个文本就可以这样写:

1
2
3
4
5
6
$(go.TextBlock,{
text:"www.peng8.net",
stroke: "red",
font: "bold 10pt helvetica, bold arial, sans-serif",
margin: 4
})

注释:上面这段代码应该很好理解,用画笔绘制了一个文本对象go.TextBlock ,并为它填充了属性 text、stroke、font、margin 等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
myDiagram.nodeTemplate = $(go.Node, "Auto",
$(go.Shape, "RoundedRectangle",
{
fill: "white",
stroke: "red"
},
new go.Binding("fill", "color")
),
$(go.TextBlock,
{
font: "bold 10pt helvetica, bold arial, sans-serif",
margin: 4
},
new go.Binding("text", "text"))
);

注释:上面这段代码定义了一个节点模版,一个流程图,由很多很多个节点构成,在节点模版里面有定义了2个模型,一个是形状一个是文本,首先通过go.Shape 定义了一个 圆角矩形 ,默认填充色为 白色,边框颜色为 红色。
注意了,仔细看我们会发现 TextBlock 里相对与上面那个TextBlock ,少了一个text属性节点,而在最下面多了一行 new go.Binding("text","text") ,这什么意思呢?这是申明动态绑定text属性,将数据源中提供text字段的值赋值给当前的text属性,随后介绍数据源的格式。

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
myDiagram.linkTemplate =
$(go.Link,
{ adjusting: go.Link.Stretch, reshapable: true },
new go.Binding("points").makeTwoWay(),

//new go.Binding("curviness", "curviness"),
$(go.Shape,
{
isPanelMain: true,
stroke: "black"
}),
$(go.Shape,
{
toArrow: "standard",
stroke: null
}),


$(go.TextBlock,
{
textAlign: "center",
segmentOffset: new go.Point(0, -10),
font: "10pt helvetica, arial, sans-serif",
stroke: "#555555",
margin: 4
},
new go.Binding("text", "text")
)
);

注释:我们定义了节点模版,构成了流程图的每一个点,所谓流程图自然有流向,于是有了连接点与点的线,这里我们称之 流程线 ,可以是虚线、实线、带箭头、不带箭头等。同样上面通过go.Link 构建了流程线,这个对象里面包含了 2个形状,一个文本,2个形状一个用来画线,一个用来画箭头,文本用来显示线上的label。至于里面的属性我就不做详细介绍了,大家可以看API。

最后就是如何给流程图填充动态数据了,这里我采用了json的方式,流程图赋值就是一句话就够了

1
myDiagram.model = go.Model.fromJson(jsonList);

jsonList 是我前端定义用来接收ajax返回数据的一个对象,它的数据结构是

1
2
3
4
5
var jsonList = {
nodeKeyProperty: "key",
nodeDataArray: [{key:1,text:"节点a"},{key:2,text:"节点b"},{key:3,text:"节点c"}],
linkDataArray: [{from:1,to:2,text:"我是节点a指向节点b"},{from:2,to:3,text:"我是节点b指向节点c"},{from:3,to:1,text:"我是节点c指向节点a"}]
};

注释:jsonList 的结构是固定的,包含了nodeKeyPropertynodeDataArraylinkDataArray 三个属性,分别代表了 关联的主键节点数据节点对应关系数据 ,上面from 和to 即 开始节点的主键指向结束节点的主键。
我们把上面所有代码合起来,就形成了一个简单的流程图,上图上真相

简单的流程图

gojs简单流程图先介绍到这里,后续还会有自定义节点图标、节点编辑、节点扩充等等相关的介绍

敬请期待,待续中…..

你所不知的highchart常用属性

那些你没用过,你所不知道的highchart秘密,不定期更新。

Highcharts 4.1.9

axis.visible

这个属性用来控制是否显示yAxis或者xAxis,之前我们想要隐藏x和y轴是通过设置它的宽度为0来控制的,现在可以通过这个属性来设置了

softThreshold

此属性是在series里设置的,默认为true。如果设置false,当series里的值出现 0,1,2值会使y轴出现负值,我想大家都遇到过此问题,我们会设置y轴的最小值使y的坐标从0开始
如果是true,则不用设置最小值,直接从0开始

Highcharts 4.1.8

exporting.allowHTML

导出配置的一个属性,这个属性默认是false,默认导出不允许导出的svg中包含自定义的html元素。设置true即可支持自定义html元素导出

1
2
3
The HTML is rendered in a foreignObject tag in the generated SVG. 
The official export server is based on PhantomJS, which supports this,
but other SVG clients, like Batik, does not support it.

我们会看到官方给出了这样一段话,什么意思呢?就是说渲染svg以外的html元素,官方的phantomjs 是支持的,但其他的客户端导出 例如Batik 是不支持的。

maxPointWidth

默认值是null,用来设置柱子的最大宽度,当图表里只有几根柱子时,柱子会非常的粗,此时就需要应用此属性来设置了。

Highcharts 4.1.6

  • 增加xAxis.title.xxAxis.title.y 配置标题的作为
  • 3D图上 增加scaling 缩放 Z 轴

Highcharts 4.1.5 以内

series.keys

1
2
3
4
5
6
7
8
9
10
11
series: [{
type: 'pie',
name: 'Browser share',
data: [
['Firefox', 45.0],
['Chrome', 12.8, true, true],
['Safari', 8.5]
],
keys: ['name', 'y', 'sliced', 'selected']
//设置key的顺序后,会按照data提供的数据顺序获取
}]

xAxis.labels.autoRotationLimit

1
2
3
4
5
6
7
xAxis: {
type: 'category',
labels: {
autoRotationLimit: 40
}
}
//X轴的label超过指定长度后自动截取

plotOptions.series.pointIntervalUnit

当x轴为 datetime模式时,可以将此属性 设置为 day,month,year ,代表间隔单位

xAxis.labels.autoRotation

此属性是一个数组用来分别设置categories的倾斜度数,例如:

1
2
3
4
categories: ['January', 'February', 'March'],
labels: {
autoRotation: [-10, -20, -30]
}

yAxis.tickAmount

用来设置y轴 label的显示个数

events.selection

当设置了zoomType时,选中图表某个区域,能在此事件中获取到选中的区域的值范围。

1
2
3
4
selection: function (event) {
var min=Highcharts.numberFormat(event.xAxis[0].min, 2);
var max=Highcharts.numberFormat(event.xAxis[0].max, 2);
}

chart.panningchart.panKey

这2个属性基本同时出现,要使用panKey,必须先将panning设置为true。它的作用是:设置一个快捷键,当x轴启用zoomType时,放大某一块区域,然后按住所设置的快捷键,点击图表拖拽可以滑动查看。

xAxis.breaks

此属性是一个数组,作用是用一个区间段来代表x轴 某个起始点到某个结束点。例如x轴有1~10个点,我想把 5~8 之间的点不显示,直接显示 1,2,3,4,5,8,9,10。这样6,7 两个点就不显示在x轴上了。

1
2
3
4
5
6
7
8
xAxis: {
tickInterval: 1,
breaks: [{
from: 5,
to: 8,
breakSize: 1
}]
}

xAxis.labels.staggerLines

用来设置x轴分行显示

plotOptions.line.linecap

用来设置线条的渲染形状 弧形和方形,默认是弧形,以下设置为方形

1
2
3
4
plotOptions: {
line: {
linecap:"square"
}}

后面待续。。。。不定期更新

highchart 在legend中动态显示point点的值

插件分享,闲话就不多说了,主要是实现在legend中动态展示point点的值!

  • 将以下代码单独拷入到文件中,引用在highchart.js文件之后
    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
    (function (H) {
    H.Series.prototype.point = {};
    H.Chart.prototype.callbacks.push(function (chart) {
    $(chart.container).bind('mousemove', function () {
    var legendOptions = chart.legend.options,
    hoverPoints = chart.hoverPoints;

    if (!hoverPoints && chart.hoverPoint) {
    hoverPoints = [chart.hoverPoint];
    }
    if (hoverPoints) {
    H.each(hoverPoints, function (point) {
    point.series.point = point;
    });
    H.each(chart.legend.allItems, function (item) {
    item.legendItem.attr({
    text: legendOptions.labelFormat ?
    H.format(legendOptions.labelFormat, item) :
    legendOptions.labelFormatter.call(item)
    });
    });
    chart.legend.render();
    }
    });
    });
    // 隐藏tooltip,允许crosshair
    H.Tooltip.prototype.defaultFormatter = function () { return false; };
    }(Highcharts));

说明:上述代码是一段扩展,在callback中为图标重新绑定了mousemove事件,当鼠标滑过某个点,动态修改legendItem的属性,并重新渲染

来张效果示意图

DEMO地址入口:传送门

angularjs中自定义绑定标签

在使用ng的过程中,默认的绑定符号是 \{\{ng变量\}\},但有时候会与其他插件的一些模版符号冲突,因此我们需要自定义ng渲染的符号,能不能将 \{\{ng变量\}\} 替换成 [[ng变量]] 或者 {[ng变量]},答案是肯定的, 主要是利用 $interpolateProvider内置服务 修改标识符。代码如下所示

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
<body ng-app="MyModule">
<form id="form1" runat="server">
<div>
<div ng-controller="main">
[[test]]
</div>
</div>
</form>
<script type="text/javascript">
angular.module('MyModule', []).config(['$interpolateProvider', function ($interpolateProvider) {

angular.bootstrap(document.documentElement,

[function ($interpolateProvider) {

$interpolateProvider.startSymbol('[[');

$interpolateProvider.endSymbol(']]');

}]);

}]);
function main($scope, $http) {
$scope.test = "aaaa";
}
</script>

</body>

分享 aspose 的一些基本用法

Aspose 是Aspose公司旗下的最全的一套office文档管理解决方案,主要提供.net跟java两个开发语言的控件套包。功能异常强大,各个平台基本都支持,强力推荐大家使用。
本文就根据我所用的经历简要介绍Aspose的一些用法!

注:由于小弟只在ASP.NET 中曾用Aspose 导出过word ,所以接下来的介绍都是asp.net环境下的一些用法。

资源包

首先我们得去官网下载 asp.net aspose的DLL 程序集,稍后会在项目中使用。
官网的DLL 会带有水印和商标,因此大家可以在网上搜索破解版,这里我就不啰嗦了

基本用法

1
Aspose.Words.Document doc = new Aspose.Words.Document();

用来申明一个 word文件对象,后面() 里可以增加参数,实例化有5个重载,括号中什么都不写表示空文档对象,若写上本地word的路径,则是将word文件读取到当前word文件对象中。

1
Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);

DocumentBuilder 类似一个文档操作工具,用来操作已经实例化的Document 对象,DocumentBuilder 里有许多方法 例如插入文本、插入图片、插入段落、插入表格等等

查看更多

如何解决angularjs中post参数获取不到的问题

解决angularjs post方式提交时,获取不到参数

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
angular.module('MyModule', [], function ($httpProvider) {
// Use x-www-form-urlencoded Content-Type
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

/**
* The workhorse; converts an object to x-www-form-urlencoded serialization.
* @param {Object} obj
* @return {String}
*/

var param = function (obj) {
var query = '', name, value, fullSubName, subName, subValue, innerObj, i;

for (name in obj) {
value = obj[name];

if (value instanceof Array) {
for (i = 0; i < value.length; ++i) {
subValue = value[i];
fullSubName = name + '[' + i + ']';
innerObj = {};
innerObj[fullSubName] = subValue;
query += param(innerObj) + '&';
}
}
else if (value instanceof Object) {
for (subName in value) {
subValue = value[subName];
fullSubName = name + '[' + subName + ']';
innerObj = {};
innerObj[fullSubName] = subValue;
query += param(innerObj) + '&';
}
}
else if (value !== undefined && value !== null)
query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
}

return query.length ? query.substr(0, query.length - 1) : query;
};

// Override $http service's default transformRequest
$httpProvider.defaults.transformRequest = [function (data) {
return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
} ];
});

将这段代码添加到指定的模块上,作用是将Content-Type 请求方式由 application/json 变为 'application/x-www-form-urlencoded;charset=utf-8

1
2
3
4
5
6
7
8
9
10
$scope.save = function () {
$http.post(location.href + "?action=Save", {
aaa: "1111",
bbb: "2222"
}).success(function (r) {
alert(r);
}).error(function () {

});
}

这样后台就能正常的获取参数了