Linux source-code-pro 字体安装脚本

#!/bin/sh
# Userland mode (~$USER/), (~/).

# ~/.fonts is now deprecated and that
#FONT_HOME=~/.fonts
# ~/.local/share/fonts should be used instead
FONT_HOME=~/.local/share/fonts

echo "installing fonts at $PWD to $FONT_HOME"
mkdir -p "$FONT_HOME/adobe-fonts/source-code-pro"
# find "$FONT_HOME" -iname '*.ttf' -exec echo '{}' \;

(git clone \
   --branch release \
   --depth 1 \
   'https://github.com/adobe-fonts/source-code-pro.git' \
   "$FONT_HOME/adobe-fonts/source-code-pro" && \
fc-cache -f -v "$FONT_HOME/adobe-fonts/source-code-pro")

 

 

前端学习之html行内元素和块元素

首先说说行内元素(内联元素),行内元素只能显示在一行内,它不会因为一行放不下而进行换行。如:span就是一个行内元素。宽度(width)、高度(height)、内边距的top/bottom(padding-top/padding-bottom)和外边距的top/bottom(margin-top/margin-bottom)都不可改变,就是里面文字或图片的大小;

块元素与行内元素相反,一个块元素会自动在新的一行开始。如:h1,p都是块元素。宽度(width)、高度(height)、内边距(padding)和外边距(margin)都可控制;

通过css我们可以改变元素是块元素还是行内元素:

1. display: block;

2. display: inline;

3. display: inline-block;

行内元素列表

b, big, i, small, tt
abbr, acronym, cite, code, dfn, em, kbd, strong, samp, var
a, bdo, br, img, map, object, q, script, span, sub, sup
button, input, label, select, textarea

块元素列表

address , blockquote , center , dir , div , dl , fieldset , form , h1 , h2 , h3 , h4 , h5 , h6 , hr , isindex , menu , noframes , noscript , ol , p , pre , table , ul , li

Postgresql 基础命令的使用

本文介绍了Postgresql 最基础命令的使用。

访问数据库

1、列举数据库:\l

2、选择数据库:\c 数据库名

3、查看该某个库中的所有表:\dt

4、切换数据库:\c interface

5、查看某个库中的某个表结构:\d 表名

6、查看某个库中某个表的记录:select * from apps limit 1;

7、显示字符集:\encoding

8、退出psgl:\q

创建用户

创建 yy 用户, 密码为 yy , 创建 blogbase数据库,并对 yy 用户赋予所有权限

$ sudo su - postgres

$ psql

postgres=# CREATE USER yy WITH PASSWORD 'yy';

CREATE ROLE

postgres=# CREATE DATABASE blogbase;

CREATE DATABASE

postgres=# GRANT ALL PRIVILEGES ON DATABASE blogbase to yy;

GRANT

修改用户密码

alter user 用户名 with password’新密码’;

ALTER ROLE

登陆数据库

psql -U 用户名 -d 数据库名 -h 主机地址 -p 端口

重命名数据库

alter database blogbase rename to blogbase1;

查看状态

sudo /etc/init.d/postgresql status

启动

sudo /etc/init.d/postgresql start

停止

sudo /etc/init.d/postgresql stop

重启

sudo /etc/init.d/postgresql restart

 

用Python爬取妹子图所有大图

昨天我用python写了一个爬取妹子图网站图片的爬虫,是一个非常简陋的爬虫。
下边把我写的烂程序分享给大家,望给我做些评价。
我写的这个程序分为两个python文件,一个用来把图片文章的列表页网址给解析出来保存到一个python的list里边,并且用json库把这个list保存进一个json文件内。另一个python文件是用来解析并且下载图片文章详情页的所有大图。

GIF

第一个python文件(meizitu.py)

 

'''爬取“妹子图”http://www.meizitu.com/ 所有大图
1.列表页面:http://www.meizitu.com/a/more_1.html
*more_{num}.html其中num从1-72
*列表页小图链接在<div class="pic">下边(链接指向详情页面)
2.列表详情页面:http://www.meizitu.com/a/38.html
*{num}.html,其中num是详情页面的id
*大图在<div class="postContent">下边
*大图的img属性中有class="scrollLoading"我们就用这个属性来找到我们需要的图片
*文章标题在<div class="postmeta clearfix">下边
*我们把图片的文件名用文章标题加上数字进行重命名,另外去除标题中的空格和不符合文件名的符号
'''
import requests
from bs4 import BeautifulSoup
import json

list_link_num = 'http://www.meizitu.com/a/more_{num}.html'
list_link = [list_link_num.format(num=i) for i in range(1, 73)]
details_link = []

def get_list_index(list1, lists):
num = lists.index(list1) + 1
return num

def get_list_page_img_link(html):
soup = BeautifulSoup(html, 'lxml')
for link in soup.findAll('div', class_='pic'):
for a in link.findAll('a'):
details_link.append(a.attrs['href'])
print(len(details_link))

for link_list in list_link:
r = requests.get(link_list, headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'})
r.encoding = r.apparent_encoding
print('状态: %s\n' % r.status_code)
print('第 %d 个网页下载成功' %(get_list_index(link_list, list_link)))
get_list_page_img_link(r.text)

with open('./test.json', 'w') as f:
json.dump(details_link, f, indent=4)

f.close()

 

第二个文件(test.py)

import json
import requests
from bs4 import BeautifulSoup
import time

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}
download_path = 'd://image//'
download_count = 1
#link = []
with open('./test.json', 'r') as f:
link = json.load(f)

f.close()
#print(link)

def writeImage(path, img):
with open(path, 'wb') as f:
f.write(img)
f.close()

for a in link:
r = requests.get(a, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
for img_parent in soup.findAll('div', id='picture'):
for img in img_parent.findAll('img'):
print('正在下载第: %d 张美女的图片' % download_count)
img_link = img.attrs['src']
img_name_list = img_link.split('/')
img_file_name = img_name_list[-4] + img_name_list[-3] + img_name_list[-2] + img_name_list[-1]
#time.sleep(1)
try:
r_img = requests.get(img_link, headers=headers, timeout=10)
r_img.raise_for_status()
except:
print('链接异常')
path = download_path + img_file_name
writeImage(path, r_img.content)
print('第:%d 张美女的图片已下载完成, 赶快去看看吧!' % download_count)
download_count += 1
#print('还剩%d 张没有下载' % len(img_parent.findAll('img')) - download_count)

 

下载后存储的json文件(test.json)

这个文件的内容就不分享了,因为太长了有将近3000行。

图片一共爬取了1.5万多张。

Flask 第三方插件导入方法

我遇到的问题
我在Flask运行是的问题就是,每次运行python manage.py runserver是都会显示一些警告信息,从提示可以看到只是警告信息,并不是错误信息。Google了以下原来是版本不同导致的兼容性问题,解决的办法就是使用新的导入方式即可。

旧的第三方插件导入方式

from flask.ext.sqlalchemy import SQLAlchemy

我们可以在ipython里查看第三方包的包名,按照包名导入即可。

Flask 的项目架构

(flask_env) fy@fy-Box:~/py_project/blog$ tree
.
├── app
│   ├── blog
│   │   ├── errors.py
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── errors.cpython-35.pyc
│   │   │   ├── __init__.cpython-35.pyc
│   │   │   └── views.cpython-35.pyc
│   │   └── views.py
│   ├── __init__.py
│   ├── __pycache__
│   │   └── __init__.cpython-35.pyc
│   ├── static
│   │   ├── css
│   │   ├── img
│   │   └── js
│   └── templates
│   ├── 404.html
│   ├── 500.html
│   ├── base.html
│   └── blog
│   └── index.html
├── config.py
├── manage.py
├── __pycache__
│   └── config.cpython-35.pyc
└── requirements.txt

11 directories, 16 files

app 目录

app 目录是Flask 的应用目录,里边包括templates\static和一些蓝图,蓝图可以有多个,但这里只有blog一个,蓝图里就是一些视图函数。

app/init.py
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy

# 导入配置文件
from config import config

bootstrap = Bootstrap()
db = SQLAlchemy()

def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)

bootstrap.init_app(app)
db.init_app(app)

# Bluerpint
from .blog import blog as blog_blueprint
app.register_blueprint(blog_blueprint)
return app

blog/config.py

import os

base_dir = os.path.abspath(os.path.dirname(__file__))

class Config(object):
'''
Base Config
'''
SECRET_KEY = 'ABCDEFG'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = True

@staticmethod
def init_app(app):
pass

class DevConfig(Config):
'''
Development Config
'''
DEBUG = True
HOST = '0.0.0.0'
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(base_dir, 'data-dev.sqlite')

config = {
'development': DevConfig,
'default': DevConfig
}

blog/manage.py

import os
from app import create_app
from flask_script import Manager

app = create_app('default')
manage = Manager(app)

if __name__ == '__main__':
manage.run()

app/blog/init.py

from flask import Blueprint

blog = Blueprint('blog', __name__)

from . import views, errors

app/blog/errors.py

from flask import render_template
from . import blog

@blog.app_errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404

@blog.app_errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500

app/blog/views.py

from flask import render_template

from . import blog

@blog.route('/')
def index():
return render_template('blog/index.html')
templstes/base.html
{% extends "bootstrap/base.html" %}
{% block title %}疯影{% endblock %}

{% block content %}
<div class="container">
{% block page_content %}base.html{% endblock %}
</div>
{% endblock content %}

 

 

今天写了个C语言字符转ASCII码的程序

void ascii(void) {
  /**************************
  * 字符转换ASCII码
  ***************************/
  char a='0'; // 给a一个初始化值
  while (1) {
    if (a != 10) {// 当a不等于LF换行时才打印输出提示
      printf("请输入一个字符(或输入q退出):");
    }
    scanf("%c", &a);
    if (a != 10) {
      printf("%c -> %d\n", a, a);
    }
    
    if (a == 'q') {
      break;
    }
  }
}

 

c语言逻辑运算符

下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:

  1. && 称为逻辑与运算符。如果两个操作数都非零,则条件为真。(A && B) 为假。
  2. || 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。A || B) 为真。
  3. ! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。

代码:

#include <stdio.h>
 
main()
{
   int a = 5;
   int b = 20;
   int c ;
 
   if ( a && b )
   {
      printf("Line 1 - 条件为真\n" );
   }
   if ( a || b )
   {
      printf("Line 2 - 条件为真\n" );
   }
   /* 改变 a 和 b 的值 */
   a = 0;
   b = 10;
   if ( a && b )
   {
      printf("Line 3 - 条件为真\n" );
   }
   else
   {
      printf("Line 3 - 条件不为真\n" );
   }
   if ( !(a && b) )
   {
      printf("Line 4 - 条件为真\n" );
   }
}

结果:

Line 1 - 条件为真
Line 2 - 条件为真
Line 3 - 条件不为真
Line 4 - 条件为真

 

c语言a++与++a的区别

c语言a++与++a的区别,两者的区别就是先赋值后运算和先运算后赋值。

代码:

#include <stdio.h>
 
int main()
{
   int c;
   int a = 10;
   c = a++; 
   printf("先赋值后运算:\n");
   printf("Line 1 - c 的值是 %d\n", c );
   printf("Line 2 - a 的值是 %d\n", a );
   a = 10;
   c = a--; 
   printf("Line 3 - c 的值是 %d\n", c );
   printf("Line 4 - a 的值是 %d\n", a );
 
   printf("先运算后赋值:\n");
   a = 10;
   c = ++a; 
   printf("Line 5 - c 的值是 %d\n", c );
   printf("Line 6 - a 的值是 %d\n", a );
   a = 10;
   c = --a; 
   printf("Line 7 - c 的值是 %d\n", c );
   printf("Line 8 - a 的值是 %d\n", a );
 
}

结果:

先赋值后运算:
Line 1 - c 的值是 10
Line 2 - a 的值是 11
Line 3 - c 的值是 10
Line 4 - a 的值是 9
先运算后赋值:
Line 5 - c 的值是 11
Line 6 - a 的值是 11
Line 7 - c 的值是 9
Line 8 - a 的值是 9