Status update:

若能让我开心,今后所做的一切,为你罢,帮你也罢,都行.
但若我坦然处事,得不到任何,只为成就,未来,生活,那才可悲.
且若开心二字,你若安好,便是晴天.你若得到你想要的生活,便是晴天.

主题迁移时的问题汇总

1.鼠标,仅需要在style.css中加入以下代码即可,其中鼠标文件地址自己设置

Tip:鼠标必须是cur格式

cur.css

2.雪花,直接将下面文件拆分,启动的那部分放到footer.php中,逻辑部分放在header.php中(均是主题).

Snow.js

三角函数+公式推导+部分C++函数

两角和的公式

  sin(A+B)=sinAcosB+cosAsinB sin(A-B)=sinAcosB-sinBcosA

  cos(A+B)=cosAcosB-sinAsinB cos(A-B)=cosAcosB+sinAsinB

  tan(A+B)=(tanA+tanB)/(1-tanAtanB) tan(A-B)=(tanA-tanB)/(1+tanAtanB)

  cot(A+B)=(cotAcotB-1)/(cotB+cotA) cot(A-B)=(cotAcotB+1)/(cotB-cotA)

  倍角的公式

  tan2A=2tanA/(1-tan2A) cot2A=(cot2A-1)/2cota

  cos2a=cos2a-sin2a=2cos2a-1=1-2sin2a

  sinα+sin(α+2π/n)+sin(α+2π*2/n)+sin(α+2π*3/n)+……+sin[α+2π*(n-1)/n]=0

  cosα+cos(α+2π/n)+cos(α+2π*2/n)+cos(α+2π*3/n)+……+cos[α+2π*(n-1)/n]=0 以及

  sin^2(α)+sin^2(α-2π/3)+sin^2(α+2π/3)=3/2

  tanAtanBtan(A+B)+tanA+tanB-tan(A+B)=0

  四倍角之公式:

  sin4A=-4*(cosA*sinA*(2*sinA^2-1))

  cos4A=1+(-8*cosA^2+8*cosA^4)

  tan4A=(4*tanA-4*tanA^3)/(1-6*tanA^2+tanA^4)

  五倍将式:

  sin5A=16sinA^5-20sinA^3+5sinA

  cos5A=16cosA^5-20cosA^3+5cosA

  tan5A=tanA*(5-10*tanA^2+tanA^4)/(1-10*tanA^2+5*tanA^4)

  六倍将式:

  sin6A=2*(cosA*sinA*(2*sinA+1)*(2*sinA-1)*(-3+4*sinA^2))

  cos6A=((-1+2*cosA^2)*(16*cosA^4-16*cosA^2+1))

  tan6A=(-6*tanA+20*tanA^3-6*tanA^5)/(-1+15*tanA^2-15*tanA^4+tanA^6)

  七倍将式:

  sin7A=-(sinA*(56*sinA^2-112*sinA^4-7+64*sinA^6))

  cos7A=(cosA*(56*cosA^2-112*cosA^4+64*cosA^6-7))

  tan7A=tanA*(-7+35*tanA^2-21*tanA^4+tanA^6)/(-1+21*tanA^2-35*tanA^4+7*tanA^6)

  八倍将式:

  sin8A=-8*(cosA*sinA*(2*sinA^2-1)*(-8*sinA^2+8*sinA^4+1))

  cos8A=1+(160*cosA^4-256*cosA^6+128*cosA^8-32*cosA^2)

  tan8A=-8*tanA*(-1+7*tanA^2-7*tanA^4+tanA^6)/(1-28*tanA^2+70*tanA^4-28*tanA^6+tanA^8)

  九倍将式:

  sin9A=(sinA*(-3+4*sinA^2)*(64*sinA^6-96*sinA^4+36*sinA^2-3))

  cos9A=(cosA*(-3+4*cosA^2)*(64*cosA^6-96*cosA^4+36*cosA^2-3))

  tan9A=tanA*(9-84*tanA^2+126*tanA^4-36*tanA^6+tanA^8)/(1-36*tanA^2+126*tanA^4-84*tanA^6+9*tanA^8)

  十倍将式:

  sin10A=2*(cosA*sinA*(4*sinA^2+2*sinA-1)*(4*sinA^2-2*sinA-1)*(-20*sinA^2+5+16*sinA^4))

  cos10A=((-1+2*cosA^2)*(256*cosA^8-512*cosA^6+304*cosA^4-48*cosA^2+1))

  tan10A=-2*tanA*(5-60*tanA^2+126*tanA^4-60*tanA^6+5*tanA^8)/(-1+45*tanA^2-210*tanA^4+210*tanA^6-45*tanA^8+tanA^10)

  ·万能公式:

  sinα=2tan(α/2)/[1+tan^2(α/2)]

  cosα=[1-tan^2(α/2)]/[1+tan^2(α/2)]

  tanα=2tan(α/2)/[1-tan^2(α/2)]

  半将式

  sin(A/2)=√((1-cosA)/2) sin(A/2)=-√((1-cosA)/2)

  cos(A/2)=√((1+cosA)/2) cos(A/2)=-√((1+cosA)/2)

  tan(A/2)=√((1-cosA)/((1+cosA)) tan(A/2)=-√((1-cosA)/((1+cosA))

  cot(A/2)=√((1+cosA)/((1-cosA)) cot(A/2)=-√((1+cosA)/((1-cosA))

  和差化积

  2sinAcosB=sin(A+B)+sin(A-B) 2cosAsinB=sin(A+B)-sin(A-B)

  2cosAcosB=cos(A+B)-sin(A-B) -2sinAsinB=cos(A+B)-cos(A-B)

  sinA+sinB=2sin((A+B)/2)cos((A-B)/2 cosA+cosB=2cos((A+B)/2)sin((A-B)/2)

  tanA+tanB=sin(A+B)/cosAcosB tanA-tanB=sin(A-B)/cosAcosB

  cotA+cotBsin(A+B)/sinAsinB -cotA+cotBsin(A+B)/sinAsinB

  某些数列前n项和

  1+2+3+4+5+6+7+8+9+…+n=n(n+1)/2 1+3+5+7+9+11+13+15+…+(2n-1)=n2

  2+4+6+8+10+12+14+…+(2n)=n(n+1) 1^2+2^2+3^2+4^2+5^2+6^2+7^2+8^2+…+n^2=n(n+1)(2n+1)/6

  1^3+2^3+3^3+4^3+5^3+6^3+…n^3=(n(n+1)/2)^2 1*2+2*3+3*4+4*5+5*6+6*7+…+n(n+1)=n(n+1)(n+2)/3

  正弦定理 a/sinA=b/sinB=c/sinC=2R 注: 其中 R 表示三角形的外接圆半径

  余弦定理 b2=a2+c2-2accosB 注:角B是边a和边c的夹角

  乘法与因式分 a2-b2=(a+b)(a-b) a3+b3=(a+b)(a2-ab+b2) a3-b3=(a-b(a2+ab+b2)

  三角不等式 |a+b|≤|a|+|b| |a-b|≤|a|+|b| |a|≤b<=>-b≤a≤b

  |a-b|≥|a|-|b| -|a|≤a≤|a|

推论

三角形ABC中: tan(a/2)tan(b/2)+tan(b/2)tan(c/2)+tan(a/2)tan(c/2)=1

S(ABC)=[1/2(a+b+c)]r(△ABC内接圆半径)

三角形ABC中: 设 1/2周长为 p=1/2(a+b+c) 
            tan(a/2)=r/(p-b)

Python Flask(五) Email

moudule:Flask_mail
配置参数:

中文:

如果不进行配置,Flask_Mail会自动连接localhost上的端口25

啊……调了一大堆错,总算搞定了QQ的邮件发送…… :sob: :sob: :sob: :sob: :sob: :sob: :sob: :sob:

1.向QQ发送邮件是通过SMTP协议发送的,所以我们需要在QQ邮箱的设置中开启SMTP协议:

2.因为QQ采用的是授权码发送邮件的方式,所以发送邮件时的密码是授权码,需要申请一下(这个授权码会被改变,但我不知道是怎样的条件会改变).如上图的生成授权码.

3.千万不要把TTL写成TLE!!!!!!

4.set MAIL_USERNAME/PASSWORD=*** 这个操作是在cmd界面下直接输入即可,意为将key-value:环境变量-值放在系统内.python取出是依赖os模块os.environ.get('key')取出value的.

5.对于QQ邮箱而言,新生成的msg对象sender需要和你发送到的目标用户一样,否则会出现501错误:发送者与接收者不是同一人.

6.发送的shell大概代码为:

7.AC

Code:

#--*--coding:utf-8--*--
from datetime import datetime
from flask import Flask, render_template,session,redirect,url_for,flash
from flask_script import Manager
from flask_bootstrap import Bootstrap   
from flask_moment import Moment
from flask_wtf import FlaskForm
from wtforms import StringField,SubmitField
from wtforms.validators import Required
from flask_sqlalchemy import SQLAlchemy
import os
from flask_mail import Mail

class NameForm(FlaskForm):
    name=StringField('What is your name?',validators=[Required()])
    submit=SubmitField('Submit')

app = Flask(__name__)

#Flask-WTF : secret_key
#app.config dict used to save config message.
app.config['MAIL_SERVER']='smtp.qq.com'
app.config['MAIL_PORT']=587
#app.config['MAIL_USE_TLE']=True
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME']=os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD']=os.environ.get('MAIL_PASSWORD')
app.config['SECRET_KEY']='hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI']=\
    'mysql://root:zwt~19970210@localhost/data'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db=SQLAlchemy(app)

manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)
mail=Mail(app)

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship('User', backref='role', lazy='dynamic')

    def __repr__(self):
        return '<Role %r>' % self.name


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    def __repr__(self):
        return '<User %r>' % self.username
@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404


@app.errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500


@app.route('/',methods=['GET','POST'])
def index():
    form=NameForm()
    if form.validate_on_submit():
        user=User.query.filter_by(username=form.name.data).first()
        if user is None:
            user =User(username=form.name.data)
            db.session.add(user)
            session['known']=False
        else:
            session['known']=True
        session['name']=form.name.data
        form.name.data=''
        return redirect(url_for('index'))
    return render_template('index.html',
                           current_time=datetime.utcnow(),form=form,name=session.get('name'),known=session.get('known',False))


@app.route('/user/<name>')
def user(name):
    return render_template('user.html', name=name)


if __name__ == '__main__':
    db.create_all()
    manager.run()

接下来我要试试Gmail..

9.成功,而且好像知道了怎么用自己的一个账号发送给另一个账号的奇技淫巧…recipients参数是目标邮箱.结果如下:
Gmail:
1. 给自己发的结果:

2.给QQ邮箱发的结果:

QQ:
接收到Gmail发送的结果:
Aaron10.将发送邮件功能集成到页面.
功能=>每次添加新用户发送到邮箱信息:'User {{ username }} has joined.'
主要发送代码如下:

def send_email(to,subject,template,**k):
    msg=Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX']+subject,
        sender=app.config['FLASKY_MAIL_SENDER'],recipients=[to])
    msg.body=render_template(template+'.txt',**k)
    msg.html=render_template(template+'.html',**k)
    mail.send(msg)

调用代码:

@app.route('/',methods=['GET','POST'])
def index():
    form=NameForm()
    if form.validate_on_submit():
        user=User.query.filter_by(username=form.name.data).first()
        if user is None:
            user =User(username=form.name.data)
            db.session.add(user)
            session['known']=False
            if app.config['FLASKY_ADMIN']:
                send_email(app.config['FLASKY_ADMIN'],'New User','mail/new_user',user=user)
        else:
            session['known']=True
        session['name']=form.name.data
        form.name.data=''
        return redirect(url_for('index'))
    return render_template('index.html',
                           current_time=datetime.utcnow(),form=form,name=session.get('name'),known=session.get('known',False))

11.最终结果如下:
添加新用户Aaron Swartz:

12.用异步的方法发送邮件:这样会产生一种无延迟感,用户体验更好.
代码如下:

from threading import Thread

def send_async_email(app,msg):
    with app.app_context():
        mail.send(msg)

def send_email(to,subject,template,**k):
    msg=Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX']+subject,
        sender=app.config['FLASKY_MAIL_SENDER'],recipients=[to])
    msg.body=render_template(template+'.txt',**k)
    msg.html=render_template(template+'.html',**k)
    thr=Thread(target=send_async_email,args=[app,msg])
    thr.start()
    return thr

Done!

Python Flask(二) Custom Error Pages

自定义错误界面:
直接上代码:

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404


@app.errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500

返回参数有两个,第一个是渲染模板,第二个是错误码,错误界面通过handler获取错误码然后重定向到错误界面.以上.

C++操作CMD并返回结果

    #include <iostream>  
    using namespace std ;  
    // 描述:execmd函数执行命令,并将结果存储到result字符串数组中   
    // 参数:cmd表示要执行的命令  
    // result是执行的结果存储的字符串数组  
    // 函数执行成功返回1,失败返回0    
    int execmd(char* cmd,char* result) {  
        char buffer[128];                         //定义缓冲区                          
        FILE* pipe = _popen(cmd, "r");            //打开管道,并执行命令   
        if (!pipe)  
            return 0;                      //返回0表示运行失败   

        while(!feof(pipe)) {  
            if(fgets(buffer, 128, pipe)){             //将管道输出到result中   
                strcat(result,buffer);  
            }  
        }  
        _pclose(pipe);                            //关闭管道   
        return 1;                                 //返回1表示运行成功   
    }  

    int main(){  
        char result[1024*4]="";                   //定义存放结果的字符串数组   
        if(1==execmd("ipconfig",result)){  
            printf(result);  
        }  
        system("pause");                          //暂停以查看结果   
    }   

javascript表单传送文件

专门把这次课给搞出来记一下笔记..

在HTML中,唯一可以上传文件的就是

<input type="file">

注意,当一个表单包含file时,表单的enctype必须是multipart/form-data,method必须指定为post,浏览器才能以正确编码并以multipart/form-data格式发送表单.

Tip: enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。

出于安全考虑,浏览器只允许用户点击<input type="file">来选择本地文件,用JavaScript对<input type="file">的value赋值是没有任何效果的。当用户选择了上传某个文件后,JavaScript也无法获得该文件的真实路径:

获取表单上传路径后结果总会是fakepath
<script>
$(function () {
    var
        fileInput = document.getElementById('test-file-upload'),
        filePath = document.getElementById('test-get-filename');
    fileInput.addEventListener('change', function () {
        filePath.innerText = fileInput.value;
    });
});
</script>

<form method="post" action="http://localhost/test" enctype="multipart/form-data">
    <p>
        <input type="file" id="test-file-upload" name="test">
    </p>
    <p>待上传文件: <span id="test-get-filename" style="color:red"></span></p>
</form>

通常,上传的文件都由后台服务器处理,JavaScript可以在提交表单时对文件扩展名做检查,以便防止用户上传无效格式的文件:

var f = document.getElementById('test-file-upload');
var filename = f.value; // 'C:\fakepath\test.png'
if (!filename || !(filename.endsWith('.jpg') || filename.endsWith('.png') || filename.endsWith('.gif'))) {
    alert('Can only upload image file.');
    return false;
}

File API

由于JavaScript对用户上传的文件操作非常有限,尤其是无法读取文件内容,使得很多需要操作文件的网页不得不用Flash这样的第三方插件来实现。
随着HTML5的普及,新增的File API允许JavaScript读取文件内容,获得更多的文件信息。

HTML5的File API提供了File和FileReader两个主要对象,可以获得文件信息并读取文件。

下面的例子演示了如何读取用户选取的图片文件,并在一个

<

div>中预览图像:

var
    fileInput = document.getElementById('test-image-file'),
    info = document.getElementById('test-file-info'),
    preview = document.getElementById('test-image-preview');
// 监听change事件:
fileInput.addEventListener('change', function () {
    // 清除背景图片:
    preview.style.backgroundImage = '';
    // 检查文件是否选择:
    if (!fileInput.value) {
        info.innerHTML = '没有选择文件';
        return;
    }
    // 获取File引用:
    var file = fileInput.files[0];
    // 获取File信息:
    info.innerHTML = '文件: ' + file.name + '<br>' +
                     '大小: ' + file.size + '<br>' +
                     '修改: ' + file.lastModifiedDate;
    if (file.type !== 'image/jpeg' && file.type !== 'image/png' && file.type !== 'image/gif') {
        alert('不是有效的图片文件!');
        return;
    }
    // 读取文件:
    var reader = new FileReader();
    reader.onload = function(e) {
        var
            data = e.target.result; // 'data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...'            
        preview.style.backgroundImage = 'url(' + data + ')';
    };
    // 以DataURL的形式读取文件:
    reader.readAsDataURL(file);
});

上面的代码演示了如何通过HTML5的File API读取文件内容。以DataURL的形式读取到的文件是一个字符串,类似于data:image/jpeg;base64,/9j/4AAQSk…(base64编码)…,常用于设置图像。如果需要服务器端处理,把字符串base64,后面的字符发送给服务器并用Base64解码就可以得到原始文件的二进制内容。

回调

上面的代码还演示了JavaScript的一个重要的特性就是单线程执行模式。在JavaScript中,浏览器的JavaScript执行引擎在执行JavaScript代码时,总是以单线程模式执行,也就是说,任何时候,JavaScript代码都不可能同时有多于1个线程在执行。

你可能会问,单线程模式执行的JavaScript,如何处理多任务?

在JavaScript中,执行多任务实际上都是异步调用,比如上面的代码:

reader.readAsDataURL(file);

就会发起一个异步操作来读取文件内容。因为是异步操作,所以我们在JavaScript代码中就不知道什么时候操作结束,因此需要先设置一个回调函数:

reader.onload = function(e) {
// 当文件读取完成后,自动调用此函数:
};

当文件读取完成后,JavaScript引擎将自动调用我们设置的回调函数。执行回调函数时,文件已经读取完毕,所以我们可以在回调函数内部安全地获得文件内容。