I wanna be Clever man.
post @ 2018-03-03

JanusGraph的设计是为了支持处理那些需要大量存储空间和强大的计算能力的图形。它的基本优点是大规模数据的实时遍历和分析查询。
JanusGraph支持多个非常大的图形,支持大量并发事务和运行图计算。

  • 它的事务处理能力兼容集群中的多台机器并可以以毫秒为单位回答了大型图表上复杂的遍历查询。
  • 它通过Hadoop的框架支持全局的图形分析和图的批量处理。

JanusGraph是一个图数据库引擎. JanusGraph集中在图的序列化, 图的数据模型和高效的查询. 此外JanusGraph依赖hadoop来做图的统计和批量图操作. JanusGraph为数据存储,索引和客户端访问实现了粗粒度的模块接口. JanusGraph的模块架构能和和许多存储,索引,客户端技术集成. 可以简便的扩展新的功能

JanusGraph标准支持下列存储适配和索引适配, 同时也支持第三方适配
数据存储
· Apache Cassandra
· Apache HBase
· Oracle Berkeley DB Java Edition

索引, 加快查询和复杂查询
· Elasticsearch
· Apache Solr
· Apache Lucene
通常, 应用通过两种方法与JanusGraph交互
当从本地或者远程检索数据, 内嵌在应用中的JanusGraph,运行Gremlin查询, JanusGraph缓存和事务处理和应用在同一个JVM上,
通过提交Gremlin查询, 和本地或者远程的JanusGraph实例交互, JanusGraph原生支持Gremlin Server 组件(TinkerPop stack)

架构图

启动

  1. 下载地址
  2. 解压并在终端打开
    1
    2
    $ bin/janusgraph.sh start
    $ bin/gremlin.sh

注:JanusGraph自带了一个可以开箱使用的JanusServer,里面集成了简化的cassandra和ES,不能作为生产环境,但可以用来学习使用JanusServer

  1. 测试
    1
    2
    3
    $ graph = JanusGraphFactory.open('conf/janusgraph-cassandra-es.properties')
    $ GraphOfTheGodsFactory.load(graph)
    $ g = graph.traversal()

参考资料

Leia Mais
post @ 2018-02-27

介绍

决策树(decision tree),也称为判定树,是一类常见的机器学习的方法。
一般,一棵决策树包含1个根节点,若干内部结点,若干叶结点。叶结点对应决策结果,其他每个结点对应一个属性测试,根结点包含样本全集。

目的

决策树学习的目的是为了产生一棵泛化能力强(处理未见示例的能力强)的决策树,基本流程遵循简单且直观的分而治之(divide-and-conquer)策略。

简单示例

上图完整表达了这个女孩决定是否见一个约会对象的策略,其中绿色节点表示判断条件,橙色节点表示决策结果,箭头表示在一个判断条件在不同情况下的决策路径,图中红色箭头表示了上面例子中女孩的决策过程。

这幅图基本可以算是一颗决策树,说它“基本可以算”是因为图中的判定条件没有量化,如收入高中低等等,还不能算是严格意义上的决策树,如果将所有条件量化,则就变成真正的决策树了。

划分选择

决策树的生成是一个递归的过程。决策树的学习关键在于如何选择最优划分属性。随着划分过程的不断进行,我们希望决策树的分支节点包含的样本尽可能属于同一类,即结点的纯度(purity)越来越高。那么度量样本集合纯度的指标是什么呢?

  • 信息熵(information entropy))是常用的一种指标。信息熵的值越小,样本集合的纯度越高。
  • 1.信息增益(information gain)越大,就意味着使用属性a来划分所获得的纯度提升越大。信息增益准则对可取值数目较多的属性有所偏好。
    注:信息增益 = 分类前信息熵 - 分类后信息熵
  • 2.增益率(intrinsic value). C4.5决策树算法采用的。增益率对可取值数目较少的属性有所偏好,因此,C4.5决策树算法不是直接选择增益率最大的候选划分属性,而是先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
  • 3.基尼指数(Gini index). 基尼值越小,数据集的纯度越高。

剪枝处理(pruning)

剪枝是决策树学习算法对付 过拟合(决策树分支过多,把训练集的特点当作所有数据都具有的一般性质)的主要手段。

  • 预剪枝(prepruning): 决策树在生成的过程中,对于每个结点在划分前进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
    • 优点:降低了过拟合的风险,显著减少了决策树的训练时间开销和测试时间开销
    • 缺点:可能导致欠拟合
  • 后剪枝(postpruning):先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。后剪枝决策树比预剪枝决策树保留了更多的分支。
    • 优点:后剪枝决策树的欠拟合风险较小,泛化性能往往优于预测剪枝决策树。
    • 缺点:需要自底向上对树中的所有非叶结点进行逐一考察,训练时间开销大得多。

如何判断决策树泛化性能是否提升呢?

待填坑。。。

连续与缺失值处理

1. 连续值处理
=> 连续属性离散化技术 => 二分法(bi-partition)
2. 缺失值处理

1
2
(1)如何在属性值缺失的情况下进行划分属性选择?
(2)给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?

多变量决策树

可参考BeaLin’s Blog,她摘选的机器学习原文

参考文档

Leia Mais
post @ 2018-02-26
1
2
3
4
万恶的产品设计一个动态表格合并的功能,曾经实现了一版运用js进行dom元素的拼接,发现代码量好大,
后来产品再次设计了类似表格,复用之前代码感觉心好累,所以我就花十分钟仔细想了下,得出下面的解决方案。
最终效果为 https://goddywu.github.io/html/demo/table_combine.html
源码地址 https://github.com/Goddywu/html/blob/master/demo/table_combine.html

场景

想象一个情景,我们需要记录用户的操作,并展示出来,用户在相邻时间点做的同样操作,我们希望它们占据同一个格子。

思路

  • 如果我们希望做一个3X2的表格,第二列合并前两格,那么我们的HTML代码将是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <table>
    <tr>
    <td>1行1列</td>
    <td rowspan="2">第2列前两格</td>
    </tr>
    <tr>
    <td>2行1列</td>
    </tr>
    <tr>
    <td>3行1列</td>
    <td>3行2列</td>
    </tr>
    <table>
  • 观察需要合并的第二列,合并前我们每个行元素tr内需要有第二列的td元素,假设1代表存在,那么第二列的td存在情况为 [1, 1, 1]

  • 观察合并后的第二列的td元素存在情况,为 [1, 0, 1]
  • 如果将rowspan的值代替掉第一个td元素,那么我们得到的数组为 [2, 0, 1],数组名称设置为temp
  • 有了这个数组就好办了,我们可以用vue的v-on绑定rowspan,用v-if来去掉例如第二行不需要的第二个td元素。
  • 数据为

    1
    2
    3
    4
    5
    6
    7
    8
    #已知数据
    data = [
    ['2018-01-01', '买包子'],
    ['2018-01-02', '吃包子'],
    ['2018-01-03', '吃包子']
    ]
    #我们需要计算出的数组
    array = [2, 0, 1]
  • 我们的代码将是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <table>
    <tr v-for='(i, index) in data'>
    <td>
    {{i[0]}}
    </td>
    <td v-if='temp[index] != 0'>
    {{i[1]}}
    </td>
    </tr>
    </table>

接下来,就是核心:如何得出数组array

思路:
建立一个temp作缓存变量,count作为计数器,遍历data数组,如果值与temp相同,则计数器加1,如果不同,则temp值赋值为当前值,并且计数器重置。

所有代码戳链接

参考资料

Leia Mais
1
2
3
4
5
6
7
序:
公司一直在强调`结果导向`,那我就先放最终结果的链接吧。
在线访问:https://goddy.gitlab.io/line-chart-event/#/
源码地址:https://gitlab.com/Goddy/line-chart-event
这个系列主要解决了折线图引入事件的需求,需要读者有一定echarts的基础。
项目中我已经封装好了事件与折线图融合的方法,我们只需要引入js文件即可,下一个篇章我来说明下我封装的内容。
此篇主要讲解虚拟的业务情景以及在vue项目中如何使用封装的js文件。

假设情景

对比南通和石家庄分别两个区的降雨量,并将一些降雨量导致的事件体现到折线图上,点击事件可以跳到相应新闻网站。

已知数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#时间
['2017-12-21', '2017-12-22', '2017-12-23', '2017-12-24', '2017-12-25', '2017-12-26', '2017-12-27', '2017-12-28', '2017-12-29', '2017-12-30', '2017-12-31', '2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05', '2018-01-06', '2018-01-07']
#南通A、B地区降雨量
[1,2,3,4,5,6,7,5,3,9,12,4,2,4,6,3]
[7,6,5,4,3,2,1,8,2,14,3,2,14,5,20]
#石家庄A、B地区降雨量(单引号为未知)
[1,2,3,4,5,6,7,7,2,2,4,6,7,3,2,1]
[7,6,5,'',4,3,2,1,4,8,8,2,3,2]
#南通事件(单个例子)
{
title: '事件(2)', #标题
date: '2017-12-26', #日期
content: '内容(1226)', #内容
url: 'http://echarts.baidu.com/demo.html#grid-multiple' #事件网址
}
#石家庄事件(同上)

核心思路

因为x轴数据即时间是连续不间断的,那么我们就可以根据x轴的两端的时间及它们的位置找到事件发生的时间对应x轴的位置。

引入流程

1. 创建vue项目

1
2
3
4
5
$ vue init webpack my-project
$ cd my-project
$ cnpm install
$ npm run dev
$ cnpm install echarts --save

2. 引入封装的js文件

  • 下载需要引入的echartsEvent.js文档
  • 用一款你熟悉的编译器打开my-project
  • 打开目录 src/components/HelloWorld.vue
  • 添加一个div
    • 🆔设置为echarts,用于识别
    • 给此div添加css #echarts {width: 1000px;margin:20px auto;}
  • 从js文件引入drawChart方法 import {drawChart} from '@/assets/js/echartsEvent'
  • 重点来了,数据配置
    • 数据概览
    • 折线图数据
    • 事件数据 (不做展示,可戳链接查看)
  • 添加drawChart的触发方法(编译好HTML后触发)
    1
    2
    3
    4
    5
    mounted() {
    setTimeout(() => {
    drawChart(this.dataInput)
    }, 300) #延迟触发
    }

结语

至此,你本地的样例生效了吗?

参考文档

Leia Mais
1
2
3
4
5
6
序:
作为一个孤家寡人,自称孤和寡人不为过吧。🙄
寡人,在网上浏览了很多关于如何在github部署hexo的文章,
但是都是在github为我们分配的二级域名根目录下,例如https://goddywu.github.io/
如果我想blog子目录下部署呢(https://goddywu.github.io/blog/)
读完这篇文章相信您就会了解。

一、安装环境

1. nodejs
安装:官网下载页
验证:$ node -v, $ npm -v 查看node及npm的版本
2. git
安装:官网下载页
验证:$ git –version 查看git的版本
3. hexo-cli
安装: $ cnpm install hexo-cli -g
验证:$ hexo -v 检查hexo的版本

二、hexo-cli脚手架的使用

1
2
3
4
5
6
7
8
9
10
$ cd test  #打开存放项目的目录
$ hexo init my-blog #下载模版项目
$ cd my-blog #打开模板项目目录
$ cnpm install #下载相关依赖的包
$ cnpm install hexo-deployer-git --save #安装扩展包
$ hexo generate / hexo g #生成静态文件
$ hexo server / hexo s [-i 127.0.0.1] [-p 4000]#默认在本地的4000端口启动项目
control + C #终止运行
$ hexo deploy / hexo d #将.deploy目录部署 [到Github]
$ hexo g -d / hexo d -g #生成完毕后自动部署

三、操作步骤

1. github操作

  • github新建项目,名称为blog
  • 修改已创建好的hexo项目中的_config.yml文件
  • 终端执行 $ hexo g -d
  • 打开github我们的项目地址
  • 选择setting
  • 找到GitHub Pages勾选master branch

至此,博客就可以访问了,示例网址:
https://goddywu.github.io/blog/

参考资料

Leia Mais
post @ 2018-02-24

1
2
3
因为喜欢gitlab,希望通过gitlab pages部署hexo。
我们一般在本地打包好本地文件再放置到github远程仓库上,
然而gitlab部署博客,需要在服务器端完成生成和部署。

环境配置

  • git
  • hexo

操作步骤

  1. 在gitlab新建项目blog
  2. 本地新建hexo项目

    1
    2
    3
    4
    5
    $ cd test  #打开存放项目的目录
    $ hexo init my-blog #下载模版项目
    $ cd my-blog #打开模板项目目录
    $ cnpm install #下载相关依赖的包
    $ cnpm install hexo-deployer-git --save #安装扩展包
  3. 将本地项目添加至远程仓库

    1
    2
    3
    4
    5
    6
    $ cd my-blog  #打开项目目录
    $ git init #设置项目目录为git仓库
    $ git remote add origin git@gitlab.com:Goddy/blog.git #连接远程仓库
    $ git add . #添加文件
    $ git commit -m 'msg' #添加注释并合并至本地git仓库
    $ git push #提交至远程仓库
  4. 添加.gitlab-ci.yml部署文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    image: node:4.2.2

    pages:
    cache:
    paths:
    - node_modules/

    script:
    - npm install hexo-cli -g
    - npm install
    - hexo deploy
    artifacts:
    paths:
    - public
    only:
    - master

注:gitlab-ci全称是gitlab continuous integration的意思,就是持续集成。每次在我们push到gitlab的时候,都会触发此脚本

  1. 修改项目里_config.yml文件
  1. 再次提交后查看setting里pages,已可以访问网址:https://goddy.gitlab.io/blog/

    参考

Leia Mais
post @ 2018-02-24
1
2
3
4
5
6
7
序:
gitlab方便之处在于它可以帮你在服务器端进行软件的打包、发布,
我们无需在本地进行代码的压缩。
vue-ci脚手架生产的模版,如果想使用github pages,
我们需要在本地执行npm run build,将dist文件夹下的内容提交到远程仓库。
然而,gitlab就没有这个必要了。
示例网址:https://goddy.gitlab.io/vue-gitlab

1.本地使用vue-ci创建好模版项目

  • 官网教程

    2.在项目根目录新建.gitlab-ci.yml

  • $ touch .gitlab-ci.yml

    3.在.gitlab-ci.yml添加打包、部署的流程

  • 方法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
    #build过程
    build:
    stage: build
    image: node:9.4.0
    cache:
    paths:
    - node_modules/
    script:
    - npm install
    - npm run build
    artifacts:
    paths:
    - dist
    only:
    - master

    #发布过程
    pages:
    stage: deploy
    image: alpine:latest
    script:
    - mkdir public
    - mv dist/* public
    artifacts:
    paths:
    - public
    only:
    - master
  • 方法2:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #打包和发布一起执行
    image: node:9.4.0

    build:
    cache:
    paths:
    - node_modules/
    script:
    - npm install
    - npm run build
    - mkdir public
    - mv dist/* public
    artifacts:
    paths:
    - public
    only:
    - master

p.s. 值得注意的一点是,vue-ci创建的模版有一个缺陷,在config/idex.js文件里,module.exports的build模块中的assetsPublicPath应设置为相对路径’./‘。否则打包后的css及js可能找不到对应路径

Leia Mais
post @ 2018-01-01
1
2
3
4
5
6
7
8
序:
曾经呢,因为喜欢😍上一个女生,所以买了她名字的中文域名,`www.王珺.我爱你`。
在我把网站备案成功的一段时间后,通过浏览器访问这个url总是有时能访问有时访问失败,一脸懵B。
突然有一天,猛然开窍,原来是这个网站使用的虚拟主机之前和我爸公司的网站绑定,忘记清除DNS解析,造成了冲突。

在此中间,读了一些关于DNS解析的文章,就对主机域名的自定义配置感了兴趣,
然而主机域名绑定服务器或者虚拟主机要花钱💰,何不利用github pages免费存储网页呢,
那么此篇文章就是介绍如何实现github pages绑定我们的自定义主机域名。

最终结果

  • http://heart.王珺.我爱你
  • http://jesslyn.王珺.我爱你
  • user page: 用户的整个站点,创建一个名为goddy.github.io的项目。goddy改为自己的github名称,项目默认的域名跟项目名称一致。
  • project page: 项目的默认域名,是在user page的域名上加上二级目录实现的,比如我有一个项目叫heart,那么该项目的站点就是访问goddy.github.io/heart

域名结构

域名地址以主机(host)、子域 (sub domain)和域(domain)的形式表示的Internet地址(address),与数字表示的IP地址(IP address)相对应。

购买域名

github pages开通

  • user page
    • 创建名为[你的github账号名].github.io的项目,提交项目代码至远程仓库
    • 打开github该项目的setting
    • GitHub Pages的source选择master branch
    • 浏览器打开[你的github账号名].github.io即可访问项目
  • project page
    • 创建项目heart,提交代码至远程仓库
    • 打开github该项目的setting
    • GitHub Pages的source选择master branch
    • 浏览器打开[你的github账号名].github.io/heart即可访问项目

自定义域名

首先,域名服务商配置

  • 打开阿里云并登录
  • 打开控制台
  • 选择 域名与网站 - 域名 - 域名列表,选择域名的解析
  • 选择解析设置,解析的记录类型常用的有如果我们选择了A那么我们需要在记录值填写服务器ipv4的地址,如果我们选择CNAME那么我们在记录值填写指向的域名。
    因为我们要指向github pages生成的域名,所以记录类型选择CNAME,注意不管是user page还是project page我们在记录值统一填写为[你的github账号名].github.io
    注:如果你希望github里大量的项目都分配一个主机名,那么可以统一只填写一条记录,主机记录处填写为\,表示所有主机名都指向github地址*

然后,github项目配置

  • 第一种方式
    • 打开远程仓库
    • 在项目根目录下添加文件CNAME 注意没有后缀名
    • 打开CNAME,填写目标网址
  • 第二种方式

    • 打开项目的Settings
    • 在GitHub Pages的custom domain处填写你的网址,如abc.baidu.com 注意没有http://或https://
  • 中文域名处理
    上面是英文域名的填写方式,博主购买的是中文,中文的填写也很方便。
    打开中文域名转码网站输入中文,例如heart.王珺.我爱你,将取到的结果heart.xn--qby4i.xn--6qq986b3xl填写至你项目的CNAME文件中或custom domain处就可以啦,是不是很简单。

参考资料

Leia Mais
⬆︎TOP