luanguang / blog Goto Github PK
View Code? Open in Web Editor NEW学好阅读理解,杠精解散。
学好阅读理解,杠精解散。
mysql表记录的时候,会记录变长字段长度列表和NULL字段列表
相较于NOT NULL,NULL要记录更多的数据,所以尽量使用NOT NULL
同理,尽量将字段的长度固定,这样也可以减少一部分数据记录空间。
require
如果文件不存在,则报错fatal error,并停止脚本;
include
如果文件不存在,则出现warning,并继续脚本;
require_once
,include_once
在执行过程中,都先检验是否已经加载,加载过就不加载了。
__DIR__
返回当前文件的绝对路径
比如Laravel
的public/index.php
中,返回的就是
/var/www/yangmao/public/../vendor/autoload.php
从硬件角度来看,redis的操作都是在内存当中进行的。
内存每次寻址时间在100ns
SSD随机读取时间在150us
相差了1000倍
a) 打开 .env 文件
b) 在Workspace Container下搜索WORKSPACE_INSTALL_MONGO 参数
c) 将其设置为 true
d) 在PHP-FPM容器下搜索PHP_FPM_INSTALL_MONGO 参数
e) 将其设置为 true
2 - 重构容器 docker-compose build workspace php-fpm
3 - 使用 docker-compose up 命令运行MongoDB Container(mongo)。
docker-compose up -d mongo
然而docker-compose ps
却发现
laradock_mongo_1 docker-entrypoint.sh mongod Exit 14
这种情况下,你可以尝试一下把docker-compose.yml文件里的mongoDB的路径地址改一下
### MongoDB ##############################################
mongo:
build: ./mongo
ports:
- "${MONGODB_PORT}:27017"
volumes:
#- ${DATA_PATH_HOST}/mongo:/data/db
- ${DATA_PATH_HOST}/mongo:/data/mongodb
networks:
- backend
暂时没有搞清楚带跟不带的区别,由于crontab的问题,有人说跟这个有关,就按照操作把它删掉了,很明显,跟这个没什么卵关系。
xattr -c -r path
按照文档一步步跟着走,把所有的配置文件配置完成,提交到服务器上想进行简单的测试。然后用浏览器
访问了一下,结果出现This page contains the following errors: error on line 1 at column 1: Document is empty
的报错,然后查到这个访问一开始就没准备让浏览器来,所以这种错误不必担心。
但是接下来我发信息给自己的公众号,可是一直提醒该公众号提供的服务出现故障,请稍后再试
。接下来就是许久的谷歌查找相应的解决办法,不过可惜没有找到。
因为做项目都是用的lumen没有出现过这种错误,于是想起会不会是laravel的CSRF的缘故,于是添加了白名单。结果问题就解决了。
GET /user 获取个人资料
PUT /user 修改个人资料
POST /user/register 注册用户
DELETE /user 删除用户
看Url就知道要什么
看http method就知道干什么
看http status code就知道结果如何
来自一个还未从事过互联网、软件相关行业的萌新。
你的简历写的不错, 现在是我的了 23333333
:)
mac OS 10.14.6
node v10.20.1
用yarn install下载报错。
查阅github的issue
yarn upgrade
运行解决
.*
<?php
$pre = '/.*(\d+)/';
$str = 'hello 1234567 world';
preg_match($pre, $str, $matches);
print_r($matches[1]);
#7
这里就涉及一个贪婪匹配与非贪婪匹配的问题了。在贪婪匹配下,.*会匹配尽可能多的字符。正则表达式中.*后面是\d+,也就是至少一个数字,并没有指定具体多少个数字,因此,.*就尽可能匹配多的字符,这里就把123456匹配了,给\d+留下一个可满足条件的数字7,最后得到的内容就只有数字7了。
.*?
<?php
$pre = '/.*?(\d+)/';
$str = 'hello 1234567 world';
preg_match($pre, $str, $matches);
print_r($matches[1]);
#1234567
此时就可以成功获取1234567了。原因可想而知,贪婪匹配是尽可能匹配多的字符,非贪婪匹配就是尽可能匹配少的字符。当.*?匹配到Hello后面的空白字符时,再往后的字符就是数字了,而\d+恰好可以匹配,那么这里.*?就不再进行匹配,交给\d+去匹配后面的数字。所以这样.*?匹配了尽可能少的字符,\d+的结果就是1234567了。
在做匹配的时候,字符串中间尽量使用非贪婪匹配,当然php本身就有许多方法,可以避开不适用正则,能用原生方法最好用原生。
在php当中很少用到正则匹配,对于贪婪与非贪婪更是没有使用到过,这次是学习爬虫时,根据python3网络爬虫开发实战教程一步步走下来,然后看到的知识点。
刚接触mac,这个问题困扰了我三天。我一开始将所有报错复制粘贴进行搜索,但是不管谷歌还是百度,给出的答案都跟crontab有关。然后尝试开始创建文件,使用mac上的crontab。只是根本没有效果。
stackoverflow给出的答案是要在安全中将iterm2给全部文件的权限。
然而我是在php执行exec时候无法将crontab写入,跟这个毫无关系。抱着尝试的心态去操作,结果一样是失败的。
最后用关键字搜索Operation not permitted
,搜到了mac的rootless权限策略,然后跟边上的同事一对比,还真是因为这个开启导致的。
今天同事的新mac也有这个问题,但是在执行php的exec的时候,居然直接有提醒是否要让php-fpm接管。
我当时为什么没有啊!!!!心态炸了
众所周知,HTTP是无状态的。为了能够记录下信息,引入了session和cookie。
cookie是存放在用户客户端(大多是在浏览器里),每次对一些已经登陆过或者浏览过的网页进行访问的时候,都会带上这个cookie,方便服务器识别自己。
cookies具有不跨域名性,你拿京东的cookie给淘宝,淘宝肯定也不认。
假如服务器不支持cookie,也会在url上带上sid用于分别用户。
session则是存放在服务器内存、数据库、文件等当中,是一串字符串,记录了用户的信息。
session的扩展能力不是很好,比如说一个集群有两台机器AB,那么登录A,只在A记录了session,B不能使用。除非让他们同步,或者弄一台机器专门存储session。但是随着信息增加,这就造成了一个大的负担。
第一步
# 下载 Certbot 客户端
$ wget https://dl.eff.org/certbot-auto
# 设为可执行权限
$ chmod a+x certbot-auto
第二步 将XXX.com改成自己的域名
./certbot-auto certonly -d "*.xxx.com" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
第三步
输入自己邮箱之后,他会发送一份邮件给你确认,确认完毕,到Before continuing
这里先不要立刻点击确认。到域名解析里添加一条txt的解析,值是添加_acme-chanllenge.你的域名。下面的一串添加到记录值里。然后添加成功再按回车继续。
第四步
到nginx配置文件里添加
listen 443 http2 ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;
第五步 想要直接跳转到https,添加
server {
listen 80;
server_name XXXX;
location / {
return 301 https://$server_name$request_uri;
}
}
<?php
ini_set('display_errors', true);
error_reporting(-1);
forum项目是根据laracasts的testing里的学习教程一步步搭建而成。
laravel可以不用observer,直接在模型里定义一个boot方法就能使用自带的十种监听事件的方法,个人感觉简单的处理可以直接放在模型当中,而处理比较多的时候,建议还是合并到一个observer里,在serviceprovider里记得注册。
工厂模式生成数据,在Modelfactory中,define生成多种不同数据,使用php artisan tinker
创建定义的数据。
测试用例,laravel自带登录的方法actingAs
,不同guarded
可以传入不同的参数进行模拟登录操作。不过没有尝试过用jwt方式。测试时,因为phpunit版本问题出过许多bug,例如assertDatabaseMission
这方法不存在之类的无法解决。
laravel定义了许多断言方法供你测试返回的数据是否正确。
Gate的使用,定义某个固定的用户为管理员权限。
每次执行控制器,都会先访问模型当中有没有跟引入trait一样名字的boot方法。
在serviceprovider当中用composer
方法共享数据,可以传入到缓存当中,只需查询一次,不比多次查询,优化查询效率。
定义policy
,控制部分方法的权限,比如说update只能是管理员或者这个文章或者回复的发起人。
laravel自带的提醒notify监控。
发送邮件所需配置,以及驱动设置。
知识点过多,导致分散。以及重构将一眼能看完的代码分成了多个地方,虽然感觉代码更少,更整洁。但是过几天重新打开这个项目再回味,发现忘记的也差不多了,还要来回查找这个方法哪里来的。新人有些难受。
今天把博客布置上线,运行完composer install
之后,报错It is unsafe to run Dusk in production.
。
这是因为安装了dusk
包,当你的APP_ENV=local、testing
时是本地测试环境,他就是用来检测代码的质量如何,所以不会抛出这个异常。但是当你的APP_ENV=production
时,也就是你部署到线上了,这个包会暴露很多接口以及程序信息,会给你的程序带来致命的危险。
解决办法也很简单,要么在线上的时候把这个包给删除掉。要么就是在安装这个包的时候,将他放在composer.json
文件的require-dev
下面,在线上composer安装完毕,再运行一下
composer install --no-dev
问题解决。
作者从夜晚手电筒的闪烁传递信息开始,引入了编码这么一种概念。有了这么一个概念之后,再次引入了莫尔斯码以及布莱叶盲文与二进制编码。
接着作者再次引入了电流,电子的移动产生电流,使用电流,在两个人的房间内安装灯泡,通过灯泡的闪烁表达不同的二进制码,而这些二进制码传递不同的信息。
电报机原理:在线路一端采取一些措施,使线路另一端发生某种变化。灯泡的闪烁由另一个房间的人控制,也算是简陋的电报机。
而后猜想两人之间的距离如果太远,电流不够,还需要一个放大器来完成,于是又引出了中继器这么一个东西。
解释了为什么人类习惯性用十进制,因为人的手指一共是十根,这样计算更加方便符合人类的思维。同时阐述了二进制对于传递信息是更加方便的。
二进制有了,电流传递有了,数学当中的集合逻辑引入,从而引入了电流控制,使用串联,并联的方式,生成了与门和或门。
\d: (decimal)匹配任意数字
\s: (spacing)匹配空白符
\w: (word)匹配任意字符数字下划线,相当于[0-9a-z_A-Z]
所有大写都是反向匹配。
.: 匹配除新行符 (
r
n) 序列外的任何单个字符
+: 匹配一个或者多个前面的字符
*: 匹配0或者多个前面的字符
(): 匹配括号里的字符
[]: 匹配括号里包含的其中的一个字符
{}: 匹配括号当中的次数范围
多技
I/O复用
这个跟select、poll、epoll有关,一个tcp链接一个进程,少的时候没关系,但是多了就有问题。于是有了一个进程里面有多个线程进行链接,但是没有立刻执行,在系统有数据返回的时候再循环这些线程,给需要的线程进行执行。这是select。
而这样子循环也是很缓慢的,有性能问题。于是记录下每个线程的一个id,当系统返回数据的时候也传回id,就能直接去线程里查找这些id,不要每次都循环遍历。这是epoll。poll只是对select进行记录,并没有实质性的大变化。
redis为什么快
首先redis是将记录在内存当中的。而内存的速度原本就要比硬盘快上很多,不需要进行硬盘读取的I/O。
数据结构简单,他是Nosql。
单线程阻塞I/O。不需要进行线程之间的切换(历史问题,现已经改成多线程)。
258M的服务器内存,如何对1G的文件进行排序。
这是一个很典型使用归并算法的题目,还是需要申请磁盘空间,时间复杂度是nlogn。优化之后最好能达到n。
简单的依赖注入和控制反转
依赖注入很简单,构造函数,然后传特定的类进去。控制反转则需要进行判断他需要什么类,然后传进去。
并发时QPS多少。
这个由于是运维当时观察,我并没有看到是多少,至于升级的服务器还是由运维来决定的。
pv 是指页面被浏览的次数,比如你打开一网页,那么这个网站的pv就算加了一次;
tps是每秒内的事务数,比如执行了dml操作,那么相应的tps会增加;
qps是指每秒内查询次数,比如执行了select操作,相应的qps会增加。
在计算机最开始的时候,运行一个程序,是要这个程序从开始到结束都在CPU当中进行运行,其他程序想要运行,必须等这个程序运行结束之后,才能开启。后来觉得这样做的效率太低,于是使用了进程这么一种概念。就是运行一个程序开启一个进程,比如运行计算器,那么久开启一个计算器的进程。
而且这个进程不是一直占用着CPU,而是跟其他进程相互穿插使用。因为CPU运行的速度实在太快,让我们这些人的眼睛根本区分不出来,使用的时候也不受到影响。
说到这里不得不提一句,化学中分子中也存在空隙,只是他们太小,欺骗了我们的眼睛,让我们误认为他们是没有间隙的,与计算机欺骗我们的方式何其相似。
后来发现一个进程有时候不能满足一部分操作。
以word举例,我们打开一个word文档的时候,就是开启了一个word进程。word可以进行编辑、保存等操作。但是我们编辑的时候,想要保存。一个进程只能完成一个操作,于是卡死在那里无法继续运行。于是乎有些线程这东西。线程成了程序执行的最小单位。一个进程最少有一个线程。
编辑用一个线程,保存又用一个线程。他们都包含在word这个进程当中。
现有进程后有线程
线程三种状态:运行、就绪、堵塞。堵塞只能先去就绪。就绪能和运行互相转换,运行能转换成堵塞或者就绪。
cat group1 | grep blog
两个命令是同时运行的,只是grep运行遇到cat还没有查到结果就会堵塞在那里,等待cat运行完成。
<?php
class A {
public $div = 0;
}
$a = new A();
$a->bar = 2;
echo $a->bar;
#2
能够直接访问未定义变量bar是因为调用了魔术方法__set
function __set($name, $value) {
return $this->data[$name] = $value;
}
可以定义的就先定义,这也有一点小性能可以提升。
抽象类的定义:定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承抽象类,必须实现抽象方法
关键字 abstract
转发调用
self::, parent::, static::, forward_static_call()这几个方式都是转发调用
非转发调用
foo::bar(), foo->bar()这样子属于非转发调用
后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。
PHP面向对象中new self( )和 new static( ) 的区别
在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。
<?php
class A {
public static function foo() {
static::who();
}
public static function who() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function who() {
echo __CLASS__."\n";
}
}
class C extends B {
public static function who() {
echo __CLASS__."\n";
}
}
C::test();
#A
#C
#C
本地和测试站请求都是可以的。但是正是站超过4000条就不行
$response = new Response();
$response->headers->set('Content-type', 'text/csv');
$response->headers->set('Content-Disposition', 'attachment; filename="'.$fileName.'"');
$response->headers->set('Content-length', strlen($content));
$response->setContent($content);
还想尝试用POST请求来完成,结果POST也是模拟点击用GET。各种排查最后发现,因为nginx临时目录没有写入权限。因为文件流过大的时候,会将这些数据写入nginx的临时目录当中缓存起来。
我用的是Anaconda安装的python环境。废话不多说,直接进入正题。
安装tesserocr
conda install -c simonflueckiger tesserocr
这个安装完成之后,我们要去安装一下tesseract
tesserocr是Python的一个OCR识别库,但其实是对tesseract做的一层Python API封装,所以它的核心是tesseract。
链接
tesseract下载地址:http://digi.bib.uni-mannheim.de/tesseract 选一个不带dev的下载就行,安装的时候把所有勾上,大概有1.4GB大小。我从早上十点安装到了下午四点三十。可谓相当想死了。
安装完成后,我们将这个添加到环境和系统变量里去。
然后cmd测试看看有没有加进去了
这样子在你安装的路径可以用了,不过我想要全局都能用咋办,添加一个新的系统变量。名字是TESSDATA_PREFIX,路径是你安装的路劲,比如我的C:\Program Files (x86)\Tesseract-OCR
图片跟本人有bu不同,把路径改成你自己的就可以了。
然后重新打开你的cmd运行你的python文件,应该就能成功了。还不行……试试把testdata文件复制放到Anaconda目录下面……还不行,我也不知道了。
四核八线程是指使用了超线程技术 , 把一个物理核心,模拟成 两个逻辑核心, 理论上要像八颗物理核心一样在同一时间执行八个线程,所以设备管理器和任务管理器中会显示出八个核心,但事实上并不是真正的八个核心,四核八线程就是真四核,虚拟八核;
四核八线程在有些情况下比如任务量不大能让CPU利用率提高很多从而使其性能接近八核CPU的水平,而在另外一些情况比如CPU占用100%满负荷工作的情况下,这时候四核八线程和八核的性能表现差距明显,其实质就是虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。这也是四核八线程和八核的最大区别。
总而言之四核8线程是4个物理核心模拟成8个逻辑核心,8核是8个物理核心
最早时期计算机通信是明文没有加密的,发送的数据包都是可以被其他人截获并且进行读取的。所以非常的不安全。为了信息的隐秘性,所以对发送的数据进行加密。但是用什么方法加密呢?
但是这样子的做法还是有一个漏洞,那就是中间人攻击。比方说C截获了A的公钥,然后把自己的公钥发给B。B发送信息给A期间,C获取信息,用自己的私钥解析,然后再用A的公钥加密发回给A。这样子做依旧无法保护信息的隐秘性。
这只能让自己处于一个相对安全的网络环境来应对了。
延伸到HTTPS。公钥和私钥的加密方式虽然安全,但是速度太慢。于是就想用RSA的方式将对称加密的密钥传递给对方,这样子能快上许多。可是有中间人攻击,这样子做又不安全了。于是想要用数字签名。将一个人的公钥以及个人信息之类的用hash算法生成消息摘要(hash算法是输入只有有一种变化,生成的结果就天翻地覆),接着用有公信力的认证中心(简称CA)的私钥加密生成一个数字签名。数字签名和之前的公钥以及个人信息之类的合并成一个数字证书。这个数字证书得到之后进行对比,相同那么就没有被修改。
本地登录服务器,我们用ssh username@ip
进行首次登陆会有一些提示确保你保证自己的网络没啥危险,然后输入密码。不过这样子以后每次登陆都需要密码太麻烦。于是我们用公钥登陆,也就是将自己本地的公钥传递给服务器,ssh-copy-id -i 路径 username@ip
,服务器接受了本地的公钥,然后我们到/etc/ssh/sshd_config
这个文件进行修改
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
把这三句前面的注释去掉,重启一下service ssh restart
。就完成了。
ssh登录了一次之后,有一个文件known_hosts
把公钥保存下来,下次登录的时候直接访问有没有。服务器还会生成一个authorized_keys
来保存这个公钥,保存一行,另一个公钥重启一行。
用ssh连接服务器上的mysql。我用的是heidisql图形工具。首先我们将服务器上的用户名密码填上去。然后点开SSH隧道。
这时候我们需要先下载一个plink.exe,有32位和64位的。然后填写SSH主机+端口22。填上用户名,密码空着。接着我们加入本地的私钥文件,这个私钥文件必须是.ppk类型。所以我们需要下载一个PuTTY来将我们的私钥生成一个符合的文件。填写本地端口3307。我们只是使用SSH隧道,并不是SSH连接,而在隧道到达之后,3307会被转换成3306。点击打开,OK。
level 4kyu
Ubuntu 14/16 下的 Laravel LNMP 线上环境自动部署脚本
yum -y install vim-enhanced
vim /etc/yum.repos.d/nginx.repo
添加:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
wq退出 yum install nginx
有提醒就按y
systemctl start nginx
systemctl enable nginx
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=80/udp --permanent
systemctl restart firewalld.service
然后在浏览器输入服务器的地址或者ip,显示界面,nginx安装成功
下载mysql源安装包:
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
安装mysql源:
yum localinstall mysql57-community-release-el7-8.noarch.rpm
检查mysql源是否安装成功:
yum repolist enabled | grep "mysql.*-community.*"
安装mysql:
yum install mysql-community-server
启动mysql:
systemctl start mysqld
然后查看mysql的初始密码:
grep 'temporary password' /var/log/mysqld.log
修改mysql密码:
shell> mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPassword9#';
修改mysql的默认编码为utf8
vim /etc/my.cnf
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'
首先删除之前安装的php:
yum -y remove php*
更改yum源:
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
安装各种扩展:
yum -y install php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-fpm php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-pdo php72w-xml
添加用户和用户组,之后用到:
groupadd www
useradd -g www www
修改php配置:
vim /etc/php.ini
修改
;cgi.fix_pathinfo=1
-> cgi.fix_pathinfo=0
修改php-fpm配置:
vim /etc/nginx/nginx.conf
user www www;
worker_processes auto;
[...]
include vhost/*.conf;
server{
listen 80 default;
server_name _ "";
index error.html;
root /home/www/error;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
location / {
allow 127.0.0.1;
deny all;
}
}
修改完成,然后我们这之中包含了一个include vhost/*.conf
然后创建vhost文件夹
cd nginx
mkdir vhost
cd vhost
vim index.conf
server {
listen 80;
listen [::]:80;
server_name ;### 你的域名或者ip
root /home/www/;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
添加完成,接着
cd /home
分别修改文件夹的用户组和用户和文件权限
chown -R www www
chgrp -R www www
chmod -R 755 www
进入www目录创建一个index.php文件 在其中写
<?php
phpinfo()
yum install git-core
curl -sS https://getcomposer.org/installer | php #安装composer包
mv composer.phar /usr/local/bin/composer #将composer放到全局环境当中
现在访问composer -v
composer太慢想修改composer源可以执行下面这段代码
composer config -g repositories.packagist composer https://packagist.phpcomposer.com
composer global require "laravel/installer"
然后到 /home/www执行
composer create-project --prefer-dist laravel/laravel blog
修改用户,用户组,权限
chown -R www www
chgrp -R www www
chmod -R 755 www
修改.env文件
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:zCWGDEsNSF0bmt/Gh/bdlcRHjWKCCiny6brrer5OZxA=
APP_DEBUG=true#线上改成false
APP_LOG_LEVEL=debug
APP_URL=你的服务器域名或者ip
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=你的数据库
DB_USERNAME=root
DB_PASSWORD=你的数据库密码
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
到数据库创建一个blog(你想取啥名都行,只要在DB_DATABASE=你的名字就行)
然后到php artisan migrate
生成成功
然后你打开服务器,会看到有报错页面,说log不能执行,这里就是log文件权限不够
chmod -R 777 storage
777就完事儿了
运用selenium+PhantomJS的时候,曝出UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
查了一下chrome和firefox都除了handless(无头)版本,所以可以不用PhantomJS了。
至于怎么用,之后再补充……
我推荐两家我用过的服务商吧,一家是Vultr,也是我正在使用的,没有信用卡的话也可以使用PayPal支付;另一家是搬瓦工(Bandwagon)。
搬瓦工有低配且便宜的选择,如果只是用于科学上网也还可以,目前在亚洲没有机房。Vultr相比搬瓦工费用能高一丢丢,最低配置(15GB SSD,1CPU,768MB Memory,1000GB Bandwidth)也不算差,除了科学上网放个网站也足矣。目前我使用东京节点的机子,进行路由跟踪你会发现会绕道美国,也有绕道香港的,这和当前所处的网络环境也有一定的关系。
CentOS:
# yum install python-setuptools && easy_install pip
# pip install shadowsocks
Debian / Ubuntu:
# apt-get install python-pip
# pip install shadowsocks
服务器系统一般默认安装了 Python ,查看当前版本:
# python --version
Python 2.7.5
确保服务器安装的是 Python 2.6 or 2.7
创建一份配置文件/etc/shadowsocks.json例如:
{
"server":"my_server_ip",
"server_port":8388,
"local_address": "127.0.0.1",
"local_port:":1080,
"password":"mypassword",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}
server:服务器IP地址
server_port:SS服务指定端口
local_address:本地服务地址,默认127.0.0.1
local_port:本地服务端口,常用1080
password:SS服务密码,禁止使用默认密码mypassword
timeout:服务超时,单位秒s
method:加密方式,默认aes-256-cfb
fast_open:TCP Fast Open ,true or false
配置多用户账号:
{
"server":"my_server_ip",
"port_password":{
"8388":"mypassword",
"8389":"mypassword",
"8390":"mypassword"
},
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}
安装并写好配置后即可运行:
# ssserver -c /etc/shadowsocks.json
如果你通过SSH终端成功运行该命令,当关掉终端窗口服务随即终止。所以需要执行SS服务后台运行:
# ssserver -c /etc/shadowsocks.json -d start
# ssserver -c /etc/shadowsocks.json -d stop
如果要检查日志:
# less /var/log/shadowsocks.log
无法正常运行:
防火墙禁止端口访问
SS 安装了也配置了,启动服务也没问题,但是在电脑或者手机连接上直接超时了。这可能是防火墙的问题,Vultr 的CentOS 7 默认打开了防火墙,而 Ubuntu 14.04 则没有。
可清空防火墙所有规则:
# iptables -F
个人觉得没必要清空规则,相反,我们可以手动添加规则确保 SS 所使用的端口能正常使用:
# firewall-cmd --zone=public --add-port=8088/tcp --permanent
# firewall-cmd --zone=public --add-port=8088/udp --permanent
port即在配置文件里写的端口,执行后规则立即生效。
也可以通过修改/etc/firewalld/zones/public.xml文件,增加所要使用的端口,比如增加8088端口:
<port protocol="tcp" port="8088"/>
<port protocol="udp" port="8088"/>
保存后,运行:
# firewall-cmd --complete-reload
###socket.error: [Errno 99] Cannot assign requested address
在国内主机我尝试搭建 SS 也碰到过这个问题,具体解决办法是将 server 的 IP 设置为 0.0.0.0 即可解决上述问题,配置这样写:
{
"server":"0.0.0.0",
"server_port":8388,
"local_address": "127.0.0.1",
"local_port:":1080,
"password":"mypassword",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}
最后
感谢clowwindy的贡献,希望 Shadowsocks 能助你轻松科学上网。
以A发一封早上好的邮件给B为例子。
填写发件人,填写收件人,填写电子邮件内容。添加应用层的数据首部,通过接口传给表示层。
将电子邮件进行转码,转换成通用编码格式的内容,带上表示层数据首部,通过接口传递给会话层。
决定将电子邮件用何种连接方式(顺序)传送给对方,带上会话层数据首部,通过接口传递给传输层。
确定发送端A与接收端B的连接与断开连接,带上传输层数据首部,通过接口传递给网络层。
将数据发送到接收端,带上网络层数据首部,通过接口传递给数据链路层。
负责实现每一个区间内的通信,带上数据链路层数据首部,通过接口传递给物理层。
简单粗暴的将数据转换成0、1的电压和脉冲光传输过去,带上物理层的数据首部。
B接收端,从物理层开始一步步查看首部,通过接口向上传递,直到应用层能看到这条邮件为止。假如邮箱满了,返回异常处理,这是应用层干的事情。
from bs4 import BeautifulSoup
from urllib.request import urlopen
import lxml
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
soup = BeautifulSoup(html.read(), 'lxml')
print(soup.h1)
print(html.read())
输出
<h1>An Interesting Title</h1>
b''
read方法只能用一次就没有了?为啥?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.