利用now.sh加速博客访问

我最近发现我自建的CDN在不同地区表现有较大差别(比如现在我自己加载个图都加载不出来)所以现在临时换用了zeit的代理来加速,自建CDN待我调教好了再重新启用…

zeit每月提供20G免费流量,对于个人博客还是够用的,国内通常走GCP香港台湾,所以速度较快(坐标重庆,实测移动电信流量秒开图片)

下面介绍一下方法…

首先,在官网注册一个账号,可以直接用GitHub登录

然后,准备一个nodejs环境

安装Now CLI并登录

npm i -g now
now login

新建一个文件夹,在其中创建now.json

{
  "name": "项目名", //这个会体现在链接前面部分
  "version": 2,
  "routes": [
    {"src": "/目录名/(.*)","dest": "https://需要反代的地址/$1"} //只能通过该文件夹访问
  ]
}

部署

now --prod
> Deploying ~\文件夹 under 用户名
> Using project 项目名
> Synced 1 file [2s]
> https://项目名-随机字符.now.sh [6s]
> Ready! Deployment complete [1m]
- https://项目名-名词-数词.now.sh
- https://项目名.用户名.now.sh [in clipboard]

运行结果中的三个域名均可用于访问,访问地址大概是这样:

https://项目名.用户名.now.sh/目录名/

然后就可以用WP Super Cache代替所有静态文件链接来食用了….

此外,也可以在官网换用自己的域名

自制迷你PHP博客…

上周作业…时间太紧了就随手做了个…

用 Parsedown 解析md达到的…(自行去官网下载Parsedown.php才能食用哦)

目录和文章需要手动建立…

demo:(完全没有小屏幕适配)

Source:

<!doctype html>
<html>
<head>
	<title>Simple Blog</title>
	<link href="//cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
  </head>
<div class="container-fluid">
	<div class="d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom shadow-sm">
  	<nav class="my-0 mr-md-auto font-weight-normal">
  	<a class="p-2 text-dark" href="index.php">首页</a>
  	<a class="p-2 text-dark" href="index.php?list">目录</a>
  </nav>
  <h5 class="my-2 my-md-0 mr-md-3">博客</h5>
</div>
  </div>
  <div style="width: 90%; max-width: 800px; margin: 0 auto;">
<?php
header("content-type:text/html;charset=utf-8");
require_once('Parsedown.php');
function output($passage)
{
  if(file_exists($passage)){
    $fp = fopen($passage,"r");
	$text = fread($fp,filesize($passage));
	fclose($fp);
    $result = Parsedown::instance()->parse($text);
	echo $result;
	}
    else echo '<div style="margin-top:170px;"><h2>Sorry , 文章不存在</h2></div>';
}
if(isset($_GET['p']))output($_GET['p'].".md");
else if(isset($_GET['list']))output('list.md');
else echo '<div style="margin-top:170px;"><h2>这是个博客...</h2><br><br><br><h4>嗯,这是个博客</h4><br><br><h5>文章看目录8</h5></div>';
  ?>
  </div>
</html>

Python翻译小程序

调用网上找的api做的…

支持谷歌、必应(能否成功调用看脸)、有道、词霸、欧米翻译

直接放Source

import requests
import re
def translate_google(lanf,lant,text):
    try:
        url="https://translate.google.cn/translate_a/single?client=gtx&sl="+lanf+"&tl="+lant+"&dt=t&dt=bd&q="+text
        translation=requests.get(url).json()
        num=0
        ans={}
        try:
            for i in translation[1]:
                num+=1
                ans[num-1]=0
                for j in translation[1][num-1][1]:
                    ans[num-1]+=1
            i=0
            while i<num:
                print(translation[1][i][0],end=": ")
                j=0
                while j<ans[i]:
                    print(translation[1][i][1][j],end="")
                    if j+1<ans[i]:print(",",end="")
                    j+=1
                print()
                i+=1
            print('')
        except:
            translation=translation[0][0][0]
            print("翻译结果:"+translation)
            print('')
    except:
        print("出错")
def translate_youdao(lanf,lant,text):
    try:
        if lanf=='jp':lanf='ja'
        if lant=='jp':lant='ja'
        mode=(lanf.replace('-','_')+'2'+lant.replace('-','_')).upper()
        url="http://fanyi.youdao.com/translate?&doctype=json&type="+mode+"&i="+text
        translation=requests.get(url).json()['translateResult'][0][0]['tgt']
        print("翻译结果:"+translation)
        print('')
    except:
        print("出错")
def translate_bing(lanf,lant,text):
    try:
        url="http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=AFC76A66CF4F434ED080D245C30CF1E71C22959C&from="+lanf+"&to="+lant+"&text="+text
        translation = requests.get(url).text
        translation=re.findall(r'<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">(.*?)</string>',translation)[0]
        print("翻译结果:"+translation)
        print('')
    except:
        print("出错")
def translate_icb(lanf,lant,text):
    try:
        if lanf!='auto':
            lanf=lanf[:2]
            if lanf=='jp':lanf='ja'
        if lant!='auto':
            lant=lant[:2]
            if lant=='jp':lant='ja'
        url='http://fy.iciba.com/ajax.php?a=fy&f='+lanf+'&t='+lant+'&w='+text
        translation=requests.get(url).json()
        if translation['status']==0:
            for i in translation['content']['word_mean']:
                print(i)
        elif translation['status']==1:
            print("翻译结果:"+translation['content']['out'])
        print('')
    except:
        print("出错")
def translate_omi(lanf,lant,text):
    try:
        lanf=lanf[:1]
        lant=lant[:1]
        if lanf=='a' or lant=='a':mode='undef'
        else:
            if lanf=='z':lanf='c'
            if lant=='z':lant='c'
            mode=lanf+'2'+lant
        url='https://www.omifanyi.com/transsents.do?sentsToTrans='+text+'&languageType='+mode
        translation=requests.get(url).json()
        base=translation['sentsResults'][1][0]
        extra=translation['wordResults']
        print('翻译结果:'+base)
        try:
            for i in extra:
                print(i[0]+' '+i[1])
        except:
            pass
        print('')
    except:
        print("出错")
def main(lanf,lant,provider):
    while 1:
        if provider==1:
            text = input("键入需要翻译的内容:\n")
            translate_google(lanf,lant,text)
        elif provider==2:
            text = input("键入需要翻译的内容:\n")
            translate_bing(lanf,lant,text)
        elif provider==3:
            text = input("键入需要翻译的内容:\n")
            translate_youdao(lanf,lant,text)
        elif provider==4:
            text = input("键入需要翻译的内容:\n")
            translate_icb(lanf,lant,text)
        elif provider==5:
            text = input("键入需要翻译的内容:\n")
            translate_omi(lanf,lant,text)
        elif provider==6:
            text = input("键入需要翻译的内容:\n")
            print("谷歌:")
            translate_google(lanf,lant,text)
            print("有道:")
            translate_youdao(lanf,lant,text)
            print("词霸:")
            translate_icb(lanf,lant,text)
            print("欧米翻译:")
            translate_omi(lanf,lant,text)
            print("必应:")
            translate_bing(lanf,lant,text)
        else:
            print("错误选项")
            exit()
mode=int(input("欢迎使用翻译\n你希望怎么翻译呢?\n1).英译中\n2).中译英\n3).自动转中文\n4).自动转英文\n5).全自动(有道、词霸支持多语言)\n6).手动选择\n7).退出\n"))
if mode==1:
    provider=int(input("要哪家的服务呢?\n1).谷歌\n2).巨硬(Api次数有限)\n3).有道\n4).词霸\n5).欧米翻译\n6).我全都要\n"))
    main('en','zh-cn',provider)
elif mode==2:
    provider=int(input("要哪家的服务呢?\n1).谷歌\n2).巨硬(Api次数有限)\n3).有道\n4).词霸\n5).欧米翻译\n6).我全都要\n"))
    main('zh-cn','en',provider)
elif mode==3:
    provider=int(input("要哪家的服务呢?\n1).谷歌\n2).巨硬(Api次数有限)\n3).有道\n4).词霸\n5).欧米翻译(仅中英)\n6).我全都要\n"))
    main('auto','zh-cn',provider)
elif mode==4:
    provider=int(input("要哪家的服务呢?\n1).谷歌\n2).巨硬(Api次数有限)\n3).有道\n4).词霸\n5).欧米翻译(仅中英)\n6).我全都要\n"))
    main('auto','en',provider)
elif mode==5:
    provider=int(input("要哪家的服务呢?\n1).有道\n2).词霸\n3).欧米翻译(仅中英)\n"))
    if provider==1:provider=3
    elif provider==2:provider=4
    elif provider==3:provider=5
    elif provider==6:pass
    else:provider=0
    main('auto','auto',provider)
elif mode==6:
    lanf=input("输入源语言(zh-cn,en,jp,auto...):\n")
    lant=input("输入目标语言(zh-cn,en,jp...):\n")
    provider=int(input("要哪家的服务呢?\n1).谷歌\n2).巨硬(Api次数有限)\n3).有道\n4).词霸\n5).我全都要\n"))
    if provider==5:provider=6
    elif provider==6:provider=0
    main(lanf,lant,provider)
elif mode==7:
    print('欢迎下次使用')
    exit()
else:
    print('错误选项')
    exit()

就这样8…

Python简易聊天室

这是第二个

一、一对一版

1).服务端

我又倦了,直接贴代码

import socket
import threading
s = socket.socket()
s.bind(("", 2333))
s.listen(5)
nick = input("输入昵称:")
print("Start Server...")
sock, addr = s.accept()
print(addr, " Connected")
print("输入q以退出")
other = sock.recv(1024).decode()
def reciver():
    while 1:
        data = sock.recv(1024)
        print(other, " : ", data.decode())
def sender():
    while 1:
        sock.send(nick.encode())
        massage = input()
        if massage == 'q':
            break
        print(nick + " : " + massage)
        sock.send(massage.encode())
t1 = threading.Thread(target=reciver, name='recive')
t2 = threading.Thread(target=sender, name='send')
t1.start()
t2.start()
t2.join()
sock.close()
print("断开连接")

2).客户端

import socket
import threading
s = socket.socket()
nick = input("输入昵称:")
ip = input("输入服务器ip:")
port = 2333
s.connect((ip, port))
print("已连接服务器\n输入q以退出")
s.send(nick.encode())
def sender():
    while 1:
        massage = input()
        if massage == 'q':
            break
        print(nick + " : " + massage)
        s.send(massage.encode())
def reciver():
    while 1:
        other = s.recv(1024).decode()
        massage = s.recv(1024).decode()
        print(other, " : ", massage)
t1 = threading.Thread(target=reciver, name='recive')
t2 = threading.Thread(target=sender, name='send')
t1.start()
t2.start()
t2.join()
print("断开连接")
s.close()

二、多人聊天室

1).服务端

import socket
import threading
user={}
address={}
def send(text,addr):
    for i in user:
        try:
            if addr != '' and i == address[addr]:
                pass
            else:
                s.sendto(text.encode(),user[i])
        except:
            logout(i)
def preload():
    while 1:
        preloading=s.recvfrom(1024)
        mess=preloading[0].decode()
        addr=preloading[1]
        if addr in address:
            try:
                if mess == 'q':
                    logout(address[addr])
                else:
                    send(address[addr]+ ':' + mess,addr)
            except:
                logout(address[addr])
        else:
            login(mess,addr)
            print(addr," Connected\n当前在线人数:",len(user))
def login(nick,addr):
    if nick in user:
        s.sendto("系统消息:用户名存在\n请重新输入:".encode(),addr)
    else:
        user[nick]=addr
        address[addr]=nick
        send("系统消息:欢迎"+nick+"进入直播间",'')
def logout(nick):
    send("系统消息:"+nick+"褪出了直播间",'')
    s.sendto("sys_exit".encode(),user[nick])
    print(user[nick],"Logout\n当前在线人数:",len(user)-1)
    del address[user[nick]]
    del user[nick]
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('',2333))
print("Start Server...")
thread=threading.Thread(target=preload)
thread.setDaemon(True)
thread.start()
thread.join()

2).客户端

import socket
import threading
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
nick = input("输入昵称:")
ip = input("输入服务器ip:")
port = 2333
s.connect((ip,port))
print("连接服务器...\n如需退出,按q(请务必不要强制退出)")
s.send(nick.encode())
def sender():
    try:
        while 1:
            massage = input()
            s.sendto(massage.encode(),(ip,port))
            if massage == 'q':
                exit()
    except:exit()
def reciver():
    try:
        while 1:
            massage=s.recvfrom(1024)[0].decode()
            if massage == 'sys_exit':
                break
            print(massage)
    except:print("IF YOU MEET SOME TROUBLE,Please Contact Developer\nBye~")
t1 = threading.Thread(target=reciver, name='recive')
t2 = threading.Thread(target=sender, name='send')
t1.start()
t2.start()
t2.join()

就这样8…

感谢以下文章:

Python基础socket一对一聊天室

Python实现简易聊天室(Linux 终端)

socket编程学习——-python打造多人聊天室

基于python的聊天室程序

python实现socket+threading处理多连接

【python】udp 数据的发送和接收

python-udp接受数据

这些文章我或多或少进行了参考,可能只是一个点,可能只是一句话,亦有可能是一段代码,但非常感谢这些文章在我完成这个作业时对我的帮助

…不想写了…明天再说,我去康康有什么新优惠

TCP完成简易GET

咕咕咕,这段时间主要是期中考试…还关注了几天黑五…然后拖到今天才写完…

这是第一个,用仅TCP实现GET功能

import socket
import ssl
s=ssl.wrap_socket(socket.socket())
s.connect(('www.bilibili.com', 443))
s.send('GET / HTTP/1.1\r\n'.encode())
s.send('Host: www.bilibili.com\r\n'.encode())
s.send('User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36\r\n'.encode())
s.send('Connection: close\r\n\r\n'.encode())
response=b""
while 1:
    temp = s.recv(1024)
    if temp:
        response+=temp
    else:break
s.close()
response=response.decode("utf8").split("\r\n\r\n")[1]
f = open('bilibili.html','w',encoding='utf-8')
f.write(response)
f.close()

这样就行了,很简单的,就是输出出来的文件会有点奇怪:

有些地方UTF-8无法解析,谁来救救我…

参考了许多大佬的文章,在此一并感谢

Python爬取网易云歌手信息

这个同样是作业…

早写完了,鸽了好久才发出来…

首先是根据指定歌手id获取歌手名和简介

import requests
import re
def spider(id):
    url="https://music.163.com/m/artist?id="+id
    headers={"user-agent": "Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1"}
    response=requests.get(url,headers=headers)
    response=response.text
    singer=re.findall(r'<meta name="keywords" content="(.*?)" />',response)
    introduce=re.findall('"briefDesc":"(.*?)"',response)
    result=dict(zip(singer,introduce))
    print(result)
id=input('请输入歌手id:\n')
spider(id)

我发现移动版的网易云更好搞,不需要cookie啥的,只要有个UA就能获取成功…

然后稍微处理一下就能取得信息了…

然后是获取所有亚洲男歌手id和姓名

import requests
import re
def spider(id):
    url="https://music.162.com/discover/artist/cat?id=1001&initial="+str(id)
    headers={"user-agent": "Mozilla/4.0 (Windows NT 10.0; Win64; x64; Cortana 1.11.6.17763; 10.0.0.0.17763.805) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"}
    response=requests.get(url,headers=headers)
    response=response.text
    singer=re.findall(r'<a href="/artist\?id=(.*?)" class="nm nm-icn f-thide s-fc-1" title="(.*?)的音乐"',response)
    singer=dict(singer)
    return singer
list={64,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,0}
singers=spider(-2)
for id in list:
    singers=dict(singers,**spider(id))
print(singers)

这个也很简单…UA用的Cortana的…虽然不知道有什么用…

就这样吧,这次的没什么难度

如何做一个假wei斯

这个其实也是在完成作业时的副产品,之所以选择百度就是因为便宜还有易于开发

一、获取百度SDK

首先,你需要拥有一个百度账号(估计都有吧,这年代还有人不用百度云?)

然后,登陆 https://console.bce.baidu.com/ai/#/ai/speech/overview/index 创建应用,接口默认即可

点击查看应用详情,获取 AppID,API Key,Secret Key

安装Python SDK

pip install baidu-aip

无pip也可在应用页下载SDK手动安装,解包后执行

python setup.py install

二、安装依赖

这部分没pip的只有自己想办法了…

除SDK外,还需安装playsound,pyaudio,scipy,numpy

第一个用于播放合成出来的语音

后面三个主要用在录音环节

依次执行

pip install 包名

如果pyaudio无法安装

https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 下载对应包

pip install 包名.whl

即可完成安装

另外,还需对playsound进行修改,否则循环时会一直占用音频文件,导致无法写入

请参考 python下playsound模块解除占用

三、码代码

我们分成四个部分来完成

第一部分:语音识别

参考官方文档,我们首先需要将之前获得的APP_IDAPI_KEYSECRET_KEY 填入

from aip import AipSpeech

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

再参照文档中的示例

# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

# 识别本地文件
client.asr(get_file_content('audio.pcm'), 'pcm', 16000, {
    'dev_pid': 1536,
})

这个示例是将目录下的audio.pcm上传识别

因此,能想到,如果有什么方法能自动录音,判断我们已经停止说话,然后将文件上传识别,那么这个模块就已经完善

然而,我对这个自动录音想的太过简单,最终,录音部分通过对python录音程序提供的源码进行修改实现

大佬的源码非常完善,我们只需要对其中几个参数进行修改即可,录音阈值可以按环境进行适度调整,为了美观,可以将其中的两个print进行修改

删除源码的最后两行,保存为record.py

录音模块便制作完成

将其import后就可以直接调用了,我们可以直接recording(‘in.wav’)完成录音

再看回百度这边,client.asr调用后会返回一个dict,处理起来非常方便,只需dict.get(‘result’)就可以获取到[‘内容’]形式的结果

我通过对字符串的简单处理去除了[‘和’]

questionall = client.asr(get_file_content('in.wav'), 'pcm', 16000, {'dev_pid': 1536, }) # 此部分实现语音识别,返回值在questionall内
questional = str(questionall.get('result'))
    lens = int(len(questional))
    ques = questional[2:lens - 2]str(questionall.get('result')) # 此部分将结果提取并转为字符串
lens = int(len(questional)) # 获取字符串长度
ques = questional[2:lens - 2] # 只保留内容到ques

第二部分:调用机器人

因为懒,我直接用了一个百度出来的机器人http://api.qingyunke.com/ 说实话,还蛮好的

我们通过GET来获取回答,信息已存入message中,需注意,message必须urlencode,否则可能报错

r=requests.get('http://api.qingyunke.com/api.php?key=free&appid=0&msg='+message)

结果为一个dict和json都会报错的东西(大概是我太蔡了),所以我只能再次进行字符串处理

answer=str(r.json()) # 转为字符串
lens=int(len(answer)) # 计算长度
ans=answer[26:lens-2] # 保留结果

第三部分:语音合成

同样,根据官方文档

result  = client.synthesis('你好百度', 'zh', 1, {
    'vol': 5,
})

# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
    with open('auido.mp3', 'wb') as f:
        f.write(result)

所以我们只需把‘你好百度’换成我们需要的文字即可,可以修改参数来优化语音

播放语音通过playsound(‘out.mp3’)实现

第四部分:逻辑主体

这里主要是逻辑方面的编写,你们自己看着办吧…

比如一阵机械的嘘寒问暖之后,开始循环,直到识别到关键字退出或进行指定回答…

最终节:出来吧,假wei斯

唔,我还是直接贴代码吧,不想写了,安装完依赖后,直接执行应该能得到一个假wei斯吧…(记得替换APP_ID啥的,record.py必须在同目录下)

from aip import AipSpeech
import requests
import urllib.parse
from record import recording
from playsound import playsound

# 认证部分
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

# 录音并调用SDK进行语音识别,输出并返回结果
def voice():
    recording('in.wav')
    questionall = client.asr(get_file_content('in.wav'), 'pcm', 16000, {'dev_pid': 1536, })
    questional = str(questionall.get('result'))
    lens = int(len(questional))
    ques = questional[2:lens - 2]
    print('.',end='')
    print(ques)
    ques = urllib.parse.quote(ques)
    return ques

# 根据给入的文字调用SDK输出并播放音频
def voiceout(message):
    result  = client.synthesis(message, 'zh', 1, {'vol': 5,})
    if not isinstance(result, dict):
        with open('out.mp3', 'wb') as f:
            f.write(result)
    playsound('out.mp3')

# 向机器人发送信息并对返回值处理
def ai(message):
    r=requests.get('http://api.qingyunke.com/api.php?key=free&appid=0&msg='+message)
    answer=str(r.json())
    lens=int(len(answer))
    ans=answer[26:lens-2]
    return ans

# 程序主体
print('欢迎使用聊天机器人')
ainame=input('给你的机器人取个名字吧\n')
name=input('你叫什么名字?\n')
print(ainame,':你好',name,',说些什么吧')
voiceout('你好,'+name+',说些什么吧')
i=1;
while i==1:
    print(name,':',end='')
    requ=voice()
    requ=urllib.parse.unquote(requ)
    if '再见' in requ or '晚安' in requ or '退出' in requ or '拜拜' in requ:
        i=0
    anse=ai(requ)
    if anse=='未获取到相关信息':
        anse='听不清,请再说一遍'
    print(ainame,':',anse)
    voiceout(anse)
print('谢谢使用!')
voiceout('谢谢使用!')

最后,再次感谢百度SDK,聊天机器人录音脚本playsound修改等教程或服务的作者或开发者

利用Docker一键安装WordPress

同样,这也是社团任务…

这次,我选用Centos8来进行

配置Docker及系统环境

首先,安装Docker

推荐使用自动脚本安装(省事,快捷),通过mirror选项更换国内源

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

启用Docker

systemctl enable docker
systemctl start docker

开启v4转发(不开就没法关防火墙…容器也可能连不了外网)

vi /etc/sysctl.conf
#在其中添加
net.ipv4.ip_forward=1
#重启网络生效
systemctl restart network

关闭防火墙及SELinux(也是因为懒)

#停止firewalld服务
systemctl stop firewalld
#禁止firewalld自起
systemctl disable firewalld
#临时关闭SELinux
setenforce 0
#永久关闭SELinux
vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled

使用YAML一键构建

建立一个wordpress.yml文件

vi wordpress.yml

在其中键入(3.1版语法)

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 80:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpressuser
      WORDPRESS_DB_PASSWORD: wordpresspass
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress:/var/www/html

  db:
    image: mariadb
    restart: always
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpressuser
      MYSQL_PASSWORD: wordpresspass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

以上根据官方文档修改

一键安装

docker stack deploy -c stack.yml wordpress

安装完成后可通过http://swarm-iphttp://localhost, or http://host-ip访问

附1:

我是使用DaoCloud一键构建的,但由于平台只支持YAML 2.0,因此,我修改了上方代码,形成下方代码(适用于DaoCloud,别的不清楚)

wordpress:
  image: wordpress
  ports:
  - 80:80
  environment:
  - WORDPRESS_DB_HOST=db
  - WORDPRESS_DB_USER=wordpress
  - WORDPRESS_DB_PASSWORD=password
  - WORDPRESS_DB_NAME=wordpress
  restart: always
  links:
  - db
  volumes:
  - wordpress:/var/www/html
db:
  image: mariadb
  restart: always
  environment:
  - MYSQL_DATABASE=wordpress
  - MYSQL_USER=wordpress
  - MYSQL_PASSWORD=password
  - MYSQL_RANDOM_ROOT_PASSWORD='1'
  volumes:
  - db:/var/lib/mysql

附2:

还顺便研究了下Minecraft的Docker一键部署(同样2.0版)

minecraft:
  image: index.docker.io/itzg/minecraft-server:20190824  //有新版本自行更换
  privileged: false
  restart: always
  ports:
  - 25575:25575  //推荐更改此端口,这个为控制端口
  - 25565:25565
  volumes:
  - /data:/data
  environment:
  - EULA=TRUE  //不同意不能部署

详见 https://hub.docker.com/r/itzg/minecraft-server

如何在Ubuntu下手撸LNMP并安装WordPress

前言&Centos8上的失败尝试

手撸LNMP,这个对我来说久远的记忆…(自从用了LNMP一键脚本后,除了特殊环境和省时间外我就没再亲自做了…更何况后来发现更好用的面板)上次手撸LNMP还是高二…(R1D上哦,教程什么的等寒假回家了再说吧) 这次由于社团要求,我首先想到了在Centos8环境进行,毕竟用作服务器似乎Centos好点?… 开始安装后,我首先执行了

yum install nginx php mariadb mariadb-server 

然后初始化数据库mysql_secure_installation,初始化结束后,开始配置nginx和php 由于Centos自带php、nginx默认使用sock,所以不需要其他设置就能通过PHP info验证… 但当我将探针放上去却频繁报错…(搞了1天,日志什么的都看了,没法解决,而且网上似乎也没解决方案…)所以我决定将Centos环境换成Ubuntu18.04

LNMP环境安装

先更新软件源

sudo apt update

安装nginx,php,mariadb

sudo apt install nginx php-fpm php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip php-mysql mariadb-server mariadb-client 

配置nginx

首先,设置nginx自起并启动

sudo systemctl start nginx.service
sudo systemctl enable nginx.service 

这里使用多站点配置方案

sudo vi /etc/nginx/sites-available/wordpress

将以下内容贴入(仅启用了http)

server {
    listen 80;
    listen [::]:80;
    root /var/www/html/wordpress;
    index  index.php index.html index.htm;
    server_name _;

    client_max_body_size 100M;

    location / {
        try_files $uri $uri/ /index.php?$args;        
    }

    location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass             unix:/var/run/php/php7.2-fpm.sock;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

启用配置文件

sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/

重载nginx

sudo systemctl reload nginx

可用sudo nginx -t检查语法错误

配置数据库

同样,启用数据库

sudo systemctl start mariadb.service
sudo systemctl enable mariadb.service

初始化数据库

sudo mysql_secure_installation

初始化后,进入数据库

mysql -u root -p

新建数据库

CREATE DATABASE xxx DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
xxx为数据库名,自行修改

创建用户管理该数据库

GRANT ALL ON xxx.* TO 'xxxuser'@'localhost' IDENTIFIED BY 'password';
xxx为刚才数据库名,xxxuser为用户,password为用户密码,自行修改

刷新权限并退出

FLUSH PRIVILEGES;

安装Wordpress

cd /var/www/html/wordpress
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz
mv wordpress/* .
rm -rf wordpress
sudo chown -R www-data:www-data /var/www/html/wordpress

进入127.0.0.1或localhost即可载入wordpress安装程序

安装到此结束

参考文献较杂较多,在此无法列出,见谅

这是用Makedown写的哟,最近有学Makedown哟

Surface Book の 奇幻之旅

为了方便做笔记以及提高生产力,我决定采购一台支持笔书写的平板用于学习,在进行深思熟虑后(排除一堆国产杂牌,排除某果),我选择了信仰苏菲,平衡了性能与预算后,我选择购入一台Book丐版展示机(买笔买拓展坞还是花了好多…)

Book预装的是已经濒临抛弃的1703,因此给系统升个级是必须操作,排除咖喱系统1903,1803和1809便是最佳选择,考虑网友对1809的文件夹创建卡顿颇有微词,我从msdn上下载了1803的最新补丁版

此处省略万字升级过程,按安装程序装的去就是了,记得装完再更新一下…

由于学习需要,我需要对苏菲进行Win10 X Linux

参考 https://www.jianshu.com/p/3d74e90af751 内容

我对C盘进行了30G压缩并制作了Elementaryos(基于Ubuntu18.04,又有超帅界面,骚年你还犹豫什么)启动盘

修改启动顺序,关闭TPM与Secure Boot后,需要输入BitLocker解锁码(咋没人提这个呢,一定要解密,一定要解密,不然你会被每切一次系统就要输一次解锁码烦死),并且需要重置pin,然后Win10这边就莫问题了

将制作好的启动U盘插入苏菲,系统会自动引导,之后按Ubuntu安装套路安装就行了

安装完成后,需进行驱动安装 https://github.com/jakeday/linux-surface (把脚本跑一遍,然后装上内核即可)

至此,这篇对小白极不友善的教程结束