`学习笔记`分类下的文章

学习笔记

更新升级MacOSX到10.14 Mojave (MacBook Air 13-inch early 2014)

写在前面的话:

如果不是真的很需要,其实最好是不去更新系统,以免带来更多的麻烦。如果新的系统对你真的很重要,我也建议你备份现有数据,然后全新安装新的系统版本。我就是那个单纯的升级系统,导致原有的软件无法正常运行的傻逼,下面虽然记录了我的问题,但我最终的解决方案还是把软件卸载后重新安装和配置。

既然App Store推送了本次更新,我也就傻傻的更新了,谁知道会发生什么呢?

很不开心的是,第二天上班来发现系统更新好了,直接登录!一切安好。然鹅!!!发现了好几个惊喜:

  1. svn和git命令无法执行,提示xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
  2. Apache和PHP配置全部恢复成初始状态,所有已安装的扩展没了
  3. OSSRS(Simple-RTMP-Server)无法运行了,提示:illegal hardware instruction,目前没找到解决方案,提了Issue看怎么说。

解决第一个问题网上给了答案,安装XCode开发者工具就好了:
xcode-select --install

Apache和PHP的配置的恢复,主要是指httpd.conf的覆盖和php.ini的丢失,以及PHP扩展丢失,这样我就不得不重新编写配置文件和编译安装开发所需要的全部扩展了。

这里记录一下我的操作过程,因为之前更新系统也遇到这种问题,但是没有做笔记,导致现在又遇到问题时又花了很多时间去找资料。

安装Memcache扩展

从Github直接clone下来:https://github.com/websupport-sk/pecl-memcache

执行phpize出现问题:

1
2
3
4
5
6
7
grep: /usr/include/php/main/php.h: No such file or directory
grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:
Zend Module Api No:
Zend Extension Api No:

百度出来的解决方案:

1
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/ /usr/include

好的,遇到了就算使用sudo还是提示权限不足的情况。 不怕,之前有经验,需要关掉系统的保护机制。操作方法就是重启电脑,按住command+R直到进入新界面,通过实用工具打开终端,输入csrutil disable关闭保护,然后reboot重启

重启完打开终端,傻傻的执行ln命令后发现还是不行!phpize依旧报错, 怪我有点笨,然后才去读这行命令的意思,发现MacOSX10.11.sdk这个目录不存在,只有一个MacOSX10.14.sdk的目录。很傻,根据自己的系统来嘛!

所以下面的完整命令解决phpize的问题

1
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/ /usr/include

然后是./configure 接着make && sudo make install

执行完后再修改/etc/php.ini增加extension=memcache.so。然后重启apache:sudo apachectl -k restart

安装mcrypt扩展

这个我是直接去php官网下载系统当前版本的PHP源码(php-7.1.19.tar.gz),然后解压进入ext/mcrypt目录,如上所述的执行phpize./configure以及make && sudo make install,修改php.ini增加extension=mcrypt.so。重启apache搞定。

重启打开安全策略csrutil enable

电脑重启后发现memcache和mcrypt扩展无法加载,提示了文件签名的问题。无解!

所以,重点强调!!! 直接舍弃系统自带的PHP和Apache吧,用brew全新安装一个,管理起来也非常的方便,系统更新后也不会导致软件丢失!

不过,遇到了新的问题,brew在安装cmake的时候出现了错误,提示如下:

1
2
3
4
Error: You are using macOS 10.14.
We do not provide support for this pre-release version.
You may encounter build failures or other breakages.
Please create pull-requests instead of filing issues.

很明显,说当前系统版本时预发布版本,他们不支持,不支持!!??

百度了,无解,无奈就去问了Google,然后说要去下载Command Line Tools (macOS 10.14) for Xcode 10,原文:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000898980-CMake-not-compiling-after-macOS-10-14-Mojave-update

写在最后

官宣,作为一个需要稳定开发环境的开发人员和开发机器来说,不是闲的蛋疼就别随便的更新系统了吧,一个上午就折腾这事儿去了,真是满脸的不愉快,晚上8点还在重装软件,今儿可是1024啊,过节啊!!

阅读剩下更多

默认配图
学习笔记

Linux下的安装Ngrok服务器的故事

使用场景

公司A是一家服务提供商,公司B是一家知名企业。
现在公司B中的一个软件服务出现了故障,需要公司A的专业人员来排查。由于两家公司相隔甚远,他们采用了远程排查方案。但是公司B的这个软件部署在内网环境的机器C上,层层网关以及种种原因(和谐部分)导致无法将机器C映射到公司B的公网端口。为了解决这种需要打通从一个局域网到另外一个局域网的网络通路,我们叫它‘内网穿透’。

总所周知,处在同一个局域网的所有机器是可以互通的,而不同局域网中的机器是无法跨域访问的。解决这种问题,我能想到的有:

  1. 交换机和路由
  2. 使用公网VPN服务器
  3. 使用内网穿透服务器

配置交换机和路由往往非常复杂,遇到复杂的组网环境,还是杀了我吧!

公网VPN服务器我也试过了,使用简单,但是稳定性得不到保证。

所以我最终尝试了内网穿透服务器:Ngrok。(当然还有别的比如:frp)

Ngrok简介

Ngrok是一款使用GO语言开发的开源软件(仅针对1.x,2.x不开源),是一个反向代理软件。它可以在你本地运行的服务和公网服务器端点建立一条安全的隧道,这样任何一个和公网连通的客户端都可以访问和使用你的本地服务。Ngrok还可以捕获和分析所有通道上的流量,对后期的分析和处理也有相当好的支持。

Ngrok的git仓库地址:https://github.com/inconshreveable/ngrok

需要的宝贝

云服务器(有公网IP的服务器)

提供这种服务的像阿里云/腾讯云/百度云等等,随便挑

域名

随便什么域名,只要是你的域名,你能对其配置解析(最好能泛解析)。

我的域名解析

环境要求

Linux服务器:CentOS、Ubuntu

1
2
3
4
5
#centos
yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ git golang

#ubuntu
#自行对应缺啥用'apt-get'补啥,openssl golang make 等等的都得有

安装服务器

克隆Ngrok到本地

1
git clone https://github.com/inconshreveable/ngrok.git

制作和生成证书

1
2
3
4
5
6
7
8
9
cd ngrok
mkdir cert
cd cert
NGROK_DOMAIN="ngrok.imsry.cn"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

覆盖证书到Ngrok中

1
2
3
cp base.pem ../ngrok/assets/client/tls/ngrokroot.crt
cp server.crt ../ngrok/assets/server/tls/snakeoil.crt
cp server.key ../ngrok/assets/server/tls/snakeoil.key

编译生成Ngrok服务端

1
2
cd ../ngrok
GOOS=linux GOARCH=amd64 make release-server

启动和运行服务端(可以写成bash脚本)

1
2
3
4
5
6
7
./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="ngrok.imsry.cn"  -httpAddr=":8081" -httpsAddr=":8082" -tunnelAddr=":8083"

#参数说明:
#-domain 访问ngrok是所设置的服务地址生成证书时那个
#-httpAddr http协议端口 默认为80
#-httpsAddr https协议端口 默认为443 (可配置https证书)
#-tunnelAddr 通道端口 默认4443

客户端的编译和使用

1
2
3
4
5
6
7
8
9
10
11
#window-64bit如下:
GOOS=windows GOARCH=amd64 make release-client
#编译成功后会在ngrok/bin/下面生成一个windows_amd64目录下面有ngrok.exe

#Linux 平台 32 位系统:GOOS=linux GOARCH=386
#Linux 平台 64 位系统:GOOS=linux GOARCH=amd64
#Windows 平台 32 位系统:GOOS=windows GOARCH=386
#Windows 平台 64 位系统:GOOS=windows GOARCH=amd64
#MAC 平台 32 位系统:GOOS=darwin GOARCH=386
#MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64
#ARM 平台:GOOS=linux GOARCH=arm

编写配置文件ngrok.cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server_addr: "ngrok.imsry.cn:8083"
trust_host_root_certs: false

tunnels:
http:
subdomain: "test"
proto:
http: "80"

https:
subdomain: "test"
proto:
https: "443"

tcp:
remote_port: 5555
proto:
tcp: "8001"

ssh:
remote_port: 2222
proto:
tcp: "22"

启动客户端

1
2
3
4
./ngrok -config=ngrok.cfg start-all #启动所有服务

./ngrok -config=ngrok.cfg start ssh #启动SSH服务
./ngrok -config=ngrok.cfg start ssh http #启动SSH和HTTP服务

出现下面内容,表示链接成功:

1
2
3
4
5
6
7
8
9
10
11
ngrok

Tunnel Status online
Version 1.7/1.7
Forwarding http://test.ngrok.imsry.cn8081 -> 127.0.0.1:80
Forwarding https://test.ngrok.imsry.cn:8082 -> 127.0.0.1:443
Forwarding tcp://test.ngrok.imsry.cn:5555 -> 127.0.0.1:8001
Forwarding tcp://test.ngrok.imsry.cn:2222 -> 127.0.0.1:22
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms

开始访问你的服务吧!

直接访问上面的地址就能取得相应的服务
如果是ssh和tcp的话,直接使用如:ssh [email protected] -p 2222

阅读剩下更多

默认配图
学习笔记

mysql中几种Log和打开方法

Mysql中常见的log有:错误日志log_error慢查询日志slow_query_log二进制日志bin_log通用查询日志general_log

错误日志(error_log)

这个日志记载mysql服务器的启动和关闭以及运行过程中发生的故障或异常情况,如果你发现mysql无法正常启动,那么你首先应该查看这个日志。

配置:

1
log_error = error.log

服务器上查询log位置:show variables like 'log_error'

慢查询日志(slow_query_log)

为了改善数据库性能,需要减少慢查询SQL的使用次数,那么哪些SQL需要改善呢?通过这个日志可以更清楚如何去改善。

配置:

1
2
3
slow_query_log = 1
lone_query_time = 10
slow_query_log_file = slow_query.log

二进制查询日志(bin_log)

Mysql的binlog日志作用是用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被binlog日志记录;主要用于数据库的主从复制以及增量恢复。

配置:

1
log_bin = mysql_bin.log

通用查询日志(general_log)

会记录mysql运行期间的所有sql语句

配置:

1
2
3
log_output=[none|file|table|file,table]  #通用查询日志输出格式
general_log=[on|off] #是否启用通用查询日志
general_log_file[=filename] #通用查询日志位置及名字

阅读剩下更多

默认配图
学习笔记

skip-name-resolve可以解决远程连接mysql数据库时候的缓慢或超时

  咳咳,迁了新的机器,全新的机器但是环境还是跟以前一样,基本没变过什么配置。但是远程连接mysql却很慢,甚至10s超时都还没连上!!! 当然,仅仅只是建立连接的时候,连接成功后一切操作都行如流水。

  所以最快最简单的方法就是直接在数据库的配置文件my.cnf|my.ini中添加一行skip-name-resolve来解决。

  其实mysql在用户登录建立连接的时候,会对客户端进行DNS反查,如果遇到服务器的DNS解析出现问题,那么就可能导致客户端迟迟连接不上。此方法可禁止mysql进行DNS反查从而解决了这个问题。

阅读剩下更多

默认配图
学习笔记

Laravel5.5 发送邮件遇到Connection could not be established with host xxxxx

Laravel输出的错误页面如下图:
Laravel异常捕获-mail

服务器:阿里云香港节点(B区) CentOS6.8 64bit

lamp环境:PHP7.2.1

Laravel .env mail部分:

1
2
3
4
5
6
7
8
MAIL_DRIVER=smtp
MAIL_HOST=hwsmtp.exmail.qq.com
MAIL_PORT=465
[email protected]
MAIL_PASSWORD=XXXXXXXX
[email protected]
MAIL_FROM_NAME=noreply
MAIL_ENCRYPTION=ssl

问题发生前景:本地测试完全正常,相同配置在服务器上就被抛出异常。

因为之前遇到过由于端口没有放行而造成无法建立连接的问题,在此问题上我也做了一样的尝试,在安全组配置里面对465端口进行放行(无论是出口还是入口)。但是结果表示并不是这个问题,而我在没有配置放行的情况下,telnet host:port 是通的。

经过大约两天的间接性排查和尝试,最终提交工单咨询阿里,他们给了我处理意见:尝试他们的Demo!

尝试阿里云提供的Demo测试发件是没有问题的,这就令我很纳闷的,于是我去看该Demo是如何建立连接的。

通过一步一步的探索,发现该Demo也是同样使用了stream_socket_client方法来建立连接,那为什么它可以,Laravel内的却不行?说明不是该环境的问题!

问题逐渐定位到了stream_socket_client这个方法上,查询PHP.NET来认识一下它。

1
resource stream_socket_client ( string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context ]]]]] )

方法描述上,只有一个参数可能会不一样,就是最后那个$context,它是一个Resource,由stream_conntext_create方法创建并返回。

我注意到Laravel中使用的Swift_Mailer所引用的StreamBuffer类中,在stream_socket_client方法前面加上了@符号来屏蔽error,而在下面自己判断来抛出异常。

那么我果断将@符号去掉! 真正的错误爆出来了!!!!

1
2
stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

乍眼一看,证书校验失败????

上面的废话只是简单描述我遇到这个问题是如何应对的

解决方案来了! 既然是走SSL协议(465端口),且程序抛出错误为证书校验失败,那么就去直接搜索有关Laravel/SwitEmailer的证书校验问题。

在stackOverflow上找到两个相关的问题:

  1. localhost and “stream_socket_enable_crypto(): SSL operation failed with code 1”
  2. how to fix stream_socket_enable_crypto(): SSL operation failed with code 1

他们都提出了一个配置:

1
2
3
4
5
6
7
8
9
//	在/config/mail.php中增加

'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],

然后测试,Bingo!!!

当然,既然是SSL必然使用校验才是最安全的,但是我这里仅满足能够发件即可,至于如何进行证书校验,请移步:使用PHPMailer 中的报错解决 “Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:”

阅读剩下更多

默认配图
学习笔记

完全源码编译LNMP环境

环境:

软件:

依赖软件:

阅读剩下更多

默认配图
学习笔记

【干货】本地git对应多个远程仓库

当Githuber发现GitOSChina能发布项目演示,想把自己的项目也同步到OSChina上去时,同时维护两个本地仓库或者remote显得太过麻烦

提要

  首先,为本地git仓库添加远程仓库,我们使用命令:git remote add origin [url],这样一来,本地仓库就对应有了一个远程仓库的地址,包括pushfetch源,如下图所示:

remote-v

  但是,我们如何才能做到既能将本地git仓库PUSH到Github,也能够PUSH到OSChina上呢?

  可能有以下方式是你想到的:

  1. 本地创建两个仓库,一一对应(你不嫌麻烦的话的确可行)
  2. 添加多个远程库,即git remote add [another-origin](那每次都要PUSH两次咯?)

  其实,git的一个远程库本来就可以配置成多个地址,即一个origin拥有多个url。

敲黑板了(实现)

  前提条件是,我们已经为本地仓库添加了一个origin远程库(没有添加的自行添加,方法前面说了)。我们现在为本地库继续添加url地址:https://git.oschina.net/anthony_box/hitools.git

  这个命令是:git remote set-url --add origin [url](url替换成如上地址)

set-url

擦黑板了(原理)

  其实该条命令执行就是在git项目的config文件里的[remote "origin"]配置新增一条记录,我们打开config文件看看,输入git config -e(文件路径:[repo]/.git/config):

config-e

  所以说,执行git remote set-url -add origin和编辑config文件,一码子事。

阅读剩下更多

默认配图
学习笔记

神奇的空格符

  当我通过表单提交带空格的数据并保存到数据库,然后通过再次渲染出的页面修改该数据,意想不到的事情发生了,再也不同通过这个值检索到这条数据了。

  首先,我们先写一个PHP的测试文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if(isset($_POST['model'])){
echo $_POST['model'];
echo "<br>";
echo str_replace(' ','&nbsp;',$_POST['model']);
echo "<br>";
echo urlencode($_POST['model']);
}
?>
<form method='post'>
<input name='model' value='' />
<button type='submit'>ttttt</button>
</form>

  可以看到,这里面有个表单,提交到自己这个页面,然后由PHP获取到POST过来的参数model,第一行直接输出它的值,第二行输出防SQL注入对空格的转化后的值,第三行输出encode之后的值(为什么?我们最后说TA的用途^_^)。

  我们现在试着输入并提交Sumsang S8

结果1

  由此可见,后台获取到的是一个Sumsang+空格+S8,第二行跟上面一样(显示一样,源码不一样),第三行空格变成加号是urlencode后的转义,那么看下源码:

源码1

  当然,很多情况下,为了防止SQL注入,我们会将空格转化成&nbsp;存库,然后取数据的时候在逆回来。


  紧接着,我们模拟数据的修改,基本过程是:从数据库取出这条数据–>填充到input标签的value属性中(没有做逆处理)–>渲染页面,渲染的页面源码如下:   

阅读剩下更多

默认配图
学习笔记

The Problems When Python2.6 to 2.7 on CentOS6.5

当Python从2.6升级到2.7后,pip找不到了?

  对的,基本上都能遇到这个问题。我很暴力的直接去下载一个pip然后用Python去安装它。

1
python setup.py install

  却被告知ImportError: No module named setuptools,想通过yum直接给安装,却出现下图所示:

  没办法,去下载一个setuptools的包自己来装吧(我试过了下载setuptools-35.0.1.zip,这个不适用)。所以下面的这个亲测有效:

1
2
wget https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg  --no-check-certificate
sh setuptools-0.6c11-py2.7.egg

阅读剩下更多

默认配图
学习笔记

Learning-Markdown

MarkDown的学习

这里面就是一些简单的MarkDown语法,提供给我自己看一下,刚开始还是需要不断练习来接受这种语法,必然能够在码字的过程中体验乐趣!

下面开始啦:

阅读剩下更多

默认配图
返回顶部