Git 删除旧的提交历史

1.创建新分支(–orphan)

--orphan 建立一个分支不继承任何分支且没有任何commit(基于当前代码分支代码)

git checkout --orphan new

执行完毕后会自动切换到new分支

2.将当前代码进行commit

git add -A

3.创建commit

git commit -am "init"

4.删除要替换的分支

git branch -D master

5.将new更名

git branch -m master

6.推送(-f)

git push -f origin master

7.done

SQLAlchemy 小计2 (索引)

针对PostgreSQL

  1. 函数索引
    class test_table(db.Model):
            username = db.Column(String(20))
    
            __table_args_ = (Index('idx_username', func.lower('username'), unique=True), )
            # 生成SQL如下:
            # create unique index idx_username on test_table  lower(username)
    
  2. 指定索引类型
    __table_args__ = (Index('idx_point', 'point', postgresql_using='gist'), )
    # 生成SQL:
    # create index idx_point on table_name using gist(point)
    
  3. 条件索引
    __table_args__ = (Index('idx_where', 'column', postgresql_where = model.c.column > 10), )
    # 生成SQL:
    # create index idx_where on table_name (column) where column > 10
    

SQLAlchmey 创建复合索引

关键字:__table_args__

class User(db.Model):
    """
    user model
    """
    __tablename__ = 'users'

    id = db.Column(BigInteger, primary_key=True)
    username = db.Column(String(30), nullable=False)
    password = db.Column(db.String(60), nullable=False)
    reg_dateline = db.Column(db.String(12), nullable=False)

    # table_args
        # 创建名为 idx_test 含字段 username和reg_dateline的 索引
    __table_args__ = ( Index('idx_test','username','reg_dateline') )

电商SKU之Python

itertools是Python内置标准库之一,itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用。在BigData分析处理上也会经常使用。

简单的笛卡尔乘积问题

import itertools

# 商品属性字典
attributes = [
    # 尺码属性
    ['S','M','L','XL','XXL'],
    # 颜色属性
    ['黑色','白色','灰色','天蓝黑'],
    # 季节属性
    ['春','夏','秋','冬']
]

skus = []
for i in itertools.product(*attributes):    
    skus.append(i)
print(skus)

输出结果:

[(‘S’, ‘黑色’, ‘春’), (‘S’, ‘黑色’, ‘夏’), (‘S’, ‘黑色’, ‘秋’), (‘S’, ‘黑色’, ‘冬’), (‘S’, ‘白色’, ‘春’), (‘S’, ‘白色’, ‘夏’), (‘S’, ‘白色’, ‘秋’), (‘S’, ‘白色’, ‘冬’), (‘S’, ‘灰色’, ‘春’), (‘S’, ‘灰色’, ‘夏’), (‘S’, ‘灰色’, ‘秋’), (‘S’, ‘ 灰色’, ‘冬’), (‘S’, ‘天蓝黑’, ‘春’), (‘S’, ‘天蓝黑’, ‘夏’), (‘S’, ‘天蓝黑’, ‘秋’), (‘S’, ‘天蓝黑’, ‘冬’), (‘M’, ‘黑色’, ‘春’), (‘M’, ‘黑色’, ‘夏’), (‘M’, ‘黑色’, ‘秋’), (‘M’, ‘黑色’, ‘冬’), (‘M’, ‘白色’, ‘春’), (‘M’, ‘白色’, ‘夏’), (‘M’, ‘ 白色’, ‘秋’), (‘M’, ‘白色’, ‘冬’), (‘M’, ‘灰色’, ‘春’), (‘M’, ‘灰色’, ‘夏’), (‘M’, ‘灰色’, ‘秋’), (‘M’, ‘灰色’, ‘冬’), (‘M’, ‘天蓝黑’, ‘春’), (‘M’, ‘天蓝黑’, ‘夏’), (‘M’, ‘天蓝黑’, ‘秋’), (‘M’, ‘天蓝黑’, ‘冬’), (‘L’, ‘黑色’, ‘春’), (‘L’, ‘ 黑色’, ‘夏’), (‘L’, ‘黑色’, ‘秋’), (‘L’, ‘黑色’, ‘冬’), (‘L’, ‘白色’, ‘春’), (‘L’, ‘白色’, ‘夏’), (‘L’, ‘白色’, ‘秋’), (‘L’, ‘白色’, ‘冬’), (‘L’, ‘灰色’, ‘春’), (‘L’, ‘灰色’, ‘夏’), (‘L’, ‘灰色’, ‘秋’), (‘L’, ‘灰色’, ‘冬’), (‘L’, ‘天蓝黑’, ‘春’), (‘L’, ‘天蓝黑’, ‘夏’), (‘L’, ‘天蓝黑’, ‘秋’), (‘L’, ‘天蓝黑’, ‘冬’), (‘XL’, ‘黑色’, ‘春’), (‘XL’, ‘黑色’, ‘夏’), (‘XL’, ‘黑色’, ‘秋’), (‘XL’, ‘黑色’, ‘冬’), (‘XL’, ‘白色’, ‘春’), (‘XL’, ‘白色’, ‘夏’), (‘XL’, ‘白色’, ‘秋’), (‘XL’, ‘白色’, ‘冬’), (‘XL’, ‘灰色’, ‘春’), (‘XL’, ‘灰色’, ‘夏’), (‘XL’, ‘灰色’, ‘秋’), (‘XL’, ‘灰色’, ‘冬’), (‘XL’, ‘天蓝黑’, ‘春’), (‘XL’, ‘天蓝黑’, ‘夏’), (‘XL’, ‘天蓝黑’, ‘秋’), (‘XL’, ‘天蓝黑’, ‘冬’), (‘XXL’, ‘黑色’, ‘春’), (‘XXL’, ‘黑色’, ‘夏’), (‘XXL’, ‘黑色’, ‘秋’), (‘XXL’, ‘黑色’, ‘冬’), (‘XXL’, ‘白色’, ‘春’), (‘XXL’, ‘白色’, ‘夏’), (‘XXL’, ‘白色’, ‘秋’), (‘XXL’, ‘白色’, ‘冬’), (‘XXL’, ‘灰色’, ‘春’), (‘XXL’, ‘灰色’, ‘夏’), (‘XXL’, ‘灰色’, ‘秋’), (‘XXL’, ‘灰色’, ‘冬’), (‘XXL’, ‘天蓝黑’, ‘春’), (‘XXL’, ‘天蓝黑’, ‘夏’), (‘XXL’, ‘天蓝黑’, ‘秋’), (‘XXL’, ‘天蓝黑’, ‘冬’)]

Gunicorn 部署 Flask

/application
├── app
│   ├── admin
│   │   ├── __init__.py
│   ├── api
│   │   ├── __init__.py
│   ├── exceptions.py
│   ├── home
│   │   ├── __init__.py
│   ├── __init__.py
│   ├── main
│   │   ├── errors.py
│   │   ├── __init__.py
│   │   └── views.py
│   ├── models.py
│   ├── shop
│   │   ├── __init__.py
│   └── views
│       ├── base_layout.html
│       ├── index.html
│       ├── password.html
│       └── pc.html
├── config.py
├── wsgi.py
# file: wsgi.py

from .app import create_app

# 此处的名字(app)后面会用到
app = create_app('development')

启动

./venv/bin/gunicorn -b :8080 -w8 --worker-class "gevent" wsgi:app <- 文件名称:变量名 不支持 gunicorn -b :8080 /var/www/dir/wsgi: 这种形式 必须是当前目录

什么是所谓的模板引擎

<?php
// 程序入口文件 index.php
// 重点
// 什么是“模板引擎” 模板引擎如何工作

// 设置PHP显示所有错误,除notice错误
error_reporting(E_ALL & ~E_NOTICE);

header("Content-Type: text/html; charset=utf-8");


class test
{
    protected function view($name, array $data = array())
    {
        // 模板文件路径
        $sourceFilepath = __DIR__."/{$name}.source.php";

        // 即将编译后的模板路径(实际使用的模板文件路径)
        $compliedPath = __DIR__."/{$name}.complied.php";


        // 模板文件路径文件是否存在
        if (!file_exists($sourceFilepath))
            exit("ERROR: {$sourceFilepath} not exists.");

        // 读取原始文件
        $sourceContent = file_get_contents($sourceFilepath);


        // 预设的 模板规则替换 正则规则
        $replaces = [
            '/{{([a-zA-Z0-9_$\(\)]+)}}/i' => '<?php echo $1; ?>',// 替换 {{xx}}  为 <?php echo xx; ? >
            '/@foreach\((.*)\)/i' => '<?php foreach($1): ?>',// 替换@foreach(xx) 为 <?php foreach(xx): ? >
            '/@endforeach/i' => '<?php endforeach; ?>',// 替换 @endforeach 为 <?php endforeach; ? >
        ];

        // 循环规则,开始替换模板内容
        foreach ($replaces as $regex=>$content)
        {
            $sourceContent = preg_replace($regex, $content, $sourceContent);
        }

        // 写入模板缓存
        file_put_contents($compliedPath, $sourceContent);

        extract($data);
        // 直接include 编译后的模板文件
                ob_start();
        include $compliedPath;
                return ob_get_clean();

    }

    public function index()
    {
        return $this->view('index',[
            'var1' => time(),

            'data' => [
                'k1' => 'v1',
                'k2' => 'v2',
                'k3' => 'v3'
            ]
        ]);
    }
}




$test = new test();
echo $test->index();
<!-- 模板文件 index.source.php -->
这是var1的值:{{$var1}}

<p>
    要循环的数据为
    <pre>
        {{print_r($data)}}
    </pre>
</p>

<p>
    @foreach($data as $index=>$value)
    {{$index}} => {{$value}}<br/>
    @endforeach
</p>

记一次编译php5.3的openssl错误解决

错误如下:
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0: error adding symbols: DSO missing from command line

/usr/lib/x86_64-linux-gnu/libssl.so.1.0.0: error adding symbols: DSO missing from command line
等其他类似错误

解决方法:
Make zend_extra_libs=’-lssl -lcrypto’

或在 Makefile 中找到 EXTRA_LIBS后增加 -lssl -lcrypto 即可

2016年11月28日 RabbitMQ 笔记

管理操作

停止服务:
rabbitmqctl stop

添加删除用户
rabbitmqctl add_user|delete_user username

修改用户密码
rabbitmqctl change_password username password

设置用户组
rabbitmqctl set_user_permissions username administrator|mointoring|management

设置用户权限 (conf/write/read为正则表达式)
rabbitmqctl set_permissions -p vhost user conf write read