「if1612是什么」1612年中国是什朝代,有什么赚钱方法吗
2019年11月25日

if1612是什么:1612年中国是什朝代

一、公元1612年明朝万历四十年。 二、万历(1573年9月4日-1620年8月18日)是明神宗朱翊钧的年号,明朝使用此年号共48年,为明朝所使用时间最长的年号。万历前期,张居正主导实行了一系列的改革措施,社会经济持续发展,对外军事也接连获胜,朝廷呈现中兴气象,史称万历中兴。历史学家黄仁宇用“大历史观”的角度,写了《万历十五年》这本研究明史的专著。

if1612是什么:LED灯1612型号是什么

1612是指LED灯珠的封装。 其功率随着厂家不同,质量不同会有区别。 建议上查看1612灯珠相关参数

if1612是什么:发动机故障代码P1612,是什么意思?

    是发动机电脑的软件编码不对,无法被识别。这种情况建议联系售后4S店处理,或由专业人士进行维修检查。切忌自行拆修和放任不管。

if1612是抖音成人版本APP什么:逆变器 1612是什么意思

1612可能是逆变器的型号 逆变器是把直流电能(电池、蓄电瓶)转变成交流电(一般为220V,50Hz正弦波)。它由逆变桥、控制逻辑和滤波电路组成。广泛适用于空调、家庭影院、电动砂轮、电动工具、缝纫机、DVD、VCD、电脑、电视、洗衣机、抽油烟机、冰箱,录像机、按摩器、风扇、照明等。在国外因汽车的普及率较高外出工作或外出旅游即可用逆变器连接蓄电池带动电器及各种工具工作。通过点烟器输出的车载逆变是 20W 、 40W 、 80W 、 120W 到 150W 功率规格。再大一些功率逆变电源要通过连接线接到电瓶上。把家用电器连接到电源转换器的输出端就能在汽车内使用各种电器。可使用的电器有:手机、笔记本电脑、数码摄像机、照像机、照明灯、电动剃须刀、CD 机、游戏机、掌上电脑、电动工具、车载冰箱及各种旅游、野营、医疗急救电器等。

if1612是什么:1612年俄罗斯是什么年

1612年俄罗斯是“动荡时代”。 【环球军事报道】俄总统普京2014年11月4日在“人民团结日”的纪念活动上发表讲话称,“今年我们被迫应对艰难的挑战,俄罗斯证明自己有能力捍卫国家利益。在面对历史考验时,我们的人民团结一心奋起,这已经不是第一次了。”作为“人民团结日”的由来,1612年11月4日俄罗斯民间起义军解放被波兰侵略者占领的莫斯科,并因此结束俄罗斯历史上黑暗的“动荡时代”。 资料来源于:http://mil.huanqiu.com/history/2014-11/5193263.html

if1612是什么:vivo1612是什么型号

vivo PD1612是Y67型号的手机。

if1612是什么:轴承1612是不是22312

「if1612是什么」1612年中国是什朝代「if1612是什么」1612年中国是什朝代1612是2312,不是22312!尺寸如图所示请采纳!

if1612是什么:D1612是CRH几?

D1612次是北京局和谐号CRH5A重联担当。(2019年2月)

if1612是什么:身份证320586尾号是1612是属于哪里

320586 发证地:江苏省 苏州市 吴县市 说明:因发证地中的"吴县市"已被撤并,行政区划代码320586已撤销,新发的身份证中不再使用。

if1612是什么:奇瑞a5故障码p1612是什么原因、

奇瑞a5故障码p1612是发动机防盗验证不正确。 解决原因:
    要检查一下在冷启动时发动机防盗系统是否出现故障。如发动机防盗系统正常,需要检查一下发动机积碳是否过多导致发动机不好启动,必要时进行发动机积碳清洗。

if1612是什么:商品期货多品种海龟策略

海龟交易法起源


这个交易系统的诞生来源与两个交易老手的争论,一方觉得交易这种技能是后天习得的,另一方觉得这是先天所决定的。1983年,在新加坡海龟农场,两位神一样的交易员Dennis、Eckhardt有了分歧。E神说,交易员是天生的;D神说,就像这一大缸海龟一样,交易员可以培养。

于是,D神掏出来白花花的银子,要做实验,要打赌。他们在华尔街日报、纽约时报等等放出广告,说D神要搞培训班了,给每个人100万美元的账户,手把手地教,不限专业,无须经验,皆可报名。有千余人投了简历,40人进入面试,23人被留下考察,13人进入培训班。

这13个人来自各行各业,多数都没有交易经验,是一群尚未成功的普通人。他们被培训了两个星期,然后放出去交易,在接下来的四年半里,创出了80%的年均收益率。培训内容,叫做《海龟交易法则》;培训学员,被称为“海龟”。

尽管有人质疑样本的随机性,这场试验应该算D神胜利了。

  • 海龟交易系统是一个完整的交易系统,它有一个完整的交易系统所应该有的所有成分,涵盖了成功交易中的每一个必要决策:

市场:买卖什么?

头寸规模:买卖多少? Unit=(1%?Account)/N

入市:什么时候买卖?

止损:什么时候放弃一个亏损的头寸?

退出:什么时候退出一个盈利的头寸?

战术:怎么买卖?

核心围绕: N值,海龟的止损、加仓、头寸规模 都是基于N值计算, 有些海龟交易系统用的是ATR来代替N值,ATR为真实波幅的20日平均。

“海龟们从不去预测市场的动向,而是会寻找市场处于某种特定状态的指示信号。优秀的交易者不会试着预测市场下一步会怎么样;相反,他们会观察指示信号,判断市场现在正处于什么样的状态中。”

对于 “海龟交易法”感到陌生的读者可以看这篇文章: BotVS

也可以 知乎 或者 百度 搜索,有很多文章介绍,老白就不做赘述了。

  • 作为 本系列文章的最后收尾一篇,我们就来动手实践一个海龟策略,当然我们要有创新,我们实现一个“海龟群”。

说点题外的,之前的几篇文章记录的都是老白当时学习时的心路历程,学习量化、程序化没办法一蹴而就,只能脚踏实地,耐住性子一点点进步。老白开始的时候也感觉思考问题、找BUG 、写程序晕头转向的。但是,慢慢的我发现学习是个加速度,开始很慢,积累越多越轻松。一个完全零基础的朋友经常和我说:“越是感觉自己要放弃的时候,越是应该跟困难死磕的时候!”

言归正传, 为什么我们要使用海龟群呢?

当然是为了尽可能的分散风险,即使是大名鼎鼎的海龟策略,当年也曾经有过大幅回撤,甚至亏损本金。任何交易系统都是有一定风险的。多品种的好处就是“把鸡蛋放在不同的篮子里”。当然也有缺点,那就是需要不小的资金量。资金量小了,可能只能交易几个品种,降低了分散风险的能力。

还有一点需要牢记:任何时候都可能飞出一只黑天鹅! (如商品期货 16年底黑色星期五 全线暴跌。)


商品期货多品种海龟策略
  • 只支持操作CTP商品期货
  • 支持自动或手动恢复进度
  • 可同时操作多个不同品种
  • 增加时间段区分与各种网络错误问题的应对处理
  • 移仓功能目前正在加入中

请下载最新托管者并比较版本号是否最新

$ ./robot -vnBotVS docker 3.0 compiled at 2016-07-05T09:56:18+0800 


注释版 多品种海龟 源码

/*  n参数:nInstruments             合约列表                  字符串(string)      MA701,CF701,zn1701,SR701,pp1701,l1701,hc1610,ni1701,i1701,v1701,rb1610,jm1701,ag1612,al1701,jd1701,cs1701,p1701nLoopInterval            轮询周期(秒)              数字型(number)       3nRiskRatio               % Risk Per N ( 0 - 100) 数字型(number)       1nATRLength               ATR计算周期               数字型(number)      20nEnterPeriodA            系统一入市周期             数字型(number)      20nLeavePeriodA            系统一离市周期             数字型(number)      10nEnterPeriodB            系统二入市周期             数字型(number)      55nLeavePeriodB            系统二离市周期             数字型(number)      20nUseEnterFilter          使用入市过滤              布尔型(true/false)   truenIncSpace                加仓间隔(N的倍数)          数字型(number)      0.5nStopLossRatio           止损系数(N的倍数)          数字型(number)      2nMaxLots                 单品种加仓次数             数字型(number)      4nRMode                   进度恢复模式              下拉框(selected)     自动|手动[email&极速打码苹果版下载#160;protected]==1       手动恢复字符串             字符串(string)      {}nWXPush                  推送交易信息              布尔型(true/false)   truenMaxTaskRetry            开仓最多重试次数           数字型(number)       5nKeepRatio               预留保证金比例             数字型(number)      10 n*/nnvar _bot = $.NewPositionManager();                                                          // 调用CTP商品期货交易类库 的导出函数 生成一个用于单个品种交易的对象 nnvar TTManager = {                                                                           // 海龟策略 控制器n    New: function(needRestore, symbol, keepBalance, riskRatio, atrLen, enterPeriodA, leavePeriodA, enterPeriodB, leavePeriodB, useFilter,n        multiplierN, multiplierS, maxLots) {n        // 该控制器对象 TTManager 的属性 New 赋值一个 匿名函数(构造海龟的函数,即:构造函数),用于创建 海龟任务,参数分别是:n        // needRestore: 是否需要恢复,symbol:合约代码,keepBalance:必要的预留的资金,riskRatio:风险系数, atrLen:ATR指标(参数)周期。enterPeriodA:入市周期An        // leavePeriodA:离市周期A , enterPeriodB:入市周期B, leavePeriodB:离市周期B,useFilter:使用过滤,multiplierN:加仓系数,multiplierS:止损系数,maxLots:最大加仓次数nn        // subscriben        var symbolDetail = _C(exchange.SetContractType, symbol);                            n        // 声明一个局部变量 symbolDetail 用于接受API SetContractType 函数的返回值(值为symbol的合约的详细信息,symbol 是 "MA709",返回的就是甲醇709合约的详细信息),n        // 调用API SetContractType 订阅并切换合约为 symbol 变量值的合约。 _C() 函数的作用是 对 SetContractType 合约容错处理,即如果 SetContractType返回null 会循环重试。n        if (symbolDetail.VolumeMultiple == 0 || symbolDetail.MaxLimitOrderVolume == 0 || symbolDetail.MinLimitOrderVolume == 0 || symbolDetail.LongMarginRatio == 0 || symbolDetail.ShortMarginRatio == 0) {n        // 如果 返回的合约信息对象symbolDetail 中 VolumeMultiple、MaxLimitOrderVolume 等数据异常,则调用 throw 抛出错误,终止程序。n            Log(symbolDetail);n            throw "合约信息异常";n        } else {                                                                             // 检索的数据没有异常则,输出部分合约信息。n            Log("合约", symbolDetail.InstrumentName, "一手", symbolDetail.VolumeMultiple, "份, 最大下单量", symbolDetail.MaxLimitOrderVolume, "保证金率:", _N(symbolDetail.LongMarginRatio), _N(symbolDetail.ShortMarginRatio), "交割日期", symbolDetail.StartDelivDate);n        }nn        var ACT_IDLE = 0;                                                                    // 定义一些宏 (标记)n        var ACT_LONG = 1;n        var ACT_SHORT = 2;n        var ACT_COVER = 3;                                                                   // 动作宏nnn        var ERR_SUCCESS = 0;                                                                 // 错误宏n        var ERR_SET_SYMBOL = 1;n        var ERR_GET_ORDERS = 2;n        var ERR_GET_POS = 3;n        var ERR_TRADE = 4;n        var ERR_GET_DEPTH = 5;n        var ERR_NOT_TRADING = 6;n        var errMsg = ["成功", "切换合约失败", "获取订单失败", "获取持仓失败", "交易下单失败", "获取深度失败", "不在交易时间"];  // 错误宏的值 对应该数组的索引,对应索引的值就是翻译nn        var obj = {                                // 声明一个对象,构造完成后返回。单个的海龟策略控制对象。n            symbol: symbol,                        // 合约代码         构造函数执行时的参数传入n            keepBalance: keepBalance,              // 预留的资金       构造函数执行时的参数传入n            riskRatio: riskRatio,                  // 风险系数         构造函数执行时的参数传入n            atrLen: atrLen,                        // ATR 长度         构造函数执行时的参数传入n            enterPeriodA: enterPeriodA,            // 入市周期A        构造函数执行时的参数传入n            leavePeriodA: leavePeriodA,            // 离市周期A        构造函数执行时的参数传入n            enterPeriodB: enterPeriodB,            // 入市周期B        构造函数执行时的参数传入n            leavePeriodB: leavePeriodB,            // 离市周期B        构造函数执行时的参数传入n            useFilter: useFilter,                  // 使用入市过滤条件  构造函数执行时的参数传入n            multiplierN: multiplierN,              // 加仓系数 基于N   构造函数执行时的参数传入n            multiplierS: multiplierS               // 止损系数 基于N   构造函数执行时的参数传入n        };n        obj.task = {                               // 给 obj对象添加一个 task 属性(值也是一个对象),用来保存 海龟的任务状态数据。n            action: ACT_IDLE,                      // 执行动作n            amount: 0,                             // 操作量n            dealAmount: 0,                         // 已经处理的操作量 n            avgPrice: 0,                           // 成交均价n            preCost: 0,                            // 前一次交易成交的额度n            preAmount: 0,                          // 前一次成交的量n            init: false,                           // 是否初始化n            retry: 0,                              // 重试次数n            desc: "空闲",                           // 描述信息n            onFinish: null                         // 处理完成时的 回调函数,即可以自行设定一个 回调函数在完成当前 action 记录的任务后执行的代码。n        }n        obj.maxLots = maxLots;                     // 赋值 最大加仓次数  构造函数执行时的参数传入n        obj.lastPrice = 0;                         // 最近成交价,用于计算 持仓盈亏。n        obj.symbolDetail = symbolDetail;           // 储存 合约的详细信息 到obj 对象的 symbolDetail 属性n        obj.status = {                             // 状态数据n            symbol: symbol,                        // 合约代码n            recordsLen: 0,                         // K线长度n            vm: [],                                // 持仓状态 , 用来储存 每个品种的 ,手动恢复字符串。n            open: 0,                               // 开仓次数n            cover: 0,                              // 平仓次数n            st: 0,                                 // 止损平仓次数n            marketPosition: 0,                     // 加仓次数n            lastPrice: 0,                          // 最近成交价价格n            holdPrice: 0,                          // 持仓均价n            holdAmount: 0,                         // 持仓数量n            holdProfit: 0,                         // 浮动持仓盈亏n            N: 0,                                  // N值 ,  即ATRn            upLine: 0,                             // 上线n            downLine: 0,                           // 下线n            symbolDetail: symbolDetail,            // 合约详细信息n            lastErr: "",                           // 上次错误n            lastErrTime: "",                       // 上次错误时间信息n            stopPrice: '',                         // 止损价格n            leavePrice: '',                        // n            isTrading: false                       // 是否在交易时间n        };nn  ...n  // 源码太长,如果有兴趣可以登录 FMZ 量化获取。


「if1612是什么」1612年中国是什朝代

以上是 上期 simnow 期货仿真 账户测试。

鉴于海龟 策略 在一定行情中 回撤还是有的,风险意识要强。本文章策略代码 是掌握海龟思路,深入学习程序化、量化 策略代码设计的很好资料。

最后! 一句很重要的话 “敬畏市场!!!”

策略源码:FMZ

由 发明者量化(FMZ.COM) (原BotVS ) 授权首发刊载

if1612是什么:谁能很实用的帮我介绍一下etf和股指期货?

股指期货现在被限制仓了,所以一般都不好做,还有如果你不是专业人士机构或者大户,股指做好别做,你玩不起,风险很大,而且交易所为了限制普通老百姓交易,股指期货开户至少50万起,交易1手需要10W左右,做交易首先看风险,而不是看收益,切记

股指期货:以股票指数为标的标准化期货合约  

股票是现货交易,股指期货则是买卖双方按未来某月的股票指数报价交易。股指期货合约是交易所统一制定的标准化协议,是股指期货市场交易的对象,其主要包括:

(1)合约标的,即股指期货合约的基础资产,如沪深300股指期货合约标的为沪深300股票价格指数;

(2)合约价值,等于股指期货合约市场价格的指数点与合约乘数的乘积;

(3)报价单位及最小变动价位,股指期货合约的报价单位为指数点,最小变动价位为该指数点的最小变化刻度;

(4)合约月份,即股指期货合约到期交割的月份;

(5)交易时间,指股指期货合约在交易所交易的起止时段,最后交易日的交易时间可能有特别规定;(6)价格限制,限定合约在一个交易日或某一时段中价格的涨跌幅度;

(7)保证金,现货是全价买卖,期货则采用占合约总价值一定比例的保证金交易;

(8)交割方式,股指期货采用现金交割,不是合约移交;

(9)最后交易日和交割日,具体日期按交易所规定,股指期货合约在交割日通过现金结算差价的方式进行交割。

 什么是股指期货的“主力合约”?

 股票被套,可以一直留着等待股市上涨。但股指期货期货合约却有生存周期,合约月份最后交易日收市后就要交割结算,故股指期货合约不能像股票那样一直“抱着”。我国股指期货合约包括了当月、下月及随后两个季月合约。例如,在2016年12月1日,可供交易的沪深300股指期货就有IF1612、IF1701、IF1703和IF1706四个合约。“16”表示2016年,“12”表示12月份,“IF1612”表示2016年12月份到期交割结算的合约。

 所谓主力合约,就是市场上同时存续的四个合约中持仓量最大、通常成交量也最大、最活跃、流动性最好的合约。近月合约与季月合约相结合,半年左右共有四个合约同时交易,具有长短兼济、相对集中的效果。

  股指期货与股票交易的四大区别

  投资者在正式参与股指期货交易之前,需要了解它与传统的股票投资都有哪些不同。一是股指期货合约有到期日,“逾期不候”,故投资者必须注意合约到期日,提前平仓或现金交割。二是股指期货实行保证金交易,它不需像炒股那样全额支付,只需提供占合约价值一定比例的“定金”,即我们常说的保证金,就可交易。三是双向交易。股票只能先买后卖,而股指期货既可以在上涨期间先买后卖,也可以在下跌期间先卖后买。四是结算方式,因股票是全额交易,亏损再大也不超过所交金额,故不需追加资金。而股指期货发生亏损时,有可能形成投资者账户保证金余额不足。所以股指期货采用当日无负债结算制度,限定投资者在规定时间内补足保证金,否则会被强行平仓。

 股指期货三大主要特征

 总结起来,股指期货具备以下三大特性:一是跨期性。股指期货的交易建立在对未来预期的基础上,预期的准确与否直接决定了投资的盈亏。二是杠杆性。投资者只需支付一定比例的保证金就可以签订较大杠杆的合约。当然,收益可能成倍放大的同时,损失也同样可能成倍放大。三是联动性。股指期货的价格与其标的资产——股票指数的变动紧密联系,其走势受到现货基本面的影响。   市场风险可分为非系统性和系统性两种风险。非系统性风险可采取分散化投资将其损失降到最低,而系统性风险可以利用股指期货的做空机制来对冲。通过卖出股指期货合约可以对冲股市整体下跌的风险,有效减轻集体抛售股票带来的损失。

if1612是什么:Superset:Just Enough

陆续写了二十几篇,该整理一下了,对读者的定位是什么,哪些内容放在前面哪些放在后面,哪些内容要归拢到一起,深度如何。


对读者的定位是什么呢?

至少有一两年软件开发经验吧,能写程序,不了解Superset,既需要横向的结构介绍,也需要纵向的流程讲解。


该如何分层呈现?

横向的结构放在前面,纵向的流程放在后面。从理解系统的角度,需要向读者呈现一个全局的结构图。从二次开发的角度,需要逐一分析各个子系统的流程,以便决定在哪里修改。


哪些内容要归拢到一起?

分类吧,比如有几篇试图呈现出工程师解决问题的过程,这些内容应该从流程介绍里面独立出来,单独构成一个章节。


深度

Just Enough。对组件的只限于大致介绍,重点放在为了实现特定的需求,该如何修改相关的Superset代码。更详细的介绍,需要读者自行搜索。窃以为,搜索引擎普及很多年了,书籍的内容编排应该做出适应性改变,至少有一部分书籍,应该聚焦在如何work上,把深入的介绍外包给搜索引擎。

一、Superset的结构

? 前端的界面元素

Superset前端用到了React、d3/nvd3、Jinja2。

Jinja2是模板,界面上方的菜单条就是用Jinja2的模板机制来实现的:

「if1612是什么」1612年中国是什朝代


React和d3/nvd3的分工如下,涉及到交互的界面元素用到了React,各种复杂的图表则由d3/nvd3绘制:


「if1612是什么」1612年中国是什朝代


? 后端的主要组件

Application框架:Flask AppBuilder

数据库访问:SQLAlchemy

查询结果处理:Pandas.DataFrame


? 目录结构

定制开发过程中经常用到的目录有如下几个

Superset/templates
– 存放Jinja2模板

Superset/migrations
– 存放数据库升级脚本(基于SQLAlchemy的python代码)

Superset/assets
– 存放前端的各种js、jsx文件以及第三方前端组件

Superset/models
– MVC中的m,基于SQLAlchemy定义的模型,建立到数据库中的table的ORM映射

Superset/views
– MVC中的v,基于Flask AppBuilder的视图,为前端各url的入口


二、打开一个slice需要几步


Slice是superset的基本功能单元。为了在浏览器中显示slice,需要jinja2、JavaScript、React、d3/nvd3几部分拼装起一个slice。


? Jinja2:

「if1612是什么」1612年中国是什朝代

Basic.html模板提供了统一的界面风格和元素,views/core.py中的函数在渲染页面时,都要指定basic.html模板为基础。


? Views/core.py

如下是explore函数的渲染代码

return self.render_template(n    "superset/basic.html",n    bootstrap_data=json.dumps(bootstrap_data),n    entry='explore',n    title=title,n    standalone_mode=standalone)

其中的entry=’explore’指定了需要加载的JavaScript脚本


? JavaScript

Entry指定的JavaScript文件是由npm run
dev-fast命令生成的

「if1612是什么」1612年中国是什朝代


Npm run dev-fast命令由assets/webpack.config.js文件控制:

entry: {n    theme:APP_DIR + '/javascripts/theme.js',n    common:APP_DIR + '/javascripts/common.js',n    addSlice: ['babel-polyfill', APP_DIR +n        '/javascripts/addSlice/index.jsx'],n    dashboard: ['babel-polyfill', APP_DIR +n        '/javascripts/dashboard/Dashboard.jsx'],n    explore: ['babel-polyfill', APP_DIR +n        '/javascripts/explore/index.jsx'],n    sqllab:['babel-polyfill', APP_DIR + '/javascripts/SqlLab/index.jsx'],n    welcome: ['babel-polyfill', APP_DIR + '/javascripts/welcome.js'],n    profile: ['babel-polyfill', APP_DIR + '/javascripts/profile/index.jsx'],n},


可以看到explore….entry.js是由assets/javascripts/explore目录打包生成的(index.jsx相当于入口点,会依据index.jsx的引用关系树,把相关文件都打包到enplore.js中)。


? React

Slice左侧的各种参数、按钮是由React构造的:

「if1612是什么」1612年中国是什朝代

代码在store目录中:

「if1612是什么」1612年中国是什朝代


? D3/nvd3

Slice右侧的Chart是由d3/nvd3绘制的:

「if1612是什么」1612年中国是什朝代


代码在assets/visualizations目录下

「if1612是什么」1612年中国是什朝代

Main.js是入口点。


Visualization的定义在javascripts/explore/components目录下,该目录下的ChartContainer.jsx负责render视图。

renderViz() {n   this.props.actions.renderTriggered();n   const mockSlice = this.getMockedSliceObject();n   this.setState({ mockSlice }); n   try {n     const viz = visMap[this.props.viz_type];n     // viz(mockSlice, this.props.queryResponse, this.props.actions.setControlValue);n     viz(mockSlice, this.props.queryResponse);n   } catch (e) {n     this.props.actions.chartRenderingFailed(e);n   }n }

上述代码中的visMap,是从assets/visualizations目录下的main.js中导入的:

import visMap from
'../../../visualizations/main';


Superset各种可视化类型对应的绘制功能都在visualizations目录下,main.js将这些js文件放在visMap数据结构之中,供外部调用。


三、菜单加载的流程

大致的流程:在superset启动时,F.A.B侧会把各个menu item加载的appbuilder中的menu对象里。在用户登录之后,flask_appbuilder/templates/appbuilder/navbar_menu.html负责加载菜单。is_menu_visible会调用self.security_manager.has_access来确认是否允许显示菜单。


{% for item1 in menu.get_list() %}n    {% if item1 | is_menu_visible %}


贴一段traceback.print_stack()的输出:

DEBUG:root:inside manager::has_accessnDEBUG:root:menu_accessnDEBUG:root:SQL Labn  File "/usr/lib/python2.7/threading.py", line 783, in __bootstrapn    self.__bootstrap_inner()n  File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_innern    Branded Short Domain Powered by Bitly()n  File "/usr/lib/python2.7/threading.py", line 763, in runn    self.__target(*self.__args, **self.__kwargs)n  File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_threadn    self.finish_request(request, client_address)n  File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_requestn    self.RequestHandlerClass(request, client_address, self)n  File "/usr/lib/python2.7/SocketServer.py", line 649, in __init__n    self.handle()n  File "/***/lib/python2.7/site-packages/werkzeug/serving.py", line 232, in handlen    rv = BaseHTTPRequestHandler.handle(self)n  File "/usr/lib/python2.7/BaseHTTPServer.py", line 340, in handlen    self.handle_one_request()n  File "/**/lib/python2.7/site-packages/werkzeug/serving.py", line 267, in handle_one_requestn    return self.run_wsgi()n  File "/**/lib/python2.7/site-packages/werkzeug/serving.py", line 209, in run_wsgin    execute(self.server.app)n  File "/**/lib/python2.7/site-packages/werkzeug/serving.py", line 199, in executen    for data in application_iter:n  File "/**/lib/python2.7/site-packages/werkzeug/debug/__init__.py", line 284, in debug_applicationn    app_iter = self.app(environ, start_response)n  File "/**/lib/python2.7/site-packages/flask/app.py", line 1997, in __call__n    return self.wsgi_app(environ, start_response)n  File "/**/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_appn    response = self.full_dispatch_request()n  File "/**/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_requestn    rv = self.dispatch_request()n  File "/**/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_requestn    return self.view_functions[rule.endpoint](**req.view_args)n  File "/**/superset/superset/views/core.py", line 2520, in welcomen    'superset/welcome.html', entry='welcome', utils=utils)n  File "/**/lib/python2.7/site-packages/Flask_AppBuilder-1.9.4-py2.7.egg/flask_appbuilder/baseviews.py", line 158, in render_templaten    return render_template(template, **dict(list(kwargs.items()) + list(self.extra_args.items())))n  File "/**/lib/python2.7/site-packages/flask/templating.py", line 134, in render_templaten    context, ctx.app)n  File "/**/lib/python2.7/site-packages/flask/templating.py", line 116, in _rendern    rv = template.render(context)n  File "/**/lib/python2.7/site-packages/jinja2/environment.py", line 1005, in rendern    return concat(self.root_render_func(self.new_context(vars)))n  File "/**/superset/superset/templates/superset/welcome.html", line 14, in rootn    n  File "/**/superset/superset/templates/superset/basic.html", line 29, in rootn    {% endblock %}n  File "/**/superset/superset/templates/superset/basic.html", line 98, in block_navbarn  File "/**/superset/superset/templates/appbuilder/navbar.html", line 51, in rootn  File "/**/lib/python2.7/site-packages/Flask_AppBuilder-1.9.4-py2.7.egg/flask_appbuilder/templates/appbuilder/navbar_menu.html", line 45, in rootn  File "/**/lib/python2.7/site-packages/Flask_AppBuilder-1.9.4-py2.7.egg/flask_appbuilder/filters.py", line 118, in is_menu_visiblen    return self.security_manager.has_access("menu_access", item.name)n  File "/**/lib/python2.7/site-packages/Flask_AppBuilder-1.9.4-py2.7.egg/flask_appbuilder/security/manager.py", line 777, in has_accessn    traceback.print_stack()


四、SQL Editor获取schema


2017-11-16:用admin登录,SQL Editor左侧的schema能正常显示,非admin用户登录,schema为空白。

admin登录后的界面:

「if1612是什么」1612年中国是什朝代

非管理员登录的界面:

「if1612是什么」1612年中国是什朝代

获取schema的代码在superset/views/core.py中:

@apin    @has_access_apin    @expose("/schemas//")n    def schemas(self, db_id):n        db_id = int(db_id)n        database = (n            db.sessionn            .query(models.Database)n            .filter_by(id=db_id)n            .one()n        )n        schemas = database.all_schema_names()n        schemas = self.schemas_accessible_by_user(database, schemas)n        return Response(n            json.dumps({'schemas': schemas}),n            mimetype="application/json")

增加日志后发现database.all_schema_names返回了相应的schema,在经过self.schemas_accessible_by_user的处理后,schemas为空。继续观察schemas_accessible_by_user函数。

schemas_accessible_by_user在superset/views/base.py中:

def schemas_accessible_by_user(self, database, schemas):n        # 管理员的权限判断走到这个分支就返回了n        if self.database_access(database) or self.all_datasource_access():n            return schemasnn        # 非管理员的权限判断会走到这个分支n        subset = set()n        for schema in schemas:n            # 以sqlite数据库为例,schema_perm为“[main].[main]”n            schema_perm = utils.get_schema_perm(database, schema)n            # 由于并未对schema授权,can_access的检查自然不会通过n            if self.can_access('schema_access', schema_perm):n                subset.add(schema)nn        # 根据table的授权信息,推导对应的scheman        # 获取到的perms是这样的:set([u'[main].[birth_names](id:3)', u'[mysql].[ab_permission_view](id:8)', u'[mysql].[ab_permission](id:9)', u'[main].[energy_usage](id:1)'])n        perms = self.user_datasource_perms()n        if perms:n            # 用perms过滤数据库中的tablesn            # 按上述perms过滤出来的tables:[energy_usage, birth_names]n            tables = (n                db.session.query(SqlaTable)n                .filter(n                    SqlaTable.perm.in_(perms),n                    SqlaTable.database_id == dataBASE Computer Online Store,n                )n                .all()n            )n            # 问题出在t.shcema上n            # t的类型是n            # 似乎对sqlite数据库,并没有schema属性n            for t in tables:n                # t.schema的类型:n                if t.schema:n                    subset.add(t.schema)n        return sorted(list(subset))


五、Superset不支持Echarts的原因


Todo: New Viz · Issue #216 · apache/incubator-superset

ascott的回复:

i'm assuming you are talking about baidu's echarts. no plans to support echarts at this time. we will be continuing to use d3/nvd3 and moving to react for most of our ui components.

不过,在二次开发的过程中,我们逐渐认识到,superset“左交互.右chart”的界面风格对部分用户略显复杂(比如从Tableau转过来的团队,chart的参数不需要经常修改,左侧的React组件不需要每次都显示)。如果能用Echarts支持更简单的界面风格,即使偏离React,也可以接受。


如果要把Echarts集成进来,至少要兼容Superset现有的npm install机制,在npmjs网站找到了Echarts的说明:

echarts

看起来可以用npm install来安装Echarts。在superset/assets/package.json中增加echarts:

"viewport-mercator-project": "^2.1.0",n"echarts": "^3.7.0"

再执行npm --registry=registry.npm.taobao.org install -d,在安装日志中找到如下的提示信息:

npm http request GET http://registry.npm.taobao.org/echartsnnpm info attempt registry request try #1 at 1:38:37 PMn...nnpm http 200 http://registry.npm.taobao.org/echartsnnpm info addNameTag [ 'immutable', 'latest' ]nnpm info addNameTag [ 'datatables.net-bs', 'latest' ]nnpm info addNameTag [ 'reactable', 'latest' ]nnpm info addNameTag [ 'brfs', 'latest' ]n...nnpm http request GET http://registry.npm.taobao.org/zrendernnpm http 200 http://registry.npm.taobao.org/zrendern...nnpm http request GET http://registry.npm.taobao.org/geojson-areannpm http 304 http://registry.npm.taobao.org/geojson-areannpm WARN deprecated [email protected]: This module is now under the @mapbox namespace: install @mapbox/geojson-area insteadn...nnpm http 304 http://registry.npm.taobao.org/object-keysnnpm http 304 http://registry.npm.taobao.org/is-objectnnpm WARN deprecated [email protected]: Please update to the latest object-keysn...nnpm info addNameTag [ 'node-uuid', 'latest' ]nnpm WARN deprecated [email protected]: Use uuid module insteadn...nnpm info linkStuff [email protected] WARN prefer global [email protected] should be installed with -gn...n+-- [email protected]+-- UNMET PEER DEPENDENCY [email protected]


看起来并没有Echarts相关的错误提示。执行npm run dev-fast,生成javascript文件,再次登录,未发现前端有错误提示。


下一步打算用Echarts的同比图来替换自己添加的nvd3同比图。

Echarts的基本用法可以参考 @羡辙 的文章:

漂亮得不像实力派:ECharts 水球图教程


根据上面的教程,Echarts有三个基本步骤:

导入Echarts的js文件。

找到界面上对应的DOM,作为echarts.init的参数。

构造option(格式在Echarts官网上有示例),执行chart.setOption(option),将option绘制出来。


导入Echarts的js文件:

参考Superset中对d3的处理

import d3 from 'd3';

猜测应该可以用import echarts from 'echarts';

在superset/assets/visualizations/heatmap.js中加入import echarts from 'echarts';,执行npm run dev-fast,未报错。

浏览器登录,打开heatmap图,也能正常显示,说明上述导入Echarts的js文件的方式是正确的。


找到DOM:

2017-11-17更新:下个月开始不再从事Superset相关的工作了,这个系列暂时告一段落。


六、2017-11-22更新:

交接时整理了permission相关的几张表


「if1612是什么」1612年中国是什朝代
「if1612是什么」1612年中国是什朝代
「if1612是什么」1612年中国是什朝代
「if1612是什么」1612年中国是什朝代

新中国密码:15665,611612!