weixin_40455124
这个作者很懒,什么都没留下…
展开
-
metabase 前台调用后台API代码分析
metabase 前端调用后端服务,都是调用/api的rest服务前端核心调用是frontend\src\metabase\lib\api.js文件,其中最重要的部分代码如下:// TODO Atte Keinänen 6/26/17: Replacing this with isomorphic-fetch could simplify the implementation _makeRequest(method, url, headers, body, data, options) { /原创 2020-11-06 22:46:57 · 1209 阅读 · 0 评论 -
使用macroexpand 学习clojure thread macro
clojure 的thread macro有如下内容->->>some->some->>cond->as->doto对应->Threads the expr through the forms. Inserts x as thesecond item in the first form, making a list of it if it is not alist already. If there are more forms原创 2021-04-02 22:21:55 · 156 阅读 · 0 评论 -
Clojure Filter函数
记录下https://clojure.org/guides/higher_order_functions的filter 函数,可以快速过滤数据集(def pets [ {:name "Fluffykins" :type :cat} {:name "Sparky" :type :dog} {:name "Tibby" :type :dog} {:name "Al" :type :fish} {:name "Victor" :type :bear}])(defn原创 2021-03-27 00:28:33 · 175 阅读 · 0 评论 -
clojure gen java class
使用:gen-class,extend及implements 来实现对类及接口的继承,注意interface 方法不需要使用:methods声明,需要声明的是新增方法,不需要使用expose。特别要注意是在project.clj要增加aot:aot [clojure-learn.JavaSimpleJob clojure_learn.gentest]clj文件代码如下如(ns java-interfaces.using-gen-class (:gen-class :name java-i原创 2021-01-15 09:28:40 · 149 阅读 · 0 评论 -
clojure nil导致的类型判断失败
metabase 的send-pulse! 如代码有pre的检测:pre [(map? pulse) (integer? (:creator_id pulse))]}(defn send-pulse! "Execute and Send a `Pulse`, optionally specifying the specific `PulseChannels`. This includes running each `PulseCard`, formatting the results, an原创 2021-08-11 04:34:43 · 119 阅读 · 0 评论 -
clojure 调用返回的函数
一句话总结:()就是clojure执行函数,不是eval 也不是apply,测试代码如下(defn enforce-api-key [] (fn [x] (println x) (if (= "key" x) (println "===") (println "xxx") ) ))((enforce-api-key ) "k") ((enforce-api-key ) "key")或者 (defn enforce-api-key [x] (fn []原创 2021-03-07 23:33:00 · 192 阅读 · 0 评论 -
Mastering clojure macros 读书笔记
这是花了一周时间的阅读笔记,Mastering clojure macros提到的computation 还是不太理解。1.1. build a solid foundation1.1.1. macro is ladder: code becomes data then data become data1.1.1.1. input args(function) acting on data1.1.1.2. treat the code of arguments as data, create a原创 2021-03-12 22:49:56 · 117 阅读 · 0 评论 -
Clojure destructuring 学习记录
在看metabase 代码时候,可以看到很多类似如下的代码(let [{:keys [args body arg->schema], :as defendpoint-args}看的似懂非懂的,于是去google,仔细阅读https://clojure.org/guides/destructuring ,总结如下:对应map类variable{},可以在任意地方进行destructuring,包括let及函数参数中有如下关键字:as,:or , :strs,:keys:syms可以在dest原创 2021-03-27 00:24:40 · 102 阅读 · 0 评论 -
clojure 使用本地jar
在project.clj 中增加如下diam:resource-paths [“resources/elasticjob-operation-0.0.1-SNAPSHOT.jar”]是clj文件中使用import 导入即可(ns clojure-learn.lite(:import com.dangdang.ddframe.job.config.JobCoreConfiguration com.dangdang.ddframe.job.config.simple.SimpleJob原创 2021-01-15 09:22:15 · 270 阅读 · 0 评论 -
mastering clojure macros 的一个小错误
macros can be contagious(传染)中有如下例子(defn send-email [user messages] (Thread/sleep 1000)) ;; this would send email in a real implementation(def admin-user "[email protected]")(def current-user "[email protected]")(defn notify-everyone [messages] (a原创 2021-03-12 22:54:37 · 87 阅读 · 0 评论 -
clojure rest client
clojure rest client 使用以下两个package就可以(require '[clj-http.client :as client])(require '[cheshire.core :as json])获取json测试代码如下:(let [url "http://headers.jsontest.com//" response (client/get url {:as :reader})] (with-open [reader (:body response)]原创 2021-03-28 00:18:01 · 87 阅读 · 0 评论 -
Clojure Characters 清单
大部分来自官网 ,最后一个来自mastering clojure macro( … ) - List[ … ] - Vector{ … } - Map# - Dispatch character#{ … } - Set#_ - Discard#"…" - Regular Expression#(…) - Anonymous function#' - Var quote## - Symbolic values#inst, #uuid, and #js etc. - tagged lite原创 2021-03-14 10:32:18 · 82 阅读 · 0 评论 -
defendpoint 内 for 循环导致的bug
最近几天一直在修改metabase defendpoint 遇到很奇怪的问题:函数单独执行可以,但放到defendpoint 内,for 循环表现为获取不到数据库内数据导致没有执行for循环内代码。参考:Clojure循环-----Doseq循环和for循环的区别将被defpoint内的for改为doseq,pass。参考metabase其它代码,加上try catch:(doseq [channel channel-ids ] (try (delete-crontab-pulse-chann原创 2021-08-18 00:28:56 · 88 阅读 · 0 评论 -
clojurewerkz.quartzite.jobs defjob 的bug
今天在研究metabase pulse 支撑crontab过程发现一个defjob 的bug记录一下在repl模式下使用defjob重新定义一个job,发现quartz调用时候代码没有变化。execution=> (j/defjob JobDd #_=> [ctx] ( let [ channel_id (get (.getMergedJobDataMap ctx) "channel-id" ) ] ^M #_=> ( let原创 2021-08-11 04:40:09 · 96 阅读 · 0 评论 -
toucan 使用数据库函数方法记录
metabase 使用toucan 进行数据库操作,在文档中没有明确写道如何使用数据库函数,但实际使用clojure 默认方式“keyword”,以下代码中的 FIND_IN_SET 就是mysql函数。 (db/select [PulseChannel :id :pulse_id :schedule_type :channel_type] {:where [:and [:= :enabled true] [:or [:= :schedule_typ原创 2021-08-07 13:53:14 · 92 阅读 · 0 评论 -
metabase 通过API查看quartz定时任务信息
metabase 使用了quartz作为定时任务调度,查看quartz定时任务信息的方法包括2种查看数据库中QUARTZ相关表使用task api: api/task/info 会返回所有quartz task的定义{ "scheduler":[ "Quartz Scheduler (v2.1.7) 'MetabaseScheduler' with instanceId 'metabse1627945923475'", " Scheduler class: 'org原创 2021-08-06 23:55:42 · 314 阅读 · 0 评论 -
metabase 0.40.1 pulse定时任务变化
metabase 0.40.1定时任务与0.3X有变化,具体从那个版本开始没有去查。数据模型变化数据模型上有些小的变化相关表没有变化,还是pulse及pulse_xxx等表pulse的存储数据有区分如上图,表pulse中name 为空是card里面的alert ,可以通过表pulse_card查看到关联的carddashboard_id 不为空的是dashboard的订阅name不为空且dashboard_id为空的是之前的pulse,相关card_id 也保存在pulse_card原创 2021-08-03 08:17:30 · 406 阅读 · 2 评论 -
metabase 基于问题(card)设计新的问题(card)
metabase除了基于数据库来设计新的question/card,也可以基于已经保存的问题设计新的question。simple模式simple很简单,在数据选择的时候选用“保存的问题”即可:同时,可以关联(join)其它已经保存的问题进行关联查询,以下为示意图片:sql模式sql模式可以参考:https://www.metabase.com/docs/latest/users-guide/referencing-saved-questions-in-queries.html以下为示意图:原创 2021-07-22 21:53:33 · 220 阅读 · 0 评论 -
metabase 远程yarn dev模式
metabase yarn 提供了dev模式,查看package.json,可以看到如下内容:"scripts": { "concurrently": "yarn && concurrently --kill-others -p name", "dev": "yarn concurrently -n 'backend,frontend,cljs,docs' -c 'blue,green,yellow,magenta' 'lein run' 'yarn build-hot:j原创 2021-07-22 21:34:30 · 590 阅读 · 0 评论 -
metabase 容器dev模式启动失败-System limit for number of file watchers
metabase提供了一个容器化编译能力,默认开发可以在容器内通过yarn dev启动开发环境,但如果使用默认linux配置,会遇到如下错误ENOSPC: System limit for number of file watchers reached, watch '/app/source/resources/frontend_client/app/fonts/lato-v16-latin/lato-v16-latin-900.woff2System limit for number of file原创 2021-07-20 23:42:38 · 342 阅读 · 0 评论 -
metabase route/uri 分析及前后端拆分的可能性分析
ROUTE 分析metabase 使用ring 作为webserver,route(即一般web说的URI,或者说servlet的dispatch)使用compojure(https://github.com/weavejester/compojure)来使用实现,top 的dispatch 入口在route.clj的如下代码中(defroutes ^{:doc "Top-level ring routes for Metabase."} routes (or (some-> (resolv原创 2021-07-20 23:32:30 · 174 阅读 · 0 评论 -
metabase 0.40.1 代码编译分析及基础image下载
metabase 0.40.1 代码编译和37有不少变化,步骤更加清晰。在0.40.1这个版本提供一个基础编译的容器,URL地址:https://github.com/metabase/metabase-docker-ci/blob/master/DockerfileFROM adoptopenjdk/openjdk11:alpineENV FC_LANG en-US LC_CTYPE en_US.UTF-8# coreutils: needed for the basic tools#原创 2021-07-17 11:44:56 · 248 阅读 · 0 评论 -
使用chromedriver 及selenium发送dashboard、question
metabase本身的调度是基于每小时,同时pulse 定时发送的question的图形和metabbase页面显示并不一样,格式简单不能满足要求的话,可以考虑1、使用chromedriver 及selenium进行截屏、下载excel附件2、再使用外部调度,比如dolphinscheduler实现cron或者在完成数据抽取、分析后自动发送邮件以下为一些示意代码:public static WebDriver getPage(String rootUrl, WebDriver driver,Page原创 2021-06-23 21:15:11 · 161 阅读 · 0 评论 -
metabase field的字段 special_type设置
metabase field的字段 special_type设置 也来源于表的metadata同步过程,但比table复杂核心入口在(s/defn classify-fields! "Run various classifiers on the appropriate FIELDS in a TABLE that have not been previously analyzed. These do things like inferring (and setting) the special原创 2021-04-01 23:39:21 · 325 阅读 · 0 评论 -
metabase table 类型entity_type 识别
在https://blog.csdn.net/weixin_40455124/article/details/115364776 记录了metabase如何对表进行自动展示,展示是依赖表的entity_type ,那这个entity_type 怎么来的呢?entity_type 来源于metabase在同步表的meta数据时候,根据表名称进行识别的,是不是觉得太简单了?!关键代码都在metabase.sync.analyze 下,包括对field的识别。核心代码如下:(s/defn analyze-原创 2021-04-01 23:27:10 · 207 阅读 · 0 评论 -
metabase autodashboard 初步分析
metabase 可以对表及字段进行自动分析,实现过程初步分析如下:clojure代码主要在ns metabase.automagic-dashboards下,即目录automagic-dashboards下在resources 目录下有一个子目录automagic_dashboards,存放以yaml文件定义展现规则-rules,在表metabase_table 的字段entity_type 定义表的用途分类在表metabase_field的字段 special_type 定义字段特殊用途原创 2021-04-01 00:37:31 · 201 阅读 · 0 评论 -
metabase Drill Through(数据下钻)能力
简单总结metabase 的tile map/瓦片地图模式通过地图缩放可以实现Drill Through对应外键和joined 字段,在非native query模式下可以实现自动展现对应数据,使用joined字段可以避免使用外键,更适合生产环境带dashboard 通过自定义click 事件也可以实现dashboard模式需要注意,以native query为例,要跳转的parameter类型要正确,如下图数字类型的参数必须选择number。dashboard的配置如下:注意右下角的P原创 2021-03-14 08:43:57 · 1403 阅读 · 0 评论 -
metabase 权限体系
metabase 权限体系总体如下:不能对单个people授权,只能居于group授权一个人可以归属多个group可以授权的对象分为data:database/tablecollection(dashboard及question的集合)data授权分data accesssql queries为何sql queries单独出来,估计和enterprise的row-level-restrictions(行限制)和column-level-perms-check有关,尤其是col原创 2021-03-14 08:26:15 · 994 阅读 · 0 评论 -
metabase 关闭slack metabot
再开通slack 后,默认可以使用bot自动处理slack请求,在启动日志中可以看到metabot duty的相关内容。metabot官方用途说明如下:(defsetting metabot-enabled (deferred-trs "Enable MetaBot, which lets you search for and view your saved questions directly via Slack.") :type :boolean :default false)原创 2021-03-10 07:49:35 · 329 阅读 · 0 评论 -
metabase的地图展示方式及切换地图源
metabase 3中地图模式的使用原创 2021-03-09 08:44:39 · 2478 阅读 · 2 评论 -
metabase MB_API_KEY不生效及ring handler简易分析
分析handler的起因是测试MB_API_KEY发现不生效:官方文档描述如下:MB_API_KEYType: stringDefault: nullMiddleware that enforces validation of the client via the request header X-Metabase-Apikey. If the header is available, then it’s validated against MB_API_KEY. When it matches,原创 2021-03-08 20:24:45 · 260 阅读 · 0 评论 -
metabase native sql支持按时间查询对应的表
实现将下面的native query sql:select * from activity_{{'eval timeformatter YYYYMM months 0}} where id={{'eval metabase-user-id}}转换为select * from activity_202103 where id=1*其中metabase-user-id 为登录用户id实现方式,在metabase 的query processor 中增加一个middleware,这个middleware原创 2021-03-05 20:30:38 · 455 阅读 · 1 评论 -
跟踪分析metabase query_processor的每个middleware操作
metabase的query processor有很多步,为分析default-middleware中这些middleware ,可以写一个简单middleware用于跟踪,具体代码如下(ns metabase.query-processor.middleware.querylog "Middleware for logging a query before it is processed. (Various other middleware functions log the query as原创 2021-03-03 20:34:35 · 156 阅读 · 1 评论 -
metabase query-processor 过程
简单记录下query-processor过程,直接在源代码上汇聚相关function的说明;; ▼▼▼ POST-PROCESSING ▼▼▼ happens from TOP-TO-BOTTOM, e.g. the results of `f` are (eventually) passed to `limit`(def default-middleware "The default set of middleware applied to queries ran via `process-qu原创 2021-02-24 21:09:47 · 215 阅读 · 0 评论 -
metabase session/login 分析
metabase 登录及session 管理最重要的两个CLJ文件是session.cljhandler.clj代码分析先看handler.clj ,这个handler.clj是Ring 框架的web请求handler定义,关键代码如下,注释也很清晰(def app "The primary entry point to the Ring HTTP server." (-> ;; in production, dereference routes now because t原创 2021-02-22 21:44:42 · 365 阅读 · 0 评论 -
Metabase 数据源管理及同步机制
metabase增加数据库有2个选项:Automatically run queries when doing simple filtering and summarizingWhen this is on, Metabase will automatically run queries when users do simple explorations with the Summarize and Filter buttons when viewing a table or chart. You原创 2021-01-20 08:32:57 · 1316 阅读 · 0 评论 -
metabase表用途简单记录
SELECT * FROM core_session ; oss session 信息,可以作为登录历史SELECT * FROM core_user;用户表SELECT * FROM permissions_group; 权限组“id” “name”“2” “Administrators”“1” “All Users”“3” “MetaBot”SELECT * FROM query ;sql原创 2021-01-16 14:10:28 · 450 阅读 · 0 评论 -
记录pulse 发送时候card 运行失败记录到数据库中
记录pulse 发送时候card 运行失败记录到数据库中,在如下代码中(s/defn ^:private render-pulse-card-body :- common/RenderedPulseCard [render-type timezone-id :- (s/maybe s/Str) card {:keys [data error], :as results}] (log/info (.toString (.getClass card)) (.toString card))原创 2020-11-23 18:57:29 · 137 阅读 · 0 评论 -
metabase slack简单记录
Slack在国内很少用,简单记录如下基本按操作建立bot就可以在文档没有提到的是要建一个metabse_files channelslack发送的是tab的图片,与email不同slack可以每小时发送,这也是metabase最小执行单位slack 发送图片有jvm add font失败的issue,换jvm或者升级可以解决...原创 2020-11-09 22:58:27 · 345 阅读 · 0 评论 -
metabase pulse代码分析
metabase pulse代码简单跟踪分析如下:获取要执行的pulse(s/defn retrieve-scheduled-channels "Fetch all `PulseChannels` that are scheduled to run at a given time described by `hour`, `weekday`, `monthday`, and `monthweek`. Examples: (retrieve-scheduled-channels 1原创 2020-11-09 22:55:01 · 447 阅读 · 0 评论