之前介绍了如何在宝塔上如何利用Gunicorn部署Flask,今天要介绍的是Supervisor和Gunicorn部署Flask。 为啥需要Supervisor呢?

Supervisor是一个进程管理系统,它通过fork/exec的方式将这些被管理的进程当作它的子进程来启动,若该子进程异常中断,则父进程可以准确地获取子进程异常中断的信息。
参考:https://blog.csdn.net/guolindonggld/article/details/83386920

我之前写的网站一直都运行正常,所以没有机会使用Supervisor。但直到今天,我上传了重构的网站并运行成功,于是乎我就退出SSH,但我发现退出SSH之后网站就停止运行了。。。google了很多资料才发现需要Supervisor来管理FLASK的后台进程,以防止自动退出。

第一步, 安装supervisor

sudo apt install supervisor

第二步,建立conf文件

安装完supervisor之后你会发现etc下会出现了supervisor的文件夹,接下来我们要在 /etc/supervisor/conf.d/ 这个目录下新建一个xxx.conf的文件,这个文件是用于填写相关的运行命令。

[program:hello_world]
directory=/home/ubuntu/hello_world
command=/home/ubuntu/.env/bin/gunicorn app:app -b localhost:8000
autostart=true
autorestart=true
stderr_logfile=/var/log/hello_world/hello_world.err.log
stdout_logfile=/var/log/hello_world/hello_world.out.log

上面的directory是指你项目的具体位置
command是指gunicorn的所在目录,例如,我的vps上安装了virtualenv,所以我的gunicorn所在目录为/xxxx/py3env/bin
stderr_logfile和stdout_logfile是记录文件的地址,我们需要在/var/log/的目录下新建一个名为hello_world的文件夹以便supervisor生成hello_world.err.loghello_world.out.log

第三步,运行

上面的步骤都做好之后,我们可以开始运行了

$ sudo supervisorctl reread
$ sudo service supervisor restart

查看运行状态

$ sudo supervisorctl status

这样就大功告成了。

参考:https://medium.com/ymedialabs-innovation/deploy-flask-app-with-nginx-using-gunicorn-and-supervisor-d7a93aa07c18

最近做的网站需要用到tabulator作为前端的数据展示,之前一直用3.5的版本,但到了4.0的版本之后,引用js就出现了$(...).tabulator is not a function的错误,后台发现了新的版本不在依赖jQuery.

The core code of version 4.0 of Tabulator is now dependency free! That means no more jQuery, which means there are a few changes that need to be made to your existing code to get on board with the new way of doing things.

下面是新的引用形式:

var table = new Tabulator("#example-table", {
    //table setup options
});

需要注意的是JS的引用要放在jQuery的前面,要不然会出错。

<script type="text/javascript" src="https://unpkg.com/[email protected]/dist/js/tabulator.min.js"></script>

参考:
http://tabulator.info/docs/4.0/upgrade

这几天在看“hands-on machine learning with sklearn and tensorflow” 的第二章节,狗血的事情发生了。其中的一部分是需要将median_income划分为5个等分,然后大于5的部分全部归类为5,代码如下:

    housing["income_cat"] = np.ceil(housing["median_income"] / 1.5)
    housing["income_cat"].where(housing["income_cat"] < 5, 5.0, inplace=True)

结果我看了大半天还以为housing["income_cat"] < 5这里写错了,后来才发现mask 函数和 where 作用刚好相反。

  s = pd.Series(range(5))
  s.where(s > 1, 10)
  0    10.0
  1    10.0
  2    2.0
  3    3.0
  4    4.0

  s.mask(s > 1, 10)
  0    0.0
  1    1.0
  2    10.0
  3    10.0
  4    10.0
  df = pd.DataFrame(np.arange(10).reshape(-1, 2), columns=['A', 'B'])
  m = df % 3 == 0
  # df.where(m, np.array([1,2,3,4,5]).reshape(-1, 5))  #此句话报错
  df.where(m, -df)
  A  B
  0  0 -1
  1 -2  3
  2 -4 -5
  3  6 -7
  4 -8  9

--------------------- 
作者:依斐 
来源:CSDN 
原文:https://blog.csdn.net/dss_dssssd/article/details/82818587 
版权声明:本文为博主原创文章,转载请附上博文链接!

first, run jupyter notebook list to get jupyter used port-number.
then,run lsof -n -i4TCP:[port-number]to get PID, The PID is the second field in the output.
finally, run kill -9 [PID]to kill this process.

This works for me when running a jupyter notebook server in the background.

nohup jupyter notebook --allow-root > error.log &

Stop the nohup jupyter notebook is simple.

First, find the pid of jupyter:

ps -ef| grep juypter

e.g output like:

root     11417  2897 2 16:00 pts/0 00:04:29 /path/to/jupyter-notebook

Then kill the process:

kill -9 11417

You can also simplify this by storing the pid with:

nohup jupyter notebook --allow-root > error.log & echo $!> pid.txt

i.e, you can stop the notebook with:

kill -9 $(cat pid.txt)

reference:
https://github.com/jupyter/notebook/issues/2844
https://stackoverflow.com/questions/47331050/how-to-run-jupyter-notebook-in-the-background-no-need-to-keep-one-terminal-f/51030781

当用户输入数值的时候,我们并不知道用户所输入的是属于股票名称还是股票代码,这意味着使用pymongod find的时候,并不知道输入的值是属于那个column的,这时候可以使用$or来解决, 这样pymongo就会find出所有对应数据。

Dataset= db['Data']
tickers = Dataset.find({ '$or':[{'code':{'$regex':selected_keywords}},
{'name':'$regex':selected_keywords}}]})

参考:

How to query with multiple conditions and those conditions are dependent Ask Question

今日学习Hands-On Machine Learning with Scikit-Learn and TensorFlow 的第三章的时候需要导入MNIST 数据库,后来死活连不上远程服务器,结果发现,sklearn 0.20版本后不再提供fetch_mldata的数据下载。

#源代码
from sklearn.datasets import fetch_mldata
mnist = fetch_mldata('MNIST original')

最后通过官网发现,需要更改函数,修正方法:

from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version='active')

或者:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

注意:
MNIST不再按照顺序排列,原来的X[36000]为5, 更新后的X[36000]为9。

参考:
https://scikit-learn.org/dev/modules/generated/sklearn.datasets.fetch_openml.html

https://github.com/ageron/handson-ml/issues/7