todo

技术学习

  • 可以任意维度筛选,排序,分组,分栏的 TODO LIST。

理财

  • 使用前一天的开盘收盘最高最低成交价换手率波动率等作为特征,取 1-3 年的数据作为样本,以第二天的涨跌为分类标签,使用贝叶斯算法训练模型并预测第二天涨跌。
  • 把同一基金经理管理年限超过 5 年的基金,计算最近 1 年,3 年, 5 年的波动率,夏普率,年化收益,α 收益,β 收益,最大回撤,以及两两之间的相关性做成一个表格。

定期检查

  • 域名过期检查
  • 云主机过期检查
  • HTTPS 证书过期检查
  • 云主机定时备份
  • 手机定时备份
  • 电脑定时备份

202206

解读历史波动率,发现交易机会
https://new.qq.com/rain/a/20210830A08VW100

波动率具有聚集性、均值回归、长记忆性和非对称性等特征。

  • 聚集性是指波动率具有高低波动率各自聚集的特征,即高波动率之后大概率还是高波动率,低波动率之后大概率还是低波动率,而且高波动率和低波动率聚集的时期会交替出现,呈现出的就是周期性。
  • 均值回归是指波动率没有长期上涨或者下跌的趋势,而是围绕均值上下波动。
  • 长记忆性指波动率存在较高的自相关特性,现在的波动率在很大程度上取决于其过去的波动率。
  • 波动率的非对称性主要体现在隐含波动率上,即标的价格上涨或下跌相同幅度对期权隐含波动率的影响并不相同。

说到企业估值,你怎能不知道现金流折现法?
https://baijiahao.baidu.com/s?id=1722719168861071511

一个公司的内在价值,取决于该公司未来能产生的自由现金流。

自由现金流折现法(Discounted Cash Flow ),简称 DCF。

无杠杆自由现金流/企业自由现金流

  • = EBIT-调整的所得税+折旧摊销—营运资金的增加—资本支出。
  • = 净利润+利息费用+所得税-调整的所得税+折旧摊销—营运资金的增加—资本支出。

为了防止 ssh 或 scp 时,提示是否需要确认 hosts,可以提前执行如下语句

ssh-keyscan abc.com >> ~/.ssh/known_hosts

ssh 或 scp 自动输入密码可以使用 sshpass

apt-get update
apt-get  install -y --force-yes sshpass
sshpass -p "xxxx" scp local remote 

Postgree 查看数据库,表,索引大小

查看各个库的大小

select pg_database.datname, pg_size_pretty (pg_database_size(pg_database.datname)) AS size from pg_database;

查看 public 库下所有表索引大小

select indexrelname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_indexes where schemaname='public' order by pg_relation_size(relid) desc;

查看 public 库下所有表大小

select relname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_tables where schemaname='public' order by pg_relation_size(relid) desc;

查看单个表大小

select pg_size_pretty(pg_relation_size('表名'));

查询所有表的大小并排序(包含索引)

SELECT table_schema || '.' || table_name AS table_full_name, pg_size_pretty(pg_total_relation_size('"'
    || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC limit 20;

查询表大小按大小排序并分离data与index

SELECT
table_name,
pg_size_pretty(table_size) AS table_size,
pg_size_pretty(indexes_size) AS indexes_size,
pg_size_pretty(total_size) AS total_size
FROM (
SELECT
table_name,
pg_table_size(table_name) AS table_size,
pg_indexes_size(table_name) AS indexes_size,
pg_total_relation_size(table_name) AS total_size
FROM (
SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name
FROM information_schema.tables
) AS all_tables
ORDER BY total_size DESC
) AS pretty_sizes;

分区,挂磁盘

# 创建挂载目录
mkdir /data_ext2/

# 查看块设备,找到新硬盘
lsblk
file -s /dev/nvme2n1
    /dev/nvme2n1: data

# 分区并查看
mkfs -t xfs /dev/nvme2n1
file -s /dev/nvme2n1
    /dev/nvme2n1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
lsblk -f | grep nvme2n1
    nvme2n1     xfs                      de17daa1-9f10-4b60-adc9-2a7ed1557c89

# 挂载并查看
mount /dev/nvme2n1 /data_ext2
df -h /data_ext2

# 查看设备 id,并设置开机启动挂载
blkid
vi /etc/fstab
    UUID=7a0a651a-0000-0000-0000-717708af1dec /data_ext2  xfs  defaults 0 0

How to fix “MySQL server has gone away”, “Packets out of order” and similar MySQL connection errors
https://www.ryadel.com/en/fix-mysql-server-gone-away-packets-order-similar-mysql-related-errors/

for these errors:

MySQL server has gone away
Error reading result set's header
Error executing query
MySQL server has gone away for query
2006, MySQL server has gone away
Packets out of order. Expected X received Y. Packet size=Z
  • There’s a good chance that the server is dropping an incorrect or too large packet sent by the client. To fix that, check the max_allowed_packet variable value and set it to a very high value
  • The issue might be due to the fact that the server timed out and closed the connection. Check the wait_timeout MySQL variable value and ensure it’s large enough.
  • Additionally, if you’re getting the Packets out of order error in the PHP log, there’s an high chance that the issue is due to the fact that there’s an incompatibility between the PHP and MySQL versions you’re using.

我的一个不常访问的页面使用的如下的代码

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));

但偶尔报下面的错误,不是经常

warning: Packets out of order. Expected 1 received 0. Packet size=145

我怀疑是我使用了 MySQL 持久连接,但这个页面不经常使用,造成这个连接长时间保持但没有任何真实请求,然后被 MySQL 单方面杀掉了,但我过了很久之后再刷新页面,PHP 尝试复用这个连接时,被 MySQL 拒绝了。

如果是一个比较活跃的站点,持久连接带来的好处可能比较明显,因为节省了很多连接建立的花时间。但一个请求量比较低的页面没有必要使用持久连接,不知道理解的对不对。

要想真正避免这个问题,我想在执行 SQL 之前要先执行个空的 MySQL ping 命令,验证 MySQL 连接是否有效,如果无效则重新连接,有效则直接使用。这个验证连接的操作可以设置一个缓存时间,比如 1 小时内不需要再次验证,以避免频繁的做无用功。


sql

TODO: MySQL窗口函数OVER()
https://blog.csdn.net/weixin_46544385/article/details/120609601

mysql 快速查看表的数据行数

set session information_schema_stats_expiry=0;
show table status like 'mytable'\G

Postgres array_to_string() and array_agg() to decouple your interface
https://pemungkah.com/postgres-array_to_string-and-array_agg-to-decouple-your-interface/

SELECT Array_to_string(Array_agg(number_of
                                 || ' '
                                 || status), ',  ') summary_status,
       Max(user_id) USER
FROM   (SELECT Count(*) number_of,
               status,
               user_id
        FROM   jobs
        GROUP  BY status,
                  user_id
        ORDER  BY user_id) AS foo
GROUP  BY user_id;

PostgreSQL:基于数组(外键)列联接2个表
http://ask.sov5.cn/q/rxkaSsHjMA

SELECT u.id, u.name,array_agg(g.name) group_names FROM users u JOIN groups g ON g.id = ANY (u.group_ids)
GROUP BY u.id, u.name;

postgree 里的换行

select 'test line 1'||E'\n'||'test line 2';

postgree 的表 a 有一个数组列 id_arr,格式类似于 [1,2,3],关联到 b 表的 id 列,我想得到 [a,b,c]

SELECT (select string_agg(b.name,',') from b where b.id = ANY(a.ids)) FROM a 

创建临时表,当你断开与数据库的连接后,临时表就会自动被销毁。 临时表只在当前连接中有效。

CREATE TEMPORARY TABLE 临时表名 AS
(
    SELECT *  FROM 旧的表名
    LIMIT 0,10000
);

MySQL 全文索引
https://blog.csdn.net/dreamyuzhou/article/details/120432893

  • 全文索引只能用于InnoDB或MyISAM表,并且只能为CHAR、VARCHAR或TEXT列创建。
  • MySQL提供了一个内置的全文ngram解析器,支持中文,日文和韩文(CJK),以及一个可安装的MeCab日文全文解析器插件。 “ngram全文解析器”和“MeCab全文解析器插件”
  • FULLTEXT索引定义可以在创建表时在CREATE TABLE语句中给出,也可以稍后使用ALTER TABLE或CREATE index添加。
  • 对于大型数据集,将数据加载到一个没有FULLTEXT索引的表中,然后在此之后创建索引,比将数据加载到一个已有FULLTEXT索引的表中要快得多。
  • 分区表不支持全文搜索

mysql的全文索引只有一种方法判断相关性,就是词频,索引并不会记录匹配的词在字符串中的位置。并且,全文索引和数据量有较大的关系,全文索引只会全部在内存中时,性能才会很好,因此当全文索引过大,不能全部读入进内存,性能就会比较差。
可以通过一下点,思考下全文索引的问题:

  • 修改一段文本中的100个单词时,需要索引100次。
  • 全文索引的长度对性能的影响也是巨大的
  • 全文索引会产生更多的碎片,需要频繁的优化(optimize table)操作
  • 内存和数据容量也是常可观,所以需要规划和参数控制这部分
  • 因为mysql复制机制是基于逻辑复制,产生的binlog很大,那就会出现主从延迟等问题。
  • 词分割(token_size)也是一个问题,单个汉字也能表达出不同的意思。
  • 查询上:如果sql中包含match against,而索引列上又正好有全文索引,那么mysql就一定会使用全文索引,如果此时还有其他索引,mysql也不会去对比那个索引性能更高。

MySQL 创建全文索引

-- 创建全文索引
CREATE FULLTEXT INDEX idx ON table_name(`columns`);

-- 创建表时自动加全文索引,临时表不支持
CREATE TABLE articles (
  id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  title VARCHAR(200),
  body TEXT,
  FULLTEXT (title,body)
) ENGINE=InnoDB;

-- 插入测试数据
INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial, we show ...'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When configured properly, MySQL ...');

-- 简单全文搜索 
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('database' IN NATURAL LANGUAGE MODE);

+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+


-- 布尔搜索
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

+----+-----------------------+-------------------------------------+
| id | title                 | body                                |
+----+-----------------------+-------------------------------------+
|  6 | MySQL Security        | When configured properly, MySQL ... |
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...        |
|  2 | How To Use MySQL Well | After you went through a ...        |
|  3 | Optimizing MySQL      | In this tutorial, we show ...       |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ... |
+----+-----------------------+-------------------------------------+

-- 查询扩展搜索是对自然语言搜索的修改。
-- 搜索字符串用于执行自然语言搜索,然后将搜索返回的最相关行的单词添加到搜索字符串中,并再次执行搜索。
-- 查询返回第二次搜索的行.
SELECT * FROM articles
WHERE MATCH (title,body)
    AGAINST ('database' WITH QUERY EXPANSION);

+----+-----------------------+------------------------------------------+
| id | title                 | body                                     |
+----+-----------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL     | In the following database comparison ... |
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...             |
|  3 | Optimizing MySQL      | In this tutorial, we show ...            |
|  6 | MySQL Security        | When configured properly, MySQL ...      |
|  2 | How To Use MySQL Well | After you went through a ...             |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ...      |
+----+-----------------------+------------------------------------------+

laravel

https://zhuanlan.zhihu.com/p/95558910
Laravel 一主多从配置

'mysql' => [
    'write' => [
        'host' => '192.168.1.180',
    ],
    'read' => [
        ['host' => '192.168.1.182'],
        ['host' => '192.168.1.179'],
    ],
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
]

https://lqwang.net/13.html

  • 使用 chunkById 或者 chunk 方法的时候不要添加自定义的排序,chunk和chunkById的区别就是chunk是单纯的通过偏移量来获取数据,chunkById进行了优化,不使用偏移量,使用 id 过滤,性能提升巨大。在数据量大的时候,性能可以差到几十倍的样子。
  • 而且使用chunk在更新的时候,也会遇到数据会被跳过的问题。
  • 同时 chunkById 在你没有传递 column 参数时,会默认添加 order by id,可能会遇到索引失效的问题。解决办法就是传递 column 参数即可。
  • 本人感觉 chunkById 不光是根据 Id 分块,而是可以根据某一字段进行分块,这个字段是可以指定的。

https://laravel.com/docs/master/broadcasting
https://learnku.com/docs/laravel/9.x/broadcasting/12223

For example, imagine your application is able to export a user’s data to a CSV file and email it to them. However, creating this CSV file takes several minutes so you choose to create and mail the CSV within a queued job. When the CSV has been created and mailed to the user, we can use event broadcasting to dispatch a App\Events\UserDataExported event that is received by our application’s JavaScript. Once the event is received, we can display a message to the user that their CSV has been emailed to them without them ever needing to refresh the page.

  • Laravel 通过 WebSocket 连接使它很容易的去「广播」您的服务端 Laravel 事件。
  • 广播 Laravel 事件允许您在服务器端 Laravel 应用程序和客户端 JavaScript 应用程序之间共享相同的事件名称和数据。
  • 广播背后的核心概念很简单:客户端连接到前端的命名频道,而您的 Laravel 应用程序将事件广播到后端的这些频道。
  • laravel-websockets 和 soketi 包为 Laravel 提供了与 Pusher 兼容的 WebSocket 服务器。 这些包允许您在没有商业 WebSocket 提供程序的情况下利用 Laravel 广播的全部功能。

算法

经典面试题:如何快速求解根号2?
https://mp.weixin.qq.com/s/ONv1k27PflPZstlv99Vfzw

如何最简单、通俗地理解LSTM?
https://www.zhihu.com/question/445411028/answer/2323876011

  • LSTM 是一种 RNN 模型
  • LSTM 是对简单循环神经网络的改进
  • LSTM 可以避免梯度消失的问题,可以有更长的记忆

大白话理解LSTM神经网络(附实例讲解)
https://blog.csdn.net/Iceberggg/article/details/124114192

长短期记忆神经网络(LSTM)是一种特殊的循环神经网络(RNN)。原始的RNN在训练中,随着训练时间的加长以及网络层数的增多,容易出现梯度爆炸或梯度消失的问题,导致无法处理较长序列数据,从而无法获取长距离数据的信息。为解决该问题,提出了它的改进方案,即LSTM神经网络。

设计思路

  • RNN 神经网络:记住所有信息,无论是有用的还是无用的。
  • LSTM 神经网络:选择一个记忆细胞,对信息有选择性地记忆。

前向传播

  • t 为时刻
  • C_{t} 为记忆细胞
  • h_{t} 为状态
  • x_{t} 为输入
  • f_{t} 为遗忘门
  • i_{t} 为更新门
  • o_{t} 为输出门

举例

  • 假设现在是期末考试周且你的脑容量有限,昨天你考完了高等数学,后天将考线性代数,你的线性代数老师也为你贴心地划好了考试重点。
  • RNN会记住所有的信息,无论是有用信息还是无用信息,即你复习了整本线性代数的书本,并将其内容与上一门高等数学的内容全部记忆了下来
  • 对于LSTM来说,你将遗忘大部分高等数学的内容,而只保留基础数学运算等通用内容,并且只复习记忆线性代数书本中老师划出的重点。
  • C_{t} X f_{t} 的会生成一系列 0-1 之间的数,如[0,1,0.7,0,0.3,1],对其赋权重后,进行选择性遗忘。
    • 遗忘大部分高等数学的知识,记忆能够用到线代考试中的基础数学运算等知识。
  • i_{t} 更新门
    • 老师所划出的重点并不会全部出现在试卷上,你可以在复习的过程中根据自己的理解,判断哪些内容可能考,哪些内容肯定不考,由此再进行筛选过滤。
  • 在 LSTM 的每个时间步里,都有一个记忆 cell,给予 LSTM 选择记忆的功能。

请问rnn(lstm)和hmm在处理序列问题上的区别和优缺点在于?
https://www.zhihu.com/question/55007302/answer/1744376871

  • 在特定问题下,参数设置正确,相关论文已经证明HMM与LSTM能达到类似的效果。
  • 但是越先进的模型,调参成本越低。
  • 在时间序列预测问题上,可能 LSTM 不需要做特别多的参数调整就优于 HMM
  • 自然语言处理上,BERT 不需要做特别多的参数调整就优于 LSTM

深度学习做股票预测靠谱吗?
https://www.zhihu.com/question/54542998/answer/2361320437

  • 我有无数的本科生从youtube上抄了一堆直接应用LSTM在股票价格上的预测,说r^2高达99%,然后我让他们用daily return做一遍,立刻不说话了。
  • 究其原因,是股票价格的时间序列非常persistent,而在take first-order difference之后,return的信噪比又过低,所以LSTM肯定没办法。
  • LSTM在经济学里适合做什么呢?适合做宏观数据,一群月度季度宏观数据放在一起train,得到的结果是非常棒的。为什么呢?因为宏观本来就有lead-lag indicators,你LSTM做的是定量上的贡献。
  • 在去掉seasonality之后如果还有很多信息,那么LSTM才会好(例如宏观数据)。
  • lstm 绝对是靠谱的。我就知道国内某头部量化2017 年到2019年用lstm做出了很好的收益。但具体做法绝对不是一般人想的那么简单。任务的目标、使用的数据、处理的特征,都不是一般人能想到的
  • 任务的目标是个很重要的问题,很多人都没考虑清楚任务的目标就上LSTM
  • 如果预测价格而不是return,线性模型都能给搞出高R^2来,把价格作为预测目标说明完全没有上道在胡做一气。不要预测价格,要预测收益率。
  • 在不讨论因子有效性的前提下讨论模型work不work没有意义。没有因子,别玩模型。
  • 混沌理论,尤其李天岩教授的研究,对股市预测有一定的帮助。所以金融领域,混沌理论应该是正确的突破方向。
  • 幻方之前的报告明确表示,小资金量只用盘口数据+LSTM是可以赚钱的,但是他们也说特征工程有trick(估计有什么自己的因子)
  • 宏观惯性大,微观在搞布朗运动
  • 不是LSTM不行,而是关键方法设计和改进需要适合数据特性,做好预处理,做好需要处理的各种多模态数据的准备…毕竟直接套用LSTM,那是肯定不行…LSTM背后应该是一类方法,而不只是调用出来的tf里的一个确定的方法
  • 特征挖得好加点非线性就能work,和lstm关系也不大
  • 单变量序列,前后变化幅度上下0.1,不平稳,硬套lstm[飙泪笑] 老师!我有个时间复杂度O(1)的好主意,和你lstm一个水平:x(t) = x(t-1)[飙泪笑] 换daily return了?老师这题我也会!x(t) = mean(x[t-n: t-1])
  • feature不行吧,对着一堆噪声再好的模型也学不到语义,而且直接上lstm也太…
  • 时序的默认假设就是有很强的关联性。单股数据内在关联实际上很弱,也就是所谓的信噪比非常低。这种情况下,越强的神经网络越容易出问题。因为噪声模式占主导,不经过特定的特征选择和滤噪,基本上只有过拟合噪声一条命。
  • 对价格建模确实精确的一无是处
  • 其实最大问题是时序非稳态,随着时间的变化时序的模式变了,机器学习还是按照过去训练集给出的模式来预测,结果肯定拉跨。说到底非稳态时序预测就是搞不定,arima不行,啥神经网络也不是万能药。
  • lstm 在高频预测方面还是有一定收益的
  • 如果是youtube上面涉及到的first difference的方法我见过大部分是只使用股票价格去套lstm。这个问题出在数据上而不是lstm这个模型本身有没有效。
  • 如果训练数据本身对结果就没有说明度模型选什么model已经不重要了……现在业内普遍的做法是训练数据用的因子是截面的基本面+量价因子(类MSCI Barra 或者Fama的做法),target用收益率或者对数收益率。
  • 如果做非线性模型除了单lstm还有CNN+LSTM或者几种stacking的做法,做RF的也有,反正这个见仁见智吧跟设备还有交易速度也有关。
    另外宏观跟微观世界也差很多……有时候tick级动量因子就很有效反而日间的时候无效,有时候正好相反。
  • 另外不同市场区别也很大,之前有段时间开盘那段趋势性很强,然后就有人做那种开盘型的momentum策略,结果最近日内波动上来了被爆锤。
  • 归根结底,海量有效的因子库还是基础,模型是5%-6%的问题(这个我随便臆测的数哈不一定对,重点还是放在因子上)。
  • 所以现在头部量化都是疯狂卷设备,招一堆因子民工进去挖因子,毕竟越同质化的因子注定策略收益越会被其他使用相同因子的同类策略压缩掉,总之是越来越卷
  • 为什么说return信噪比低呢?这不应该比close 高?对数化遮盖了很多低频信息
  • 预测return和你说的那些任务,难度和收益的差别堪比打游戏和打赢一场战争。。并且也不应该指望很高的r2,0.01就有用处了。0.1就逆天了
  • 如果把预测股票视为一个分类问题,0跌 1涨呢?
    • 方向准确率也比较难有比随机猜的50%更好的效果,而且拿方向准确率交易本身也不靠谱,就算能到75%,也有可能3天赚的钱1天直接双倍亏回来。
    • 如果真的有75%,我完全可以分散成20个仓位,取预测上涨百分比最高的前20,上涨的概率越大仓位分配重,不多贪,每天能吃1个点一年都是10倍,三年一千倍
    • 比特币分钟线搞过52%准确率的,期望收益率十万分之五每分钟
  • 做差分或者对return rate做预测或者是对01涨跌分类预测会不会work(比last day baseline好)
    • 预测收益率or Diff是最最最基本的…work与否取决于因子质量,模型没有门槛,但因子库有。
  • 模型不是越高深效果越好,而是有各自适用的范围。比如,如果linear regression都过拟合,那用ML和DL就没什么意义了。
  • 我个人的经验,日度的数据,用ML预测无卵用,加上盘口的高频数据ML倒是有可做的空间,但是还是无法满足DL对数据的质量要求。
  • 当然,如果是对策略进行优化,而不是纯以预测股价为目的,ML应该会有更多的应用空间。但总而言之DL现在做量化的应该是几乎不用的。
  • 一圈实验下来,确实觉得对策略优化是大概率的没走“邪路”。尤其是只用日频数据的alpha类策略,用ML来预测市场就像水中捞月。
  • 不论回归,分类,不管统计学习,机器学习,深度学习,都是跑的概率。可以说是对你“见过的数据”做了一次拟合实验,想找到里面的规律――概率。
  • 下围棋是归纳还是博弈?
    • 下围棋是两人之间的博弈没错,但是深度学习alphago在这里面的作用起的是归纳历史棋局的作用。围棋虽然复杂,但是规则是有限的,也是明确的,所以在大量数据和高性能计算上,深度学习通过归纳下围棋的方法能打赢人类。但是市场跟围棋不一样,市场由于有很多人参与,规则是无限的,也是不明确的,很难用一个统一的模型去寻找规律。当然有可能存在短时间某种规律一直有效的情况,所以说有些因子在某些特定环境有效。
  • 如果说机构还能构建模型,对散户来说应该是通过归纳找出某周期内胜率大于50%的操作方式,合理设置盈亏比,严格执行之。并时时统计这个周期内胜率变化,一旦变化,相应策略也要调整。市场是混沌的,预测冇意义,一切都是概率变化而已
  • 股市预测的问题本质上是一个online learning 的问题,因为股票市场上的规律是不断地在变的。这也是为什么传统机器学习方法和深度学习方法在金融市场上容易被当成笑话的原因。也因此,reinforcement learning 是显然不适合金融市场的,reinforcenment learning的反馈太慢了,所以需要大量的数据才能学到数据背后的规律。显然,在online learning场景下我们没有办法提供大量的数据。
  • 我觉得深度学习还是可以用来做投资的,而非交易。
    • 我觉得可以。最起码可以做交易员的辅助交易。因为有些隐规则是人自身没有发现的,但是机器可能会发现,一个好的高频预测模型是可以做出来的,因为短期内环境不会有大的变化,就可以预测。如果深度学习能够学习其中的隐规则,并且使用模型输出人能够理解的信息形式,就是一个很好的预测模型
  • 市场追求的不是博弈,而是共识。 同样2020年3月为例,绝对的利空,造成统一的救市共识,然后才挽救了股市。放在1927年、2000年,市场在救与不救之间徘徊不定无法达成共识,造成了灾难性后果。
  • 深度学习肯定是可以用在股票市场的,比如针对某只股票的新闻情感分析等。但是不能用来预测市场走向!!!

人工智能基础课,最优化

求解无约束优化问题最常用的方法是梯度下降法(gradient descent)。直观地说,梯度下降法就是沿着目标函数值下降最快的方向寻找最小值,就像爬山时要沿着坡度最陡的路径寻找山顶一样。在数学上,梯度的方向是目标函数导数(derivative)的反方向。

当函数的输入为向量时,目标函数的图象就变成了高维空间上的曲面,这时的梯度就是垂直于曲面等高线并指向高度增加方向的向量,也就携带了高维空间中关于方向的信息。而要让目标函数以最快的速度下降,就需要让自变量在负梯度的方向上移动。这个结论翻译成数学语言就是“多元函数沿其负梯度方向下降最快”,这也是梯度下降法的理论依据。

遗憾的是,梯度下降法无法获知关于导数的变化信息,也就不知道应该探索导数长期为负的方向。由于不具备观察目标函数的全局视角,在使用中梯度下降法就会走出一些弯路,导致收敛速度变慢。而二阶导数所包含的全局信息能够为梯度下降的方向提供指导,进而获得更优的收敛性。

如果将二阶导数引入优化过程,得到的典型方法就是牛顿法(Newton’s method)。在牛顿法中,目标函数首先被泰勒展开,写成二阶近似的形式(相比之下,梯度下降法只保留了目标函数的一阶近似)。此时再对二阶近似后的目标函数求导,并令其导数等于 0,得到的向量表示的就是下降最快的方向。相比于梯度下降法,牛顿法的收敛速度更快。

群蚁算法、遗传算法、模拟退火算法,禁忌搜索算法等通俗详解
https://blog.51cto.com/u_13682052/2981273

单只蚂蚁的行为及其简单,行为数量在10种以内,但成千上万只蚂蚁组成的蚁群却能拥有巨大的智慧,这离不开它们信息传递的方式——信息素。蚂蚁在行走过程中会释放一种称为“信息素”的物质,用来标识自己的行走路径。在寻找食物的过程中,根据信息素的浓度选择行走的方向,并最终到达食物所在的地方。信息素会随着时间的推移而逐渐挥发。在一开始的时候,由于地面上没有信息素,因此蚂蚁们的行走路径是随机的。蚂蚁们在行走的过程中会不断释放信息素,标识自己的行走路径。随着时间的推移,有若干只蚂蚁找到了食物,此时便存在若干条从洞穴到食物的路径。由于蚂蚁的行为轨迹是随机分布的,因此在单位时间内,短路径上的蚂蚁数量比长路径上的蚂蚁数量要多,从而蚂蚁留下的信息素浓度也就越高。这为后面的蚂蚁们提供了强有力的方向指引,越来越多的蚂蚁聚集到最短的路径上去。

继续考虑寻找f(x)最大值的问题,爬山算法搜索到A点时就会停止搜索,原因是A点左右的值均小于A点的值。模拟退火算法采用的解决办法是以一定的概率选择A两边的点,尽管A两边的点并不是局部最优解,这样就有一定的概率搜索到D点,从而搜索到B点,最终获得了全局最优解。上文中的一定概率来自于固体退火原理:当固体温度较高时,物质内能较大,固体内部分子运动剧烈;当温度逐渐降低时,物体内能也随之降低,分子运动趋于平稳;当固体温度降到常温时,固体内部分子运动最终平稳。根据Metropolis准则,粒子在温度T时趋于平衡的概率为e^(-ΔE/(kT)),其中E为温度T时的内能,ΔE为其改变量,k为Boltzmann常数。

TODO: numpy实现朴素贝叶斯模型(高斯分布)
https://www.jianshu.com/p/efa980944235

import numpy as np


class GaussianNB():

    def fit(self, X, y):
        """模型拟合"""
        self.y_prior = [round(sum(y == i) / len(y), 6) for i in sorted(set(y))]
        self.features_param = []

        for i in sorted(set(y)):
            pos = np.where(y == i)
            features_data = X[pos]
            features_mean = np.mean(features_data, axis=0)
            features_std = np.std(features_data, axis=0)

            param = [(round(avg, 6), round(std, 6)) for avg, std in zip(features_mean, features_std)]
            self.features_param.append(param)

    def predict(self, x):
        """模型预测"""
        result = []
        for i in range(x.shape[0]):
            bayes_prob = []

            for j in range(len(self.y_prior)):
                x_param = self.features_param[j]
                y_param = self.y_prior[j]
                xi_conditional_prob = 1

                for k in range(len(x_param)):
                    xi_conditional_prob *= self.gauss_pro(x[i][k], x_param[k][0], x_param[k][1])
                bayes_prob.append(round(y_param * xi_conditional_prob, 6))
            result.append(np.where(bayes_prob == np.max(bayes_prob))[0][0])

        return np.array(result)

    def gauss_pro(self, v, miu, sigma):
        """高斯分布概率密度计算"""
        part1 = 1 / (sigma * np.sqrt(2 * np.pi))
        part2 = np.exp(-1 * (v - miu) ** 2 / (2 * sigma ** 2))
        return round(part1 * part2, 6)


if __name__ == '__main__':
    from sklearn import datasets

    iris = datasets.load_iris()
    X = iris.data
    y = iris.target

    gnb = GaussianNB()
    gnb.fit(X, y)

    res = gnb.predict(X)
    print(res)

Neo4j

neo4j使用文档
https://www.cnblogs.com/naimao/p/13497046.html

  • 它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,
  • 它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。
  • 图形数据库数据模型的主要构建块是:节点、关系、属性
  • neo4j主要存储节点和关系,其中关系必须为有向关系,描述节点和关系的数据以属性的形式存储,节点和关系上都能放键值对的属性。不同类型的节点和关系通过标签Label来区别,不同标签的节点代表不同类型节点,不同标签关系代表不同类型关系

创建一个标签为Person的节点,其有属性 name 和age:

create (:Person{name:'小红',age:21});

查询一个节点:

match (m:Person{name:'小红',age:21}) return n;

删除一个节点:

match (m:Person{name:'小红',age:21}) delete n;

创建关系:

create (a:Person{name:"a"}),(b:Person{name:"b"}) with a,b create (a)-[r:Friend]->(b);

查询关系:

match (a:Person{name:"a"})-[r:Friend]->(b:Person{name:"b"}) return r;

删除关系:

match p=(a:Person{name:"a"})-[r:Friend]->(b:Person{name:"b"}) delete p;

linux

Linux–网络通信命令(给其它用户发送广播消息)
https://blog.csdn.net/qq_42119367/article/details/123427804

wall Happy New Year

http://ipcmen.com/nano

nano 是一个字符终端的文本编辑器,有点像 DOS 下的 editor 程序。它比 vi/vim 要简单得多,比较适合Linux初学者使用。

  • 移动光标:使用用方向键移动。
  • 复制一整行:Alt+6
  • 剪贴一整行:Ctrl+K
  • 粘贴:Ctrl+U
  • 如果需要复制/剪贴多行或者一行中的一部分
    • 先将光标移动到需要复制/剪贴的文本的开头
    • 按 Ctrl+6(或者 Alt+A )做标记
    • 然后移动光标到 待复制/剪贴的文本末尾。这时选定的文本会反白
    • 用 Alt+6 来复制,Ctrl+K 来剪贴。
    • 若在选择文本过程中要取消,只需要再按一次 Ctrl+6。
  • 退出: Ctrl+X: 如
    • 果你修改了文件,下面会询问你是否需要保存修改。
    • 输入Y确认保存,输入N不保存,
    • 按 Ctrl+C 取消返回。
    • 如果输入了Y,下一步会让你输入想要保存的文件名。
      • 如果不需要修改文件名直接回车就行;
      • 若想要保存成别的名字(也就是另存为)则输入新名称然后确定。
      • 这个时候也可用 Ctrl+C 来取消返回。
  • 撤销:Alt+U
  • 重做: Alt+E

Linux visudo配置详解
http://t.zoukankan.com/wutao1935-p-10045809.html

sudo的工作过程如下:

  • 当用户执行 sudo 时,系统会主动寻找 /etc/sudoers 文件,判断该用户是否有执行 sudo 的权限
  • 确认用户具有可执行 sudo 的权限后,让用户输入用户自己的密码确认
  • 若密码输入成功,则开始执行 sudo 后续的命令
  • root 执行 sudo 时不需要输入密码 (sudoers 文件中有配置 root ALL=(ALL) ALL这样一条规则)
  • 若欲切换的身份与执行者的身份相同,也不需要输入密码

visudo 使用 vi 打开 /etc/sudoers文件,但是在保存退出时,visudo 会检查内部语法,避免用户输入错误信息

# 允许 user1 用户执行任意路径下的任意命令
user1 ALL=(ALL) ALL
# 允许 user1 用户不输入该用户的密码的情况下使用所有命令
user1 ALL=(ALL) NOPASSWD: ALL
# 允许 user1 用户执行特定命令
user1 ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

量化

从零入门量化交易系列(十二)Black-Litterman模型及python实现
https://zhuanlan.zhihu.com/p/363540266

这里还要再说一个重要的假设就是共轭分布,千万别被共轭(conjugate)这个词吓到,它几乎是整个Black-Litterman模型在形式上的核心。原因在于一个正态分布乘以另一个正态分布结果还依然是正态分布。这就是为什么模型不仅要假设\mu服从正态分布,连投资者的观点也要假设为正态分布的原因。这两个正态分布都在分子上,相乘后结果仍为正态分布,而分母上的积分为常数,并不影响新的正态分布的均值和方差。也就是说先验和后验同属于正态分布,两者共轭,因此后验分布的均值方差都可以根据公式快速得到。这也就方便我们得到后验分布的均值,也就是我们想要的期望收益率。

【量化模型】Black-Litterman模型介绍
https://zhuanlan.zhihu.com/p/25041459

Markowitz的MPT模型:给定风险水平下的预期收益最大化,也可以是其对偶命题,给定预期收益 水平下的风险最小化。

  • 缺点:
    • 假设不成立:MPT理论假设为投资者一致且理性(即投资者对预期收益、标准差和风险资产相关性具有一致预测;投资者行为遵循最优化原则,即投资者理性)。现实中显然不成立。
    • 无仓位限制:在无卖空限制条件下,MPT模型经常导致在一些资产上有很大的空头头寸,而实际上大量投资者具有卖空约束。中国市场对卖空进行限制,模型经常导致在某些资产上权重为零,而在另一些资产上权重过大,即出现资产配置过于集中的现象。
    • 参数敏感:对输入参数如预期收益率作小幅度变化,可能导致模型结果发生剧烈变化。
  • 改进:
    • 高盛的Fisher Black和Robert Litterman在研究中发现,对组合中德国债券预期报酬率做0.1%小幅修正后,竟然该类资产的投资比例由原来的10.0%提高至55.0%。
    • 做法:加入投资者自己的观点,而且有一定的置信水平。二人提出了BL模型:使用Bayes定理(条件概率),构建收益时通过一定方式对市场隐含收益率与主观预期收益的加权平均。

Black-Litterman模型是基于MPT基础上的资产配置理论。BL模型在隐含市场收益率和分析师主观预测信息的基础上,成功解决了MPT模型中假设条件不成立,参数敏感等问题。

  • BL优化后确实战胜市场均衡配置;
  • BL模型同样也存在模型上的缺陷,需要继续改进。历史数据计算出来的协方差矩阵在长期内可能不能良好刻画出短期关系,需要动态调整;分析师主观预期(看法)信心水平的设定具有很大的主观 随意性,在方法上还存在众多分歧;
  • BL模型比较符合目前国内基金投资真实市场环境,如关注分析师主观预期,存在投资仓位上下限规定等;
  • BL模型适用于行业资产配置,而一般不配置具体的投资,倾向区分大类资产;但有的地方也说可以用在个股组合中;
  • 达里奥桥水基金的全球配置更关注风险因子,而非大类。股票中的能源股和部分大宗商品息息相关,从而分配到相同的一类中。是不同于MPT和BL的资产配置理论

大奖章基金
https://baijiahao.baidu.com/s?id=1664399262080636944&wfr=spider&for=pc

  • 该基金的收费比较高,管理费为 5%,业绩分成比例为 36%。
  • 奖章基金的管理规模在 100 亿美金左右,折合人民币约 700 亿。
  • 二十年年化收益率近 70%

【矩阵分析】Condition Number
https://zhuanlan.zhihu.com/p/81053589

  • 我们在衡量某个函数敏感度与稳定性时,常使用的一种方法是求导。即观察导数[公式] 的大小。
  • 然而对于一个矩阵而言,所谓的导数似乎就不是那么显著,在此我们就介绍一个常用的指标矩阵敏感度指标:Condition Number。

TODO: 因子分析的数学基础
https://zhuanlan.zhihu.com/p/348566335

  • 1.1 方差
  • 1.2 标准差
  • 1.3 均方误差
  • 1.4 python实现
  • 1.5 协方差
  • 1.6 相关系数
  • 1.7 特征值和特征向量
  • 1.8 使用Python求解特征值和特征向量
  • 1.9逆矩阵和转置矩阵
  • 1.10 矩阵的迹和行列式

多元函数泰勒级数展开_用Python学微积分(4)—泰勒级数
https://blog.csdn.net/weixin_39906358/article/details/111639431


WaveFunctionCollapse
https://github.com/mxgmn/WaveFunctionCollapse

动态生成迷宫


shell

查看 json 压缩文件里倒数第 2 行的 id, 因为有可能是个末尾损坏的压缩包,所以跳过倒数第一条数据

zcat ./out_000000168373001.gz 2>/dev/null | tail -n2 | head -n1| jq -r '.id'

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-source-field.html

Think before disabling the _source field
Users often disable the _source field without thinking about the consequences, and then live to regret it. If the _source field isn’t available then a number of features are not supported:

  • The update, update_by_query, and reindex APIs.
  • On the fly highlighting.
  • The ability to reindex from one Elasticsearch index to another, either to change mappings or analysis, or to upgrade an index to a new major version.
  • The ability to debug queries or aggregations by viewing the original document used at index time.
  • Potentially in the future, the ability to repair index corruption automatically.

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-id-field.html

  • Each document has an _id that uniquely identifies it, which is indexed so that documents can be looked up either with the GET API or the ids query.
  • The _id can either be assigned at indexing time, or a unique _id can be generated by Elasticsearch.
  • This field is not configurable in the mappings.

https://www.517712.com/gupiao/94304.html

美元加息对黄金影响的三种情况:

1、美元加息利好黄金:美元加息,但货币并未成功回流流回银行系统,而企业贷款利率上涨,贷款困难,就会出现流动性危机,美元会被看空,对黄金就是利好。
2、美元加息利空黄金:美元加息,存款利率上涨,货币顺利回流银行系统,美元升值,对黄金就是利空。
3、美国加息,美元升值,但同时出现地区性动荡、石油危机等情况影响正常经济发展,对黄金有利好作用,就是美元和黄金同时上涨。

国际现货黄金是以美元来定价的,因此美元和黄金价格呈现一定的负相关关系,换句话说当美元上涨时,黄金价格大概率是下跌,而当美元下跌时,黄金价格大概率是上涨。


NGINX Proxy to wordpress website
https://stackoverflow.com/questions/38205743/nginx-proxy-to-wordpress-website

location ^~ /blog/ {
  proxy_pass http://127.0.0.1:8080/;
  proxy_set_header Host $http_host;
  proxy_set_header X-Forwarded-Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
}

/** set the site URL */
define('WP_HOME','http://www.example.com/blog');
define('WP_SITEURL','http://www.example.com/blog');

/** Fix to get the dashboard working with the reverse proxy.*/
$_SERVER['REQUEST_URI'] = str_replace("/wp-admin/", "/blog/wp-admin/",  $_SERVER['REQUEST_URI']);

Gutenberg breaks completely if site URL is not the same as wordpress URL
https://github.com/WordPress/gutenberg/issues/1761


反射放大攻击
https://baijiahao.baidu.com/s?id=1730701810134759899

所谓的反射放大攻击是非常常见的DDoS攻击手法,其基本原理非常简单:攻击者通过控制僵尸网络伪造靶机IP向特定的公网服务器发送请求,公网服务器收到请求后会向靶机发送更大的应答报文,从而实现攻击流量放大。

这里的公网服务器是指对外开放某些可被利用作反射放大的协议端口的服务器,比较常见的协议有DNS、NTP、SNMP、Memcached等,这些协议一般基于UDP,并且协议本身存在缺陷,没有校验来源IP的真实性,且存在应答报文远大于请求报文等特点。这种反射放大手法简单、有效,一直深受黑客喜爱,所以很长一段时间内UDP反射就是反射放大攻击的别称。

早在2018年就出现利用公网服务器开放的TCP端口进行反射攻击的手法,相比UDP反射放大攻击,此类利用TCP协议栈的反射攻击实际并无太明显的流量放大效果,因为请求的来源IP是伪造的,无法与TCP服务器完成TCP三次握手建立连接,所以无法得到应用层的应答报文。但是这种攻击利用了TCP的协议栈特性,使靶机看到攻击流量具备协议栈行为,而且成份复杂(synack、ack、rst等混合流量),导致反向挑战、协议栈行为校验等传统的TCP防护算法无法防护,大大增加了防护难度,所以这种TCP反射诞生后很快成为DDoS攻击的主流攻击手法。

放大系数可以理解为流量的放大倍数,计算方法非常简单,就是response总长度/query总长度。传统的UDP反射攻击的放大系数与具体的协议实现相关,所以放大系数是一个相对固定的值:除了Memcached反射攻击以外,其他UDP反射放大系数不超过600,而且以200以内为主。


nginx

A Guide to Caching with NGINX and NGINX Plus
https://www.nginx.com/blog/nginx-caching-guide/

docker

docker数据卷与数据卷容器以及备份与恢复
https://blog.csdn.net/m0_60360828/article/details/122641289

创建容器

docker run -it -v /opt --name test_1 centos:7 /bin/bash

    echo "123321" > /opt/1.txt

备份

docker run -it --volumes-from test_1 -v /mnt:/mnt centos:7 tar cvf /mnt/opt.tar /opt
  • --volumes-from test_1 :指定数据卷容器所在
  • -v /mnt:/mnt:共享该容器中mnt目录到主机的mnt
  • tar cvf /mnt/opt.tar /opt:这个较为绕,mnt是该容器跟主机之间共享的一个目录。所以将备份后的数据放到这个文件中,好备份之后直接导到主机。
  • 后面跟随的备份目标路径,则是该容器与数据卷容器之间的共享目录,因为要对数据卷容器进行备份,所以则是需要备份该目录

查看备份

ls /mnt/
tar xvf opt.tar
cat ./opt/1.txt

恢复

#创建数据卷容器,并且共享opt目录
docker run -it -v /opt --name test_2 nginx:1.12 /bin/bash

#创建一个容器,作用是从主机中获取文件,并且将该文件传输给数据卷容器
docker run -itd --volumes-from test_2 -v /mnt:/mnt nginx:1.12 tar xvf /mnt/opt.tar -C /opt/

cd opt/ && ls
cat ./opt/1.txt

elasticsearch

Field data typesedit
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

Each field has a field data type, or field type. This type indicates the kind of data the field contains, such as strings or boolean values, and its intended use. For example, you can index strings to both text and keyword fields. However, text field values are analyzed for full-text search while keyword strings are left as-is for filtering and sorting.

pandas

设置时间索引

data['time_key'] = pd.to_datetime(data['time_key'])
data.set_index('time_key', inplace=True)

设置图表默认大小

from matplotlib import pyplot as plt 
plt.rcParams['figure.figsize'] = (16, 8)

两个指标各用一个坐标轴

data[['close','volume']].plot(secondary_y=['volume'])

两个指标各用一个子图

fre[['fre','cumsum']].plot(subplots=True)

分成 10 段,显示每个段的数量

data['real_vol_22'].hist(bins=10)

pandas数据可视化原来也这么厉害
https://baijiahao.baidu.com/s?id=1684407979428084767&wfr=spider&for=pc

pandas 区间间隔 pd.Interval
https://www.gairuo.com/p/pandas-interval


理财

无风险数字货币套利之三角套利
https://zhuanlan.zhihu.com/p/394421805

三角套利,是指交易者利用三种不同的数字货币的价格不匹配的过程。 通过买卖这些特定货币,交易者获得了无风险的利润。 这种失配通常只会持续几秒钟,因为有大量的交易员正在积极寻找这样的机会,因此三角套利主要是通过程序化的量化交易来完成的。

以btc、eth和usdt三种数字货币来说,而交易所存在eth/btc、eth/eos、btc/eos三个交易对,同时三个交易对之间存在价差,那么首先可以使用价值400元的eth购买对应份额的eos,而后在使用这些的eos兑换成btc,最后可以将兑换btc兑换成eth,那么最终结果就是你净赚10元,同时又由于这些交易都是瞬时完成的,也就可以近似认为是无风险套利了,其中唯一的风险就是别人比你的交易速度更快。

三角套利是利用交叉汇率定价错误进行的套利。套利使得实际交叉汇率与理论交叉汇率保持一致。在国际市场上,几乎所有的货币兑美元都有一个兑换率。两个非美国国家之间的理论汇率可以从它们与美元之间的汇率中推断出来,这种套算出来的汇率称为理论交叉汇率。在现实世界中,很少会出现根据交易商对美元汇率报价计算出的理论交叉汇率不同于交易商报出的实际交叉汇率的情况。如果差异大到足以与购买及出售货币的交易成本相比,就出现了无风险套利机会。

平稳(非平稳)时间序列
https://zhuanlan.zhihu.com/p/425684691

金融时间序列分析——对收益率序列平稳化处理
https://blog.csdn.net/m0_37876745/article/details/108994950

谈谈时间序列的平稳性
https://blog.csdn.net/TimeFuture/article/details/120690021

  • 时间序列分析中的许多预测和分析方法,如 ARMA、Granger 因果检验等,都要求输入序列是平稳的。
  • 大多数时间序列都是非平稳的,比如一些股票的收盘价数据就是非平稳的。
  • 如果时间序列包含明显的趋势和季节性,会影响算法准确预测时间序列的能力。
  • 一般可以通过差分、取对数等方法转化成平稳时间序列。
    • 一步的差分其实就是今天的价格和昨天的价格相减再除以昨天的价格:df['Close'] - df['Close'].shift(1)
    • 对原始数据取对数然后再差分:np.log(df['Close']) - np.log(df['Close'].shift(1)
  • 对转换后的数据集运行 Augmented Dicker-Fuller 测试,以确保平稳性

安装 ta-lib

sudo apt install build-essential wget -y
wget https://artiya4u.keybase.pub/TA-lib/ta-lib-0.4.0-src.tar.gz
tar -xvf ta-lib-0.4.0-src.tar.gz
cd ta-lib/
./configure --prefix=/usr
make
sudo make install

pip install TA-Lib

backtrader绘图运行出matplotlib错的原因
https://www.jianshu.com/p/2dc8a671ab7a

backtrader与matplot 3.3不兼容,要降级到3.2,运行如下命令可降级:

pip uninstall matplotlib
pip install matplotlib==3.2.2

pip uninstall pyfolio
pip install git+https://github.com/quantopian/pyfolio

Pyfolio一行代码实现专业量化回测图表
https://zhuanlan.zhihu.com/p/376954470

pyfolio 是全球最大量化网站Quantopian开发的量化“三剑客”之一,另外两个分别是alphalens(用于多因子分析)和zipline(类似backtrader的回测框架)。pyfolio非常适合用于金融投资组合性能和风险分析,包括与Zipline和alphalens结合,输出专业的量化指标和图表分析结果。

Python量化策略风险指标

不显示 warnings
import warnings
warnings.filterwarnings(‘ignore’)

PEG指标
https://baike.baidu.com/item/PEG指标/10904043

  • 背景:
    • 投资者普遍习惯于使用市盈率来评估股票的价值,但是,当遇到一些极端情况时,市盈率的可操作性就有局限,比如市场上有许多远高于股市平均市盈率水平,甚至高达上百倍市盈率的股票,此时就无法用市盈率来评估这类股票的价值。
    • 但如果将市盈率和公司业绩成长性相对比,那些超高市盈率的股票看上去就有合理性了,投资者就不会觉得风险太大了,这就是PEG估值法。
  • 定义:
    • PEG 指标(市盈率相对盈利增长比率)是用公司的市盈率除以公司的盈利增长速度。
    • 所谓 PEG,是用公司的市盈率(PE)除以公司未来 3 或 5 年的(每股收益复合增长率*100)。
    • 它由股票的未来市盈率除以每股盈余(EPS)的未来增长率预估值得出。
    • 它是在 PE 估值的基础上发展起来的,它弥补了 PE 对企业动态成长性估计的不足。
    • PE 仅仅反映了某股票当前价值,PEG 则把股票当前的价值和该股未来的成长联系了起来 。
  • 特点
    • 通常成长型股票的 PEG 都会高于 1,甚至在 2 以上,投资者愿意给予其高估值,表明这家公司未来很有可能会保持业绩的快速增长,这样的股票就容易有超出想象的市盈率估值。
    • 通常价值型股票的 PEG 都会低于 1,以反映低业绩增长的预期。当 PEG 小于 1 时,要么是市场低估了这只股票的价值,要么是市场认为其业绩成长性可能比预期的要差。
  • 使用
    • 粗略而言,PEG 值越低,股价遭低估的可能性越大。
    • 选股的时候选那些市盈率较低,同时它们的增长速度又是比较高的公司,这些公司有一个典型特点就是 PEG 会非常低。
    • PEG 始终是主导股票运行的重要因素,所以寻找并持有低 PEG 的优质股票是获利的重要手段。
    • 当然,也不能够机械的单以 PEG 论估值,还必须结合国际市场、宏观经济、国家的产业政策、行业景气、资本市场阶段热点、股市的不同区域、上市公司盈利增长的持续性以及上市公司的其他内部情况等等多种因素来综合评价。
  • 缺点
    • 须注意的是,PEG值的分子与分母均涉及对未来盈利增长的预测,出错的可能较大。
    • 计算 PEG 值所需的预估值,一般取市场平均预估(consensus estimates),即追踪公司业绩的机构收集多位分析师的预测所得到的预估平均值或中值。

详解PE与PEG估值法
https://zhuanlan.zhihu.com/p/353770859

如何评价纳西姆·塔勒布的《反脆弱》?该书都有哪些优劣之处?
https://www.zhihu.com/question/24684650/answer/1174590096

本书的核心观点是:事物的发展从来都是非线性发展,一切事物都会从波动中获得收益或遭受损失,反脆弱就是能在波动性和不确定性中带来收益。

最好应对风险的方法是“以毒攻毒”,设计一个“反脆弱结构”。这里就是反脆弱概念,让自己经常暴露在风险中,提高自己生活的“波动性”,利用“波动性”平衡风险,并伺机利用风险获利。

通过非线性理论让我们知道,机遇某种程度比能力更重要,不能指望人生是线性发展,也并非“一分耕耘一分收获”,能力提高就能升职加薪。现实中,确定性事件和不确定性事件至少同样多。为了实现收入指数性增长而非线性增长,必须寻找新的增长点。

https://baijiahao.baidu.com/s?id=1732327796243580868&wfr=spider&for=pc

  • 书中提出的应对不确定性的策略是杠铃策略——极端保守+极端投机的策略。其核心思想是为了避开中间地带,首要的是降低不利因素,而不是增加有利因素。
  • 对于脆弱的系统而言,其他任何“增加效率、增加成功”的行为在“实现生存”这一需求面前都是不重要的。因此极端保守的策略显得如此重要。
  • 同时,为了获得收益,又需要搭配极端投机策略。在投资中就体现为“现金+投机资产”或股票投资中的“高确定性标的+高投机性标的”的组合。
  • 总结一下,反脆弱的杠铃策略在投资中的实践就是:先活下来,不要亏钱,再寻求收益。
  • 脆弱的系统往往在大多数时候给予人们较好的体验,但在不确定性来临时不堪一击,其核心问题是不确定性来临时无法生存。

https://baijiahao.baidu.com/s?id=1698275248230462135&wfr=spider&for=pc

  • 脆弱的事物依赖稳定环境,比如一个没有任何保护的股票多头策略,一旦市场大幅下跌将很可能会损失惨重。
  • 强韧的事物不太依赖环境,环境怎么变它都不太会变。但是强韧不等于反脆弱,因为它无法从不确定性中获益。
  • 反脆弱不是坚强,而是越挫越勇。外界环境越波动、随机、混乱越不会受伤,反而利用波动环境茁壮成长。就像人类的免疫系统,受到的冲击越多越坚强。
  • 90%的现金和10%的期权就是一个比较典型的杠铃策略。一侧是极端的风险厌恶,一侧是极端的风险偏好,不走中间道路。当然,风险端的投资也要判断尽量有很高胜算才能参与,不能把期权当成赌大小的骰子。

钱:7步创造终身收入 笔记
https://book.douban.com/review/10111467/

重新认识风险

  • 传统观点是收益和风险成长比,其实未然。
  • 投资大师寻找风险小收益大的投资机会。
  • 高风险并不一定都带来高收益,高收益也不一定都要高风险。
  • 结构化票据、市场联动大额存单、固定指数年金等都是低风险高收益的投资对象。
  • 投资还有运气成分,完全相同的策略,如果开始的年份不同,可能后面结果完全不同。

量化理财目标: 量化实现目标所需的财富水平,设定个人的理财目标:

  • 财务安全:解决住房、水电、吃饭、交通、保险等问题
  • 财务活力:财务安全 + 着装、娱乐、美食等额外需求
  • 财务独立:现有生活水平
  • 财务自由:相对有品质的生活
  • 财务绝对自由:非常有品质的生活

采取行动

  • 开源
    • 通过提升技能,增加收入。
    • 通过创业创新,增加收入。
  • 节流
    • 改变生活方式以减少开支。
    • 压缩不必要的,或者低效的开支。
    • 提前偿还部分房贷本金,从而减少利息支出。
    • 为了压缩开支,减少税赋,搬家也是值得的。
  • 储蓄
    • 建立储蓄账户、养老账户。
    • 拿出收入的固定比例,自动存入账户,建立「财务自由投资基金」。

达利欧组合

  1. 达利欧在哈里·马科维茨(现代投资组合理论之父)的基础上创立了全天候投资策略。

  2. 达利欧总结出 4 种不同的经济环境(经济季节),匹配四种不同的投资组合。

  3. 达利欧全天候投资策略拥有高收益、高安全、低波动的特点。

  4. 简化版的达利欧组合包括:

    • 长期国债:40%
    • 股票:30%
    • 中期国债:15%
    • 黄金:7.5%
    • 大宗商品:7.5%
  5. 净利润: 净利润是一个企业经营的最终成果,净利润多,企业的经营效果好。

    • 第 1 步:计算销售净额,也就是营业收入,是指销售总额减销货退回与折让,以及销售税金后的余额;
    • 第 2 步:计算销售毛利,即销售净额减销售成本后的余额;
    • 第 3 步:计算销售利润,即销售毛利减销售费用、管理费用、财务费用等期间费用后的余额;
    • 第 4 步:计算营业利润,即销售利润加上其他业务利润后的余额;
    • 第 5 步:计算利润总额,即营业利润加营业外收支后的余额;
    • 第 6 步:计算所得税后的净利润,即利润总额减应计所得税(支出)后的余额。
  6. 归母净利润:归属于母公司所有者的净利润才是投资人真正要关心的数字,它是由净利润扣除掉 “少数股东损益”得到。

    • 假设:甲上市公司旗下只有一家子公司 A,并且持其 70% 的股份。
    • 如果 2017 年,A 公司的净利润是 1 亿,且甲和 A 之间没有任何关联关系。
    • 上市公司在制定合并利润表时,在净利润科目中,增加不是 7000万 而是 1 亿。
    • 但真正属于上市公司股东,也就是所有股民的净利润要把另外 3000 万扣除掉。
    • 持有 A 公司 30% 股份的那些股东就被称之为少数股东,而这个 3000 万就叫作“少数股东权益”。
  7. 扣非归母净利润:“归母净利润” 减去“非经常性损益”,即扣掉公司正常经营损益之外的一次性或者偶发性损失

    • 处置长期股权投资、固定资产、在建工程、无形资产、其他长期资产产生的损益;
    • 越权审批或无正式批准文件的税收返还、减免;
    • 各种形式的政府补贴;
    • 因不可抗力因素,如遭受自然灾害而计提的各项资产减值准备;

链接:https://wenku.baidu.com/view/02399cd5cbd376eeaeaad1f34693daef5ef71365.html

利润概念:

  • 毛利润 = 主营业务净收入-主营业务支出-主营业务税金及附加
  • 利润总额 = 主营业务净收入-主营业务支出-主营业务税金及附加+其他业务利润-营业费用-管理费用-财务费用+投资收益+营业外收入-营业务支出
  • 净利润 = 利润总额-所得税
  • 息税前利润 = 利润总额+利息支出
  • 税前利润 = 利润总额
  • 税后利润 = 净利润
  • 归母净利润 = 净利润 - 少数股东损益(母公司未持有子公司股权部分的收益)
  • 扣非归母净利润 = 归母净利润 - 非经常性损益(公司正常经营损益之外的一次性或者偶发性损失)

息税前利润通俗地说就是不扣除利息也不扣除所得税的利润, 顾名思义,是指不支付利息和所得税之前的利润.

毛利率高:说明行业好,业务模式好,竞争不激烈,有钱赚。
毛利率低:说明是夕阳行业,没钱赚,或者竞争太大,打价格战。
净利率高:说明管理水平高,成本和费用控制的好。
净利率低:说明运营效率低,管理水平差,公司不行。
俩都高:说明行业好,公司牛。

这样理解的对不?

12种底部形态特征
https://www.zhihu.com/question/280125504/answer/2228221734

钱:7步创造终身收入
https://book.douban.com/subject/27667390/

7步创造终身收入:

  1. 多存钱 (花小钱,存大钱)
  2. 少上当(只投正路,不被骗钱)
  3. 做规划(这辈子目标要赚到多少钱,需要多久,算下来年化收益目标是多少)
  4. 做资产配置(三个水桶:一 安全安心水桶 只买固定收益,本金安全 二 风险成长水桶 做股票投资房地产投资 三 梦想水桶 追逐梦想)
  5. 稳收入(强烈推荐保险年金)
  6. 学大师(巴菲特达利欧邓普顿等)
  7. 大财富(前面6步都只是小财富,人最大的财富就是健康,活的更爽和更久最重要,最带来幸福感的不是得到,而是付出和给予。不是物质而是激情,不是过去而是未来。

分享下《钱》的完整笔记
https://book.douban.com/review/10111467/


mysql

部署MySQL延迟从库的几个好处
https://blog.51cto.com/imysql/3170546
https://dev.mysql.com/doc/refman/8.0/en/replication-delayed.html

MySQL延迟从库的好处主要有几点:

  • 误删除时,能更快恢复数据。 有时候手抖了,把线上数据给误删除了,或者误删除库、表、其他对象,或不加WHERE条件的更新、删除,都可以让延迟从库在误操作前的时间点停下,然后进行恢复。
  • 把延迟从库作为专用的备份节点。虽然有一定的延迟,但并不影响利用该节点作为备份角色,也不影响生产节点数据库库。
  • 还可以把延迟从库当做一些问题、案例研究的对象。个别时候,可能有些binlog event在普通从库上会有问题(例如早期版本中无主键会导致从库更新非常慢的经典问题),这时就有时间在延迟从库上慢慢琢磨研究了。

php

How do I create a copy of an object in PHP?
https://stackoverflow.com/questions/185934/how-do-i-create-a-copy-of-an-object-in-php

$objectB = clone $objectA;


linux

rc.local

printf '%s\n' '[Install]' 'WantedBy=multi-user.target' 'Alias=rc-local.service' | sudo tee -a /usr/lib/systemd/system/rc-local.service

echo "
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
" >> /usr/lib/systemd/system/rc-local.service

tail /usr/lib/systemd/system/rc-local.service
echo '#!/bin/bash' > /etc/rc.local
chmod +x /etc/rc.local
systemctl enable rc-local
systemctl start rc-local
systemctl status rc-local

iptables

iptables -A INPUT  -i eth0 -p tcp -s 140.143.1.1--dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
iptables -L -n
iptables-save >/etc/iptables-script
cat /etc/iptables-script
iptables-restore </etc/iptables-script
echo '/sbin/iptables-restore </etc/iptables-script' >>/etc/rc.local

linux命令:iptables、modprobe装载模块、网络防火墙服务
https://blog.51cto.com/woyaoxuelinux/1906316

  • iptables 的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。
  • 当内核发展到2.x系列的时候,软件更名为 ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,
  • 而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
  • 他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。
  • 而放入内核的地方必须要是特定的位置,必须是 tcp/ip 的协议栈经过的地方,叫做 netfilter.(网络过滤器)

postgree

PostgreSQL 生成随机数字、字符串、日期、验证码以及 UUID
https://blog.csdn.net/horses/article/details/109215148

生成 0 到 1 之间的随机数

SELECT random();

任意两个数字之间的随机数

low + RANDOM() * (high - low)

elasticsearch

Elasticsearch性能调优之磁盘读写性能优化
https://blog.csdn.net/lm324114/article/details/105029393/

  • 禁用不需要的功能
    • 聚合:doc values
    • 搜索:倒排索引,index
    • 评分:norms
    • 近似匹配:index_options(freqs)
  • 不要用默认的动态 string 类型映射
    • 默认的动态 string 类型映射会将 string 类型的 field 同时映射为 text 类型以及 keyword 类型,这会浪费磁盘空间,因为我们不一定两种都需要。
  • 禁止_all field:
    • _all field会将document中所有field的值都合并在一起进行索引,很耗费空空间,如果不需要一次性对所有的field都进行搜索,那么最好禁用_all field。
  • 使用 best_compression
    • _source field 和其他 field 都很耗费磁盘空间,最好是对其使用 best_compression 进行压缩。
  • 用最小的最合适的数字类型
    • es 支持 4 种数字类型,byte,short,integer,long。如果最小的类型就合适,那么就用最小的类型。

如果我们有一个叫做 foo 的数字类型 field,我们要对这个字段运行 histograms aggr 聚合操作,但是可能我们并不需要对这个字段进行搜索,那么就可以禁止为这个字段生成倒排索引,只需要 doc value 正排索引即可。

"foo": {
    "type": "integer",
    "index": false
}

text 类型的 field 会存储 norm 值,用来计算 doc 的相关度分数,如果我们需要对一个 text field 进行搜索,但是不关心这个 field的分数,那么可以禁用 norm 值。

"foo": {
    "type": "text",
    "norms": false
}

text field 还会存储出现频率以及位置,出现频率也是用来计算相关度分数的,位置是用来进行 phrase query 这种近似匹配操作的,如果我们不需要执行 phrase query 近似匹配,那么可以禁用位置这个属性:

"foo": {
    "type": "text",
    "index_options": "freqs"
}

如果我们不关心相关度频分,我们可以配置 es 仅仅为每个 term 索引对应的 document,我们可以对这个 field 进行搜索,但是 phrase query 这种近似匹配会报错,而且相关度评分会不准确。

"foo": {
    "type": "text",
    "norms": false,
    "index_options": "freqs"
}

基金知识整理

真的是,跌的越多就涨的越好吗?

https://mp.weixin.qq.com/s/aBYGwKIN9mJEUfTF1M1hJw

在熊市期间回撤控制能力强的基金,后面也涨的更好,而熊市期间回撤幅度最大,后市仍然是表现最差的那部分基金,并没有表现出蹲得越深,跳得越高的特征。


基金规模会影响反弹收益吗

规模较小的基金在熊市阶段控制回撤能力方面略有优势,这可能得益于小规模基金具备更灵活的操作的条件,而规模过大的基金则显得尾大不掉,尤其是在遭遇长时间熊市环境,大规模基金在回撤控制方面整体不如规模较小基金;

不论是熊市底部以来的绝对收益还是相对性价比指标来看,50亿以下基金整体表现都更优,尤其是2-10亿与10-50亿两个规模区间的基金表现最为优异,适中偏低规模的基金可能更适合作为底部布局的选项。


什么类型的基金更适合底部布局?

整体而言,指增基金在两轮熊市底部以来的行情中表现都是比较优秀的,是一款性价比较优的布局工具。


我们认为一个比较适合当下进行底部布局的基金或许具有以下组合特征:

适中的规模(2-50亿)+ 最低回撤的一批基金 + 指增基金

中国互联网

中庚基金的丘栋荣在最近的一次直播中提到了互联网行业的机会,他说现在中国互联网行业满足了他投资体系中三个重要的标准:低风险、低估值、高成长性。

跟踪中国互联网行业的被动指数主要有三个:中国互联网30、中国互联网50、恒生科技。

二者最大的区别就是成分股的权重不同,中国互联网50指数更侧重于阿里和腾讯两家巨头企业,两家合计占到了53%的权重。而中国互联网30指数就更加的均衡一些,阿里和腾讯的占比在31%左右,其他的几家互联网公司就获得了更多的占比,比如京东、网易、百度等等。

恒生科技不同于上面的两个指数,恒生科技只有港股,并且也不只有互联网行业,还包括其它在港股市场上市的高科技公司,覆盖的行业更广泛一些。

在具体的投资方式上,目前比较推荐大家采取“底仓+定投”的方式。对于风险承受能力偏低的投资者们,底仓可以选择20%-30%左右,就是如果打算在互联网行业总共投入1万元的话,底仓建立应该用2000至3000元左右,然后再坚持定投。对于风险承受能力较高的投资者,底仓可以选择30%-50%左右。


沪深 300 最大回撤

认清楚市场的本质并摆正心态是长期投资中非常重要的一环,在市场大跌的时候不慌乱,帮助我们拿得住牛基。如果能在克服了自己心魔的情况下,再勇敢的迈出一步,在市场下跌很深的情况下选择加仓,那么最后获取的收益也就更高。

长期来看,伴随着市场每一次深度回调的,就是一次又一次猛烈的上涨。其中,反弹幅度最大的一次是2012年12月4日到2015年6月12日,偏股混合型基金指数累计上涨182.39%,区间年化收益达52.92%。

买在半山腰怎么办?

在自己拥有充裕的可投资资金的情况下,可以选择加仓。还是要根据自己的风险承受能力和仓位管理来做是否加仓的决定,投资过程尽可能的平滑舒适才是最重要的。

我们其实活在一个“运动中平衡”的世界,没有只涨不跌的市场,也没有只跌不涨的市场。投资过程中,最重要的是认清市场和波动的本质,让自己保持一个较为积极的心态,尽可能的摒弃一蹴而就和精确抄底的思维。

我们总说长期投资这里好那里好,其实不是我们多么热衷于放弃资金的流动性,买在一个资产里很多年不动。而是大多数情况下,只有长期投资才能收获更高的回报。长期投资不是目的,而是手段。


基金止盈止损

https://mp.weixin.qq.com/s/PoAdTpH2lscjjVG1KlXA_g

一般主动管理基金,只要基金本身没问题,就建议长期持有,因为长期看净值会持续向上。

高位止盈的方法:

  1. 根据股债利差做大的择时,当股票性价比很低的时候卖出,性价比很高的时候买入。
  2. 估值法。低估(估值百分位低于20%)买入,高估(估值百分位高于80%)卖出。行业基金参考对应行业指数的估值,均衡型基金可以参考大盘指数的估值,或者基金主要布局行业的估值。
  3. 目标收益法。偏股基金的长期年化回报是15%左右,其实想想,我们每年能获得15%的收益已经很不错了,所以在投资的时候也可以保持一份理性和克制,给自己设定一个目标,达到年化15%就收手。在定投的情况下,不能说,我才投了两个月达到15%的回报就卖出,这时你的筹码还太少,止盈没有意义,至少要定投了半年后再考虑止盈的事。
  4. 最大回撤法止盈。这个是目标收益法的升级版,如果市场很好,确实很难做到赚15%就撤,那可以考虑继续持有,但一旦出现回撤就该卖出。比如,赚15%的时候先不卖,如果净值继续上涨,赚20%之后出现回撤,那么可以考虑回撤3%卖出。卖出时也可以灵活采用一次性卖出或者分批卖出。

这四种方法都比较好操作,其他还有一些方法,比如利用均线偏离度等技术指标判进行择时,通过投资者参与热度判断市场位置等,操作起来有些难度,就不多介绍了。

低位止损就是割肉,割在地板上就太亏了,所以一般投资止盈不止损。但以下几种情况要考虑止损。

  1. 基金基本面变差。比如,基金规模暴涨后,基金经理的投资策略、风格发生漂移,业绩变差。或者债券基金经理踩雷,净值出现暴跌等。
  2. 基金经理更换。倒不是说一经更换就立马换,还是要先观察一下,至少一个季度吧,看看接任基金经理的风格、业绩,同时了解一下ta的过往经验,如果与自己想要的风格和目标不符,就要考虑更换了。
  3. 买了不符合自己风险承受能力的基金。如果基金的波动和亏损情况让自己焦虑了,不能很好的生活了,那这项投资不要也罢。
  4. 基金清盘。当基金发布了清盘公告,不论赚钱还是亏钱,都应该及时卖出。

202205

GTP-3算法是一种“暴力美学”的胜利: https://blog.csdn.net/mujie2015/article/details/115472443

李志飞把 GPT-3 形容为“一位科科都是高分的全才”。更让人激动的是,这么一个优秀的学生在学习过程中居然是无监督、完全自主驱动的,也就是学习过程它不需要人们提供有答案的练习题来复习测验(微调模型),只要给他无限多的文本序列,就能自动从文本里学到各种知识。

GPT-3 几乎是把整个互联网的浩瀚内容全部读完了。它总共阅读了大约 5000 亿词,模型大概有 1750 亿参数。系统有上万个 CPU/GPU 在 24 小时不间断地“阅读”任何领域的信息,半个月即可读完整个互联网的内容。猛灌数据量,是这个 AI 模型的“暴力”所在。

这个 GPT-3 这么神奇,他都能干什么?他其实可以做很多事情。比如他可以写作文,你给他开一个头,然后他就可以把整个文章写出来。而且他写出的文章句子非常通顺,更关键的是他段落之间逻辑也非常自洽。

网上有人把 GPT-3 写出来的文章和人类写出的文章给另外一个人判断,到底哪些机器写的,哪些是人类写的,其实人已经很难分出来了,所以他基本上可以以假乱真。


Gitlab Handbook
https://about.gitlab.com/handbook/


最近一周的数据

WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)  AND created_at <=  CURDATE()

statsd

https://github.com/statsd/statsd/blob/master/docs/metric_types.md

statsd 的 Timing mertic 不错,能自动统计周期内数据的分位值,均值,累积,标准差等。

glork:320|ms|@0.1

The glork took 320ms to complete this time. StatsD figures out percentiles, average (mean), standard deviation, sum, lower and upper bounds for the flush interval.

https://blog.csdn.net/liuxiao723846/article/details/109036280

percentThreshold

对于timer数据,除了正常的统计之外还会计算一个百分比的数据(过滤掉峰值数据),默认是90%。可以通过percentThreshold修改这个值或配置多个值。例如在config.js中配置:

//分别计算50%和80%的相关值
percentThreshold: [50, 80]

对于百分数相关的数据需要解释一下。以90为例,statsd会把一个flush期间上报的数据,去掉10%的峰值,即按大小取cnt*90%(四舍五入)个值来计算百分值。假如10s内上报以下10个值:

1,3,5,7,13,9,11,2,4,8

则只取10*90%=9个值,则去掉13。百分值即按剩下的9个值来计算。

$KEY.mean_90   // (1+3+5+7+9+2+11+4+8)/9
$KEY.upper_90  // 11
$KEY.lower_90  // 1

注:没有p99等指标。


分析过程:我们调取了 2021 年全年,好买基金 APP 上全部用户自建基金组合的收益表现情况与公募 FOF 的收益情况进行比较发现:

  • 胜率方面: 2021 年实现正收益的自建基金组合占比为 50.9%,同期 95.83% 的 FOF 基金在 2021 年实现了正收益;
  • 盈利能力方面:正收益的自建基金组合中,超 9 成收益集 中在 5% 以内,收益超过 5% 的自建组合占比仅为 3.66%; 同期,有 49.31% 的 FOF 基金收益在 5% 以内,有 45.83% 的FOF基金实现了 5% 以上的收益。

大家怎么看公墓FOF和现在流行的投顾服务,感觉比自己瞎买基金靠谱很多呀,专业的事让专业的人做,选股,择时,仓位管理,止盈止损,再平衡,都不需要自己操心。


一个类 Handler 有 3 个子类 AHandler, BHandler, CHandler 都有个 handle 方法。本来好好的,但突然 AHandler 支持批量操作了,有了一个 handleMany 方法。

下面哪个方案更好一些?

方案 A:

Class Handler                                  方案 B:
    abstract def handleMany(items)
                                                   Class Handler
Class AHandler extend Handler                          abstract handleMany(items): void
    def handleMany(self, items):                       abstract handle(item): void
        for item in items:                             abstract supportMany(): bool
            self.handle(item)
                                                   def main():
    def handle(item)                                   items = getItems()
        # call one by one api                          handler = getHandler()
                                                       if handler.supportMany():
Class BHandler extend Handler                              handler.handleMany(items)
    def handleMany(items):                             else:
        # call bulk api                                    for item in items:
                                                               handler.handle(item)
def main():
    items = getItems();
    handler = getHandler();
    handler.handleMany(items)

在线预览 office 文件, ppt, word, excel

git clone  https://gitee.com/kekingcn/file-online-preview.git
cd file-online-preview
mvn clean package -DskipTests -Prelease
docker build -t keking/kkfileview .
# 修改样式
https://gitee.com/kekingcn/file-online-preview/blob/master/server/src/main/resources/web/ppt.ftl

docker run -it -p 0.0.0.0:8012:8012 keking/kkfileview

Reddit算法分析 https://blog.csdn.net/yzllz001/article/details/54969248

这种算法的一个问题是,对于那些有争议的文章(赞成票和反对票非常接近),它们不可能排到前列。假定同一时间有两个帖子发表,文章A有1张赞成票(发帖人投的)、0张反对票,文章B有1000张赞成票、1000张反对票,那么A的排名会高于B,这显然不合理。

结论就是,Reddit的排名,基本上由发帖时间决定,超级受欢迎的文章会排在最前面,一般性受欢迎的文章、有争议的文章都不会很靠前。这决定了Reddit是一个符合大众口味的社区,不是一个很激进、可以展示少数派想法的地方。


Snowflake 雪花算法 https://zhuanlan.zhihu.com/p/142123673

分布式系统中ID生成方案,比较简单的是UUID(Universally Unique Identifier,通用唯一识别码),但是其存在两个明显的弊端:

  • 一、UUID是128位的,长度过长;
  • 二、UUID是完全随机的,无法生成递增有序的UUID。

Snowflake 雪花算法,由Twitter提出并开源,可在分布式环境下用于生成唯一ID的算法。该算法生成的是一个64位的ID,故在Java下正好可以通过8字节的long类型存放。

Snowflake 雪花算法生成的ID不是随机的,而是按时间顺序升序排列的;且可以保证在分布式高并发环境下生成的ID不会发生重复


How can I get past a “Repository is not signed…” message when attempting to upgrade Kali Linux from a mounted disk image?
https://superuser.com/questions/1331936/how-can-i-get-past-a-repository-is-not-signed-message-when-attempting-to-upgr

apt-get install 报错

apt-get update --allow-unauthenticated
apt-get update --allow-insecure-repositories

deb [trusted=yes] file:/media/cdrom0 kali-rolling main contrib non-free

彻底弄懂Redis的内存淘汰策略 https://zhuanlan.zhihu.com/p/105587132

Redis中的内存淘汰策略和过期删除策略 https://www.cnblogs.com/xiaowangbangzhu/p/16159367.html

有人往 redis 里放了大量的内容,还设置了永久不过期,需要设置内存淘汰策略,永久 key 也清理。

Redis中共有下面八种内存淘汰策略:

  • volatile-lru:设置了过期时间的key使用LRU算法淘汰;
  • allkeys-lru:所有key使用LRU算法淘汰;
  • volatile-lfu:设置了过期时间的key使用LFU算法淘汰;
  • allkeys-lfu:所有key使用LFU算法淘汰;
  • volatile-random:设置了过期时间的key使用随机淘汰;
  • allkeys-random:所有key使用随机淘汰;
  • volatile-ttl:设置了过期时间的key根据过期时间淘汰,越早过期越早淘汰;
  • noeviction:默认策略,当内存达到设置的最大值时,所有申请内存的操作都会报错(如set,lpush等),只读操作如get命令可以正常执行;

https://github.com/hexojs/hexo-renderer-markdown-it

hexo 默认的 markdown 解析器,不支持标题自动加锚点,可以用这个插件来解决。

$ npm un hexo-renderer-marked --save
$ npm i hexo-renderer-markdown-it --save

配置如下, 要启用 permalink ,在标题左边会加一个链接,分享这个链接,别人打开后可以直接定位到具体的位置。 另外 level: 2 表示二级标题才会生成链接,一级标题不会。

markdown:
  preset: 'default'
  render:
    html: true
    xhtmlOut: false
    langPrefix: 'language-'
    breaks: true
    linkify: true
    typographer: true
    quotes: '“”‘’'
  enable_rules:
  disable_rules:
  plugins:
  anchors:
    level: 2
    collisionSuffix: ''
    permalink: true 
    permalinkClass: 'header-anchor'
    permalinkSide: 'left'
    permalinkSymbol: '¶'
    case: 0
    separator: '-'

CloudWatch Logs Insights query syntax
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html

cloudwatch 查询语法中的几个常用指标聚合函数

  • avg(fieldName: NumericLogField): The average of the values in the specified field.
  • count_distinct(fieldName: LogField): Returns the number of unique values for the field. If the field has very high cardinality (contains many unique values), the value returned by count_distinct is just an approximation.
  • pct(fieldName: LogFieldValue, percent: number): A percentile indicates the relative standing of a value in a dataset. For example, pct(@duration, 95) returns the @duration value at which 95 percent of the values of @duration are lower than this value, and 5 percent are higher than this value.
  • stddev(fieldName: NumericLogField): The standard deviation of the values in the specified field.

查看 mysql 的数据目录

mysql> show variables like '%datadir%';
+---------------+---------------------------+
| Variable_name | Value                     |
+---------------+---------------------------+
| datadir       | /data_xxx/mysql_data_dir/ |
+---------------+---------------------------+
1 row in set (0.00 sec)

自建博客图床
https://blog.csdn.net/dysonya/article/details/123569457

PicGo
https://github.com/Molunerfinn/PicGo/releases
https://picgo.github.io/PicGo-Doc/zh/guide/config.html

可以用阿里云 OSS 或 腾讯云 COS 做存储。配置腾讯云 COS 后,如果提示下面的错误,可尝试切换下 API 的版本,默认是 V5,切换到 V4 就能解决。

StatusCodeError: 403 - "You do not have permission to get URL 'xxx' from this server."

有一点不太好的地方就是 PicGo 帮助文档里写的是使用全局的 SecreId 和 SccreKey,权限上给的有点大,应该新建一个 CAM 子账户,设置只能访问某个对象存储的桶,并生成一对密钥访问 API 更安全一些。

测试一张图片


word count

mysql 里如何统计一个字符串里某个字符出现的次数呢?
https://bookofzeus.com/articles/mysql/count-the-number-of-occurrences-of-a-char-in-mysql/

mysql> select `id`, `url`, LENGTH(`url`) - LENGTH(REPLACE(`url`, '/', '')) as `number` from `url`;
+----+-------------------------------+--------+
| id | url                           | number |
+----+-------------------------------+--------+
|  1 | http://www.thesunrisepost.com |      2 |
+----+-------------------------------+--------+

统计一个文本里单词个数

mysql> set @text=' aa bbb  cccc   ddddd ';select length(REGEXP_REPLACE(TRIM(@text), ' +', ' '))-length(REPLACE(REGEXP_REPLACE(TRIM(@text), ' +', ' '),' ','')) +1 word_count;
Query OK, 0 rows affected (0.00 sec)

+------------+
| word_count |
+------------+
|          4 |
+------------+
1 row in set (0.00 sec)

mysql regex replace

How to do a regular expression replace in MySQL?
https://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql

# for mariadb
SELECT REGEXP_REPLACE("stackoverflow", "(stack)(over)(flow)", '\\2 - \\1 - \\3')
over - stack - flow

# for mysql 8.0
mysql> SELECT REGEXP_REPLACE("stackoverflow", "(stack)(over)(flow)", '$2 - $1 - $3');
+------------------------------------------------------------------------+
| REGEXP_REPLACE("stackoverflow", "(stack)(over)(flow)", '$2 - $1 - $3') |
+------------------------------------------------------------------------+
| over - stack - flow                                                    |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF('ABC1' REGEXP 'ABC[0-9]$','ABC','ABC1');
+--------------------------------------------+
| IF('ABC1' REGEXP 'ABC[0-9]$','ABC','ABC1') |
+--------------------------------------------+
| ABC                                        |
+--------------------------------------------+

mysqldump -u user -p database table > dump.sql
find /path/to/dump.sql -type f -exec sed -i 's/old_string/new_string/g' {} \;
mysqlimport -u user -p database table < dump.sql

你可能在一个人面前,一文不值;却在另一个人面前,是无价之宝。做你自己,爱你的人,自然爱你。谨记自己的价值所在,这就是,人活着的道理。

—— 杨绛

投资中不要去追求完美,追求完美的人就算告诉你什么时候买卖你都会失败,因为你总想买在最低卖在最高,结果导致你不是踏空就是坐过山车!退而求其次方为可把握的正道。买在次低位,卖在次高位,我很满足,方可持续。

别人本质上是没办法让你自卑的。让你自卑的是你的想法或内在的自我攻击。

“少研究别人,多提升自己,不是成功来的慢,是你努力的不够狠,努力只能及格,拼命才能优秀。”

其实,大多数餐饮店,顾客根本不在意你装修啥样,弄那么多花样,根本不加分。吃的东西弄干净一点,桌子椅子方便就行,又不是当皇上来了,弄个死沉死沉的太师椅干啥啊?傻乎乎的。

人和人之间最大的差距,不是智商的差距,而是目标清晰度的差距。如果整天不知道自己想要什么,五迷三道,那么实际上是丧失了对生活的热忱。麻木僵硬,行尸走肉;虽然活着,但已经死了。简称:活死人。

我看过90年代的下岗潮、房地产泡沫、感受过08年股灾,从来没有看到过,像现在这么大的裁员、那么多店关闭,以及,今天又看到,这么多银行沦陷。从来没有。

形式很不好了,大家要保全实力:
1、不要贷款
2、不要高消费
3、好好工作
4、积极锻炼
5、好好吃饭、好好睡觉
6、不要借钱给别人
7、不要和别人(包括同事)发生争执
8、多读书、考证、练技能

想的时间越长,就越不想去干。 我猜是大脑对此太熟悉,就以为自己已经干过了。

每个人都有自己的长处,这句话小时候都听过吧?这句话的正确理解是,你总能找到一个方向,让你饿不死能混口饭吃,而不是你踢球不行换了体操就能打进世锦赛奥运会争金牌了。

你的孩子病了,你陷入了繁重的债务。接下来是家里的事,你的另一半花光了所有积蓄,留下孩子和一堆账单离开了你。就别再提什么去夜校学习了。在评价别人之前,要记住努力并不代表所有,而且每个人的努力也并非建立在同样公平的前提之上。——卡罗尔·德韦克《终身成长》


java hello world

Java包的定义及使用
https://www.jianshu.com/p/c798a019f2ec

编码

$ vi Hello.java
package com.ihuhao.demo;

public class Hello {
    public static void main(String args[]) {
        System.out.println("Hello world !");
    }
}

编译执行

$ javac -d . Hello.java
$ tree
.
├── com
│   └── ihuhao
│       └── demo
│           └── Hello.class
├── Hello.java

$ java com.ihuhao.demo.Hello

打包执行

$ jar -cvf my.jar com
$ rm com -rf
$ java -classpath './my.jar' com.ihuhao.demo.Hello

java 使用第三方库

Maven Repository 网站搜索需要的 jar 包: https://mvnrepository.com/artifact/com.google.code.gson/gson

$ mkdir lib
$ cd lib
$ wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar
$ cd ..

$ vi GsonTest.java
package com.ihuhao.demo;

import java.util.HashMap;
import java.util.Arrays;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GsonTest {
    public static void main(String args[]) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "wawa");
        map.put("age", 18);
        map.put("skills", Arrays.asList("吃饭", "睡觉", "打豆豆"));

        String json  = gson.toJson(map);
        System.err.println(json);
    }
}

$ javac  -classpath './lib/gson-2.9.0.jar' -d . GsonTest.java
$ java -classpath '.:./lib/gson-2.9.0.jar' com.ihuhao.demo.GsonTest
{
  "skills": [
    "吃饭",
    "睡觉",
    "打豆豆"
  ],
  "name": "wawa",
  "age": 18
}

本地编译的 java 程序,依赖的 JDK 库和编译时用的 java 编译器,都要和生产环境一致,否则运行时会报错。
本地的 Tomcat 版本和 生成环境也要一致。


java arrays

import java.util.Arrays;

public class ArraysTest {
    public static void main(String[] args) {
        int[][] nums = {{1,2},{3,4}};
        System.out.println(Arrays.deepToString(nums));

        int a[] = new int[] { 18, 62, 68, 82, 65, 9 };
        Arrays.sort(a);
        System.out.println(Arrays.toString(a));
        System.out.println("数字 62出现的位置:"+Arrays.binarySearch(a, 62));
    }
}

vim 开发 java

常见的代码块快捷键:.vim/plugged/vim-snippets/snippets/java.snippets

im
    import java.util.; 
cl
    public class ArraysTest {

    }
main
    public static void main(String[] args) {

    }
sout 
    System.out.println(); 
d.al     
    List<Object> list = new ArrayList<Object>();
d.hm
    Map<Object, Object> map = new HashMap<Object, Object>();

设置 F5 编译运行

$ vim ~/.vimrc
" 当前文件为 java 时 F5 自动编译运行
autocmd FileType java nnoremap <buffer> <F5> :!javac %&&java %:r<CR>

vim 开发 java 最精简配置,写点测试代码,算法代码很方便。


vim 映射

Vimscript 基本映射 https://www.w3cschool.cn/vim/mh1uyozt.html

" 映射普通键
:map - x
" 映射空格
:map <space> viw
" 映射 ctrl + d
:map <c-d> dd

Vimscript 模式映射 https://www.w3cschool.cn/vim/n41ghozt.html

你可以使用nmap、vmap和imap命令分别指定映射仅在normal、visual、insert模式有效。

Vimscript 精确映射 https://www.w3cschool.cn/vim/sxjqcozt.html

Vim提供另一组映射命令,这些命令创建的映射在运行时 不会 进行递归。

:nmap x dd
:nnoremap \ x

每一个map系列的命令都有个对应的noremap命令,包括:noremap/nnoremap、 vnoremap和inoremap。这些命令将不递归解释映射的内容。

该何时使用这些非递归的映射命令呢? 答案是: 任何时候 。

Vimscript Leaders https://www.w3cschool.cn/vim/8y7cnozt.html

:let mapleader = "-"
:nnoremap <leader>d dd

快捷键映射

:nnoremap          <leader>d dd
:nnoremap <buffer> <leader>x dd

表示只在定义它的那个缓冲区中有效。


vim 命令大全

https://www.w3cschool.cn/vim/cjtr1pu3.html


使用Zerotier+Moon结点内网穿透
https://blog.csdn.net/it_LiChengwei/article/details/120934792

zerotier定义了几个专业名词:
PLANET 行星级的服务器,zerotier各地的根服务器,有日本、新加坡等地。
MOON 卫星级服务器,用户自建的私有根服务器,起到中转加速的作用。
LEAF 相当于各个枝叶,就是每台连接到该网络的机器节点。

使用VPS免费搭建Zerotier Moon
https://zhuanlan.zhihu.com/p/405979685

Zerotier可以组建P2P直连虚拟局域网,你可以在公司使用微软自带的远程连接直连自己公司的电脑,访问共享远程控制等。想要P2P访问必须先通过一个中继服务器握手或者转发流量,官方节点速度很慢,所以最好自己搭建Moon节点中继。

Moon节点要求不能DDNS,所以家里公网IP也没法搭,而且由于P2P不成功的话,必需通过Moon中继流量,所以最好使用国内的VPS。


jetty

Jetty 使用教程

Jetty 是一个提供 HTTP 服务器、HTTP 客户端和 javax.servlet 容器的开源项目。

export JETTY_HOME="/home/ubuntu/download/jetty-distribution-9.4.46.v20220331"
cd $JETTY_HOME/demo-base/
java -jar $JETTY_HOME/start.jar
java -jar $JETTY_HOME/start.jar --list-modules
java -jar %JETTY_HOME/start.jar --list-config

JETTY_BASE=/tmp/mybase
mkdir $JETTY_BASE
java -jar $JETTY_HOME/start.jar --add-to-startd=http,deploy
cp $JETTY_HOME/demo-base/webapps/async-rest.war webapps/ROOT.war
java -jar $JETTY_HOME/start.jar

jetty、jetty原理、jetty与tomcat区别

jetty特点

  • jetty是异步的,支持更高的并发量
  • jetty更灵活,更加轻量,更容易定制,更高的资源利用率
  • Jetty 默认采用的 NIO 模型,jetty能很好支持长链接
  • 集成简单,应用只要集成jetty,应用就可以快速支持 http 服务

jetty与tomcat区别

  • Jetty 比 Tomcat 架构更加简单。
    • jetty的所有组件都是基于 Handler 来实现,它的主要功能扩展都可以用 Handler 来实现;
    • Tomcat 的整体设计上很复杂,tomcat是基于容器的架构,开发者要想扩展tomcat功能就需要了解tomcat架构,遵循tomcat的规范。
  • jetty比较容易扩展第三方框架,所以也跟容易定制
  • jetty更加轻量可以节省内存
  • tomcat更加稳定、更加成熟,在企业级中占有率很大

C 语言计时

https://blog.csdn.net/fz_ywj/article/details/8109368

  • time_t time(time_t * timer):
    • C 标准库中的函数,可移植性最好,性能也很稳定,但精度太低,只能精确到秒,对于一般的事件计时还算够用,而对运算时间的计时就明显不够用了。
    • 用 difftime 函数可以计算两个 time_t 类型的时间的差值,可以用于计时。用 difftime(t2,t1) 要比 t2-t1 更准确,因为 C 标准中并没有规定 time_t 的单位一定是秒,而 difftime 会根据机器进行转换,更可靠。
  • clock_t clock(void):
    • 该函数返回值是硬件滴答数,要换算成秒,需要除以 CLOCKS_PER_SEC。
    • 可以精确到毫秒,适合一般场合的使用。
  • int gettimeofday(struct timeval *tv,struct timezone *tz);
    • 其参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果(若不使用则传入NULL即可)。
    • 使用这种方式计时,精度可达微秒。经验证,在arm+linux的环境下此函数仍可使用。推荐。

code

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
#include <time.h>
#include <stdio.h>
#include <math.h>
#include <sys/time.h>

int main(int argc, char *argv[])
{
time_t start1, end1;
start1 = time(NULL);
for (int i = 0; i < 300000000; ++i) sqrt(i);
end1 = time(NULL);
printf("time=%f\n", difftime(end1, start1));

clock_t start2, end2;
start2 = clock();
for (int i = 0; i < 300000000; ++i) sqrt(i);
end2 = clock();
printf("time2=%f\n",(double)(end2-start2)/CLOCKS_PER_SEC);

struct timeval start3, end3;
gettimeofday(&start3, NULL );
for (int i = 0; i < 300000000; ++i) sqrt(i);
gettimeofday(&end3, NULL );
long timeuse =1000000 * (end3.tv_sec - start3.tv_sec ) + end3.tv_usec - start3.tv_usec;
printf("time3=%f\n",timeuse /1000000.0);

return 0;
}

$ gcc 042.c -lm && ./a.out
time=3.000000
time2=2.407064
time3=2.460698

把这句翻译成英文:这是小明做的我们和其它公司收入的对比结果。

  • youdao: This is the result of comparing our revenue with that of other companies made by Xiaoming.
  • youdao2: This is xiao Ming do we and other comparison results of the company’s revenues.
  • baidu: This is the result of Xiaoming’s comparison of our income with that of other companies.
  • deepl: This is the result of the comparison of our revenue with other companies made by Xiaoming.
  • google:This is Xiao Ming’s comparison of our revenue with other companies.
  • bing:This is the result of Bob’s comparison of our revenue with other companies.
  • a: This is a revenue comparison made by Xiaoming between our company and other companies.
  • b: this is the result of compare of our and other companies on revenue which is by xiaoming.

大家觉得哪个翻译的好一些。


Nix 会超越 Docker 吗?https://www.163.com/dy/article/H5QCFQGO0511FQO9.html

  • Docker 镜像只是 Docker 提供的一小部分,Docker 为整个容器生态系统提供了工具。 而 Nix 的设计旨在构建可重现的包和环境。
  • 如果你的目的是构建可重现的开发环境,则选用 Nix 更合适。
  • 如果你希望寻找一种方法来构建、打包和部署自己的服务,则 Docker 提供的更丰富的工具更适合你。毕竟,容器乃是如今部署 Web 服务的标准方式。

Nix从0到0.1(神奇的包管理工具)https://zhuanlan.zhihu.com/p/392711598

  • Nix作为一个包管理工具,不仅仅完成了管理包的职能,还兼具了快速搭建环境、创建不同版本开发环境的职能,对于需要同一开发工具的同学来说也算是一个很有用的地方吧。
  • 对同一环境会有对应的历史记录,支持版本回滚。
  • Nix支持环境配置文件的编写,在任何一台装有Nix的机器上面都可以实现环境的完美复原,对外部的依赖只有Nix,而且对本身系统所安装的东西影响几乎为零,在我看来安全性也是有所保证的。

Postgresql关于wal日志总结,一文搞清楚它的所有概念和相关操作
https://blog.csdn.net/lusklusklusk/article/details/123603833

简单地说,WAL的核心概念是,对数据文件(表和索引所在的地方)的更改必须在写入了日志文件后这些更改之后才可以写入数据文件,也就是说,描述更改的日志记录被刷新到永久存储之后才可以写数据文件。

使用WAL可以显著减少磁盘写操作的数量,因为只需要将日志文件刷新到磁盘以确保提交事务,而不是事务更改的每个数据文件。日志文件是按顺序写入的,因此同步日志的成本要比刷新数据页的成本低得多。

备注:数据库将脏数据刷到数据文件上,这个动作是随机I/O,性能比写日志的顺序I/O差太多

总结

  • WAL即Write Ahead Log预写式日志,简称wal日志,相当于oracle中的redo日志。只是oracle中redo是固定几个redo日志文件,然后轮着切换去写入。pg中wal日志是动态切换,单个wal日志写满继续写下一个wal日志,连续不断生成wal日志。
  • 单个WAL文件的大小,默认为16MB,参数是wal_segment_size,可以理解为PG把Wal日志存储到N个大小为16M(默认值)的WAL segment file,一般不做更改
  • 如果使用了 WAL 归档,旧的段在被归档之前不能被不能删除或回收,直到它们被归档。如果WAL归档跟不上WAL生成的速度,或者archive_command重复失败,旧的WAL文件将在pg_wal中累积,直到问题解决。
  • 如果max_wal_size和wal_keep_segments没起作用导致wal_pg目录下面的wal日志文件不自动删除从而越来越多,原因主要是负载过重、archive_command失败或wal_keep_segments设置过高
  • 正常情况下pg_wal目录下的wal文件为在线WAL日志,不能删除,删除后如果遇到数据库重启则会丢失数据
  • pg_wal日志没有设置保留周期的参数,即没有类似mysql的参数expire_logs_days,在检查点之后,当旧的wal日志文件不再需要时,它们将被删除或回收(按编号顺序重命名为将来的段)。
  • PostgreSQL在写入频繁的场景中,会产生大量的WAL日志,而且WAL日志量会远远超过实际更新的数据量,这就叫做“WAL写放大”,产生的原因主要有以下两点。说个题外话当年Uber也是这个原因之一把pg切换成了mysql,参见https://eng.uber.com/postgres-to-mysql-migration/
    • full page writes,PostgreSQL会在一个checkpoint检查点之后的页面的第一次修改期间将每个页面的全部内容写到Wal文件
    • update时如果新记录位置发生变更,索引记录也要相应变更,这个变更也要记入WAL。而索引记录的变更又有可能导致索引页的全页写,进一步加剧了把内容写到Wal文件。

PostgreSQL之wal_keep_segments参数
https://blog.csdn.net/qq_35462323/article/details/115381735


what does %WCPU column mean in TOP output ?
https://community.hpe.com/t5/HP-UX-General/what-does-WCPU-column-mean-in-TOP-output/td-p/3011779

%WCPU is “Weighted CPU (central processing unit) percentage”

%CPU is “Raw CPU percentage. This field is used to sort the top processes”.

The %WCPU is just a ‘forecast’ value for the process. It really has no real world value. It’s value is totally controlled by the scheduler.

The man page for top(1) indicates that %CPU is the “Raw CPU percentage. This field is used to sort the top processes”.

Well, the %CPU is the total percentage without the ‘forecast’ factor built-in, such as a ‘raw value.’


PostgreSQL 如何查找TOP SQL (例如IO消耗最高的SQL)
https://blog.csdn.net/weixin_34102807/article/details/90588528

资源分为多个维度,CPU,内存,IO等。如何能了解各个维度层面的TOP SQL呢?

pg_stat_statements插件可以用于统计数据库的资源开销,分析TOP SQL。


一分钟抓一次耗费CPU最高的进程

1
2
3
4
5
6
7
8
9
10
11
$ cat cron_cpu_stat.sh
date
ps -Ao pid,pcpu,pmem,cmd --sort=-pcpu | head -n 10
echo '==================='

$ sudo touch /var/log/cpu_stat.log
$ sudo chown $USER /var/log/cpu_stat.log
$ ls -l /var/log/cpu_stat.log
$ crontab -l
* * * * * cd /home/ubuntu && bash cron_cpu_stat.sh >> /var/log/cpu_stat.log 2>&1
$ tail -f /var/log/cpu_stat.log

How to Check Cron Logs on Ubuntu 18.04
https://linoxide.com/check-cron-logs-ubuntu/

ubuntu 上单独查看 crontab 的日志

sudo vi  /etc/rsyslog.d/50-default.conf

    cron.* /var/log/cron.log

sudo systemctl restart rsyslog

tail -f /var/log/cron.log

一组语料,如何提取出现频率最高的短语,而不是单词,比如

good morning Sir.
good morning teacher.
good morning class.
good afternoon Sir.
good afternoon teacher.

我要得到出现次数最多的 top 2 的短语 “good morning” 和 “good afternoon”
而不是出现次数最多的 top 2 的单词 “good” 和 “morning”

算法复杂度大概是多少?


计算一组数据的分散程度

How to Calculate the Coefficient of Variation in Python
https://www.statology.org/coefficient-of-variation-in-python/

Python统计学(四)——离散性测度
https://zhuanlan.zhihu.com/p/344919136

  • 极差的概念很容易理解,一个样本中最大与最小观测值之间的差异称为极差(range)
  • 平均离差就是样本中全部数值与它们均值变动的平均数量来度量离散程度。
  • 分位数也叫百分位数,最常使用的有四分位数(25,50,75),五分位数(20,40,60,80)和百分位数(10,20,30,…,90)。
  • 方差和标准差是日常统计中应用非常广泛而且频繁的指标之一
  • 方差的量纲是原数据量纲的平方,标准差的量纲跟原数据的量纲是一样的,这就是为什么标准差运用得比方差更广泛。但是,在不同量纲的数据之间做比较时,标准差就不能使用了,因为单位都不一样,不用简单作比较。这个时候变异系数(coefficient of variation, CV)就派上用场了。变异系数就是标准差除以均值的百分比,变异系数是一个无量纲的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> np.std([2,2,2,2,2])
0.0
>>> np.std([8,2,0,0,0])
3.0983866769659336
>>> np.median([2,2,2,2,2])
2.0
>>> np.median([8,2,0,0,0])
0.0
>>> cv = lambda x: np.std(x, ddof=1) / np.mean(x) * 100
>>> cv([2,2,2,2,2])
0.0
>>> cv([8,2,0,0,0])
173.20508075688772

Python统计学(三)——位置测度
https://zhuanlan.zhihu.com/p/344780317

  • 样本均值(算术平均数)
  • 加权平均数是算术平均数的一种特殊情形。当有几个相同数值的观测值时,算术平均数就会变成加权平均数。
  • 中位数:将一组数据从最小到最大、或者从最大到最小排序以后,位于中点的数值。
  • 众数:在一个样本的所有观察值中,发生频率最大的一个值称为样本的众数。
  • 几何平均数在商业、工业、金融当中应用非常广泛,特别是涉及到随时间推移的平均变动时,几何平均数就派上用场。比如计算营业额增长率、复利、GDP等。
  • 调和平均数仅适合于有限数量的应用情形,比如计算股票的平均成本等。它是对于观测值的倒数进行求和后再求平均,最后将平均值求倒数后得到。

Python统计学(五)——切比雪夫、偏度及峰度
https://zhuanlan.zhihu.com/p/346810231

  • 当得知样本观察值呈正态分布时,可以用前面的正态经验法则来评估数据大约有多大比例集中在什么范围内;当然,如果不清楚数据分布情况,或者数据分布不是正态分布,那么我们可以利用切比雪夫定理来做评估。
  • 一个分布如果不对称,则被称为偏度。分布有对称、正偏(右偏)、负偏(左偏)。正偏的分布表现出右侧长尾,负偏的分布具有左侧长尾。正偏的单峰分布,其众数要小于中位数,而中位数又小于均值;负偏的单峰分布刚好相反。
  • 一个分布如果不对称,则被称为偏度。分布有对称、正偏(右偏)、负偏(左偏)。正偏的分布表现出右侧长尾,负偏的分布具有左侧长尾。正偏的单峰分布,其众数要小于中位数,而中位数又小于均值;负偏的单峰分布刚好相反。
  • 峰度是一个统计度量指标,它告诉我们一个分布的峰值比正态分布更高还是更低。标准差越小,曲线越陡;标准差越大,曲线越平缓。
  • 一个分布的峰值如果比正态分布要大,称其为尖峰的(leptokurtic),一个分布的峰度如果等于正态分布,称其为中峰的(mesokurtic),一个分布的峰度如果比正态分布要小,称其为低峰的(platykurtic)。
  • 对于所有正态分布来说峰度等于3,许多统计软件会给出超额峰度(excess kurtosis),也就是峰度减去3之后的值。一个正态分布或者其他中峰分布的超额峰度为0, 一个尖峰分布的超额峰度大于0,一个低峰分布的超额峰度小于0。
  • 标准差会影响正态分布曲线的高度,值均的不同会让曲线进行左右平移。

Statsmodels 统计包之 OLS 回归
https://blog.csdn.net/qq_17119267/article/details/79108333

jupyter 里输出表格

1
2
3
4
5
6
7
from IPython.display import HTML, display
import tabulate
table = [["Sun",696000,1989100000],
["Earth",6371,5973.6],
["Moon",1737,73.5],
["Mars",3390,641.85]]
display(HTML(tabulate.tabulate(table, tablefmt='html')))

How do I output lists as a table in Jupyter notebook?
https://newbedev.com/how-do-i-output-lists-as-a-table-in-jupyter-notebook

tabulate:在 Python 中可如此优雅地创建表格
https://zhuanlan.zhihu.com/p/485136394


How we improved DNS record build speed by more than 4,000x
https://blog.cloudflare.com/dns-build-improvement/


python matplotlib 双y轴图像实现
https://blog.csdn.net/weixin_48964486/article/details/124134584

其中第一个坐标系正常创建,第二个坐标系则使用专有的 twinx() 方法创建。因为有了两个 y 轴,如果再简单地使用 plt.ylabel() 等方法,则只能操作到左轴,而影响不到右轴。

data1 = [random.randint(1,50) for x in range(10)]
data2 = [random.randint(1,1000) for x in range(10)]

fig = plt.figure(figsize=(10, 8))

ax1 = fig.add_subplot(111)
ax1.set_ylabel('左 Y 轴')
ax1.plot(data1)

ax2 = ax1.twinx()
ax2.plot(data2, color='#3399ff', linestyle='--', marker='o', linewidth=2)
ax2.set_ylabel('右 Y 轴')

plt.show()

数学

实践线性规划:使用 Python 进行优化
https://bbs.huaweicloud.com/blogs/317032

线性规划是数学规划中使用的一组技术,有时称为数学优化,用于求解线性方程组和不等式系统,同时最大化或最小化某些线性函数。它在科学计算、经济学、技术科学、制造、运输、军事、管理、能源等领域很重要。

用python解决线性规划
https://bbs.huaweicloud.com/blogs/317032

Numpy中np.dot与np.matmul的区别
https://blog.csdn.net/ACTerminate/article/details/96151132

python实现最小二乘法
https://www.csdn.net/tags/MtTaIg1sMDc5MTQtYmxvZwO0O0OO0O0O.html

Python最小二乘法拟合与作图
https://www.jianshu.com/p/8850b94ec61c

线性代数下的最小二乘法及numpy运算案例
https://zhuanlan.zhihu.com/p/369173593

def least_squares(x,y):
    ones = np.ones((len(x)))
    A = np.c_[ones,x]
    ATA = A.T.dot(A)
    ATb = A.T.dot(y)
    inv_ATA = np.linalg.inv(ATA)
    solution = inv_ATA.dot(ATb)
    return solution

Python手工实现朴素贝叶斯分类及预测
https://zhuanlan.zhihu.com/p/486313053

简洁高斯朴素贝叶斯分类原理及python实现
https://blog.csdn.net/qq_45656248/article/details/118796503
https://baijiahao.baidu.com/s?id=1691227678810779479&wfr=spider&for=pc

这是每个数据科学职业生涯开始时的经典:朴素贝叶斯分类器。或者更应该说是朴素贝叶斯分类器家族,因为它们有很多种风格例如,有多项式朴素贝叶斯,伯努利朴素贝叶斯,还有高斯朴素贝叶斯分类器,每个分类器在一个小细节上都不同,我们会发现:朴素贝叶斯算法在设计上非常简单,但在许多复杂的实际情况下被证明是有用的。

Numpy实现NaiveBayes(朴素贝叶斯)
https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/121558563

numpy实现朴素贝叶斯模型(高斯分布)
https://www.jianshu.com/p/efa980944235

数值分析-雅克比迭代法
https://blog.csdn.net/ITGGU/article/details/122169136


postgree 的终端工具 psql 里输入 \x on 可以让输出结果按列显示,相当于 mysql client里的 \G


蒙特卡洛模拟股票曲线,设置均值,标准差,以及跳空高开和跳空低开的概率
https://github.com/boyac/pyOptionPricing

用python动手实践与学习大数定律与中心极限定理
https://zhuanlan.zhihu.com/p/394395551

各种分布的随机数生成器
https://numpy.org/doc/stable/reference/random/generator.html#distributions
https://blog.csdn.net/weixin_42029738/article/details/81977492

离散分布的相关对象,每个对象有概率质量函数,累计分布函数,百分位函数,分布描述这些
https://docs.scipy.org/doc/scipy/reference/stats.html#discrete-distributions

  • rvs(n, p, loc=0, size=1, random_state=None) Random variates.
  • pmf(k, n, p, loc=0) Probability mass function.
  • cdf(k, n, p, loc=0) Cumulative distribution function.
  • ppf(q, n, p, loc=0) Percent point function (inverse of cdf — percentiles).
  • stats(n, p, loc=0, moments=’mv’) Mean(‘m’), variance(‘v’), skew(‘s’), and/or kurtosis(‘k’).

给博客启用HTTPS证书

开启443端口

1
2
3
# iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
# service iptables save

申请证书

生成用户标识私钥和域名证书私钥

1
2
3
4
mkdir -p /data/ssl
cd /data/ssl
openssl genrsa 4096 > account.key
openssl genrsa 4096 > domain.key

生成证书请求文件

openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:ihuhao.com,DNS:www.ihuhao.com,DNS:app.ihuhao.com")) > domain.csr

使用acme-tiny脚本到Let's Encrypt 申请证书, 下载acme_tiny脚本

wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

创建一个目录用于存放证书验证过程中的临时文件

mkdir  /data/www/challenges/

设置nginx, 以blog.ihuhao.com为例, 如下

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
server {
listen 80;
listen 443 ssl;
server_name blog.ihuhao.com;

ssl_certificate /data/ssl/chained.pem;
ssl_certificate_key /data/ssl/domain.key;

ssl_prefer_server_ciphers on;
ssl_dhparam /data/ssl/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

add_header Strict-Transport-Security max-age=63072000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

location ^~ /.well-known/acme-challenge/ {
alias /data/www/challenges/;
autoindex on;
}

location / {
alias /home/wawa/src/onlytiancai.github.io/;
expires 1h;
autoindex on;
}

}

执行脚本,申请证书

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /data/www/challenges/ > ./signed.crt

脚本执行过程中,会在/data/www/challenges目录下生成一个随机文件,然后Let's Encrypt会访问http://blog.ihuhao.com/.well-known/acme-challenge/下的文件用于验证域名,所以上面的nginx配置要配置好,整个脚本才能执行成功。

下载中间证书,并和上一步生成的crt粘合在一起,生成nginx使用的证书。

1
2
wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

nginx配置,上面已经贴过了,证书路径,证书私钥路径,证书参数配置等都配好了,刷新下nginx配置,网站就可以用https访问了。

/usr/local/nginx/sbin/nginx -s reload

hexo改动

因为上面的nginx配置开启了HSTS, 但hexo的yilia模版里有的地方强引用了http的脚本,所以要做适当的修改,目前主要有如下两个路径

./themes/yilia/layout/_partial/after-footer.ejs
./themes/yilia/layout/_partial/mathjax.ejs

http://xxx改成//xxx,然后hexo generate生成一下博客就可以了

参考链接

腾讯云主机迁移

以前在广州区买的共享核主机,不能续费了,官方给发了代金券,免费升级到独立核的1核1G主机,所以就重新买了北京机房的云主机,要把以前的数据全部导过来。

安装好Centos6.5 64bit,安全组选了开放所有端口,然后自己用iptables做安全限制就行。

先用vnc以root登录,密码在邮件发给你了,新建wawa用户,设置密码,用visudo设置允许无密码sudo,配置sshd config把root的ssh登录关了,端口换成非22端口, 允许ssh登录,允许密码登录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
useradd wawa
passwd wawa

visudo

wawa ALL=(ALL) NOPASSWD: ALL

vi /etc/ssh/sshd_config

Port 36000
PermitRootLogin no
AllowUsers wawa
PasswordAuthentication yes
ChallengeResponseAuthentication yes

service sshd reload

然后就可以用putty登录wawa账户了。

旧机器上把要迁移的数据打包, 主要有Let’s Encrypt的脚本,.vim, .vimrc,.bashrc,.bash_profile,crontab, rc.local, nginx配置,.ssh等

1
2
3
4
5
6
7
tar zcfv bk.tar.gz \
/usr/local/nginx/conf/nginx.conf \
/var/spool/cron/root \
/etc/rc.d/rc.local \
/data/ssl/ \
.vimrc .vim .gitconfig .bashrc .bash_profile .ssh/ \
scripts/ src/ readme

打包了,想办法下周到新机器上,解压,大多文件放home目录就可以了,nginx配置,rc.local, crontab, let’s encrypt得重新对一遍。

安装必备环境,git, nginx, python, node。

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
sudo yum gcc
sudo yum install gcc-c++
sudo yum install make
sudo yum install sqlite-devel
sudo yum install zlib-devel
sudo yum install readline-devel
sudo yum install bzip2-devel
sudo yum install git
sudo yum install pcre pcre-devel
sudo yum install openssl-devel
yum install mysql-devel

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
nvm install 5.0

wget https://www.python.org/ftp/python/2.7.7/Python-2.7.7.tgz --no-check-certificate
tar xf Python-2.7.7.tgz
cd Python-2.7.7
./configure --prefix=/usr/local
make
sudo make install
/usr/local/bin/python -V

wget http://nginx.org/download/nginx-1.9.12.tar.gz
tar xf nginx-1.9.12.tar.gz
cd nginx-1.9.12
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
make
sudo make install
sudo /usr/local/nginx/sbin/nginx

防火墙设置下, 只允许ssh端口,80,443链接,把其它的端口都关了,再把本机访问本机打开,允许本机向外的访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
iptables -L -n
iptables -A INPUT -p tcp --dport 36000 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 36000 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -j ACCEPT

service iptables save

基本能用了。

性别列上真的不需要建索引吗

性别列上真的不需要建索引吗,我们假设有100w数据里只有10个女生,要找到这10个女生,看看有索引和没索引的差别。

建表

use test;
create table people(`id` int(11) auto_increment, `gender` char(1), primary key(`id`));

建一个用于填充数据的存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
delimiter // 

CREATE PROCEDURE filldata()
begin
declare v int default 0;

while v < 50000
do
insert into people(gender) values ('M');
set v = v + 1;
end while;

insert into people(gender) values ('F');

while v < 100000
do
insert into people(gender) values ('M');
set v = v + 1;
end while;

end
//

delimiter ;

填充数据,执行10次这个存储过程,大概每10w男生里有一个女生。

1
2
3
4
5
6
7
8
9
10
call filldata();
call filldata();
call filldata();
call filldata();
call filldata();
call filldata();
call filldata();
call filldata();
call filldata();
call filldata();

确认数据

1
2
3
4
5
6
7
mysql> select count(*) from people;
+----------+
| count(*) |
+----------+
| 1000010 |
+----------+
1 row in set (0.15 sec)

找出所有女生, 花费0.23秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> select * from people where gender = 'F' limit 10;
+--------+--------+
| id | gender |
+--------+--------+
| 50001 | F |
| 150002 | F |
| 250003 | F |
| 350004 | F |
| 450005 | F |
| 550006 | F |
| 650007 | F |
| 750008 | F |
| 850009 | F |
| 950010 | F |
+--------+--------+
10 rows in set (0.23 sec)

在性别上建个索引再找出所有女生,花费0秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> create index idx_people_gender on people(gender);
Query OK, 0 rows affected (2.70 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> select * from people where gender = 'F' limit 10;
+--------+--------+
| id | gender |
+--------+--------+
| 50001 | F |
| 150002 | F |
| 250003 | F |
| 350004 | F |
| 450005 | F |
| 550006 | F |
| 650007 | F |
| 750008 | F |
| 850009 | F |
| 950010 | F |
+--------+--------+
10 rows in set (0.00 sec)

那这种情况下还是有索引查询快。

开启php-fpm status page

要监控PHP运行情况,打开php-fpm的status page可以提供很多有用的信息。

找到php-fpm的配置路径和master的pid

# ps -ef | grep "php-fpm: master"
root     31236     1  0 11:46 ?        00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)  

修改php-fpm配置,打开status page

vi /usr/local/php/etc/php-fpm.conf
pm.status_path = /php_status

重启php-fpm

kill -USR2 31236

找到nginx配置路径

# ps -ef | grep "nginx: master"
root      3813     1  0 Mar09 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx

修改nginx配置,增加localhost的server节

server  
{
    listen       80;     
    server_name  localhost;
    error_log logs/localhost-error_log;
    access_log logs/localhost-access_log;

    location ~ ^/php_status$ 
    {       
        allow 127.0.0.1;
        deny all;

        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.socket; # 根据真实情况改动, 详见php-fpm配置
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    }       

}

重启nginx

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

测试php-fpm状态页

# curl localhost/php_status           
pool:                 www
process manager:      static
start time:           17/Mar/2016:12:09:30 +0800
start since:          747
accepted conn:        4992
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       196
active processes:     4
total processes:      200
max active processes: 15
max children reached: 0
slow requests:        0

新的开始

在公司申请了新的笔记本,要重新初始化一套新的环境,这几年都习惯了Putty+Vim开发 ,
但新笔记本默认装了windows,所以得先把linux安装起来,虚拟机就用VirtualBox,
虚拟机管理用Vagrant,方便管理,打包的镜像也方便移植,下次重装系统还能接着用。

VirtualBox和Vagrant都从官网下载就可以了,一路next安装好,然后Vagrant的路径在 环境变量里设置一下,方便在cmd下调用。

然后下周Vagrant的镜像,以后可能要玩docker,所以在vagrantbox.es 上下载了一个CentOS 6.6 x64 (Minimal, VirtualBox Guest Additions

东西都下载好了,开搞

1
2
3
vagrant.exe box add base ..\download\centos-6.6-x86_64.box
vagrant.exe init base
vagrant up

你会发现,一直卡着,根本就启动不起来,打开VirtualBox看到虚拟机已经在运行了。 但确实vagrant up报错,用ssh也连不上。后来仔细在VirtualBox看了下, 只能装32bit的操作系统,想起来了,需要在BIOS里打开Intel的虚拟化。BIOS设置完重启后 在Virtualbox新建虚拟机选择操作系统时可以看到64bit操作系统了,这时候再vagrant up 就可以了,具体BIOS设置方式Google下有很多。

在cmd下打命令还是不习惯,因为习惯了linux终端下的各种命令,快捷键等,所以要下载了 一个cmder用,下载完整版的,已经自带ls, grep,git等命令,非常好用。具体设置和使用搜一下。

用惯了putty,又下载了个putty, 我一般设置如下参数

  1. window\appearance\font setting:consolas 12pt
  2. window\translate\charset:utf-8
  3. window\selection\action of mouse buttons:windows …
  4. window\line of scoreback:20000
  5. connection\auto-login username:root
  6. connection\seconds of keepalive:10

putty登录上去后,安装软件时很慢,发现默认就1G内存,1盒CPU,又把虚拟机配置成2核2G了。

1
2
3
4
config.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 2
end

再有一个坑,就是Vagrant会默认映射一个目录/vagrant, 这个目录下执行chmod等是不起 作用的,因为它还在windows上,不支持linux文件权限。往里安装一个软件时,会有意想不到 的坑等着你,比如mysql的my.cnf配置就需要特殊的权限,否则mysql是启动不起来的。

登录centos后,发现yum等都不能用,因为公司上网需要代理,所以要设置yum,wget的代理

1
2
3
4
5
6
$ vi ~/.wgetrc
use_proxy=yes
http_proxy=proxy.xxx.com:8080

$ vi /etc/yum.conf
proxy=http://proxy.xxx.com:8080

最后就是在centos上把.vimrc简单配置下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set nocp
set ts=4
set sw=4
set smarttab
set et
set nu
set ambiwidth=double
filetype plugin indent on


set encoding=UTF-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set fileencoding=utf-8

好了,基本搞定开发环境了,可以愉快的在centos上玩耍了。

参考链接