孙肖宁 发布的文章

小编今天在使用MxSrvs运行thinPHP项目的时候,直接把项目目录直接放在了网站根目录里面,发现默认控制器的访问是没有问题的,但是其他的控制器以及直接输入默认的控制器全部显示的事404。后来发现其实是需要配置下的,而且也可以不放在网站根目录里面。
首先点击左侧的配置编辑--》再点击Nginx--》再点击最后一行的加号
1.png

然后就会弹出一个框,然后注入域名,项目名,项目目录就可以了。
2.png

这时候就会生成一个配置文件,然后在配置文件里面加入以下内容(是新弹出来的配置文件里面)

    location /
    {
        index index.php;
        #ThinkPHP REWRITE支持
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?s=$1 last;
            break;
        }
    }

完整的就是

server {
    listen            80;
    server_name        devapi.sunxiaoning.com;
    root            /; # 自己的项目的位置
    #access_log        /; # 自己项目日志的位置
    include            vhosts/_nginx.vhost.fpm;
    location /
    {
        index index.php;
        #ThinkPHP REWRITE支持
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?s=$1 last;
                        # rewrite ^/index.php/(.*)$ /index.php?s=$1 last; # 域名后面有index.php
            break;
        }
    }
}

然后在nginx的配置文件里面的PHP里面加入:

location ~ \.php$ {
            root           /Applications/MxSrvs/www;
            fastcgi_pass   127.0.0.1:10080;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_split_path_info ^(.+\.php)(.*)$;     #增加这一句  
            fastcgi_param PATH_INFO $fastcgi_path_info;    #增加这一句
            include        fastcgi_params;
        }

我们可以利用python的PyPinyin库来获取汉字的拼音,我们先来写一个简单的案例

import pypinyin
print(pypinyin.pinyin( "小宁博客"))

# [['xiǎo'], ['níng'], ['bó'], ['kè']]

是不是很简单呢,我们只用了两行代码就实现了最基础的汉字转拼音。要是多音字怎么办呢?
这里PyPinyin也给我们做了处理了

from pypinyin import pinyin, lazy_pinyin, Style
x = "我画了一个长方形"
# 按照意思自动标识声调
print(pinyin(x)) # [['wǒ'], ['huà'], ['le'], ['yí'], ['gè'], ['cháng'], ['fāng'], ['xíng']]
# 列举出所有的声调
print(pinyin(x, heteronym=True)) # [['wǒ'], ['huà'], ['le', 'liǎo', 'liào'], ['yí'], ['gè'], ['cháng'], ['fāng'], ['xíng']]
# 忽略声调
print(lazy_pinyin(x)) #['wo', 'hua', 'le', 'yi', 'ge', 'chang', 'fang', 'xing']

我们来详细分析下这个函数pypinyin.pinyin(hans, style=<Style.TONE: 1>, heteronym=False, errors='default', strict=True)

  • 参数

    • hans汉字字符串。
    • style指定拼音风格,默认是 TONE风格。
    • errors指定如何处理没有拼音的字符。
    • heteronym指定是否启用多音字。
    • strict指定是否严格遵照《汉语拼音方案》来处理声母和韵母。

我们再来看下pypinyin.lazy_pinyin(hans, style=<Style.NORMAL: 0>, errors='default', strict=True)

  • 参数

    • hans汉字字符串。
    • style指定拼音风格,默认是 TONE风格。
    • errors指定如何处理没有拼音的字符。
    • strict指定是否严格遵照《汉语拼音方案》来处理声母和韵母。

自定义拼音库
自定义拼音库--载入用户自定义的单字拼音库`pypinyin.load_single_dict(pinyin_dict, style='default')

  • 参数

    • pinyin_dict (dict)单字拼音库。比如: {0x963F: u"ā,ē"}
    • stylepinyin_dict 参数值的拼音库风格. 支持 ‘default’, ‘tone2’

自定义拼音库--载入用户自定义的词语拼音库pypinyin.load_phrases_dict(phrases_dict, style='default')

  • 参数

    • phrases_dict (dict)词语拼音库。比如: {u"阿爸": [[u"ā"], [u"bà"]]}
    • style phrases_dict参数值的拼音库风格. 支持 ‘default’, ‘tone2’

附:风格列表

  • NORMAL = 0普通风格,不带声调。如: 中国 -> zhong guo。
  • TONE = 1标准声调风格,拼音声调在韵母第一个字母上(默认风格)。如: 中国 -> zhōng guó。
  • TONE2 = 2声调风格2,即拼音声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 -> zho1ng guo2。
  • TONE3 = 8声调风格3,即拼音声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> zhong1 guo2。
  • INITIALS = 3声母风格,只返回各个拼音的声母部分(注:有的拼音没有声母,详见 #27_)。如: 中国 -> zh g。
  • FIRST_LETTER = 4首字母风格,只返回拼音的首字母部分。如: 中国 -> z g。
  • FINALS = 5韵母风格,只返回各个拼音的韵母部分,不带声调。如: 中国 -> ong uo。
  • FINALS_TONE = 6标准韵母风格,带声调,声调在韵母第一个字母上。如:中国 -> ōng uó。
  • FINALS_TONE2 = 7韵母风格2,带声调,声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 -> o1ng uo2。
  • FINALS_TONE3 = 9韵母风格3,带声调,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ong1 uo2。
  • BOPOMOFO = 10注音风格,带声调,阴平(第一声)不标。如: 中国 -> ㄓㄨㄥ ㄍㄨㄛˊ。
  • BOPOMOFO_FIRST = 11注音风格,仅首字母。如: 中国 -> ㄓ ㄍ。
  • CYRILLIC = 12汉语拼音与俄语字母对照风格,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> чжун1 го2。
  • CYRILLIC_FIRST = 13汉语拼音与俄语字母对照风格,仅首字母。如: 中国 -> ч г。

我们下载最新的MxSrvs,安装后发现我们的PHP的版本是7.4,MySQL的版本是8.0,有时候我们项目版本用的不是这些,我们就需要切换各软件的版本,但是我们发现该软件默认是没有其他版本可以让我们切换的,我们只能先去下载好需要的版本。
首先点击上面的更多版本
1.png

我们就来到了下载界面,然后发现,支持很多呀,我们目前只需要下载我们需要的软件的版本就可以了
2.png

下载完成后,我们需要把下载下来的安装包解压,然后再放到MxSrvs里面的bin目录里面(一般情况是/Applications/MxSrvs/bin/

然后我们再打开控制台:输入sudo xattr -rd com.apple.quarantine /Applications/MxSrvs回车后,输入你的电脑密码就可以了。如果出现xattr: No such file:这样的错误那么你就输入sudo xattr -rd com.apple.quarantine ,先不要回车,打开访达,找到应用程序,把MxSrvs拖到控制台,回车。
最后我们重启软件,就可以切换版本了。
3.png

今天小编给大家推荐一款mac上好用的PHP的集成开发环境MxSrvs,MxSrvs里面集成了Nginx,MySQL,PHP,Redis等。另外你也可以根据自己的需要选择不通版本的的环境。是不是很方便呢。如果你已经安装完毕了,想切换里面软件的版本,请参考小编的另外一篇文章《MxSrvs切换PHP或者其他软件的版本

安装

首先小编在这里分享下MxSrvs的下载地址:https://089u.com/file/13710799-452788670
下载下来后就可以进行安装了,安装之后,打开之后会出现无法打开“php”,因为无法验证开发者这样的错误,小编在这里提供下解决办法:

  • 打开控制台:输入sudo xattr -rd com.apple.quarantine /Applications/MxSrvs回车后,输入你的电脑密码就可以了。如果出现xattr: No such file:这样的错误那么你就输入sudo xattr -rd com.apple.quarantine ,先不要回车,打开访达,找到应用程序,把MxSrvs拖到控制台,回车。
    做完这一步你就可以使用了,打开我们的MxSrvs,你就能看到以下界面了。
    MxSrvs.png

卸载

小编在这里在说下卸载的方式:

  • 首先通过控制台停止所有已运行的服务类组件。
  • 然后通过控制台取消所有组件环境变量。
  • 在配置菜单里面取消开机启动MxSrvs取消勾选
  • 删除目录~/Library/Application Support/MxSrvs
  • 删除程序/Applications/MxSrvs

使用Mac的小伙伴都知道Mac本身没有远程Windows桌面的控制工具,我们一般需要借助第三方的工具。之前常用的就是微软远程工具,但是太久没有更新了,升级系统后,现在已经无法使用了,之前还是蛮好用的,现在官方的下载地址小编也没法访问了,在这里给大家推荐另外一款远程桌面工具吧Microsoft Remote Desktop,这款软件也是免费的,使用起来也是比较方便的。在这里给大家分享下安装包:
链接: https://pan.baidu.com/s/18gTzXG3-sdIGNFaJrmDVSg 密码: m2a3

安装完成后,点击左上角的加号(new)
1.png

输入IP,登录用户名,密码,另外还可以,共享本机的文件,然后点击关闭
2.png
2.1.png

这时候就可以看到服务列表了,双击服务器列表的某一项就可以登录服务器了。
3.png

这个软件还是比较好用的,而且还是免费的。

另外小伙伴们也可以使用一些远程工具,比如向日葵远程桌面,也比较好用,服务器和本机都安装一个向日葵远程桌面的客户端,这样也可以远程服务器了。

python使用jieba库进行中文分词,我们可以吧一篇中文文章里面的词语提取出来进行分析,这时候我们可以采用jieba库,python2和python3都支持,目前jieba库支持3种分词模式:精确模式、全模式、搜索引擎模式,并且支持繁体分词,还支持自定义词典。

使用之前我们要先安装jieba库

pip install jieba

然后导入jieba库

import jieba
import jieba.posseg as pseg #词性标注
import jieba.analyse as anls #关键词提取

分词

我们首先看下精确模式、全模式、搜索引擎模式的输出情况,默认是精确模式。

  • jieba.cut 方法接受两个输入参数: 第一个参数为需要分词的字符串,cut_all参数用来控制是否采用全模式,默认是精确模式。
  • jieba.cut_for_search方法接受一个参数:需要分词的字符串,该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。

jieba.cut以及jieba.cut_for_search返回的结构都是一个可迭代的generator,可以使用for循环来获得分词后得到的每一个词语(unicode),也可以用list(jieba.cut(...))转化为list

# 全模式
seg_list = jieba.cut("我要进行关键词提取", cut_all=True)
print("【全模式】:" + "/ ".join(seg_list)) 

# 精确模式
seg_list = jieba.cut("我要进行关键词提取", cut_all=False)
print("【精确模式】:" + "/ ".join(seg_list)) 


#【全模式】:我/ 要/ 进行/ 关键/ 关键词/ 提取
#【精确模式】:我要/ 进行/ 关键词/ 提取
#【搜索引擎模式】:我要/ 进行/ 关键/ 关键词/ 提取

精确模式,返回的是一个生成器,这对大数据量数据的分词十分重要。
全模式,可见全模式就是把文本分成尽可能多的词。

获取词性

我们还可以通过jiaba这个库把词性进行区分,比如动词,名词等

import jieba.posseg as psg

seg_list = psg.cut("我要进行关键词提取")
print([(s.word, s.flag) for s in seg_list])
# [('我', 'r'), ('要', 'v'), ('进行', 'v'), ('关键词', 'n'), ('提取', 'v')]

我们还可以提取动词或者名词,我们来提取下里面的动词

import jieba.posseg as psg

seg_list = psg.cut("我要进行关键词提取")
print([(s.word, s.flag) for s in seg_list if s.flag.startswith('v')])

获取出现次数最多的词语

from collections import Counter
c = Counter("我要进行关键词提取,我要进行学习,好好学习,天天向上。").most_common(3)
print(c)

添加字典增加准确性

我们可以指定自己自定义的词典,以便包含jieba词库里没有的词。虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率。
用法: jieba.load_userdict(file_name) # file_name为自定义词典的路径

并行分词

在文本数据量非常大的时候,为了提高分词效率,开启并行分词就很有必要了。jieba支持并行分词,基于python自带的multiprocessing模块,但要注意的是在Windows环境貌似不支持。
用法:
开启并行分词模式,参数为并发执行的进程数 jieba.enable_parallel(5)
关闭并行分词模式 jieba.disable_parallel()

Python使用QRCode生成二维码,qrcode会依赖Image这个包,所以我们首先安装qrcode和Image:

pip install qrcode
pip install Image
  • 首先我们来写一个最简单的案例,生成一个内容为hello sunxiaoning的二维码,​保存到本地,执行以下脚本,就可以生成一个hello.png的文件,并且自动打开。我们扫描之后就可以看到二维码里面的内容了。是不是很简单啊,​人生苦短,我用python。

    import qrcode 
    img = qrcode.make('hello sunxiaoning')
    # 保存二维码
    img.save('hello.png')
    # 展示二维码
    img.show()
  • 我们在来设置一个中间带有头像的二维码,我们要先安装下Pillow。使用pip install Pillow即可。

    import qrcode
    from PIL import Image
    qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_H,
            box_size=5,
            border=4,
        )
    
    # 添加数据
    qr.add_data('Hello sunxiaoning')
    # 填充数据
    qr.make(fit=True)
    # 生成图片
    img = qr.make_image(fill_color="orange", back_color="white")
    
    # 添加头像,打开头像照片
    icon = Image.open("1.jpeg")
    # 获取图片的宽高
    img_w, img_h = img.size
    # 参数设置头像的大小
    factor = 6
    size_w = int(img_w / factor)
    size_h = int(img_h / factor)
    icon_w, icon_h = icon.size
    if icon_w > size_w:
        icon_w = size_w
    if icon_h > size_h:
        icon_h = size_h
    # 设置头像的尺寸
    icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
    
    w = int((img_w - icon_w) / 2)
    h = int((img_h - icon_h) / 2)
    # 粘贴头像
    img.paste(icon, (w, h), mask=None)
    # 保存img
    img.save('hello.png')
    # 展示二维码
    img.show()

参数详解

  • version 控制二维码的大小,取值范围从1到40。取最小值1时,二维码大小为21*21。取值为 None (默认)或者使用fit=true参数(默认)时,二维码会自动调整大小。
  • error_correction控制二维码纠错级别。

    • ERRORCORRECTL大约7%或者更少的错误会被更正。
    • ERRORCORRECTM默认值,大约15%或者更少的错误会被更正。
    • ERRORCORRECTQ大约25%或者更少的错误会被更正。
    • ERRORCORRECTH大约30%或者更少的错误会被更正。
  • box_size控制二维码中每个格子的像素数,默认为 10。
  • border控制二维码四周留白包含的格子数,默认为 4。
  • image_factory选择生成图片的形式,默认为 PIL 图像。
  • mask_pattern选择生成图片的的掩模。

方法详解

  • add_data(str,optimize=20) 添加要转换的文字到data参数;如果使用了optimize优化参数,数据将被拆分为多个块来进行优化,以找到一个长度至少为这个值的足够简洁的方式来生成二维码。设置为“0”以避免优化。
  • make(fit=True)当fit参数为真或者没有给出version参数时,将会调用bestfit方法来找到适合数据的最小尺寸。如果没有设置maskpattern,将会调用bestmaskpattern方法来找到找到最有效的掩模图案。最后将这些数据传递给makeImpl方法来生成二维码。与qrcode本体的make方法不一样的是,这个方法没有任何返回值。
  • makeimage(fillcolor=None, backcolor=None,imagefactory=None):创建二维码的图像并返回,默认为 PIL 图像。可以在这里设置二维码的颜色。
  • clear 清空所有数据。
  • get_matrix 返回二维码数组。
  • print_ascii(out=None, tty=False, invert=False)可以用字符画的形式来输出二维码,但是需要注意的是扫的时候不一定可以扫出来,谨慎使用。

对于熟悉SEO的小伙伴都很清楚,静态网站的收录以及排名都比较好使。我们使用PHP开发网站的时候一般都使用的是伪静态,有些开源的程序都基本上可以开启伪静态,那么我们自己写的呢,怎么实现呢,小编今天在这里总结下TP3.2实现伪静态。

首先在使用大U方法进行传参的时候不要直接{:U('test')}?id=1这么写,我们要按照手册里面的写法去书写{:U('test',array('id'=>1))},这时候你就会发现直接是.html结尾了。

接下来我们要去除的是index.php

首先我们在网站的根目录里面新建.htaccess这个文件,记得前面有个点哦。然后填上以下内容。

<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

再然后我们打开项目的配置文件把URL_MODEL 改为 2,也就是 'URL_MODEL'=>'2'

最后我们就完美实现了。

今天小编给大家介绍一个有趣的事情,让代码开口说话,简单点说就是python利用pyttsx3实现文字转语音。感觉还是蛮有趣的,并且支持中文哦。

  • 首先我们先安装pyttsx3

    pip install pyttsx3
  • 如果是windows操作系统,并且未安装pywin32, 需要安装pywin32

    pip install pywin32
  • 我们首先让代码说句Hello World,然后再说句中文

    import pyttsx3 
     
    # 模块初始化
    engine = pyttsx3.init() 
    print('准备开始语音播报...')
    engine.say('Hello World')
    engine.say('孙肖宁')
    # 等待语音播报完毕, 不写这个是不可以的哦
    engine.runAndWait()

    是不是很简单呢

  • 我们还可以进行语速控制、音量控制、更换发音人声音

    import pyttsx3
    
    # 模块初始化
    engine = pyttsx3.init()
    print('准备开始语音播报...')
    
    # 语速控制,默认值为200
    rate = engine.getProperty('rate')
    engine.setProperty('rate', rate - 50)
    # 音量控制,范围为0.0-1.0
    volume = engine.getProperty('volume')
    engine.setProperty('volume', 0.6)
    # 添加朗读文本
    engine.say('窗前明月光,疑是地上霜。')
    
    # 等待语音播报完毕
    engine.runAndWait()
  • 我们再来说下更换发音人的声音,目前中文仅支持3种

    • 普通话: com.apple.speech.synthesis.voice.ting-ting.premium
    • 粤语 :com.apple.speech.synthesis.voice.ting-ting.premium
    • 台湾女生普通话: com.apple.speech.synthesis.voice.mei-jia

      import pyttsx3
      
      # 模块初始化
      engine = pyttsx3.init()
      volume = engine.getProperty('volume')
      
      # 普通话发音
      voices = engine.setProperty(
      'voice', "com.apple.speech.synthesis.voice.ting-ting.premium")
      
      # 标准的粤语发音
      # voices = engine.setProperty(
      #       'voice', "com.apple.speech.synthesis.voice.sin-ji")
      
      # 台湾女生普通话发音
      # voices = engine.setProperty(  
      #     'voice', "com.apple.speech.synthesis.voice.mei-jia")
      print('准备开始语音播报...')
      # 输入语音播报词语
      engine.setProperty('volume', 3)
      engine.say("窗前明月光,疑是地上霜。举头望明月,低头思故乡。")
      
      engine.runAndWait()
      engine.stop()
      另外你可以尝试查看内置的其他声音,遍历下面的voices即可
      voices = engine.getProperty('voices')
      engine.setProperty('voice', voices[0].id)

python利用pyttsx3实现文字转语音   .jpg
详解

  • 语音引擎工厂类似于设计模式中的“工厂模式”,pyttsx3通过初始化来获取语音引擎。当我们第一次调用init操作的时候,会返回一个pyttsx3的engine对象,再次调用的时候,如果存在engine对象实例,就会使用现有的,否则再重新创建一个。
    pyttsx.init([driverName : string, debug : bool]) → pyttsx.Engine
    从方法声明上来看,第一个参数指定的是语音驱动的名称,这个在底层适合操作系统密切相关的。如下:

    • drivename:由pyttsx3.driver模块根据操作系统类型来调用,默认使用当前操作系统可以使用的最好的驱动。

      • sapi5 - SAPI5 on Windows
      • nsss - NSSpeechSynthesizer on Mac OS X
      • espeak - eSpeak on every other platform
    • debug: 要不要以调试状态输出,开发阶段可以设置为True。

函数说明

  • connect()在给定的topic上添加回调通知

    • 参数:

      • topic(string):要描述的事件名称;
      • cb(callable):回调函数。
    • 返回值: dict
  • disconnect()结束连接

    • 参数:

      • token(dict):回调失联的返回标记
    • 返回值: Void
  • endLoop()简单来说就是结束事件循环
  • getProperty()获取当前引擎实例的属性值

    • 参数:

      • name(string):rate: 每分钟字数的语音速率,默认为每分钟200个。
      • name(string):voice: 语音的字符串标识符。
      • name(string):voices: pyttsx3.voice.Voice描述符对象列表。
      • name(string):volume:音量的大小。
    • 返回值: Object
  • setProperty()获取当前引擎实例的属性值

    • 参数:

      • name(string):rate: 每分钟字数的语音速率,默认为每分钟200个。
      • name(string):voice: 语音的字符串标识符。
      • name(string):volume:音量的大小。
      • value(int):rate: 设置每分钟读的字数。
      • value:voice:设置发音,后文中会再讲到。
      • valu(float):volume:设置音量大小,0.0-1.0之间;默认1.0。
    • 返回值: Object
  • say()预设要朗读的文本数据

    • 参数:

      • text(unicode):要进行朗读的文本数据。
      • name(strin):关联发音人(一般用不到)
  • runAndWait()当事件队列中事件全部清空的时候返回
  • startLoop()开启事件队列

    • 参数:

      • [useDriverLoop(bool)]:是否启用驱动循环。
  • stop()停止当前讲话并清除命令队列。