App

Bangon-瓦工助手App上架

我的第一个收费App瓦工助手(Bangon)终于上架了,是一个Bandwagon主机管理App,App很简洁,但功能还算强大,涵盖了对Bandwagon主机的常用基本管理,主机管理从此在手机上轻松搞定: ✅ 主机套餐余量查询 ✅ 主机详细信息查询及修改 ✅ 启动/关闭/重启主机 ✅ 创建快照备份,并随时恢复 ✅ 重装操作系统 ✅ 机房迁移 ✅ Shell集成 App Store链接:https://itunes.apple.com/app/id1267833691 放几个兑换码,手慢无: 3MEAMRPPTHP7 FFHJF9TF64JF XEKNF7FNLY6M WHR766KT6E44 PYPPRLXAXETH 7HREML6THEH3 REW74A4HEAKW 97LNXHT7MEY9 6J9WE6W7M3Y7 YTM3PT4YHL34 屏幕截图:

By RSSBot, ago
iOS

iOS开发的那些坑(三)

为一个View添加UIGestureRecognizer事件,会block所有SubViews的Touch事件,也就是说Touch事件先到UIGestureRecognizer,默认不会往子View继续传递。 画个图说明一下在我现在项目中的一个使用场景: 用一个UIWindow做了一个弹出效果,里面添加了一些子View完成一些操作,这里为了简单,用一个UIButton表示。要达到的效果是点击Button可以触发特定动作,点击Button以外区域则隐藏整个弹出层。 代码如下: - (UIWindow *)dimmingWindow { if (!_dimmingWindow) { _dimmingWindow = [[UIWindow alloc] initWithFrame: [UIApplication sharedApplication].keyWindow.frame]; _dimmingWindow.backgroundColor = [UIColor colorWithWhite:0 alpha:0.2]; UIGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dimmingWindowTapped:)]; gesture.delegate = self; [_dimmingWindow addGestureRecognizer:gesture]; } return _dimmingWindow; } - Read more…

By RSSBot, ago
Linux

MongoDB基本安全设置

前段时间在VPS上跑了个程序抓取PornHub的资源然后保存到MongoDB里,跑了几天,抓下来近十万条数据,然后用Node.js写了个简单的REST API,可以获取这些资源。 直到有一天当我在call REST API的时候发现没有数据返回了,登录到后台一看,数据全被清掉了,还留下一条让支付比特币去赎回数据的记录。。。 因为是第一次使用MongoDB,所以基本的安全措施都没做,等于是裸奔在互联网上的一个数据库,谁都可以访问,这不被黑客访问到就怪了。趁着今天有空,稍微研究了一下MongoDB的安全设置。 0. 只允许本机访问MongoDB 如果MongoDB只在本机访问,强烈建议打开这个配置,这样可以杜绝其它IP对数据库的访问。修改MongoDB配置文件,如果是Debian/Ubuntu,配置文件在/etc/mongod.conf,然后查找net关键字: # network interfaces net: port: 27017 bindIp: 127.0.0.1 默认bindIp一行是注释的,把注释打开就只能本机访问了。 1. 为数据库设置需要用户名和密码访问 在很多情况下,我们是需要其它主机访问本机数据库的,这时候上面的做法就行不通了,而设置需要通过用户名和密码才能访问数据库是另外一道屏障。 a. 创建用户: use cool_db db.createUser({ user: 'userName', pwd: 'secretPassword', roles: [{ role: 'readWrite', db:'cool_db'}] }) b. 打开访问认证及允许所有IP访问 同样是修改mongod.conf,首先要允许所有IP访问: # Read more…

By RSSBot, ago
JavaScript

Koa 框架教程

Node 主要用在开发 Web 应用。这决定了使用 Node,往往离不开 Web 应用框架。 Koa 就是一种简单好用的 Web 框架。它的特点是优雅、简洁、表达力强、自由度高。本身代码只有1000多行,所有功能都通过插件实现,很符合 Unix 哲学。 本文从零开始,循序渐进,教会你如何使用 Koa 写出自己的 Web 应用。每一步都有简洁易懂的示例,希望让大家一看就懂。 零、准备 首先,检查 Node 版本。 $ node -v v8.0.0 Koa 必须使用 7.6 以上的版本。如果你的版本低于这个要求,就要先升级 Node。 然后,克隆本文的配套示例库。(如果不方便使用 Git,也可以下载 zip 文件解压。) $ git clone https://github.com/ruanyf/koa-demos.git 接着,进入示例库,安装依赖。 Read more…

By RSSBot, ago
Algorithm

正态分布为什么常见?

统计学里面,正态分布(normal distribution)最常见。男女身高、寿命、血压、考试成绩、测量误差等等,都属于正态分布。 以前,我认为中间状态是事物的常态,过高和过低都属于少数,这导致了正态分布的普遍性。最近,读到了 John D. Cook 的文章,才知道我的这种想法是错的。 正态分布为什么常见?真正原因是中心极限定理(central limit theorem)。 “多个独立统计量的和的平均值,符合正态分布。” 上图中,随着统计量个数的增加,它们和的平均值越来越符合正态分布。 根据中心极限定理,如果一个事物受到多种因素的影响,不管每个因素本身是什么分布,它们加总后,结果的平均值就是正态分布。 举例来说,人的身高既有先天因素(基因),也有后天因素(营养)。每一种因素对身高的影响都是一个统计量,不管这些统计量本身是什么分布,它们和的平均值符合正态分布。(注意:男性身高和女性身高都是正态分布,但男女混合人群的身高不是正态分布。) 许多事物都受到多种因素的影响,这导致了正态分布的常见。 读到这里,读者可能马上就会提出一个问题:正态分布是对称的(高个子与矮个子的比例相同),但是很多真实世界的分布是不对称的。 比如,财富的分布就是不对称的,富人的有钱程度(可能比平均值高出上万倍),远远超出穷人的贫穷程度(平均值的十分之一就是赤贫了),即财富分布曲线有右侧的长尾。相比来说,身高的差异就小得多,最高和最矮的人与平均身高的差距,都在30%多。 这是为什么呢,财富明明也受到多种因素的影响,怎么就不是正态分布呢? 原来,正态分布只适合各种因素累加的情况,如果这些因素不是彼此独立的,会互相加强影响,那么就不是正态分布了。一个人是否能够挣大钱,由多种因素决定: 家庭 教育 运气 工作 … 这些因素都不是独立的,会彼此加强。如果出生在上层家庭,那么你就有更大的机会接受良好的教育、找到高薪的工作、遇见好机会,反之亦然。也就是说,这不是 1 + 1 = 2 的效果,而是 1 + 1 > 2。 统计学家发现,如果各种因素对结果的影响不是相加,而是相乘,那么最终结果不是正态分布,而是对数正态分布(log normal distribution),即x的对数值log(x)满足正态分布。 这就是说,财富的对数值满足正态分布。如果平均财富是10,000元,那么1000元~10,000元之间的穷人(比平均值低一个数量级,宽度为9000)与10,000元~100,000元之间的富人(比平均值高一个数量级,宽度为90,000)人数一样多。因此,财富曲线左侧的范围比较窄,右侧出现长尾。 Read more…

By RSSBot, ago
API

API设计原则

(感谢好友 @李鼎 翻译此文) 原文链接:API Design Principles – Qt Wiki 基于Gary的影响力上 Gary Gao 的译文稿:C++的API设计指导 译序 Qt的设计水准在业界很有口碑,一致、易于掌握和强大的API是Qt最著名的优点之一。此文既是Qt官网上的API设计指导准则,也是Qt在API设计上的实践总结。虽然Qt用的是C++,但其中设计原则和思考是具有普适性的(如果你对C++还不精通,可以忽略与C++强相关或是过于细节的部分,仍然可以学习或梳理关于API设计最有价值的内容)。整个篇幅中有很多示例,是关于API设计一篇难得的好文章。 需要注意的是,这篇Wiki有一些内容并不完整,所以,可能会有一些阅读上的问题,我们对此做了一些相关的注释。 PS:翻译中肯定会有不足和不对之处,欢迎评论&交流;另译文源码在GitHub的这个仓库中,可以提交Issue/Fork后提交代码来建议/指正。 API设计原则 一致、易于掌握和强大的API是Qt最著名的优点之一。此文总结了我们在设计Qt风格API的过程中所积累的诀窍(know-how)。其中许多是通用准则;而其他的则更偏向于约定,遵循这些约定主要是为了与已有的API保持一致。 虽然这些准则主要用于对外的API(public API),但在设计对内的API(private API)时也推荐遵循相同的技巧(techniques),作为开发者之间协作的礼仪(courtesy)。 如有兴趣也可以读一下 Jasmin Blanchette 的Little Manual of API Design (PDF) 或是本文的前身 Matthias Ettrich 的Designing Qt-Style C++ APIs。 1. 好API的6个特质 API之于程序员就如同图形界面之于普通用户(end-user)。API中的『P』实际上指的是『程序员』(Programmer),而不是『程序』(Program),强调的是API是给程序员使用的这一事实。 在第13期Qt季刊,Matthias 的关于API设计的文章中提出了观点:API应该极简(minimal)且完备(complete)、语义清晰简单(have clear and simple semantics)、符合直觉(be intuitive)、易于记忆(be easy to Read more…

By RSSBot, ago
Linux

Linux PID 1 和 Systemd

要说清 Systemd,得先从Linux操作系统的启动说起。Linux 操作系统的启动首先从 BIOS 开始,然后由 Boot Loader 载入内核,并初始化内核。内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程,也叫根进程。它负责产生其他所有用户进程。所有的进程都会被挂在这个进程下,如果这个进程退出了,那么所有的进程都被 kill 。如果一个子进程的父进程退了,那么这个子进程会被挂到 PID 1 下面。(注:PID 0 是内核的一部分,主要用于内进换页,参看:Process identifier) SysV Init PID 1 这个进程非常特殊,其主要就任务是把整个操作系统带入可操作的状态。比如:启动 UI – Shell 以便进行人机交互,或者进入 X 图形窗口。传统上,PID 1 和传统的 Unix System V 相兼容的,所以也叫 sysvinit,这是使用得最悠久的 init 实现。Unix Read more…

By RSSBot, ago
KPI

我看绩效考核

(本来,这篇文章应该在5月份完成,我拖延症让我今天才完成) 前些天,有几个网友找我谈绩效考核的事,都是在绩效上被差评的朋友。在大致了解情况后,我发现他们感到沮丧和郁闷的原因,不全是自己没有做好事情,他们对于自己没有做好公司交给的事,一方面,持一些疑义,因为我很明显地感到他们和公司对一件是否做好的标准定义有误差,另一方面,他们对于自己的工作上的问题也承认。不过,让他们更多感到沮丧的原因则是,公司、经理或HR和他们的谈话,让他们感觉整个人都被完全否定了,甚至有一种被批斗的感觉。这个感觉实在是太糟糕了。 因为我也有相似的经历,所以,我想在这里写下一篇文章,谈谈自己的对一些绩效考核的感受。先放出我的两个观点: 1)制定目标和绩效,目的不是用来考核人的,而用来改善提高组织和人员业绩和效率的。 2)人是复杂的,人是有状态波动的,任何时候都不应该轻易否定人,绩效考核应该考核的是事情,而不是人。 我个人比较坚持的认为——绩效分应该打给项目,打给产品,打给部门,打给代码,而不是打给人。然而现在的管理体制基本上都是打给人,而很多根本不擅长管理的经理和HR以及很多不会独立思考的吃瓜群众基本上都会把矛头指向个人,所以,当然会有开批斗会的感觉。   举几个例子 为了讲清楚我的上述观点,请让我先铺垫一下,先说几个例子吧,韩寒的例子我就不说了。 苏步青同学在小学时成绩很糟糕,全班倒数第一。 华罗庚同学上学时数学还考不及格,要不是王维克老师的鼓励并让他爱上了数学,他可能也就完全埋没了。 郑渊洁上学时,老师要求写《早起的鸟有虫子吃》,郑渊洁唱反调写《早起的虫子被鸟吃》,再加上数学老师发难,于是被开除了。从此郑渊洁没有上过一天学。 列夫尔斯泰大贵族出身,2岁丧母,9岁丧父,16岁上大学,大学三年级自动退学回家进行改革。在青年时期不好好读书,考试不及格,留级。他赌博、借债、鬼混…… 这个的例子太多了,我从另一个方面举几个体育运动相关的例子,可能年轻的朋友都不知道,可以问问你们的父母。 80年代,中国有一批非常优秀的体育运动员,比如:体操王子李宁,打破过世界跳高记录的朱建华,还有乒乓球世界冠军马文革,还有羽毛球世界冠军赵建华,记得有一年参加世界比赛,他们全输了,而输的还很惨。于是国内的一些媒体和民众开始骂他们,甚至说他们是民族的败类、耻辱,还有很多人找上门要教训他们…… 如果我们把绩效分比做在学校里的考试分,那么你是否会和我一样认为,考试的成绩只能代表这个人对这些知识点的掌握或理解,而且仅仅在这个时间点,根本不代表这个人根本就不行,更不代表他一直不行。因为挂科太多被学校开除的同学,并不见得这些人在社会上就无活生活下去,反而,他们中的有些人可能会考试成绩好的人还活得好。不是么?这样的例子在我们身边还少吗? 所以,当我看到某HR说某老员工——“他今天要不自己离开,未来一年也一定会因为绩效问题而被公司开了的”,除了感到居然有人类可以预知他人未来的可笑之外,我感到是一种悲哀,一种管理体制上的悲哀,我感到了在这HR考评背后一股非常强的暗流和不可见的力量让她干出了这样一件匪夷所思的事。 好些公司还考评价值观,价值观无可厚非,我觉得一个企业的价值观是非常必要的,但是考核价值观是件非常危险的事情。这个世界上和传统势力唱反调的人实在是太多了,而被定性为价值观有问题被迫害的人也是多了去了。被批斗被侮辱被毒打的老舍;因为同性恋问题,被迫害而自杀的图灵;因为不同意教会观点被监禁8年都不愿意放弃自己的信仰最终被烧死的布鲁诺,…… 这样的事情已经够多了,新的时代里不应该再发生这样的事了,无论大小。 考核价值观最大的问题就是非常容易的上纲上线,也非常容易的被制造政治斗争,也非常容易的扼杀各种不同思想,老实说,这从很大程度上是一种洗脑的手段——通过对人制造一种紧张或恐惧而达到控制思想的目的。   对公司和管理者想说的话 下面我来谈谈绩效考核我的一些观点。在谈这个观点前,你可以移步看一下这篇新闻报道——《绩效主义毁了索尼》。而近年来,“放弃绩效考核”的斗争已经从科技企业中的Adobe、戴尔、微软、亚马逊,席卷到德勤、埃森哲、普华永道等咨询服务类企业。甚至通用电气(GE)——曾经的绩效管理的鼻祖,也宣布抛弃正式的年度绩效考核。在刚过去的2016年,腾讯的张小龙对微信事业群发出“警惕KPI”的呼声;李彦宏在内部信中将百度的掉队归咎于“从管理层到员工对短期KPI的追逐”;雷军干脆宣布小米“继续坚持‘去KPI’的战略,放下包袱,解掉绳索,开开心心地做事。”;王石也在个人微博中感慨:“绩效主义像企业的脓包”。 绩效考核在本质上就是像学校教育以分数论英雄,而忽略员工的成长和素质教育是一个道理。当学生和老师只关注考试分数时,而只有考试分数来评价老师和学生的优良中差时,老师和学生就会开始使用一些非常形式的方式来达到这个目标,比如:死记硬被,记套路,题海战术…… 而学习的能力的考评彻底地沦为了一种形式主义。反而,分数考的越高,脑子越死。(注:美国现行教育是不允许通过学生考试成绩来评价老师的能力的) 近几年来,一些大公司开始使用 OKR – Objectives, Key Result ,但是在实践过程中,我发现好些公司用OKR,本质上还是KPI – Key Performance Indicator, 因为OKR里面有一个Key Result,用来衡量 Objectives 的结果指标。于是,使用者习惯性的设置上了KPI。我个人认为 Read more…

By RSSBot, ago
functional

Go语言的修饰器编程

之前写过一篇《Python修饰器的函数式编程》,这种模式很容易的可以把一些函数装配到另外一些函数上,可以让你的代码更为的简单,也可以让一些“小功能型”的代码复用性更高,让代码中的函数可以像乐高玩具那样自由地拼装。所以,一直以来,我对修饰器decoration这种编程模式情有独钟,这里写一篇Go语言相关的文章。 看过Python修饰器那篇文章的同学,一定知道这是一种函数式编程的玩法——用一个高阶函数来包装一下。多唠叨一句,关于函数式编程,可以参看我之前写过一篇文章《函数式编程》,这篇文章主要是,想通过从过程式编程的思维方式过渡到函数式编程的思维方式,从而带动更多的人玩函数式编程,所以,如果你想了解一下函数式编程,那么可以移步先阅读一下。所以,Go语言的修饰器编程模式,其实也就是函数式编程的模式。 不过,要提醒注意的是,Go 语言的“糖”不多,而且又是强类型的静态无虚拟机的语言,所以,无法做到像 Java 和 Python 那样的优雅的修饰器的代码。当然,也许是我才才疏学浅,如果你知道有更多的写法,请你一定告诉我。先谢过了。 简单示例 我们先来看一个示例: package main import "fmt" func decorator(f func(s string)) func(s string) { return func(s string) { fmt.Println("Started") f(s) fmt.Println("Done") } } func Hello(s string) { fmt.Println(s) } func main() { decorator(Hello)("Hello, Read more…

By RSSBot, ago