基金适合什么样的人?

  • 没有太多时间关注市场的人
  • 对某种理财产品不了解又比较感兴趣
  • 有闲钱 3-5 年用不到,不适合短线投资

买基金要考虑什么?

  • 能不能坚持长期持有基金?
  • 能不能承担风险?因为有可能亏损。
  • 买基金的钱会不会影响我的生活?
  • 基金的风格和种类,是投资的哪种类型的资产?

基金的类型

高中低风险综合配置,可以有侧重。

  • 货币基金: 以余额宝为举例,风险低,收益不高且稳定。基金规模占总体的一半以上。
  • 债券基金: 纯债基金全部用来买债券,分为短债基金(一年左右,收益和风险略高于余额宝);长债基金(3-5年长期债券,风险和收益比短债高一些)。还有一种拿一部分用来买股票,分为一级债基(主要是打新股)和二级债基(可以买股票)。
  • 可转债基金: …
  • 混合基金: 主动型基金的主要品种,配置灵活,可以买股票、债券、大宗商品、货币等。
  • 对冲基金和量化基金: 震荡市场下严格按照模型去调整。
  • 指数基金: 不太依赖基金经理,受整体市场平均值影响。跟踪某一类股票指数的涨跌走,主要是做好模型,追求平均收益。(国内指数基金种类比较少)(若于美国和香港市场)
  • 股票型基金: 基金经理按照股票市场的形式去调整。每个基金和基金经理的风格和他们团队的风格不同而不同。
  • 增强指数基金: …
  • 主动型基金: 依赖基金经理团队的能力。需要挑好基金经理,基金团队,可获得超平均收益。
  • 分级基金: 门槛比较高,风险比价高。
  • QD基金: 投资海外。

购买基金的渠道

  • 基金公司官网(专卖店)(产品比较单一)
  • 基金公司运营的公众号、APP
  • 证券公司炒股软件(适合场内基金)
  • 第三方基金平台(基金超市)(赎回时间比较短一些)
  • 银行

推荐使用第三方平台,基金类型丰富,介绍详细,方便对比。

蚂蚁聚宝、天天基金网、好买基金网(看数据)

回撤率?

主动型基金看什么?

成立时间比较久的(稳步上升)
基金以往业绩(长期业绩、平均收益)
基金经理的水平(以往业绩、回报率、擅长强项、基金投资风格)
回撤率
基金评级(基金购买页面标星)(指数基金没有评级)
夏普(冒一个单位风险获得的收益越大基金越好)

不要过于纠结以往业绩

基金转换功能

买入一个基金,可以直接在同基金公司转换为另一个基金公司,转换过程只收申购费的差价,不需要买入卖出的申购费。

想节省申购费只能用同一个基金公司的基金互转,基金官网支持的转换种类比较多,第三方平台支持的比较少。

利用基金公司官网货基零元购,再去转换到其它基金,有的在转换中不需要再交申购费。不支持 QD 基金。

QD 基金申购费比较贵,申购和赎回都比国内基金高。

基金公司主要靠管理费来赚钱。

公募基金关注基金规模(更稳健),私募基金主要关注收益(更激进)。

场内基金是可以通过炒股软件来买的。带 ETF、LOF 后缀的是场内基金,申购费比较低。场内基金比较灵活,可以当天买当天卖。手续费一般都在 0.02% ~ 0.03%,适合短线投资。

定投基本原则

逢低买入,逢高卖出,越跌越买,越涨越卖,定期不定额,止盈不止损。(反人性)

tantan1

一不留神工作就三年了,准确的说是八个月的实习加两年七个月的正式。是该找个时间跟自己谈谈,也是在反思,这三年的得与失。就通过并不咋样的表达能力,列出以下几点去总结和反思一下吧。

毕业找工作

在帝都的第一家公司是我在大四上学期通过一个学长推荐进去的。也是有一些幸运的成分,之前在大学所在城市一家公司和几个同学一起实习,没几个月就发现工作环境并不是我想要的,就想着要去帝都闯一闯,也是为了躲避前女友母亲逼迫她毕业就回家的要求。当时自学了两个月的 Python ,和同学业余时间搞了一个项目,面向学校学生,大概有一两万用户吧。正想着去北京找找工作看,发现学长的公司在校招,就找他内推了一把,笔试比较惨,但还是被录取了。

在帝都第一家公司

录取后很快我就从上一家公司离职奔来北京入职了,从实习到试用再到正式,一切都比较顺顺利利的,还两次评到了优秀员工。带我的那个师傅比较认真给我不少帮助,而我平时和学长混的也不错。强制的代码规范,不断评审的代码设计给我成长不小帮助,渐渐在组内任务越来越重,主要是公司内部的管理系统开发。说起学长,给我的感觉是做技术的有两种人,一种是为了技术做技术的人,另一种是为了生活做技术的人,学长走了我身边就只剩下另一种人了,而我渐渐的成了两者之间的一种人,最终还是会趋于其中一种。

为什么从上一家离职

离职的原因无非两种,待得不爽和给的钱少。之于我也是这两点吧,这两年从无知到渐渐确定了自己的方向,路不同便只好挥挥手告别。

今后有什么规划

目前在一家明星公司,在这个环境里还有很大的成长空间,方向也不错,踏实学习成长,后面的路还是比较长的。就现在的状况来说,更主要的是注重技术的成长,从做内部系统到结算系统到现在的支付系统,更专注与业务方向,对语言的选择并不那么重要了。

两个方面,一方面是后端技术栈的经验积累,另一方面是产品层面的业务划分与设计能力。

2018继续加油,做一个为技术做技术的人。

拿三台机器举例打洞配置讲解

机器 网络环境 用途 SSH服务
A机器 公网IP固定 中转机器 需要
B机器 NAT网络 被访问机器 需要
C机器 任意网络环境 需要访问B机器 不需要

自动连接重试

需要B机器向A机器建立 SSH 反向隧道,命令如下:

autossh -p 22 -M 6777 -NR '*:6766:127.0.0.1:22' usera@a.site

通过 autossh 可以实现连接失败自动重连,*:6766:127.0.0.1:22 是将A机器的6766端口转发到B机器的22端口,usera@a.site 是请求B机器的用户名和地址。

打洞

开启端口转发功能,编辑 sshd 的配置文件 /etc/ssh/sshd_config,增加配置:
GatewayPorts yes

另一台机器连接

通过C机器对A机器的6766端口发起连接就会自动被转发到B机器。

ssh -p 6766 userb@a.site

SSH 私钥认证

把请求机器的 ~/.ssh/id_rsa.pub 添加到被请求机器的 ~/.ssh/authorzied_keys 文件中

同时设置文件权限为 chmod 600 ~/.ssh/authorzied_keys

设置后在连接机器的时候就不需要密码了,可以走私钥认证。

守护进程

这里通过 supervisord 配置保证B机器重启后 autossh 能启动。

有固定公网IP的机器

这里我选用的是阿里云的机器,因为平时用的量不大,所以选择按量付费就可以了,看了下费用大概 80RMB/月。

参考:

http://blog.csdn.net/lidongshengajz/article/details/73482908
https://linux.cn/article-5975-1.html

后置更新…

四月

  1. 读书

    • 《见识-吴军》
    • 《领域驱动设计:软件核心复杂性应对之道》
    • Java相关
  2. 文章

    • Java相关的基础技术总结
    • Python各种技巧的技术使用(middleware、元类、with)
    • 《象与骑象人》读书笔记

以上

三月

三月并没有制定和学习计划,只是随心更新了几篇文章。

  • 基金选购学习笔记
  • 关于java的最初了解
  • git场景化操作

二月

  1. 写博客文章

    • 关于自律[abandon]
    • 关于技术成长[abandon]
    • 后端技术栈(范围待定)[abandon]
  2. 读书

    • 《象与骑象人》[done]
    • 《编写可读代码的艺术》[done]

以上

为啥文章都没写呢,因为勒安懒

不懒的时候补上吧😂

一月

  1. 写博客文章

    • mixin 模式[done]
    • 整理修饰器模式[done]
    • MRO 与多继承[abandon]
  2. 听书

    • 《皮囊》[done]
  3. 读技术书籍

    • 《亿级流量网站架构核心技术》[part]

以上

MySQL 大小写区分问题

sql_mode 配置

Modes affect the SQL syntax MySQL supports and the data validation checks it performs. This makes it easier to use MySQL in different environments and to use MySQL together with other database servers.

查看当前sql_mode

1
2
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

设置当前sql_mode

1
2
SET GLOBAL sql_mode = 'modes...';
SET SESSION sql_mode = 'modes...';

Full list of SQL Models

https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

/*!40001 SQL_NO_CACHE */

/*! */ 这是 mysql 里的语法,并非注释,! 后面是版本号,如果本数据库等于或大于此版本号,那么注释内的代码也会执行。

关于这个条件的问答: https://lists.mysql.com/mysql/203373

MySQL 锁表种类

常见的有行锁和表锁。表锁会锁住整张表,并发能力弱,开发中要避免使用表级锁。行锁只将单行数据锁住,锁数据期间对其它行数据不影响,并发能力高,一般使用行锁来处理并发事务。
MySQL是如何加不同类型的锁的?对于加锁数据的筛选条件,有其对应的索引建立,MySQL可以快速定位的数据进行行级加锁;而对于没有索引的情况,MySQL 的做法是会先锁住整张表,然后再去获取数据,然后将不满足条件的数据锁释放掉。

等待锁超时问题

Lock wait timeout exceeded; try restarting transaction
一种情况是因为有操作语句对整个表加锁了,这里发现的例子是在开启事务做 UPDATE 更新时发现的,UPDATE 条件如果不是主键或者没有索引则会锁整张表,只有以主键为条件或完全匹配的唯一索引做更新才是行级锁。
还有就是另一个事务中持有锁时间过长导致。

1
2
3
4
5
6
SELECT * FROM INNODB_TRX;  // 查看事务表锁状态

// 创建事务,更新语句,但是不提交
SET SESSION AUTOCOMMIT=off;
BEGIN;
UPDATE tabl1 SET status=1 WHERE expired_at <123456 AND expired_at >= 12346 AND `status` = 0;

这时候再去提交则会报等待锁超时问题。

http://www.toniz.net/?p=556

加行锁的注意事项:

http://blog.csdn.net/u014453898/article/details/56068841

插入语句死锁问题

在 INSERT 语句中出现 Deadlock found when trying to get lock; try restarting transaction 是因为范围匹配加锁是对索引页加锁了,导致其它事务插入数据时报死锁。处理办法是查询改成行锁,以 ID 或唯一索引加锁。

这里需要强调的是尽量避免使用范围加锁。最好是通过主键加行锁处理。

避免加锁失败和发生死锁的注意事项

  1. 减少锁占用时间,避免拿锁时做过多耗时操作。
  2. 加锁条件需对应加索引,尽量为行级锁。
  3. 避免死锁需要再开启事务后一次将所需资源加锁,处理后及时 COMMIT 释放锁。
  4. 对于请求的网络资源,首先将所需外部资源准备好。
  • 对于开启事物后加锁,只有 COMMIT 后方可释放锁
  • 在捕获异常中的处理,在捕获异常后要记得 ROLLBACK
  • 等待锁超时时间一般设置在 1-2 秒时间 SET innodb_lock_wait_timeout=1

MySQL 事务

http://blog.csdn.net/zhaoyangjian724/article/details/52858519

先非主键范围加锁
查看事务状态
插入区分度高的数据-成功
插入区分度低的数据-失败
查看引擎状态,发现页锁
改为以主键做查询条件加锁
插入区分度低的数据-成功

SELECT * FROM INNODB_TRX;

SHOW ENGINE INNODB STATUS;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

=====================================
2017-12-18 11:47:27 7fd5dd6f6700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 57 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 22630 srv_active, 0 srv_shutdown, 15047550 srv_idle
srv_master_thread log flush and writes: 15067795
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 21761
OS WAIT ARRAY INFO: signal count 42765
Mutex spin waits 38129, rounds 296291, OS waits 3638
RW-shared spins 25778, rounds 578697, OS waits 16634
RW-excl spins 4632, rounds 145148, OS waits 1184
Spin rounds per wait: 7.77 mutex, 22.45 RW-shared, 31.34 RW-excl
------------
TRANSACTIONS
------------
Trx id counter 167458
Purge done for trx's n:o < 167444 undo n:o < 0 state: running but idle
History list length 942
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started
MySQL thread id 2700260, OS thread handle 0x7fd5dd6f6700, query id 16186792 10.21.0.2 wallet init
SHOW ENGINE INNODB STATUS
---TRANSACTION 167433, not started
MySQL thread id 2700100, OS thread handle 0x7fd5dd7fa700, query id 16185344 10.100.27.2 wallet cleaning up
---TRANSACTION 167449, not started
MySQL thread id 2700073, OS thread handle 0x7fd5e6581700, query id 16186116 10.100.53.2 wallet cleaning up
---TRANSACTION 167434, not started
MySQL thread id 2700060, OS thread handle 0x7fd5e6685700, query id 16185479 10.100.53.2 wallet cleaning up
---TRANSACTION 0, not started
MySQL thread id 2699993, OS thread handle 0x7fd5dd5f2700, query id 16184159 10.100.27.2 wallet cleaning up
---TRANSACTION 0, not started
MySQL thread id 2699968, OS thread handle 0x7fd5dd633700, query id 16183926 10.100.53.2 wallet cleaning up
---TRANSACTION 0, not started
MySQL thread id 2699967, OS thread handle 0x7fd5dd7b9700, query id 16183863 10.100.53.2 wallet cleaning up
---TRANSACTION 0, not started
MySQL thread id 2699966, OS thread handle 0x7fd5e6540700, query id 16183754 10.100.53.2 wallet cleaning up
---TRANSACTION 0, not started
MySQL thread id 2699965, OS thread handle 0x7fd5e4049700, query id 16183668 10.100.53.2 wallet cleaning up
---TRANSACTION 0, not started
MySQL thread id 2699964, OS thread handle 0x7fd5e66c6700, query id 16183581 10.100.53.2 wallet cleaning up
---TRANSACTION 0, not started
MySQL thread id 2699963, OS thread handle 0x7fd5dd6b5700, query id 16183494 10.100.53.2 wallet cleaning up
---TRANSACTION 167457, ACTIVE 11 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s), undo log entries 1
MySQL thread id 2700275, OS thread handle 0x7fd5dd737700, query id 16186778 10.21.0.2 wallet update
INSERT INTO `ttt` (`id`, `no`, `trade_number`)
VALUES
(586, '856195904590458889', '200526175912156728')
------- TRX HAS BEEN WAITING 11 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 50 page no 5 n bits 96 index `idx_number` of table `test`.`ttt` trx id 167457 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 14 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 29; hex 5a484c4956454255593230313730353236323233323432363434353939; asc ZHLIVEBUY20170526223242644599;;
1: len 8; hex 0000000000000229; asc );;

------------------
---TRANSACTION 167447, ACTIVE 602 sec
4 lock struct(s), heap size 1184, 3 row lock(s)
MySQL thread id 2699383, OS thread handle 0x7fd5e4251700, query id 16186751 10.21.0.2 wallet cleaning up
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: 0 [0, 0, 0, 0] , aio writes: 0 [0, 0, 0, 0] ,
ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
6707 OS file reads, 383968 OS file writes, 119945 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.11 writes/s, 0.09 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 74, seg size 76, 733 merges
merged operations:
insert 34, delete mark 169019, delete 2
discarded operations:
insert 0, delete mark 0, delete 0
Hash table size 149489, node heap has 168 buffer(s)
0.00 hash searches/s, 0.05 non-hash searches/s
---
LOG
---
Log sequence number 394355624
Log flushed up to 394355624
Pages flushed up to 394355624
Last checkpoint at 394355624
0 pending log writes, 0 pending chkp writes
65750 log i/o's done, 0.04 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 77266944; in additional pool allocated 0
Dictionary memory allocated 669112
Buffer pool size 4607
Free buffers 1024
Database pages 3415
Old database pages 1240
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 11699, not young 475003
0.00 youngs/s, 0.00 non-youngs/s
Pages read 6606, created 13587, written 300725
0.00 reads/s, 0.00 creates/s, 0.05 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 3415, unzip_LRU len: 0
I/O sum[3]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Main thread process no. 12657, id 140556665968384, state: sleeping
Number of rows inserted 227014, updated 19739, deleted 89828, read 47831814
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

这篇文章主要介绍Mac下常用的效率工具,也许正是你所需要的或者使用后对你的工作有很大的效率提升,废话不多说,看下面介绍的五款常用效率工具。

Alfred

 
Alfred

Alfred 作为神器的霸主地位可谓实至名归,它不仅可以帮我们快速打开切换应用、打开网址,使用计算器、词典、剪贴板增强等功能,还可以通过Workflow模块实现功能的扩展,下面详细介绍一下此神器的一些功能。

首先我们定义调出 Alfred 的快捷键,这里我设置的是 Command + Space ,可以启动输入框。

Alfred

在输入框中我们可以输入想要打开或切换的应用:

Alfred

也可以输入基本的数学公式,计算结果:

Alfred

或者去 Google 搜索:

Alfred

打开 Terminal 执行命令:

Alfred

在 Web Search 中配置自定义打开的网址:

Alfred

调出剪贴板历史,我设置的快捷键是 Option + Command + C:

Alfred

默认回车会执行第一个结果,或打开网址,或将结果复制到剪贴板,这样可以极大地提高我们操作的效率。
 
当然这些默认的功能是不能够满足我们的,还可以通过 Worklow 去扩展效率工具,这里是自己做的一个效率工具箱 xyzUtils :

Alfred

Github 地址: https://github.com/noogel/Alfred-Workflow

这里我做了一些开发中常用的数据转换功能,时间戳与时间的互相转换、Unicode码中文转换、随机字符串生成、IP查询、base64编码解码、MD5生成等,回车复制结果到剪贴板,举例如下:

Alfred

网友们还提供了更多的 自定义功能,可自行知乎。

Jietu

Jietu

这个是腾讯提供的免费截图工具,可进行区域截图或者屏幕录制功能,可以快捷编辑截图,也是我常用的一个神器。配置信息如下图:

Jietu

截好图后可以按 空格键 进行快速编辑,很是方便,截图后会自动放到剪贴板,可直接粘贴到微信、QQ、Slack等应用的对话框中。

Jietu

 

Hammerspoon

Hammerspoon

这款神器和上面的 Alfred 功能点有些重合,可以提供快速启动应用、调整窗口大小等功能。通过自定义 Lua 脚本实现所需的功能,这些功能主要通过绑定快捷键实现功能出发,当然也会绑定一些系统事件触发脚本功能。

目前在网上搜集了一些基本功能,调整窗口比例,连接到办公区网络自动静音等功能。

Hammerspoon

 

Time Out

Time Out

这款工具主要是可以帮助久用电脑的人每隔一段时间暂停一下,我这里设置的每隔 50分钟暂停 3分钟,就是在这 3分钟时间这个软件会弹出屏保提醒你稍事休息一下再工作,当然暂停期间是可以随之取消的,暂停的时候就是这个样子的。

Time Out

Reeder

这是一款 Mac 上知名度很高的 RSS 阅读器,简洁的外观与便捷的操作方式可以省去了去个站点看文章。结合Mac 触控板的左右滑动操作还是很方便的。

Reeder

Reeder

最后,来还有一些常用效率工具会在在后面的文章继续介绍,或许正是你所需要的,敬请期待!

开发工程师常用工具箱

全局预览

1

支持的命令

2

  • ntime 时间戳转换,支持标准时间格式与时间戳自动检测转换,回车复制结果到剪贴板
  • nb64d Base64 解码
  • nb64e Base64 编码
  • nmd5 MD5 生成
  • ncny 数字转人民币大写
  • nu2c Unicode 码转中文
  • nc2u 中文转 Unicode 码
  • nip IP 地址查询
  • nrdm 随机字符串生成,输入长度
  • nhelp 列出所有支持的命令

欢迎大家补充。

个人博客

知一的指纹

Github

Noogel’s github Alfred-Workflow

Update at 2017-08-17

先上两张桌面和开发环境见下图
桌面
开发环境

系统优化

更新源

更新前先设置源为aliyun的,国内访问速度快。

更新源

1
2
sudo apt-get update
sudo apt-get upgrade

删除Amazon的链接

1
sudo apt-get remove unity-webapps-common

主题美化

先装 Unity 图形管理工具

1
sudo apt-get install unity-tweak-tool

然后安装 Flatabulous 主题

1
2
3
sudo add-apt-repository ppa:noobslab/themes
sudo apt-get update
sudo apt-get install flatabulous-theme

和配套图标

1
2
3
sudo add-apt-repository ppa:noobslab/icons
sudo apt-get update
sudo apt-get install ultra-flat-icons

更换操作如下图:


至此主题美化完成

System Load Indicator(系统状态指示器)

1
2
3
sudo add-apt-repository ppa:indicator-multiload/stable-daily
sudo apt-get update
sudo apt-get install indicator-multiload

微软雅黑

字体下载

1
2
3
tar zxvf YaHeiConsolas.tar.gz
sudo mv YaHeiConsolas.ttf /usr/share/fonts
sudo chmod 755 /usr/share/fonts/YaHeiConsolas.ttf

安装zsh

1
2
3
sudo apt-get install zsh
zsh --version
sudo chsh -s $(which zsh)

然后再重新注销登录就好了

必装软件

下面介绍的软件有一部分是通过 deb 文件安装的,具体安装方式见 系统使用技巧。

系统软件

  • 浏览器: Chrome
  • 搜狗输入法: sougoupinyin
  • 为知笔记: wiznote
  • 系统状态指示器: System Load Indicator
  • SS你懂得: Shadowsocks-Qt5
  • Unity图形管理工具: unity tweak tool
  • 图片编辑工具: gimp
  • 思维导图: xmind
  • EPUB文件编辑: sigil
  • Linux下的Dash: zeal
  • Linux下Albert: albert
  • 网易云音乐播放器
  • Robomongo

数据库及工具

  • mysql
  • mongodb
  • redis
  • MySQL Workbench

开发环境

  • Python IDE: Pycharm

命令行工具

  • zsh
  • oh-my-zsh
  • vim
  • git

系统使用技巧

DEB软件安装

  • 安装命令

sudo dpkg -i xxx.deb

  • 安装过程中可能会报缺少依赖的错,执行下面命令自动安装依赖

sudo apt-get install -f

  • 再次执行安装命令

sudo dpkg -i xxx.deb

卸载不再依赖的包 命令

sudo apt-get autoremove

未完待续,欢迎大家发送你的优化点到我的邮箱 noogel@163.com

交易过程:

  1. 客户下单
  2. 客户完成支付
  3. 商家接单
  4. 商家发货

从软件开发角度, 还有一些非功能性需求需要实现:

  1. 性能: 特别是秒杀的时候,如何满足高频率的支付需求?
  2. 可靠性:不用说,系统能达到几个9,是衡量软件设计功力的重要指标。 99%是基础, 99.999%是目标,更多的9哪就是神了。
  3. 易用性:支付中多一个步骤,就会流失至少2%的用户。 产品经理都在削尖脑袋想想怎么让用户赶紧掏钱。
  4. 可扩展性: 近年来支付业务创新产品多,一元购、红包、打赏等,还有各种的支付场景。 怎么能够快速满足产品经理的需求,尽快上线来抢占市场,可扩展性对支付系统设计也是一个挑战。
  5. 可伸缩性:为了支持公司业务,搞一些促销活动是必须的。 那促销带来的爆发流量,最佳应对方法就是加机器了。 平时流量低,用不了那么多机器,该释放的就释放掉了, 给公司省点钱。

典型支付系统架构:

某旅游公司:

京东金融:

支付系统一般会提供如下子系统:

  1. 支付应用和产品.(应用层): 这是针对各端(PC Web端、android、IOS)的应用和产品。 为各个业务系统提供收银台支持,同时支付作为一个独立的模块,可以提供诸如银行卡管理、理财、零钱、虚拟币管理、交易记录查阅、卡券等功能;
  2. 支付运营系统(应用层): 支付系统从安全的角度来说,有一个重要的要求是,懂代码的不碰线上,管运营的不碰代码。这对运营系统的要求就很高,要求基本上所有线上的问题,都可以通过运营系统来解决。
  3. 支付BI系统(应用层): 支付中产生大量的数据,对这些数据进行分析, 有助于公司老板们了解运营状况,进行决策支持。
  4. 风控系统(应用层):这是合规要求的风险控制、反洗钱合规等。
  5. 信用信息管理系统(应用层):用来支持对信用算法做配置,对用户的信用信息做管理。
    支付系统一般会提供如下子系统:
  6. 支付应用和产品.(应用层): 这是针对各端(PC Web端、android、IOS)的应用和产品。 为各个业务系统提供收银台支持,同时支付作为一个独立的模块,可以提供诸如银行卡管理、理财、零钱、虚拟币管理、交易记录查阅、卡券等功能;
  7. 支付运营系统(应用层): 支付系统从安全的角度来说,有一个重要的要求是,懂代码的不碰线上,管运营的不碰代码。这对运营系统的要求就很高,要求基本上所有线上的问题,都可以通过运营系统来解决。
  8. 支付BI系统(应用层): 支付中产生大量的数据,对这些数据进行分析, 有助于公司老板们了解运营状况,进行决策支持。
  9. 风控系统(应用层):这是合规要求的风险控制、反洗钱合规等。
  10. 信用信息管理系统(应用层):用来支持对信用算法做配置,对用户的信用信息做管理。

http://www.bijishequ.com/detail/95641

坑1:浮点数不精确性

1
2
In [1]: 0.1+0.1+0.1-0.3
Out[1]: 5.551115123125783e-17

解决办法:

1
2
3
In [2]: from decimal import Decimal
In [3]: Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
Out[3]: Decimal('0.0')

坑2:Decimal使用问题

1
2
In [5]: Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3)
Out[5]: Decimal('2.775557561565156540423631668E-17')

解决办法:
参照坑1的解决办法,Decimal传入值需要str类型
更多用法查看:https://docs.python.org/2/library/decimal.html

坑3:四舍五入不准确问题

1
2
3
4
5
6
In [3]: '{:.2f}'.format(Decimal(str(1001.8250)))
Out[3]: '1001.82'
In [2]: Decimal('1001.8250').quantize(Decimal('0.01'))
Out[2]: Decimal('1001.82')
In [4]: round(2.55, 1)
Out[4]: 2.5

解决办法:
发现问题原因为在不能正确四舍五入的float数值中都是因为数据存储末位的.5被存储为.4999999…的形式,解决办法是在.5上加.1的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def exact_round(num, exp=2):
"""
准确的四舍五入方法
:param num: 数值
:param exp: 保留精度
:return:
"""
str_num = str(num)
dec_num = Decimal(str_num)
exp_unit = Decimal('0.1') ** exp
mini_unit = Decimal('0.1') ** (exp + 1)
if dec_num % exp_unit == (5 * mini_unit):
dec_num += mini_unit
return Decimal(dec_num).quantize(exp_unit, rounding=ROUND_HALF_EVEN)

为了验证这个方法写了个测试脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
摘 要: exact_round.py
创 建 者: abc
创建日期: 2017-01-05
"""
__author__ = "abc"

from decimal import Decimal, ROUND_HALF_EVEN


def exact_round(num, exp=2):
"""
准确的四舍五入方法
:param num: 数值
:param exp: 保留精度
:return:
"""
str_num = str(num)
dec_num = Decimal(str_num)
exp_unit = Decimal('0.1') ** exp
mini_unit = Decimal('0.1') ** (exp + 1)
raw_num = dec_num
if dec_num % exp_unit == (5 * mini_unit):
dec_num += mini_unit
raw_result = Decimal(raw_num).quantize(exp_unit, rounding=ROUND_HALF_EVEN)
result = Decimal(dec_num).quantize(exp_unit, rounding=ROUND_HALF_EVEN)
if result != raw_result:
print "raw:round({}, {}) = > {}; fixed: round({}, {}) => {}".format(
raw_num, exp, raw_result,
dec_num, exp, result
)
return result

if __name__ == "__main__":
val = 900.0000
while val < 1001.8600:
for exp in range(0, 6):
exact_round(val, exp=exp)
val += 0.0005

脚本中我们将被修正过的数据打印出来,发现被打印出来的都是四舍五入不正确的数值,经过方法处理可以保证准确的输出。

因为我们的测试只是覆盖了部分的数值,精度深度也只到到了6位,也不能保证说方法没有问题。
后来询问了在银行做开发的朋友,他们对于数据的计算都是在数据库的存储过程中运算的,并对上面坑中的数值放到数据库中做四舍五入发现确实没有问题。

于是我将这个方法做的运算与数据库的运算结果做对比写了测试脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
摘 要: test_db_round.py
创 建 者: abc
创建日期: 2017-01-06
"""
__author__ = "abc"
import os
import sys

sys.path.append(os.path.dirname(os.path.split(os.path.realpath(__file__))[0]))

from lib.utils import exact_round
from model import Model

def test_db_round(val, exp):
"""
test_db_round
:return:
"""
sql = "SELECT round({}, {}) as val".format(str(val), exp)
db_round = Model().raw(sql)[0]["val"]
exa_round = exact_round(val, exp)
if str(db_round) != str(exa_round):
print "db:{}; ex:{}".format(str(db_round), str(exa_round))

if __name__ == "__main__":
val = 900.0000
while val < 1001.8600:
for exp in range(0, 6):
test_db_round(val, exp=exp)
val += 0.0005

经过测试后发现没有数据被打印出,证明在测试范围内Python方法和数据库的运算结果没有差异。

关于浮点数不精确性的事情相信学过计算机组成原理这门课程的都明白,这里不再赘述,放个链接:
从如何判断浮点数是否等于0说起——浮点数的机器级表示

话说为什么要在Python中做财务相关运算呢,可能最初开发这个系统的人缺乏这方面的经验,然后通过扩展精度保留位数来解决这个问题的,但终究在做四舍五入时可能产生1分的差异。
既然发现这个问题,本着眼里不揉沙子的态度,快速的解决方案是在Python中替换原来的四舍五入函数,长期策略是逐步将计算过程挪到数据库通过存储过程来实现。