wordpress升级的编辑器不能用的问题
之前看到wordpress升级出来5.0了,昨天就把我的博客给升级了,但是发现了一个问题。
我之前的插件都是用的WP Editor.md,结果更新之后发现不能用了。
正好我看到wordpres5.0的更新介绍页面,提示如果不喜欢新编辑器,可以将老的编辑器给安装回来试试看。
我就尝试安装这个经典编辑器了。
嘿嘿,又能用了,真香。
之前看到wordpress升级出来5.0了,昨天就把我的博客给升级了,但是发现了一个问题。
我之前的插件都是用的WP Editor.md,结果更新之后发现不能用了。
正好我看到wordpres5.0的更新介绍页面,提示如果不喜欢新编辑器,可以将老的编辑器给安装回来试试看。
我就尝试安装这个经典编辑器了。
嘿嘿,又能用了,真香。
在mac进行开发的时候,有时候项目的目录在访达中不好找到。在终端中进行查找的时候就比较方便,一个cd
命令可以切到任何位置。
但是将项目目录从加入到编辑器中就比较费劲了。
目前发现了一个特别好玩的东西,就是vscode可以注入code命令,在终端使用code命令打开相应的目录或文件,非常方便。
在centos上有yum,ubuntu上有apt,而mac则是brew。这个并不是内置的。需要在终端执行命令进行安装。命令如下:
1 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
安装之后就可以像是linux一样使用包管理了。包的列表可浏览 https://formulae.brew.sh/formula/ 。
安装命令:
1 | brew install nginx |
启动nginx
1 | brew services start nginx |
重启nginx
1 | brew services restart nginx |
停止nginx
1 | brew services stop nginx |
安装
1 | brew install php |
启动php
1 | brew services start php |
重启php
1 | brew services restart php |
停止php
1 | brew services stop php |
安装
1 | brew install mysql |
启动命令
1 | brew services start mysql |
重启命令
1 | brew services restart mysql |
停止命令
1 | brew services stop mysql |
首先启动mysql服务器,然后执行
1 | mysql_secure_installation |
如果出现如下内容:
1 | VALIDATE PASSWORD COMPONENT can be used to test passwords |
表示询问你是否需要安装密码验证插件,这里我输入y允许安装了。
接下来
1 | There are three levels of password validation policy: |
这里是要求制定密码强度,我这里选择是0,
接下来就是让我输入两边密码了,
因为我输入的密码比较简单,所以有了如下提示:
1 | Estimated strength of the password: 50 |
提示说这个密码的强度不高,询问是否真的使用这类强度的密码呢?我选择使用。
1 | Remove anonymous users? (Press y|Y for Yes, any other key for No) : |
是否移除匿名用户?肯定要移除啊。
1 | Disallow root login remotely? (Press y|Y for Yes, any other key for No) : |
是否禁用root远程登录呢?肯定要禁用啊。
1 | Remove test database and access to it? (Press y|Y for Yes, any other key for No) : |
是否要移除test数据库(这是一个测试数据库)呢?肯定要移除。
1 | Reload privilege tables now? (Press y|Y for Yes, any other key for No) : |
是否要重载权限表。嗯,要重载。
然后设置就完成了。
接下来我们就可以使用如下命令登录mysql了。
1 | mysql -uroot -p |
这里有个小问题,就是mysql的身份验证插件从之前的mysql_native_password
更新为caching_sha2_password
。
目前的PHP并不支持更新后的插件,所以可以参考我如下的文章使用之前的身份验证插件创建用户密码。
具体可以参考我的这一篇文章《数据库升级》.
安装完成后,其实nginx并不能直接和php进行通信。一般通信的方式有两种,一种是通过监听端口(默认9000),一种是监听socket。这里我们使用监听端口的方式。
因为php-fpm这边已经默认是监听127.0.0.1:9000端口了,所以这里只需要修改nginx配置即可。
首先打开/usr/local/etc/nginx/nginx.conf
修改后的配置文件如下:
1 | # server 部分修改如下 |
然后打开/usr/local/var/www
目录,新增index.php
文件,内容如下:
1 | <?php |
使用如下命令重启nginx
1 | brew services restart nginx |
最后访问localhost
就可以看到phpinfo正确显示的网页了。
有时候,在登录到云服务器之后,可能需要在终端查询该服务器的ip。
之前我都是用的 ip.cn ,但是感觉不行了。
现在提供一些其他的可选择项:
1 | $ curl ipinfo.io |
相信还有这么多的URL。估计哪一个不行了,都能找到可替代的了。
在windows环境中,我们都是可以通过xshell实现证书登录的。
但是在mac中却没有相关的设置,那么如何使用mac进行证书登录呢。
首先,我们需要有一个私钥文件。
比如我的是aliyun.pem.
我将其存放在/home/baoguoxiao/aliyun.pem
。
登录的命令则是如下这条:
1 | ssh -i /home/baoguoxiao/aliyun.pem root@ip |
执行该命令的时候可能会提示如下错误:
1 | Permissions 0755 for '/home/baoguoxiao/aliyun.pem' are too open. |
这个表示我们给与这个文件的权限太大了,所以需要对其设置只读权限。
执行如下命令:
1 | chmod 400 /home/baoguoxiao/aliyun.pem |
然后再次使用如上的ssh
命令,就可以顺利的登录阿里云服务器了。
这样真的好棒。妈妈再也不用担心我的学习。
有时候我们可能需要向html中传递html代码。但是因为我们的后台框架使用了laravel。所以我们在赋值的时候就会变成:
1 | {{$username}} |
虽然我们使用自带的非转义的赋值方法:
1 | {!! $username !!} |
但是我的需求却是不能使用后面的这类方法。
通过谷歌,我了解到一种完美的办法,可以将转义后的代码再次转回来。
代码如下:
1 | function htmlDecode(input){ |
我们只需要调用该方法就可以完美执行反转义了:
1 | htmlDecode("<img src='myimage.jpg'>"); |
今天下午一直在跟安卓调试sentry适配问题。发现了两个问题。现在记录如下:
在开发的时候,发现红米一直安装不上APP。经过百度查询,发现是在开发设置中打开了启用MIUI优化设置,将其关掉,然后重启,然后接着开启USB安装,之前因为一直没网,没有注意这个,导致一些隐性的bug没有展示出来,粗心啊。
一般在安装页面都会介绍DSN信息,但是安卓病没有提示,顿时不知道这个URL应该去哪找到了,在翻了好久之后,终于找到了位置。
路径为: Project details -> Settings -> Client Keys(DSN)
在这里面就可以拿到相关的DSN信息。
这个问题就非常坑了。官网提供的SDK根本不可用,最后我们各种谷歌之后,终于发现了问题,原来该SDK已经在2013年就不维护了,必须转而使用raven-java。
现在粘贴相关代码:
Gradle
1 | compile 'com.getsentry.raven:raven-android:8.0.1' # 实测compile不可用,必须替换为 api |
Permissions
1 | <uses-permission android:name="android.permission.INTERNET" /> |
实例化
1 | import com.getsentry.raven.android.Raven; |
捕获错误
1 | try { |
在测试过程中发现,接收到的错误信息有时候很及时,有时候就非常慢。推测可能是因为APP崩溃退出了,导致错误信息没有及时发出,所以会在下一次APP启动的时候,将相关的错误数据送出, 这样导致sentry接收到错误消息的时间较晚。
在安装docker-compose之前必须先检查是否已经安装好了docker。具体安装教程可阅读 docker学习笔记之一 安装。
运行此命令下载最新版本的docker-compose
1 | sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose |
可以看到我们上面下载的版本是1.23.1。这个可能很快就过期了,这个时候可以查看Releases页面了解最新发布的版本,然后将最新发布的版本号替换上面命令中已知的版本号进行下载。
接下来我们对其设置执行权限
1 | sudo chmod +x /usr/local/bin/docker-compose |
好了,这样就安装完成了。是不是非常简单。
最后我们检查看版本。
1 | $ docker-compose --version |
end.
Linux 与客户端之间进行文件互传是一个非常常见的功能。办法有很多,很多都是借助第三方功能,但是如果要求不使用第三方工具,那么可选项就很少了。下面介绍两种办法:
lrzsz
其实我最钟意这个了。但是这个认终端。需要终端进行适配才可以。
该命令对文件大小有限制,最大不能超过 4GB。我想一般人碰到这么大的文件,早就去想其他办法了吧。
使用如下命令安装:
1 | dnf install lrzsz |
上传文件:
1 | rz |
下载文件:
1 | sz /path/file |
scp
这个其实就比 lrzsz
比较通用了。但是问题是每次我都得查询一下命令是啥。一般想不起来。
下载文件从远程服务器到本地目录:
1 | scp user@ip:/path/file /path |
上传文件从本地目录到远程服务器:
1 | scp /path/file user@ip:/path |
开源错误跟踪,帮助开发人员实时监控和修复崩溃。不断重复。提高效率。改善用户体验。
使用docker-compose命令一键进行部署。减少部署的错误率。
具体部署程序可查看getsentry/onpremise
使用nginx接受请求并对其进行转发。并使用了ngx_http_realip_module
模块转发真实请求IP。
sentry分为客户端和服务端。客户端嵌入到App中,当应用发生异常的情况时,就会向服务器端发送异常通知,服务器端则将信息记录到数据库汇总,并提供web方式,方便对异常进行查看和分析,避免需要登录服务器后台查看生硬的log文件。
目前的日志捕获,都有相应的SDK,非常方便,不同的是客户端因为有代码混淆,所以,需要在sentry中上传相应sourcemap文件。
目前的PHP-FPM和Nginx错误日志没有现成的代码,这里需要一些时间进行编写代码处理相关错误。
目前sentry有很多的SDK包。目前已经覆盖咱们产品线的有:
角色
行为[Action] | 会员[Member] | 管理员[Admin] | 经理[Manager] | 所有者[Owner ] |
---|---|---|---|---|
Can view and act on issues, such as assigning/resolving/etc. | ✔️ | ✔️ | ✔️ | ✔️ |
可以加入和离开团队[Can join and leave teams] | ✔️ | ✔️ | ✔️ | ✔️ |
可以修改项目设置[Can change Project Settings] | ✔️ | ✔️ | ✔️ | |
可以添加/删除项目[Can add/remove projects] | ✔️ | ✔️ | ✔️ | |
可以编辑全局集成[Can edit Global Integrations] | ✔️ | ✔️ | ||
可以添加/删除/修改成员[Can add/remove/change members] | ✔️ | ✔️ | ||
可以添加/删除团队[Can add/remove teams] | ✔️ | ✔️ | ||
可以添加仓库[Can add Repositories] | ✔️ | ✔️ | ||
可以改变组织设置[Can change Organization Settings] | ✔️ | ✔️ | ||
可以移除一个组织[Can remove an Organization] | ✔️ |
归属关系
一个组织对应多个团队
一个团队对应多个项目
一个团队对应多个会员
一个会员属于多个团队
一个项目属于一个团队
默认情况下,一旦异常发生,5分钟内就会有一封邮件发送到你的邮箱。包含了异常的大致描述。
目前的默认规则是当出现一个新的规则时候,30分钟内发送一次邮件通知。
对于发送邮件的规则可以进行新增/编辑/移除。
sentry一个最大的好处就是可以使用邮件通知功能,如果没有邮件通知,那么我们自己上去看的话就非常麻烦了。
进行邮件推送需要我们提供邮件服务器。这里的话,我就用的是腾讯企业邮箱。
好了,下面说具体配置。
首先接上一篇文章 安装sentry,我们将代码拉取到的目录是/data/sentry
。
接下来我们就要里面这个文件夹里面的docker-compose.yml
文件。
1 | x-defaults: &defaults |
这里介绍一下每个配置项的作用:
配置项 | 作用 | 腾讯企业邮 |
---|---|---|
SENTRY_EMAIL_HOST | SMTP服务器地址 | smtp.exmail.qq.com |
SENTRY_EMAIL_USER | 登录的邮箱账号 | example@mail.com |
SENTRY_EMAIL_PASSWORD | 登录的邮箱密码 | password |
SENTRY_EMAIL_PORT | 登录的端口 | 587 |
SENTRY_EMAIL_USE_TLS | 是否使用ssl连接 | true |
SENTRY_SERVER_EMAIL | 发送的账户,跟SENTRY_EMAIL_USER相同 | example@mail.com |
配置完成之后,需要重建服务。具体可以执行以下命令:
1 | docker-compose down |
然后稍等一分钟就可以正常访问web页面了。
现在来测试一下。
进入页面,在左上角的你的昵称位置单击,选择Admin。
然后在左侧选择Mail,然后在最下面有一个测试设置。点击“向example@mail.com发送一封测试邮件”。如果收到的话,那么说明就配置成功了。
在配置问题中,如果有什么问题,可以过来跟我留言。
毕竟这个邮件通知我折腾了一下午才搞定。
哈哈
最近公司内部需要新增一个日志系统。目前可选择的就是sentry和阿里云日志系统。我通过两个对比之后,感觉sentry日志更加好用。所以在这里记录一下相关的笔记。首先这一篇就是安装系列了。
接下来的安装命令就非常简单了。
首先我们先创建目录:
1 | mkdir /data |
然后拉取命令
1 | git clone https://github.com/getsentry/onpremise sentry |
然后进入目录
1 | cd sentry |
首先我们修改一下映射端口。因为默认绑定端口是9000,因为我这台电脑启动了php-fpm服务绑定了9000端口,所以我这里需要将9000改成10000。具体相关配置如下:
1 | # docker-compose.yml |
好了,接下来就是创建volumn。
1 | docker volume create --name=sentry-data && docker volume create --name=sentry-postgres |
生成配置文件
1 | cp -n .env.example .env |
创建服务
1 | docker-compose build |
生成秘钥
1 | docker-compose run --rm web config generate-secret-key |
将生成的秘钥添加到.env
中的SENTRY_SECRET_KEY
项。
构建数据库
1 | docker-compose run --rm web upgrade |
启动所有服务
1 | docker-compose up -d |
好了,这样sentry就安装完成了。
1 | server { |
这样我们就可以使用绑定的域名进行访问了。
使用netstat命令查询端口状态:
1 | # netstat -ntlp | grep 10000 |
发现这个并没有绑定127.0.0.1。这里我并没有研究好如何绑定127.0.0.1。这里可以通过防火墙进行端口控制。比如阿里云的入网端口管理,或者centos的firewalld命令都可以进行控制。具体就不展开了。
PS:明天具体写如何配置邮件发送。
我在安装php-zip扩展的时候提示以下错误消息:
1 | $ sudo apt install php-zip |
通过谷歌,发现解决错误的方式很简单。
首先打开vi /etc/apt/sources.list
,然后修改里面的内容如下所示:
1 | deb http://archive.ubuntu.com/ubuntu bionic main universe |
执行:
1 | sudo apt update |
然后执行安装命令就好了。
1 | $ sudo apt install php-zip |
对于程序员来说,有哪些书籍是必读的呢?Stack Overflow 上有一个问题,虽然被关闭了,但是这是设置一个热门的问题。我看到里面推荐的书都是英文的。所以对照着找了找国内的中文版。但是也是有一些翻译的名字我确实没有找到或者暂时还没有出中文版。所以在其中有什么错误的地方,请大家评论告诉我,我立即去更新。
如果对多音字要求不高的话。可以使用如下方法:
1 | $id = 'Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();'; |
使用的什么原理,我还不清楚,具体可以等以后再去了解。
这两天一直在看react。今天正好想着安装 react-native ,看看传说中的用JS写APP能用嘛。
接下来就是介绍使用情况。首先就是搭建NodeJS和JAVA环境。
创建项目:
1 | react-native init fiction |
当然中间第一次运行的时候会去谷歌下载一些包。这些就不表了。
接下来主要是表述一下中间遇到的坑。
其实解决的办法很简单:
首先在android/app/src/main
创建assets
文件夹,然后执行以下命令:
1 | yarn add @babel/runtime --dev |
执行完成后,再次执行react-native run-android
就能看到美丽的开机页面了。
记录一下自己使用docker安装mysql的过程。
首先我找到两个:
我对比了一下。发现第一个是mysql官方推出的,而第二是docker自带library推出的。那么我肯定选择mysql官方推出的mysql了。
既然确定了要安装的包,那么就要开始拉取了。
上面是可以安装的版本。那么我肯定是安装latest的。
那么执行代码如下:
1 | docker pull mysql/mysql-server |
如果想要安装5.7版本的,可以执行以下命令:
1 | docker pull mysql/mysql-server:5.7 |
好了等待之后,就安装成功了,接下来,我们看看我们在本地存储的镜像。
1 | $ docker image ls |
接下来执行创建容器的命令。
1 | docker run --name mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:latest |
在这里要注意的是最后的:latest
,这个是可省略的。如果刚才安装的是指定版本,比如5.7,那么我们就需要执行以下命令了:
1 | docker run --name mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:5.7 |
好了,安装完成,就可以使用PHP进行连接测试了。
1 | $pdo = new \PDO("mysql:host=127.0.0.1;dbname=mysql", "root", "123456"); |
会提示如下错误:
1 | Host '172.17.0.1' is not allowed to connect to this MySQL server |
那么我们只能登录mysql进行修改数据了,首先是登录mysql,密码就是我们设置的123456:
1 | $ docker exec -it mysql1 mysql -uroot -p |
然后执行如下命令:
1 | use mysql; |
我们继续测试PHP脚本,发现链接就正常了:
1 | $ php ./demo.php |
1 | docker logs mysql1 |
1 | docker exec -it mysql1 bash |
1 | docker stop mysql1 |
1 | docker start mysql1 |
1 | docker restart mysql1 |
1 | docker stop mysql1 |
暂无
其实我们在创建container的时候就已经用了一个环境变量了,就是MYSQL_ROOT_PASSWORD
,现在我们来介绍一些其他的环境变量
MYSQL_RANDOM_ROOT_PASSWD
该值默认为ture(除非MYSQL_ROOT_PASSWORD
设置了或者MYSQL_ALLOW_EMPTY_PASSWORD
设置为true了),意思是在启动docker容器时随机生成root密码。密码打印到日志中。查看随机密码的方式如下:
1 | $ docker logs mysql1 2>&1 | grep GENERATED |
MYSQL_ONETIME_PASSWORD
默认为ture(除非MYSQL_ROOT_PASSWORD
设置了或者MYSQL_ALLOW_EMPTY_PASSWORD
设置为true了)root用户的密码设置为expired,必须先修改密码才能使用。
MYSQL_DATABSE
指定在容器创建时同时创建数据库的名称。如果启动参数也有MYSQL_USER
和MSQL_PASSWORD
,则会创建用户并授予该数据库对应的用户权限。如果指定的数据库已经存在了,则该变量无效。
MYSQL_USER和MYSQL_PASSWORD
该变量用户创建用户名和密码,并为该用户授予MYSQL_DATABASE
变量指定的数据库的超级用户权限。如果两个变量没有设置,则其他会被忽略。如果两个变量都已设置但是没有设置MYSQL_DATABASE
,则创建的用户没有任何权限。
MYSQL_ROOT_HOST
默认情况下,MySQL会设置”root@localhost”账户,此账户只能从内部进行连接。要允许其他主机的根连接,就需要设置此变量了。例如,该值172.17.0.1
(默认的docker网关IP)允许来自运行容器的主机的连接。但是该选项仅接受一条记录,但是允许使用通配符(例如,MYSQL_ROOT_HOST=172...*或MYSQL_ROOT_HOST=%)。
MYSQL_LOG_CONSOLE
当变量为true时(MySQL8.0服务器容器的默认状态),MySQL服务器的错误日志被重定向到stderr,以便错误日志进入docker容器的日志,并且可以使用docker logs mysqld-container
进行查看。
MYSQL_ROOT_PASSWORD
此变量指定为MySQL root账户设置的密码。在命令行上设置MySQL root密码是不安全的,因为可以通过history
查看命令历史从而获取创建的密码。所以最好是试用默认设置。
MYSQL_ALLOW_EMPTY_PASSWORD
默认为false,如果将其设置为true,则表示允许root用户使用空密码启动。但是在非开发环境设置此变量为true是不安全的,因为他会让MySQL实例完全不受保护,从而允许任何人都可以获得弯针的超级用户访问权限。最好试用默认设置。
首先介绍一下环境。
数据库:RDS(阿里云)-5.6
PHP:PHP7.2 + Lumen
系统:Ubuntu
1 | $time = date('Ymd'); |
我们有一条上面的查询语句。在开发的时候没有任何问题,但是代码在上线后,突然爆出不能正确的查出相应的数据。但是数据确实存在。
当时我们处理这个问题是凌晨1点,并且是在家里。考虑可能是时区问题,但是因为太晚了,所以我们使用了另外一种方式去避免这个问题。并没有追查这个事情的具体原因。
正好白天有一点空闲,所以准备排查一下这个问题。
我的第一考虑就是时区的问题,但是我自己执行以下的查询语句,却是发现没有问题。
1 | $pdo = new PDO("dns", "user", "password"); |
所以我把目标转向了lumen这个框架,我通过查询源码,发现有这么一段源码:
1 | // file_path: vendor/illuminate/database/Connectors/MySqlConnector.php |
然后我就去看我的数据配置,找到这里:
1 | // file path: config/database.php |
然后再次修改自己的SQL进行尝试:
1 | $time = date('Ymd'); |
发现时间就会变成CST时间了。
这样在该框架的路由中增加了该方法:
1 | Route::get("/test", function() { |
发现返回的时间也是CST时间了。所以真相大白了。
我们上班的时间是白天十点以后,这样当天的时间减去八个小时候再去计算,最上面写的SQL中的where条件还是成立的,但是凌晨一点去计算的时候,却是查询的昨天的数据,所以where条件就不查询不到正确的数据了。
这个事情让我明白,要仔细了解一个框架,说不定一个小小的细节被遗漏,就会造成不可预料的后果。
今天在进行Laravel开发的时候,发现了比较坑的一点。
按照默认情况来说,比如表单提交,如果我们提交了这个字段,但是这个字段为空字符串。在Laravel中会自动转义成Null。这个为什么呢?
原来Laravel有个全局中间件,代码如下图:
1 | <?php |
该中间件就会将空的参数值自动转为null。
那么对于这种问题应该如何解决呢?
我们再写一个中间件,替换之前的中间件,里面可以排除指定字段不转为null。里面的数组可以更改成你需要不转的字段。
1 | // app/Http/Middleware/NinjaAuther.php 新增文件 |
1 | // app/Http/Kernel.php 部分代码 |
但是该中间件是全句性质的,所以我个人则更加倾向于第二种方法。
1 | // app/Http/Controllers/StoreController.php |
如上面这样,对指定格式进行显示转换。写的多了,可能会显得繁琐一些。不过感觉比较看的明白。
上面这种方案如何解决,就看大家的喜好了。
今天晚上去看服务器,发现数据库的版本是5.7的,看起来挺新的。但是MySQL已经出了8.0了,受不了心中的渴望,所以就直接把源切到8.0新版本了。中国有一些坑,在此记录一下。
原因是mysql在更新之后,因为密码验证规则的修改,导致密码已经变成新版验证的密码了,但是PHP目前并不支持这个新版验证方式。所以解决办法就是使用指定的SQL进行修改密码。修改模式如下:
1 | ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password'; |
这样就可以了,不过执行之后出现了另外一个错误。。。
原因就是升级数据库之后没有执行mysql_upgrade
命令。
按照如下命令执行一下即可:
1 | mysql_upgrade -uuser -p |
执行完成之后,再次执行上面设置密码的命令,这样wordpress就可以正常访问了。