Grafana调研和Superset对比

Grafana调研

安装

使用Docker安装

注意事项:

  1. 启动时需要设置数据库,否则Grafana会使用嵌入式数据库sqlite3。

支持图表

官方文档,只有四种类型分别为Graph,Singlestat,Table,Heatmap

项目引入

方式一:Dashboard snapshot

分享整个Dashboard,不需要额外的权限设置。

方式二:Share Panel-Embed Panel

设置AUTH_ANONYMOUS_ENABLEDtrue允许anonymous访问。即可单独分享每一个graph panel

Dashboard市场

Grafana有把Dashboard配置通过JSON文件导入/导出功能,同时官方建立了一个在线的市场,方便大家交流。但是因为数据源的差异性,实际用途不大。

目前市场是下载比较的多的配置,是一些基于通用数据源的配置。例如prometheus,实际上Prometheus也把Grafana当作自己的图形解决方案。

插件安装

Grafana提供了通过插件扩展控能,例如安装饼图插件支持饼图设置,安装数据源插件增加支持的数据源。

代码分析

进行中

MongoDB连接

待测试,MongoDB connect BI插件理论上可行

对比分析

Grafana star 29.2k+ 有企业版(收费)Live Demo

Superset star 24.7k+

开源许可证都为apache-2.0

Superset

优点:
采用D3图表库初始支持的图表类型就十分丰富

Grafana

优点:

1. 支持插件方便社区为其提供扩展能力  
2. 项目引入简单,不需要二次开发

总结&建议

经过初步的了解,我的建议是使用Grafana。原因有以下几点:

  1. 目前的流行程度Grafana略微占优,正在使用的企业数量似乎更多(superset没有找到相关数据)。
  2. Grafana有独立的公司在开发维护,并且同时就在提供商业服务。商业成熟度上远远领先Superset。
  3. Grafana的插件设计模式更加优秀,方便社区提供能量。

Grafana的潜在缺点:

没有选择类似D3的库作为图形上的支持,我觉得有长期的运营打算在其中,也许是在为今后的按图表插件来收费的模式做准备。这样的模式没什么不好,但是长期来看通过自研要做出和D3同样水平的图表库需要很长的时间,最终能否达到同样的水平很难说。

csv文件通过node.js转存postresql数据库

排坑

分享一下代码

const config = require('../config')
const pglink = config.pg
const csv = require('csvtojson')
const fs = require('fs')
const {Client} = require('pg')
const copyFrom = require('pg-copy-streams').from

module.exports = (targetTable, inputFile, columnStr) => {
  console.log('开始导入')
  // Connecting to Database
  const client = new Client({
    connectionString: pglink,
  })
  client.connect()

  var stream = client.query(copyFrom(`COPY ${targetTable} (${columnStr}) FROM STDIN CSV`));

  var fileStream = fs.createReadStream(inputFile)

  fileStream.on('error', (error) =>{
    console.log(`Error in creating read stream ${error}`)
  })
  stream.on('error', (error) => {
    console.log(`Error in creating stream ${error}`)
  })
  stream.on('end', () => {
    console.log(`Completed loading data into ${targetTable}`)
    client.end()
  })
  fileStream.pipe(stream);
}

调用代码示例

const copyToPg =  require('/* 上面的代码 */')
const path = require('path')

const inputFile = path.join(__dirname, '/csv/country.csv')

copyToPg('Country', path.join(__dirname, '/csv/country.csv'),'country, code, continent')

这里有两个坑需要特别说明targetTable这里是区分大小写的,而且只支持小写。。。

CSV需要使用utf8格式,不然会有中文乱码问题。但是你使用Excel是改不了utf8的,我的操作流程是使用记事本打开csv文件再改变编码转存。
之后再使用Excel编辑。

参考文档

官方说明档:sql-copy

How to do postgresql bulk insert with node-pg-copy-streams

买不起airPods怎么办?

redmi airdots 你值得拥有

先看下特性参数蓝牙5.0,单耳机重量4.1g,7.2mm动圈,分体式。基本上蓝牙5.0分体式其他品牌找不到200块以下,估计300块以下都很难。
100¥基本屌全场。

在100-1200这个价位区间里面,我基本找不到能在性价比上挑战airdots的产品。总之如果你想要买一副轻巧的入耳式蓝牙耳机,又觉得
airPods太贵的话,目前redmi airdots可说是不二选择。

— 下面开始讲故事,长文预警 —

从去年7月我换了小米8开始,蓝牙耳机成了一个硬性需求。type-c转3.5mm方案实在太二,本身一条线就已经够麻烦,中间再接一条简直崩溃。
而且从我粗浅的耳机知识上来理解,type-c转3.5mm中间多经历了一次数字转模拟的过程肯定会降低音质(不知道这个理解对不对欢迎大神
拍砖)。

当时我就对蓝牙耳机市场进行了一次调研。得出的结论是目前不适合购入高档的蓝牙耳机,airPods除外,如果airPods算高档的话。PS:在我的
心目中是不算的。没有音质谈什么高档。

原因主要在于目前蓝牙技术的不成熟当时市面上还是4.0的天下,虽然现在到了5.0离达到人能分辨的完美音质仍有一定差距。5.0由4.0的1Mbps
提升到2Mbps,也就是200kps的瞬时速率。下载过mp3的同学应该知道320kps只能算是比较高而已。(这里也完全是我的个人认为,实际上我
不确定kps是否等同于kbs)总之蓝牙要想达到媲美模拟信号的音质目前还差的很远。在目前的蓝牙设备上谈音质无异于耍流氓。

既然两千块的蓝牙耳机也就是听个响,我更倾向于价格便宜音质不太差的解决方案。目前几百块的耳机市场可说是群雄逐鹿一片混乱,其中
又充斥各种同质化严重的贴牌产品,基本同一个模具换个logo就能有N种不同的蓝牙耳机诞生。有兴趣的朋友可以看看TESTV的测评视频
平价真无线耳机们到底好用不好用【值不值得买第307期】,基本说的就是这个情况。

所以去年我购入了漫步者W200BT的网易特供版W280X

由于不是分体式耳机听诊器效应不可避免。可以同时连接两个设备,这是个非常鸡肋的功能和airpods的丝般顺滑相比完全是另一个极端。
同时连接两个设备之后信号稳定度大大下降,音质也收到了影响。红米airdots一次只能连接一台设备的估计就是因为这个原因。通话效果
十分之差,对方经常听不清你在说啥。电池续航还行连续听歌可以支持6小时左右。充电方式十分丑陋,你需要抠开一个胶垫保护的充电接口
再插上充电线。充电线和耳机线必成一个直角,放哪都碍事,智障设计。

音质,肯定是不存在音质的。可以感觉到调教上特地强调了低音,但是不知是动圈不够大,还是驱动不行,给人一种嗓子哑了吼不上去沉不下来
的感觉,总之就是灾难。

在使用w280x的期间也试用过airpods,感觉就是一分钱一分货。在苹果系的产品间切换丝般顺滑,充电,取耳机,配对整个使用流程都充满了
高级感。在苹果手机上的动画都是如此炫酷。你只能惊讶于三年了,市场上仍然没有一款能与其全方位竞争的产品。就连苹果自己唯一能做
的升级也就是提升下连接速度增加siri的语音唤醒。虽然这个技术上屌到不行的语音唤醒黑科技你几乎不会用。

总之你有钱就买苹果,买不了吃亏买不了上当。使用过程中我发现一个场景是绝对只有airpods能做到的。就是你带着耳机躺床上还能侧头靠
在枕头上。换市面上任何一种其他耳机都是绝对不可能的,不把你杠死才怪。

最后来说说红米airdots

缺点:设备间切换很不方便,必须先断连再连接新设备。从手机切电脑,你得先在手机上操作断连,再在电脑上操作连接。傻X设计,应了
雷总的话,没有设计就是没有设计(误)。

音质,跟airpods一样白开水,没有针对低音的增强。两者音质差不多同一级别。airdots因为有胶套的关系隔音效果更好,适合上下班的通勤
使用。

总结

一百块你买不了吃亏买不了上当。缺蓝牙耳机且缺钱的朋友可以毫不犹豫的购入。能不能买的到就是另外一个问题了。

至于发售一两个月还在缺货这个问题只能归结为在耍猴绝对没有别的解释。手机你可以说是高通不给力,或是你跟索尼关系不够好。耳机这种
完全没有核心科技的东西还特么缺货,在工业第一大国还要跟我说产能不足完全就是扯淡。

所以最近我对小米的观感是越来越差,快要差到锤子那个级别了。但,是人就逃不过真相定律。购买渠道一、淘宝加价20,二、官网京东抢,
抢的到算我输。三、如果你所在城市有小米之家可以去门店交钱预定,我运气好头一天交钱第二天到货。

以上,感谢您的阅读。

ajax接口接收文件排坑(二)

错误处理问题

假设后端传回了一段包含错误message字段的JSON文件,如果将responseType 设置为 blob 将会导致无法解析后端传回的错误数据。

解决方案是将responseType 设置为 arraybuffer,根据http状态码来判断接口是否报错。假设接口返回400则将返回数据由arraybuffer
重新解析为String 或 Object 等我们需要的数据类型。

解析代码如下

function errorCallback(response) {
  var encodedString = String.fromCharCode.apply(null, new Uint8Array(response.data));
  var decodedString = decodeURIComponent(escape(encodedString));
  var obj = JSON.parse(decodedString);
}

其中 var decodedString = decodeURIComponent(escape(encodedString));这段代码的作用是解析utf8字符。

参考文章

Conversion between UTF-8 ArrayBuffer and String

How to read JSON error response from $http if responseType is arraybuffer

谁能真正make American greate again?

今天第一次知道杨安泽(Andrew Yang),美籍华裔祖籍台湾正在准备参加2020年美国总统大选。政治主张中主要的一条是要给每个满18周岁的美国人每月发1000美元

为什么,以及如何做到

基础职工的失业不可避免现在的工业自动化是如此,未来的人工智能更是如此。川普试图从中国等其他国家夺回工作岗位思路本身就是错误的,真正夺走美国人工作的是技术革新。

那么谁在这场技术革新中获利了呢,是Amazon(他好像只举了这一个例子,耐人寻味)之类的高科技大企业。实施办法就是向这些企业征收高额税收,把这些钱分给所有美国人。劫富济贫(🙄socialism)?

公民收入增加之后,反过来可以增加消费促进经济发展,企业挣更多的钱,交更多的税,形成正向循环。

这位老兄的这方面的政治主张和我所想的完全一致。我甚至认为,未来人类在发明出强人工智能之后这是让人类社会可以延续下去的唯一政策。communism or die 二选一的命题。在强人工智能时代99%的人口对于社会生产力来说都会成为非必要人口,为了维持社会稳定共产主义可说是唯一的选项。

总之看到这位老哥及他的政治主张之后感慨颇多,感叹优秀的人都去了美国,感叹美国的制度给了很多人发声和表现得舞台。但作为一个生活在大洋彼岸得中国人,希不希望他成功当选真的不好说。感情上十分复杂。

但如果 Democracy 真得管用得话, American folks show me!

FOX采访

CNN采访

知乎:这位华裔总统候选人 要给每人每月发1000美元

ajax接口接收文件排坑(一)

先说结论

如果你在用ajax接口接收文件时遇到文件保存后打开报错的情况,请尝试在请求header头中加入responseType: arraybuffer

排坑过程

最近在对接前后端文件传输接口时遇到的问题,后端返回xlsx文件,前端使用new blob()方法从接口返回的数据中重新生成文件。但是
生成的文件用excel打开总是报错。尝试在浏览器或Postman中调用接口保存文件都没有问题。

一开始各种尝试改变new blob方法的type参数没有效果。查看blob方法文档
最坑的就是这里Blob(blobParts[, options])blobParts what fuck is blobParts? 文档中给出的示例有
new Blob([JSON.stringify(debug, null, 2),{type : 'application/json'});so 一个包含字符串的数组?还有一段从blob中读取数据
reader.readAsArrayBuffer(blob);可以看出这里读出的数据应该是arraybuffer。

再看一下XMLHttp​Request​.response​Type的官方文档
arraybuffer的解释 是一个包含二进制数据的 JavaScript ArrayBuffer 。另外我在另一篇Creating a Blob from a base64 string in JavaScript
的提问中当中看到有高手给出的答案中指出了,想要得到blob你先要得到ArrayBuffer, text, and JSON

结论

到这里我们基本已经得到答案了,生成blob对象进而生成文件我们需要ArrayBuffer, text, or JSON这种三种数据类型的某一种。

测试验证

后端Java,代码当中使用的是 BufferedOutputStream 类来返回数据。前端分别测试了”json””text”””arraybutter””blob”四种responseType
arraybutter和blob都可以正确的生成文件。

参考文章

MDN解释
java io系列12之 BufferedInputStream(缓冲输入流)的认知、源码和示例
深入理解xhr的responseType中blob和arrayBuffer

Superset学习之连接MongoDB

集成 MongoDB

方法一:mongodb-BI,已验证

MongoDB需要安装mongdoDB BI-connector 插件,该插件的功能是使mongoDB支持Sql查询语句,从而应对各种BI工具的连接,官方文档中列举了其支持的各种BI工具。Superset不在官方支持列表当中,当然官方支持BI工具当中也没有类似Superset这种开源的PAAS类工具。
为了连通Superset,Superset侧也需要一个插件sqlalchemy-mongobi(PS:该插件是收费的)。

其他可能的实现方法

方法二:转mongoDB至关系型数据库,举例mosql
方法三:使用第三方的数据平台服务,举例dremio

总结,Superset等其他BI工具基本支持的都是Sql且关系型数据库,在配置数据图表时实际就是在组织Sql语句。所以非关系型数据库整合BI的问题基本归结为如何让其支持Sql语句。

横向对比其他PAAS类BI

Grafana star 27k+ 有企业版(收费)Live Demo

Superset star 23k+

Superset学习体验

superset代码评测:

版本还未稳定,release版本长时间脱离 master版本,且本身并不稳定。项目庞大涉及领域繁多加上人员混杂可能是导致目前代码略显凌乱bug较多的原因。尝试了几个不同的版本才获得一个可以在Ubuntu及Mac平台都可使用Docker正常运行的版本(非release版本),且该版本在前端控制台还存在肉眼可见的bug。版本号:(#6934) ea9d22b2eca6cf823380adc96d2040a5c955edd8

值得一提的问题,部署。项目的打包过程非常复杂,涉及到Linux的环境包,Python包,JavaScript包以及可能存在的其他未知类型的包。打包过程中GFW造成了巨大的阻碍。在有透明代理的路由环境下打包的成功率还是很高的,但在一般环境下成功率十不存一。甚至可能出现已经正常启动过的开发环境,重新启动时因为DNS污染的问题,把原来正确的包给破坏掉的情况。

可行的解决办法是在发布时进行本地打包Docker image,再上传至服务器启动,需要修改部分代码。

VirtualBox 虚拟机 Ubuntu 踩坑

虚拟机-网络设置

  1. 使用网络桥接模式保证host和虚拟机可以互访,虚拟机可连接Internet。
  2. host系统下网卡设置共享
  3. subnet 地址计算器

Docker 学习记录

架构解析

context build image build container run by daemon

docker-compose 为单独安装的软件,mac/windows 安装包自带,Linux自行安装

docker-machine 理解不深入,windows10非企业版下是控制虚拟机,win10非专业、企业版缺少Hyber-V支持,无法安装docker 安装包最新版,只能安装legacy版本。

文件解释

  1. Dockerfile用于build image
  2. docker-compose.yml用于组织container,设置network,启动顺序,依赖关系,来源build或pull。

待补充知识

  1. container 内部操作及commit为新 image

React hooks 学习体会

上接React、Vue比较

又经过一段时间的学习和开发对React有了更加深刻的理解,领悟了相较于Vue更多的优势。应为语法更接近原生的关系,class在使用extends时很方便,可以把很多相近的页面组件的共通部分写成一个class专门用于继承,可以大大缩短开发时间。而这点在Vue上也有对应的实现mixin,但可惜的是官方文档几乎没有说明,也不清楚具体的内在机制。

还有最近的两个重磅更新懒加载的官方实现React.lazy + suspense 实现。以及react-hooks

react hooks 的实际效果让我想起了 meteor 中的动态变量,动态变量本身不依赖组件存在,而且始终具备动态属性。可以用专门的订阅器 watch 其变化。

当然区别还是很大的,hooks的设计初衷不是方便我们在组件之间传递它的。

我对官方介绍视频hooks的开发者Dan的最后一段话特别有感触。原文大意:React的logo是一个原子,似乎是想表达React对web开发的解构,万物由原子构成,而一个web项目则是由无数个组件构成。组件即是web的原子。就像科学家原先以为原子就是世间的最小单位,之后又发现了电子、中子。hooks即是React的电子,只是之前我们对其的理解不够深,看到是state、life-cycle之类的表象,剥去表象之后才发现其真实的样子,以及其是如何影响原子的特性的。看看react logo上那围绕中子的轨道,也许那就是hooks。

朋友该卖房了

为何会有此文

2016年中曾经劝过身边的好朋友买房,2017年底发现漏通知了一位,之后说起十分尴尬,“我去,你怎么没跟我说!”此文既是为了防止这种情况的再次发生。

先说结论

敝人预计19年房价还会继续下跌,可能性大于80%。下跌区域全国性,一线、准一线城市黄金地段不包括。

论述

基本盘

经济基础决定上层建筑,GDP增长率,股市,外贸等硬指标几乎都是可以预见的下降趋势。刺激经济增长的内生动力严重不足,人口红利消减,收入增长减缓,小企业生存困难国进民退,税收增长率远远高于GDP增长率,想像美国一样大规模减税在体制上就不可能发生。

唯一一个可能产生动力的源头一带一路,但我估计仅凭这一项就想抵消上面的全部颓势因素绝无可能。更别说领导同志大笔一挥债务减免挣来的钱可能就没了。当然这是一个百年大计,过分计较一时得失不可取,在此就不展开了。只讨论明年的可能情况。

政策上是否还有招可以创造内生动力?08年4万亿,19年20万亿行不行?这么做应当可以力挽狂澜,姑且可算在那剩下的20%可能性当中。永远不可高估中国人的下线,这是我在这个国度生活了30多年得出的最宝贵经验。

以上我得出的结论是经济增长进一步减缓。

货币

长久以来我国的货币发行依赖于(或者说绑定于)贸易的美元顺差,赚多少美元印多少人民币。为了对冲和维持汇率RMB长久以来不得不维持严重超发的状态。按照普通国家的来说产生的结果肯定是钱流向股市和房市,中国股市因其国情特殊性导致其一直以来扮演的角色就是中国智商税税务局。要我说中国股民(或者说中国人民)已经算是非常理智了,否则分分钟给你炒上天际。6000就能打住真是个奇迹,总结就是聪明人太多不好忽悠。

所以聪明的中国人选择(或者说被迫选择)了房地产,实在是无奈又聪明的举动。无奈是实在没有其他选择了,金融衍生品,民间借贷严格管控,贵金属本省就是抗风险产品。聪明是房产作为一种不动产实在特殊。生活必需品,土地是不可再生资源,特殊国情与城市户口相关进而与医疗,教育等其他生活必须资源相关,可以做杠杆,更重要的是有地方政府的信用做保证!而且不是保证你不变废纸,正常情况下就是保证你不会亏。

总之房地产在我国一直扮演着最重要也几乎就是唯一的货币蓄水池的作用。而随着贸易战的进行美元盈余必将进一步减少,目前我国的外汇储备官方数字近几月处于下降态势具体原因未知。因为正常来说下降应该在明年而不是今年,可能性很多背后可能有大棋不展开说。美元盈余减少,货币增发按照以往策略也应减缓,故支撑房价的因素又少一项。

城市化

这是一个非常复杂的问题,我估计我国的智囊团也没有有把握的答案。敝人斗胆在这瞎猜一番。首先是现今的城市化率,各个机构的数字皆不相同,本来这个数字其实就是很难界定。多大县城可以算作城市,常驻人口算不算已经城市化,是不是一定要有住房才算。第二城市化那一年到多少算作基本完成,中国国情特殊,再加上互联网,物联网技术的增长未来城市可能与现今大不相同,也许未来不在需要城市化也说不定。第三存量住房究竟有多少?

在中国以上三个问题,我看在中国堪比哲学三大终极问题了。

因为此文讨论是房价的预期,以上三个问题我用一个回答回答:“我国的存量住房已经能够支持中国未来十年的城市化进程”说白了就是我国的空置房数量现今应该是一个非常恐怖的数字。

故我的观点是,只要政府愿意在不新建住房的情况下城市化的进程仍可继续。

政府的目标

至此我认为影响房价的三个最大因素已经罗列完毕,1.经济大环境,2.超发的货币增量,3.城市化。这里在分析一下政府的需求,首先最重要的地方财政。如果房价不涨或者下跌地方财政必然难以为继,故要么维持房价要么寻找新的收入点(请不要问为什么政府不能勒紧裤腰带来支持民营经济这种问题)。我的答案是房产税。

次一级的需求是经济增长,本届政府是有大志向的。几个目标,世界级强国(世界第一),世界级强军,一带一路,国家统一。所有这些目标都必须有一个支撑点——钱。

理想中的中国经济增长模型应该是,城市化->房地产业->各行业->经济增长->就业收入增加->城市化。目前这个健康循环中的最大问题点就是高房价。高房价抑制了城市化,从而阻碍了整体的经济增长。但是房价降必然给地产行业带来打击,从而可能引发连锁反应给整体经济带来重创,陷入经济下降的恶性循环。世界上大部分国家都经历过这个痛苦的过程,经济危机。

所以现在政府或者说中国全体人民需要的是一个既能解决高房价,又能不影响整体经济,从而重新释放内生动力的方案。

那么真的有两全齐美的方法吗?当然没有!挖坑要填,欠债要还,天塌下来要人顶。

房价下降的后果

说是下降,请理解成下降或崩溃。首先是房企,有地烂在手上的肯定倒闭,造成银行烂账。那么问题就是全国房企大规模倒闭造成的烂账银行撑得住吗?我觉得问题不大,几大国资银行天天盆满钵满,500强都是名列前茅,即使高管开的都是天价工资每年的利润率还是很好看。想当年国企改制那种洪水滔天的烂账都能解决,今天几个房企,少吃两顿可能裤腰带都不用勒就过去了。

接着是房地产相关行业,我觉得这部分问题就更不大了,政府年年喊着去产能,钢筋水泥首当其充。今年土地成交量已经大幅下降,整个行业已经做好了下降预期。打雷下雨,该回家收衣服的已经准备好了。

最后还有一个最大的问题,房贷断供。08年次贷危机说到底问题爆发点就在这上。经济下行房贷断供,贷款人申请破产,资产拍卖清偿资不抵债,拍卖增多房价下跌,金融衍生品亏损,连锁引爆次贷危机。

那么中国有可能发生一样的情况吗?首先国内没有基于房贷的金融衍生品。所以断供即是断供不会引发金融系统的系统性风险。(PS:话说我们有金融系统吗?)那么问题就剩下一个了,房价下跌引发的大规模断供会让银行崩溃吗?回答是肯定的,不会。告诉各位一个中国的基本事实,中国的房贷可没有强制平仓这一说。如果说美国的房贷是有限责任,即你还不上银行收回房子贷款清零。那么中国的房贷就是无限责任,100w的房子70w的贷款就算你房子跌到只剩30w,银行收回你的房子拍卖得了30w,剩下的70w贷款你还是得还。

如果你不知道上述事实,我建议再往下看之前先冷静思考五分钟。用世界上最强大的图像引擎,想象力,去想象一下那天崩地裂的景象。

结局

背着一套房的刚需继续还房贷。就算能承受的住征信出问题也绝对受不了上老赖名单。所以该还还得还。炒房客,不跳楼的都是内心强大的,中国人内心还是很强大所以问题不大。地产开发商终于经历了建国以来的一次正向竞争淘汰。去产能事业进步巨大。

总之房价的崩溃不会是全行业的系统性崩溃,结局会更像是针对中国刚刚生成的一部分中产阶级的一次定向爆破。说真的我真想看看到时候那帮砸售楼处的人,到时候准备去砸哪。

以上,歌照唱,舞照跳。天下无事,我说无事就无事。不想被代表的同志请早做打算。

未来

千古机遇,历史拐点。一手好牌想打错都难。一地鸡毛之后顺势出台房产税平衡地方财政,使地产行业成为真正服务于民生的行业。耕者有其田,居者有其屋,能者居其位,盛世开启。

广阔天地,大有可为,与君共勉。