frappe,erpnext,bench关系

frappe
全栈式web开发框架

erpnext
开源 erp 项目,基于 frappe

bench
python 环境下的web站点工具集合,可以管理 frappe 结构的站点

Javascript 判断经纬度是否在中国

Javascript 判断经纬度是否在中国

公司项目上一个问题,车辆的坐标点经常会飘到国外去,经过分析,是车载终端上传了错误的经纬度,最后考虑到终端升级麻烦,领导一句话,让前端来改。。。

然后我开始做技术调研。

百度地图有 API 来判断坐标点是否在某一个范围内,要使用这个方法,首先要把中国地图的边界坐标拿出来。刚好百度地图的的 API 也能提供。

看起来条件已经很充足了,可以开始动代码了。不过,我比较担心的是性能问题。

项目中有一个轨迹回放的功能,会把很多点拿到前端做渲染,如果每个点都要做范围的判断,有可能会有性能的问题。

最后做了单元测试,最后发现性能问题的确存在,当处理 1000 个点的时候会超过 1 秒。

以下是我的测试代码。

没有引用百度 API 的脚本,直接把需要的方法拷贝过来了。我把中国边界的坐标点录到在线 mocker 服务器上了,通过 url 就可以访问。

Zentao bug Killer,禅道bug提醒工具

Zentao bug Killer,是一个谷歌浏览器插件,用来提醒禅道上新BUG

如何安装

1. 下载 Zentao bug Killer,地址:https://pan.baidu.com/s/1c2fIwr2

2. 打开谷歌浏览器,地址栏键入 chrome://extensions/,将下载的插件拖入该页面

如图所示,即代表安装成功 ## 如何使用 工具会在后台静默刷新,如果有了新BUG会自动弹出消息框,并且不会自动关掉。当前有几个BUG,也会显示在角标上。 效果如下: 有BUG的情况下,会显示红色角标

同时会在桌面有下角显示通知,注意,即使是浏览器关闭的状态下,该通知依然可以弹出

展开,显示BUG的标题,点击BUG编号,可以打开BUG的详情页

如果BUG解决了,自动恢复到默认状态

使用JSduck生成技术文档

使用JSduck生成技术文档

为什么要有技术文档?

优点
1. 如果代码看不下去,那么看文档
2. 对功能模块有一个全局的视角
3. 使项目易于维护

缺点
1. 需要额外的人力来整理文档
2. 需要额外的时间来做文档的变更

so,有没有一种更简单的方式,在现有人力的情况下,在限有时间的前提下,做到技术文档的输出呢?

其实,可以用框架来生成技术文档,这个框架就是 JSduck

JSduck 由 Sencha 开发,因此对于自家 extJS 具有非常强大的支持功能,包括令人咋舌的实时代码修改。但即使你不是使用 extJS 进行开发,JSDuck 仍然是一个非常强大的工具,一方面它的语法非常灵活,描述支持 Markdown 语法,上手难度远远低于 JSDoc

3;另一方面它生成的文档可读性堪比 YUIDoc,同时支持源码的对照,学习起来也非常的容易。要说 JSduck 有什么不好的地方,估计就是它把一切都 Handle 太完美了以致于没有给你提供什么可以自己定制的余地。

JSduck 运行原理?

JSduck + 代码注释=文档 JSduck 也是一套程序库,运行这个程序库,它会读取你的源代码中的注释文档,最终生成一套网页文件,这些文件既是文档。

      • 注释规范需以“/*” 开头和“/”结束,不同的注释标签会生成不同的文档内容,JSduck 提供了很多注释标签,大部分都是通用的注释标签,例如 @auther 用来指定代码作者,@return 用来描述方法的返回值,@param 用来描述输入参数等等。

安装 JSduck

  1. 安装 ruby
  2. 从 github 上下载并解压 JSduck,解压目录中 JSdcuck.exe 既是可运行文件
  3. 将 JSduck 的运行目录配置到 PATH 当中

运行 JSduck

从 cmd 中输入以下命令即可运行
jsduck <源代码目录> —output <文档输出目录>

JSduck API

JSduck 玩的就是注释符,下面是 JSduck 提供的所有注释符

@abstract用来标记抽象方法或类,通常用于标记还有没实现的方法

@accessor

@alias

@alternateClassName

@aside

@author 指定类/方法的作者

@cfg 用于组件或类的配置描述

@chainable 用于标记一组链路方法,链路方法是什么?我的理解是方法总会返回 this

@class** 标记一个类,JSduck 会根据该标记来生成树的结构图

@constructor 如果为了一个类写了构造函数,那么需要使用改注释符

@deprecated 如果某一个函数不再使用,但是为了不影响线上版本不能删除改方法的情况下,需要将改函数标记为已废弃

@docauthor 类似于 @author,不过 @author 用于代码的作者,该标记用于描述文档的编写者

@enum 枚举

@event 描述一个事件的定义

@evented 描述一个事件的影响者

@experimental 用于描述一个不稳定的方法,因为改方法可能会在以后的版本中移除掉,以此来警告方法的使用者

@extends 继承

@fires 描述某一个方法中,可能会触发某一个事件

@ftype

@hide

@ignore 某些注释只用于开发者阅读,但是并不希望在出现在文档中,可以使用该标记

@inheritable

@inheritdoc

@link 用于引用其他对象(类,方法,事件等)

@localdoc

@markdown

@member

@method 描述一个方法

@mixins 混合某一个对象的注释

@new 标记某一个最新创建的方法

@override

@param 描述入参

@preventable

@private 描述私有对象

@property描述属性

@protected将成员的可见性记录为受保护。受保护的成员只能从类本身及其子类中使用。

@ptype

@readonly描述只读属性

@removed 描述某一个方法在某一个版本中已经移除掉

@requires描述依赖对象

@return** 描述方法的返回对象

@scss mixin
@since 描述从哪个版本开始加入的新的对象,使用该标记
时,会在文档中自动加入 @new 标记,但不会影响源代码。

@singleton描述单态对象

@static描述静态对象

@template提供一种作为扩展类的功能的钩子提供的方法。该标签通常与@protected 一起使用。

@throws 文件方法抛出的异常。异常类型默认为 Object。可以使用多个@throws 标签来记录多个可能的异常。

@type** 记录属性的类型,另外将记录的东西标记为属性。 不建议使用此标记。它只支持向后兼容旧的 ext-doc。对于新代码,始终使用@property 标签。

@uses** 定义文档类使用的类。

@var** 记录 SCSS 变量:其名称,类型和默认值。

@xtype

vue+bootstrap+flex(布局) 实现的播放机界面

Beer -- Angular2 后台管理框架

最近几个月,一直做车辆网的项目,我主要负责前台地图相关的开发,具体包括在地图上绘制车辆,绘制车辆轨迹,回放等。该项目用 SprintMVC + MyBatis + Redis 开发,在开发的过程中发现了几个问题:

  • 后台与前台开发界限不是很清晰,前台使用 .JSP 页面,数据绑定有时候用后台绑定,有时候又在前台发请求绑定。

  • 前台页面的重复工作太多,比如系统管理中有司机管理,车辆管理,车组管理等,这个模块都有一个共同点:

  1. 相同的布局,页面分为上下两部分,上部分为查询区域,下部分为数据展示区域。所以每一个页面的网页代码基本一致。重复而枯燥。

  2. 相同的功能,每一个系统管理模块中的功能无非是增删改查,虽然项目中已经有一个公共 JS 模块方法来承担这个操作,但是在页面上,仍然需要写 onclick , onsubmit 这些事件。没有做到完全的封装。

  3. 每个页面布局一致,顶部菜单 + 左侧菜单 + 中心内容,问题是,现在切换每个页面都是整页刷新。而且现在的 JS,CSS 文件都没有做压缩合并,导致了每次切换页面都需要等 1,2 秒,作为一个前端工程师实在看去下去。这属于架构问题。说到这个问题,得从长计议。当时时间节点比较紧张,项目组采取人海战术,每个人负责几个页面,然后复制粘贴,就成现在这个样子了。(其实刚开始我是建议用 DIV + GET 的方法来模拟 iframe 的效果的。)

  4. 包括地图监控页面(我负责的页面),也是同样的问题,虽然地图打点等功能我已经封装了,在具体的页面直接调用方法就可以了,但是前台页面并没有完全的公用,要引用 baidu API 的脚本、要创建一个 DIV 标签,用来承载地图,还要初始化地图。。。 说到底,这些问题都可以归结为一个问题,没有做到模块化。

在之前发现这些问题的同时,我也考虑过使用组件化开发可能会解决。不过现成的框架并没有完全能够解决我的问题,要么就是有一些缺陷。因为我理想的框架是这样的:

  • 组件化开发,包括一些容器组件

  • 按需加载

  • 页面路由

  • 异步加载机制,很多框架不能同时做到异步加载和按需加载,除非做一些复杂的配置(类似 Vue.JS)

套用一句广告词,直到我发现了 Angular 2…更确切的说,直到 Angular 2 的正式版发布。

可以说,Angular 2 完全能够满足我的需求。 Angular 2 已经原生支持按需加载(依赖注入)和异步加载,组件化开发功能,当然,这套框架我不能直接拿到项目中使用,我需要在 Angular2 上面再做一层封装。目的是让业务开发人员尽可能的少写,少写,少写代码。

所以,我利用空闲时间写了一套后台管理框架,Beer。基于 Angular 2,最核心的几个组件如下:

Layout 用于页面的框架布局,也是容器组件,组装了三个子组件: Header , SideMenu, router-outlet(Content)

SideMenu 左侧菜单组件,是 Layout 的子组件,与 Content 组件互动,点击菜单,Content 显示相关的页面。

Header 顶部菜单。

router-outlet(Content) 页面展示区域。与 SideMenu 组件互动,点击菜单,SideMenu显示相关的页面。

Map 我最爱的组件,封装了地图显示,打点,轨迹回放等功能,想一想,只需要在页面中插入 <map></map> 标记,一个完完整整的地图就会出现,是多么神奇。

Manage 管理模块页面的容器组件,该组件高度封装了管理页面的公共部分和逻辑代码的公共部分。Manage 组件能让管理页面完全比用写不必要的代码,举个例子:比如司机管理的代码,这样写就可以了:

脚本部分

1
2
3
4
5

@Component({
selector: <span class="hljs-string">'driver-editor'</span>,
templateUrl: <span class="hljs-string">'./app/system/driver/editor.component.html'</span>
})

最终效果

该框架现在刚刚起步开发,很多功能还需要完善和开发。目前做的这些功能是一个攻坚过程,攻坚的结果是,所有的技术点都已经解决,完完全全可以用 Beer 做一个车联网的后台项目。

但是一个人的能力有限,为了让这个框架发展更好,我特别欢迎其他 dev 参与开发:
https://git.oschina.net/scaperow/Beer.git

AWS 被扣费了?

13 年体验了一把亚马逊云服务器,因为可以免费使用一年。

但是免费的午餐不好吃。 今天中午收到了一条短信,我的信用卡发生了 446.78$ 的预付款。当时我正在写代码,看到这条短信一下就炸了。

唯一冷静下来的理由就是,这只是预付款,还没有真正的支出。 现在补救还来得及。 心想,信用卡和储蓄卡不一样,储蓄卡必须要支付密码才可以支付,但是信用卡不一样,只需要你的安全码,商户就可以从你的信用卡取钱,就像自己卡一样。也许是我在哪注册信用卡时,输入了安全码。转念一想,老外最爱弄这事了。

我在境外注册的信用卡就只用亚马逊了,打开亚马逊控制台,打开账单,我惊呆了。 从 4 月份开始,每个月都有扣费。从最开始的 1.20$ 到最近的 446.87$,(请注意货币符号,是刀乐,是美元),并不是我抠鼻,我只是觉得这扣费莫名其妙的,亚马逊从来没有明显的提示,或者通知过我。

建行的后台也是太冷静,从来没有短信通知我。 谷歌了一下,aws 被扣费,出现的结果满满好几页,看来亚马逊这个坑还不浅。好了,按照别人的经历,现在来追回被莫名其妙的扣款。

1. 登陆亚马逊账户,点击 https://console.aws.amazon.com/support/home?region=ap-northeast-1#/case/create 来创建一个案例。

2. AWS 还没有中文客服,请全部用英文填写表单。表单中Description字段要填写清楚,说明你遇到的问题和你的诉求。

3. 处理方式有两种,打电话,文字沟通。如果对英文足够自信,选择打电话。我果断选择了文字沟通。

处理很快,我第二天就收到了结果。退回了我全部的扣款。 下面是我提交的案例,可以参考下。用的是翻译软件,得过且过。

选项

描述

大意如此: 我觉得我的账单有些问题,需要你们确认:

1. 我使用的是免费服务,我觉得不应该产生任何账单,可能是免费服务过期了发生了扣费,但是我觉得你们应该通知与我。不应该自动就付费。

2. 我最近 2~3 个月都没有使用服务,我觉得不应该产生扣费。

3. 现在我注销了我的账户,以后是否不会再发生扣费? 第二天客服回复的邮件如下。

虽然事情得到了完美解决。但在这件事情上还有我许多思考。

老外的服务商和国内的模式不一样,相当于程序架构的不一样,老外的模式相当于约定大于配置。当你输入了信用卡的安全码,意思你与服务商建立了信任关系,他们随时会从你的信用卡扣费。

可能是我当时并没有认真阅读协议,所以产生了我觉得莫名其妙的账单。 售后也是相当不错,客服会尽可能的帮助你,满足你的需求。

退款这种事情在我国基本是不可能发生,除非走法律或非正常手段。中国可是个人情大国。对比之下,显得特别讽刺。

使用免费空间 OpenShift 搭建 Ghost 博客

Ghost 是什么

ghost是一套开源的博客系统,运行在node.js环境之上。
支持用markdown来书写博客。相对于wordpress来说,功能配置不是很全面,但是对一个博客系统来说,它以经完全做到了。
ghost的宣言是

Just a Blogging Platform (只为博客而生)

当你真正使用过ghost之后,你会被他界面和操作所吸引,下来是我认为ghost做的比较优秀的地方。

1. 纯粹的书写方式。博客支持用markdown书写,并且只支持markdown。 2. 漂亮的界面。跟wordpress一样,ghost支持更换皮肤,但是默认的皮肤已经美哭。
3. 专注编辑。在编辑页面中,不用点击Save按钮,直接按Ctrl+S保存。 4. 自定义功能。使用Code Injection功能,可以为页面加入自定义脚本,比如站点统计代码,分享组件代码等。
5. 使用node.js作为运行时,使用.js + handlebars,性能不担心,维护没问题。
6. 开源。开源。开源。

说说缺点
1. 没有原生评论功能,没有统计功能,没有搜索功能。需要修改代码来加入第三方的。
2. 没有批量删除博客功能,不过到是有删除全部文章功能,不太实用。

开始搭建

因为 OpenShift 是可以免费创建3个 application 的,所以将博客安家在这里。

1.申请 OpenShift 账号

https://www.openshift.com/app/account/new

2.注册后,需要到注册邮箱确认下。

3.跳转到后台界面

https://openshift.redhat.com/app/console/applications

点击Create your first application now连接,会创建一个 application

4.可以看到 OpenShift 是支持很多语言环境的,并且也提供了一些内置应用,Jenkins ServerDrupalGhostWordpress。 在此选择 Ghost 内置应用。

5.选择了应用,下来做一些配置才能使用。

Publis URL 二级域名,必填项。强迫症患者不需要纠结,因为下来可以自定义域名。

Source Code Ghost 源代码地址,OpenShift 会从该地址自动拉取代码并部署到你的空间中。 其他的选择都不用更改,点击Create Application进入下一步。 7.等待服务器工作,该过程中。OpenShift 会自动为你创建node.js的环境,并且将Ghost代码部署在该环境中。甚至你都不用考虑如何配置数据库。 8.服务器工作完成后,会跳转到应用列表界面

https://openshift.redhat.com/app/console/applications

点击应用,会跳转到你的博客首页。 ## 如何进入后台 打开博客首页,在 url 后面追加/admin。因为第一次运行,需要配置管理员账号后才可以使用。比如,我的博客首页地址是blog.scaperow.com,那么后台地址就是blog.scaperow.com/admin。配置完成后就可以尽情的折腾了。