百度PHP实习生面试实录

人呐就都不知道,自己不可以预料,一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的行程。我绝对不知道,我作为一个蒟蒻本科生怎么把我选到百度去了。所以HR同我讲话,说“人力资源部都决定了,你来当实习生。”我说另请高明吧,我实在也不是谦虚,我一个天津学生怎么到北京来了呢?但是,HR讲“大家已经研究决定了”。后来我念了两首诗,叫“苟利实习生死以,岂因远近避趋之”。所以我就作文以记之。

1番目

第一次是在6月17日(周五)下午,因为周六要考六级,所以正在复习周日要考的数理方程。两点钟左右面试官发来短信说三点开始电话面试,所以我花了一个小时的时间突击了一下我感觉会问到的算法、数据结构、操作系统、网络的知识。然而事实证明并没有什么卵用

3点过一点打来电话,听对面环境非常嘈杂,所以听起来非常吃力:

  • 首先先做一下自我介绍吧(大概是在翻简历)

    私は……

  • 有什么项目经历吗?

    (简要列举了一下做过的项目)

  • 我看了你的GitHub发现有不少项目,简要介绍几个吧~

    (随便挑几个说了)

  • 熟悉C++吧,说一说继承和多态吧~

    (因为面向对象用的不多,就随便说了说自己的理解)继承应该就是使用现有类的所有功能,在无需重新编写原来的类的情况下对这些功能进行扩展;多态就是允许将子类类型的指针赋值给父类类型的指针

  • C++最新的标准是多少?

    莫非是C++11?(后来查了一下发现都有C++17了)

  • 那你知道C++中的??(这两个字因为他那边太嘈杂了到现在都不知道说的是什么)吗?

    呃……(然后又问了几遍还是没听清,接下来就是蜜汁沉默)

  • (他察觉出这方面我不是很熟悉)不知道没关系,咱们再聊点别的。Java和C++的区别在哪?

    (随便扯一扯,大概是Java没指针、不支持多继承、对象只能由引用传递,C++没有包、接口、不能多个相同线程并发运行等等吧)

  • 那么来说一说重载和覆盖吧~

    (虽然不大清楚还是扯了一扯)重载一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同;覆盖一般是用于子类在继承父类时,重写父类中的方法

  • PHP方面做过什么项目呢?

    (就把之前做过的PHP的东西详细说了说)

  • 有什么特别的功能吗?

    (就想了想项目里的亮点说了说)

  • 具体是怎么实现的?

    (一时没想起来就翻了一下GitHub跟他讲了讲)

  • 你在实验室中做些什么?

    (简要介绍了一下自己在实验室的工作)

  • 我这边问得差不多了,我先来介绍一下我们这边的情况吧(blabla一堆)……然后你有什么想问的吗?

    (就随便问了几个无关紧要的问题就结束了)

第一次电话面试大概用了一个小时的时间,由于时间太久远了肯定遗漏了很多问题没写出来,不过在最后比较有用的信息大概就是实习生面试大概有两到三轮技术面,一般没有HR面,面试题目基本看面试官个人喜好,基本觉得差不多就给通过了,差不多一周左右就会进入下一轮面试,不会要求太高。话虽如此,不过还是感觉自己面炸了,就没有往下准备~

2番目

第二次是在6月28日(周二)下午,因为第二天要检查FPGA大作业但那时还没有人做出来,所以在研究那个。大概差一刻6点的时候面试官打来电话问我什么时候方便电面,我说就现在吧早面试完早搞FPGA,于是他准备了5分钟再次打来电话开始面试:

  • 首先先做一下自我介绍吧(老套路)

    私は……

  • 我看你简历上写熟悉Linux,列举几条你常用的Linux命令吧~

    wcdiffgrepfind等等吧

  • 看起来都是些查找统计的命令,要是对比两个目录下的文件名用什么命令?

    应该也是用diff吧,再加个参数,具体什么参数不清楚~

  • 那你回来再查查吧;如果让你杀死某个进程要怎么做?

    先用ps找到进程号然后kill掉吧~

  • 要是只用一条命令怎么写呢?(这时对面响起了敲键盘的声音)

    要用到管道吧,先把PIDcut出来(当时口误说成cat了),具体怎么写没想出来(对方还提示了半天)

  • awk你了解吗?

    用的不是很多,不太熟悉~

  • 问点PHP吧,你知道include()require()的区别在哪吗?

    (这个之前看过,但是一时想不起来,就扯了扯require()require_once()的区别,答案应该是遇到错误时include()会产生一个警告,而require()导致一个致命错误)

  • PHP怎么获取用户ip地址?

    应该是$_SERVER[]吧~

  • 那么怎么获取网页内容?

    这个没用过,真不知道(其实应该是file_get_contents($url)

  • 介绍一下简历上的XX项目吧,都有什么功能?

    (介绍一下功能)

  • 用户登录是怎么实现的?

    用了个全局变量表示登录状态(当时写的比较SB,怎么会用这种方法呢)~

  • 那样的话关闭浏览器再打开状态就丢了吧~一般要用SESSION吧,SESSION你知道吗?

    (这时我才恍然大悟刚才直接说这个不就好了吗)用过用过,在YY项目里登录我是用SESSION实现的。

  • 那你再介绍一下YY项目的工程吧~

    (blabla一大堆)

  • 那么数据库中ZZ的数据是怎么存的呢?

    (balbla介绍了一下数据库的结构)

  • 怎么按条件查询呢?

    (blabla介绍了一下查询方法)

  • 我看你还写过Java,做过Java的什么项目吗?

    并没有,只是写了点Application,Android的算吗?

  • 算吧,说说看~

    (blabbla介绍了一下功能)

  • 具体是怎么实现的呢?

    调用了为了CC而使用的GG接口~

  • 哦,那和Windows下的JJ挺像的。你还了解一点Python是吧?

    一般当脚本用的,处理数据用。

  • 我们这边还会用到go来开发平台,go你知道吗?

    golang啊,听说过。

  • 对,要是来我们这边也会用到。你那边还有一些其他问题要问吗?

    暂时想不到了,第一轮时基本问过了(因为我赶着做大作业啊)~

然后寒暄了一阵就挂掉了电话,总共用时大约半小时。虽然没有抱太大希望,但是感觉百度的面试官还是非常Nice的,但是这样的面试真心无从准备,但是一定要熟悉自己简历上的内容(面试问题基本围绕简历展开)和投递职位的工作内容,其他的就完全靠姿势水平啊~

Read More +

OpenWrt上的ssh免密登录

一般在用OpenSSH服务器的系统上进行ssh登录时,我们只需要在本地生成密钥(yuè)对,将私钥(yuè)留在本地,将公钥(yuè)上传到目标服务器上就可以了,具体如下:

ssh-keygen
cat ~/.ssh/id_rsa.pub | ssh remote_username@remote_host 'cat >> .ssh/authorized_keys'

然而OpenWrt上的ssh服务器却用的Dropbear,它是一种在较低内存和处理器资源的嵌入式系统中替代OpenSSH的软件,因此使用起来用诸多的不同。

免密登录到OpenWrt

如果本地是用ssh-keygen生成的密钥对,那么只需要将公钥上传到路由器的/etc/dropbear/authorized_keys中就行了:

cat ~/.ssh/id_rsa.pub | ssh [email protected] 'cat >> /etc/dropbear/authorized_keys'

从OpenWrt登录到其他机器

首先登入到OpenWrt。但想从OpenWrt免密登录其他机器,也要先生成密钥对并将公钥上传。由于无法使用ssh-keygen,我们可以直接用dropbearkey生成:

dropbearkey -t rsa -f ~/.ssh/id_rsa
Generating key, this may take a while…
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCn02fMyD2T1ECmDZso8EG1m/4eo5LJtNlbqCMu0SkABsOUvmTHozrPzoJ10SlcAhjnc84S//VGEAbNJxUTaYn0M7f7M8Q4NBSyPF9DMcNAWKM01OSll8BWLQafZeZneW+UOwO6h1LOd6UEaLS8lhKQUD05+dSzKhPHimZudlhkV2bO7KOkiFh3P4K1GakHBuXitB1V9QH144BKKlSqNXy7TZcJf5/oRkB76ZmdSDDMQtvfCHF1BZwggStgBsu9K6nAl8lz9MOVHCYs9AkEIurldrHLUKvoGJ4QA5yc3bEMQaMH7vu3G5YMysIY4w5+aVuZh5Wg4THoh6yXPfGUc7Mh root@OpenWrt
Fingerprint: md5 2d:8f:e9:e7:31:75:f0:f4:ba:b8:54:4c:2f:43:9b:33

这样就将私钥生成到~/.ssh/id_rsa了,并将公钥打印到了屏幕上。建议将公钥也保存下来,以便以后使用:

echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCn02fMyD2T1ECmDZso8EG1m/4eo5LJtNlbqCMu0SkABsOUvmTHozrPzoJ10SlcAhjnc84S//VGEAbNJxUTaYn0M7f7M8Q4NBSyPF9DMcNAWKM01OSll8BWLQafZeZneW+UOwO6h1LOd6UEaLS8lhKQUD05+dSzKhPHimZudlhkV2bO7KOkiFh3P4K1GakHBuXitB1V9QH144BKKlSqNXy7TZcJf5/oRkB76ZmdSDDMQtvfCHF1BZwggStgBsu9K6nAl8lz9MOVHCYs9AkEIurldrHLUKvoGJ4QA5yc3bEMQaMH7vu3G5YMysIY4w5+aVuZh5Wg4THoh6yXPfGUc7Mh root@OpenWrt" > ~/.ssh/id_rsa.pub

然后就和原来一样,将公钥上传到目标服务器就可以了:

cat ~/.ssh/id_rsa.pub | ssh remote_username@remote_host 'cat >> .ssh/authorized_keys'

但是在登录的时候要注意,使用ssh命令需要加-i参数指定所用的私钥:

ssh -i ~/.ssh/id_rsa remote_username@remote_host

记得使用scp等类似命令也要这样。

Read More +

ChinaDNS+ShadowSocks实现路由器透明代理

之前给一个路由器刷了OpenWrt在学校上网用,这个月开始学校改计费方式了,索性就拿回家来做透明代理了。之前想使用GFWlist来分流结果没成功,所以才折腾一下ChinaDNS感觉还是比较简单的,但唯一的弊病是无论境外IP是否被屏蔽都会走代理,这样有些无关痛痒的国外网站访问起来可能会变慢。无论如何,终端设备不再使用代理软件已经方便很多了。

在搞透明代理之前请确保路由器已经安刷好了OpenWrt。具体怎么刷OpenWrt请参见我之前的一篇博文路由器刷入OpenWrt固件

必要软件

首先是在OpenWrt下装上一堆必要软件:

  • shadowsocks-libev-spec
  • luci-app-shadowsocks-spec
  • ChinaDNS
  • luci-app-chinadns

这些都可以在sourceforge里找到。如果无法访问也可以下载我备份在服务器上的较老版本:

wget https://www.shintaku.cc/files/shadowsocks-libev-spec_2.4.6-1_ar71xx.ipk
wget https://www.shintaku.cc/files/luci-app-shadowsocks-spec_1.4.0-1_all.ipk
wget https://www.shintaku.cc/files/ChinaDNS_1.3.2-3_ar71xx.ipk
wget https://www.shintaku.cc/files/luci-app-chinadns_1.4.0-1_all.ipk

下载完成后使用opkg命令安装,如果当前目录下没有其他文件就直接opkg install *就好了。这时刷新一下LuCI界面就会多出服务一项了。

服务

配置ChinaDNS

默认配置是这样的:

ChinaDNS

其中的设置基本不用动,国内路由表在/etc/chinadns_chnroute.txt,最好设置成定期更新,可以在计划任务中添加crontab任务:

0 4 * * * wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("\%s/\%d\n", $4, 32-log($5)/log(2)) }' > /etc/chinadns_chnroute.txt

这样每天凌晨4点就可以将新的路由表文件写入了。

还有上游服务器一项,前面的是对于国内线路的DNS服务器,默认是114基本没什么问题;但是后一个DNS服务器则要求没有污染,默认用的Google的,感觉直接作为DNS不会太理想,所以需要自己在VPS上搭建一个简易的DNS服务器。

简单来说,使用dnsmasq比较方便,所以登入VPS服务器,安装dnsmasq并加入开机启动:

yum install dnsmasq
systemctl enable dnsmasq

然后编辑配置文件/etc/dnsmasq.conf(因为所有内容都注释掉了,所以直接加入下面几行就可以了):

1
2
3
port = 5353
server = 8.8.8.8
server = 8.8.4.4

保存后运行dnsmasq就监听到5353端口了,这样就可以间接地使用Google的DNS了。

回到路由器方面,将上游服务器的后一项改为VPS_ip:5353保存就可以了。

然后进入网络-DHCP/DNS,将基本设置里的本地服务器改为127.0.0.1#5353

DHCP/DNS

再到HOSTS和解析文件忽略解析文件忽略/etc/hosts保存即可。

配置ShadowSocks

服务器配置按实际情况填写即可,主要要注意访问控制里的被忽略IP列表,因为装了ChinaDNS,所以选里面的ChinaDNS路由表就行了。如果怕自己的VPS也被代理了,在额外被忽略IP里填上自己的VPS地址就好了:

ShadowSocks

启动ShadowSocks以后可以用Baidu和Google分别测一下自己的IP地址,如果分别是ISP和VPS的IP应该就没问题了。

Read More +

将jar程序打包成app

Mac下的Minecraft启动器是jar文件,每次需要启动的时候都要进入到它所在的目录下双击用Jar Launcher运行,或者使用jawa -jar命令启动,非常麻烦。所以想了一个办法,用Automator将它打包成app文件放到Application目录下就会出现在Launchpad里了。

新建app

首先打开Automator创建一个Application:

Application

选择Run Shell Script并将jar的运行命令填进去:

java -jar /Applications/Minecraft.app/Contents/Jar/Minecraft\ Launcher.jar

Run Shell Script

然后改个名字保存到Application下。

打包jar

打开新建好的app的Contents,在里面新建一个Jar目录,并将启动器的jar文件移进去(只要跟上面命令的路径自洽即可):

Jar

然后可以用Automator右上角的Run测试一下是否可以正常执行:

Run

更改图标

打开app的Info,点击图标后会出现一个蓝圈:

Info

这时将复制好的图片粘贴到这里就可以更改图标了。

现在就可以到Launchpad里启动Minecraft的启动器了:

Launchpad

Read More +

Mac上进行Verilog仿真

这学期上VLSI系统设计这门课,同时顺带着把计算机设计与调试的课程设计做了。往FPGA上烧写之前要用Verilog进行仿真,在实验室直接用机房的ModelSim仿真了,但是课下在虚拟机上做有诸多的不便,于是就研究了一下在Mac下写Verilog的方法。

配置Sublime代码高亮

Sublime Text默认是不支持Verilog代码高亮的,可以通过安装插件增加对其的支持。首先要安装Sublime包管理工具,按control+` 打开控制台,并运行以下代码(以Sublime Text 2为例):

1
import urllib2,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')

安装完后重启,按command+shift+P唤出命令面板,打开Install Package包管理工具:

Install Package

然后查找Verilog,将搜到的自动补全和代码高亮插件装上重启就可以了:

Verilog

安装Icarus Verilog

Icarus Verilog是Verilog硬件描述语言的实现工具之一。该软件以GNU通用公共许可协议发布,是一个自由软件。它支持Verilog对应的的IEEE 1995、IEEE 2001和IEEE 2005三个不同的版本,并对SystemVerilog的部分内容提供支持。

首先保证已经安装了Homebrew,然后通过brew安装:

brew install icarus-verilog

安装Scansion

Scansion是Mac平台下的一个VCD文件查看工具,可以去http://www.logicpoet.com/downloads/下载其最新版本并安装。

编译仿真

随便新建一个测试文件叫test.v:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module vaddsws( vra, vrb, vrt, sat );

input [31 : 0] vra;
input [31 : 0] vrb;
output [31 : 0] vrt;
output sat;

wire [31 : 0] sum;
wire [31 : 0] vrt;
wire sat;

assign {sat, sum} = vra + vrb;
assign vrt = (vra[31]^vrb[31]) ? sum : (vra[31]&&vrb[31] ? (sum[31] ? sum : 32'h80000000) : (sum[31] ? 32'h7fffffff : sum));

endmodule

再对其新建testbench文件test_tb.v:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
`timescale 1ns/100ps
`include "test.v"

module vaddsws_tb;

reg [31: 0] vra;
reg [31: 0] vrb;
wire [31: 0] vrt;
wire sat;

initial
begin
$dumpfile("test.vcd");
$dumpvars(0, vaddsws_tb);
assign vra=32'hffffffff;
assign vrb=32'hffffffff;
#100
assign vra=32'h01234567;
assign vrb=32'h76543210;
#100
$finish;
end

vaddsws add( .vra(vra), .vrb(vrb), .vrt(vrt), .sat(sat) );

endmodule

注意testbench文件的第二行中include宏是为了引用前一个文件的模块定义,如果在Windows下用ModelSim时把它注释掉就可以了。第13行是为了生成波形文件以便在Scansion里查看。

源码编辑好后执行以下命令编译执行:

iverilog -o test.vvp test_tb.v
./test.vvp

生成vcd格式的波形文件用Scansion打开即可(也可以使用命令open -a Scansion test.vcd):

输出波形

Read More +

CentOS 7配置LEMP环境

由于最近许多服务都需要依赖LEMP(Linux、Nginx、MySQL、PHP)环境,之前旧金山机房的VPS使用CentOS 6的系统总是安装不成功,最近换了新加坡机房装了CentOS 7,所以重新完完整整的配置一遍,以便后面使用。

安装MySQL

MySQL直接从yum安装总是不能成功,后来索性就直接下载rpm包安装了。首先下载MySQL社区版的rpm包并执行安装:

rpm -ivh http://repo.mysql.com/mysql-community-release-el7-7.noarch.rpm
yum update

之后安装mysql-server:

yum install mysql-server

通过mysql -V命令查看版本来检查MySQL是否安装成功。

启动服务并设置开机启动:

systemctl start mysqld
systemctl enable mysqld

然后配置安全脚本:

mysql_secure_installation

这时会要求输入数据库的root密码,由于是新安装的并没有密码,所以直接回车即可。接下来会提示设置新的root密码,然后会有一些其它选项:

Remove anonymous users? [Y/n]
Disallow root login remotely? [Y/n]
Remove test database and access to it? [Y/n]
Reload privilege tables now? [Y/n]

按需求选择即可,推荐都选Y。

结束后使用mysql -u root -p命令以root身份登录,后面输入密码就登进去了。

安装PHP

yum默认安装的PHP还是5.4版本,对于需要新版本特性的用户还是通过Remi源安装好了。所以首先下载安装Remi源:

rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum update

然后编辑/etc/yum.repos.d/remi.repo文件:

1
2
3
4
5
6
7
[remi]
name=Remi's RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/remi/$basearch/
mirrorlist=http://rpms.remirepo.net/enterprise/7/remi/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

请确保[remi]中的enabled的值是1。然后向下查看,在想要安装的php的版本([remi-php55][remi-php56])一段将对应的enabled的值改为1,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[remi-php55]
name=Remi's PHP 5.5 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php55/$basearch/
mirrorlist=http://rpms.remirepo.net/enterprise/7/php55/mirror
# NOTICE: common dependencies are in "remi-safe"
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

[remi-php56]
name=Remi's PHP 5.6 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php56/$basearch/
mirrorlist=http://rpms.remirepo.net/enterprise/7/php56/mirror
# NOTICE: common dependencies are in "remi-safe"
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

保存之后就可以用yum命令安装较新的PHP了:

yum install php php-fpm php-mysql

当然以后如果发现缺了什么php的组件也可以通过这种方式安装,例如:

yum install php-gd php-mcrypt php-pear

通过php -v命令查看版本来检查PHP是否安装成功。

启动PHP并设置开机启动:

systemctl start php-fpm
systemctl enable php-fpm

安装Nginx

再使用yum安装Nginx:

yum install nginx

通过nginx -v命令查看版本来检查Nginx是否安装成功。

启动Nginx并设置开机启动:

systemctl start nginx
systemctl enable nginx

然后在/etc/nginx/nginx.confhttp段中加入一句:

1
include /etc/nginx/conf.d/*.conf;

编辑/etc/nginx/conf.d/default.conf文件(若不存在请新建,以后就可以在这里修改配置了):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
server {
listen 80;
server_name your_domain;
return 301 https://$server_name$request_uri;
#charset koi8-r;

#access_log logs/host.access.log main;

# Load configuration files for the default server block.

include /etc/nginx/default.d/*.conf;

location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}

error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

保存后通过systemctl restart nginx命令重启Nginx。然后在根目录下新建一个html文件并从浏览器访问它看看是不是正常显示。

配置Nginx和PHP

继续编辑/etc/nginx/conf.d/default.conf文件,将location ~ \.php$一段解注释,并改成如下样子:

1
2
3
4
5
6
7
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

其中要注意root改成网页的根目录,此外还要确保location /index中有index.php。然后通过systemctl restart nginx命令重启Nginx。

再编辑/etc/php-php.d/www.confusergroup的值改为nginx(默认应该是apache):

1
2
user = nginx
group = nginx

保存后使用systemctl restart php-fpm命令重启PHP。

下面新建/usr/share/nginx/html/index.php文件测试PHP环境是否配置成功:

1
2
3
<?php
phpinfo();
?>

从浏览器打开该页面,如果出现PHP信息则说明配置完成。

Read More +

舰娘更改Cookie直接连接

DMM的游戏限制境外玩家登录,因此玩游戏必须要让DMM认为你是从日本访问的,境外玩家使用日本的匿名代理是一种常见的手段。而DMM仅仅是在登陆的时候会验证访客的IP地址,因此多了所谓直连的这一种途径。另外,DMM并不会经常改变游戏Token,因此采用任何方法登陆后,都可以通过浏览器的开发者工具将Flash的链接提取出来并保存为书签便可直接登陆游戏。

***———— 萌娘百科***

地区错误

之前玩舰娘不是使用ShadowSocks就是使用VPN,后来也曾一度使用改hosts搭配国内VPN的方式(因为只改hosts在有的网络环境下会出现白屏)。觉得这些方式都太繁琐并且过于依赖网络代理,后来就找到一种注入Cookie的方法。

直连方法是利用DMM在大部分时间都不检查用户IP这个特性,通过技术手段绕过IP验证的环节来达到直接连接的目的,更改浏览器或者舰娘辅助工具(比如Poi)的Cookie来使服务器不去验证用户的地域信息。

清空Cookie

首先打开DMM主页并选择语言为日本语

选择语言

然后清一下Cookie:

删除Cookie

注入Cookie

打开浏览器开发者工具中的控制台(在Poi中是显示菜单中的Webview开发者工具),将以下代码粘贴进去并回车:

document.cookie = "ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=osapi.dmm.com;path=/";
document.cookie = "ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=203.104.209.7;path=/";
document.cookie = "ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=www.dmm.com;path=/netgame/";
document.cookie = "ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=log-netgame.dmm.com;path=/";

运行代码

如果出现

“ckcy=1;expires=Sun, 09 Feb 2019 09:00:09 GMT;domain=log-netgame.dmm.com;path=/“

则说明注入成功。这时再次进入舰娘的页面-艦これ-则会正常打开:

舰娘主页

登陆后就会顺利进入游戏了:

进入游戏

楽しもっ!

Read More +

Linux上搭建Minecraft服务器

之前想在树莓派上搭建一个Minecraft服务器,但是只限于局域网内玩有点不爽,所以才想在VPS上开服。这个服务器的地址是mc.shintaku.xyz,一般时候都是宕机,欢迎大家过来乱搞。

环境配置

Minecraft是基于Java运行的,所以首先要安装Java环境:

yum install java

好像比其他平台的安装简单得多。然后为了让Minecraft在后台运行而不受终端操作的干扰,要装一个screen:

yum install screen

启动游戏

因为最开始要安装到树莓派上,硬件资源有限,所以这里介绍一个叫SpigotMC的轻量级MC服务器端,是Bukkit的优化版,但是可能游戏中有些材质无法使用。新建一个目录将下载的spigot.jar放进去,然后用以下命令启动:

java -Xms256M -Xmx512M -jar spigot.jar nogui

后来发现微软官网有了服务器版的下载,所以服务器配置足够好的话运行这个也是没有问题的,同样是先下载对应版本的server.jar,启动命令相同:

java -Xms512M -Xmx1024M -jar server.jar nogui

其中前两个参数是指定MC运行的内存范围,然后会出现一系列启动信息,最后就是Stopping server

修改配置文件

启动之后MC的目录下会生成一些其他的文件,先编辑eula.txt,将eula的值改为true

eula=true

然后编辑server.properties,开始里面应除了一些注释没有其他内容,将以下内容加进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
generator-settings=                 #用于设置超平坦世界的函数,留空即可
op-permission-level=4 #设置OP的许可权等级
allow-nether=true #是否允许生成/进入下界
level-name=world #世界名称及其文件夹名
enable-query=false #允许使用GameSpy4协议的服务器监听器
allow-flight=false #是否允许玩家在生存模式透过MOD飞行
announce-player-achievements=true #是否公开显示玩家成就
server-port=25565 #服务器端口(默认为25565)
level-type=DEFAULT #世界类型
enable-rcon=false #是否允许远程访问服务器仪表盘
level-seed= #世界种子
force-gamemode=false #玩家是否总是以默认游戏模式进入服务器
server-ip= #服务器IP,一般来说留空即可
max-build-height=256 #最高建筑高度(最高256)
spawn-npcs=true #是否生成村民NPC
white-list=false #是否开启白名单认证
spawn-animals=true #是否生成动物
hardcore=false #是否开启极限模式
snooper-enabled=true #是否允许服务器定期发送统计数据
online-mode=false #是否开启正版认证(开启后只有正版玩家可进入)
resource-pack= #资源包URL(可让玩家选择是否使用服务器提供的资源包)
pvp=true #可否PVP
difficulty=1 #难度
enable-command-block=false #是否可以使用命令方块
gamemode=0 #默认游戏模式
player-idle-timeout=0 #如果该玩家无反应超过这个分钟数将会被踢出
max-players=20 #最大玩家数量
spawn-monsters=true #是否生成怪物
generate-structures=true #是否生成建筑物
view-distance=10 #客户端视野距离的上限
motd=A Minecraft Server #服务器在服务器列表页所显示的信息

可以按照注释自己进行修改,注意如果没有购买正版需要将online-mode一项改为false

一切完成后新开一个screen来启动MC:

screen -S mc

这时相当于进入一个新终端,mc是这个screen的名字。在里面继续执行之前的java启动命令就可以正常启动游戏了。在screen中只要按下Ctrl+A再按下Ctrl+D就可以回到原来的终端了。再想进入这个screen的话运行screen -r mc就可以了。想要停止游戏的话输入stop就可以了。

然后在本地启动游戏,选多人游戏并输入服务器地址就能连接了。

另外附上基本的OP命令,就可以方便地管(zhuō)理(nòng)其他玩家了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/achievement <give|take> <stat_name|*> [player]
/ban <name> [reason ...]
/ban-ip <address|name> [reason ...]
/banlist [ips|players]
/blockdata <x> <y> <z> <dataTag>
/clear [player] [item] [data] [maxCount] [dataTag]
/clone <x1> <y1> <z1> <x2> <y2> <z2> <x> <y> <z> [maskMode] [cloneMode]
/debug <start|stop>
/defaultgamemode <mode>
/deop <player>
/difficulty <new difficulty>
/effect <player> <effect> [seconds] [amplifier] [hideParticles] OR /effect <player> clear
/enchant <player> <enchantment ID> [level]
/entitydata <entity> <dataTag>
/execute <entity> <x> <y> <z> <command> OR /execute <entity> <x> <y> <z> detect <x> <y> <z> <block> <data> <command>
/fill <x1> <y1> <z1> <x2> <y2> <z2> <TileName> [dataValue] [oldBlockHandling] [dataTag]
/gamemode <mode> [player]
/gamerule <rule name> [value]
/give <player> <item> [amount] [data] [dataTag]
/help [page|command name]
/kick <player> [reason ...]
/kill [player|entity]
/list
/me <action ...>
/op <player>
/pardon <name>
/pardon-ip <address>
/particle <name> <x> <y> <z> <xd> <yd> <zd> <speed> [count] [mode]
/playsound <sound> <player> [x] [y] [z] [volume] [pitch] [minimumVolume]
/replaceitem <entity|block> ...
/save-all
/save-off
/save-on
/say <message ...>
/scoreboard <objectives|players|teams> ...
/seed
/setblock <x> <y> <z> <TileName> [dataValue] [oldBlockHandling] [dataTag]
/setidletimeout <Minutes until kick>
/setworldspawn [<x> <y> <z>]
/spawnpoint [player] [<x> <y> <z>]
/spreadplayers <x> <z> <spreadDistance> <maxRange> <respectTeams true|false> <player ...>
/stats <entity|block> ...
/stop
/summon <EntityName> [x] [y] [z] [dataTag]
/tell <player> <private message ...>
/tellraw <player> <raw json message>
/testfor <player> [dataTag]
/testforblock <x> <y> <z> <TileName> [dataValue] [dataTag]
/testforblocks <x1> <y1> <z1> <x2> <y2> <z2> <x> <y> <z> [mode]
/time <set|add|query> <value>
/title <player> <title|subtitle|clear|reset|times> ...
/toggledownfall
/tp [target player] <destination player> OR /tp [target player] <x> <y> <z> [<y-rot> <x-rot>]
/trigger <objective> <add|set> <value>
/weather <clear|rain|thunder> [duration in seconds]
/whitelist <on|off|list|add|remove|reload>
/worldborder <set|center|damage|warning|get|add> ...
/xp <amount> [player] OR /xp <amount>L [player]
Read More +

SoftEther VPN的搭建与连接

虚拟专用网(VPN),是一种常用于连接中、大型企业或团体与团体间的私人网络的通讯方法。虚拟私人网络的讯息透过公用的网络架构来传送内联网的网络讯息。它利用已加密的通道协议来达到保密、发送端认证、消息准确性等私人消息安全效果。这种技术可以用不安全的网络来发送可靠、安全的消息。可以用通俗的例子来解释这件事情:

FFF国的小张和小王是异地双性恋,他们之间经常互通情书。但是FFF国有一个规定,就是异性青少年不能互通信件,否则就要被双双烧死。于是这对情侣就拜托他们的父亲老张和隔壁老王代为收发信件:小张和小王写完信后各自放在信封中封好,信封上分别写上小王亲启小张亲启,然后分别交给他们的父亲,老张和老王把信封又装进一个大信封中,上面分别写上老王收老张收再寄出。自然之后老张和老王会收到信件,拆开大信封后发现不是给自己的就转交给自己的孩子,这对情侣就这样达到了通信目的。

看了VPN的原理,我们很容易想到可以用这种方式来科学上网。我们虽然不能直接和被墙的网站通讯,但我们可以通过VPN的方式躲过GFW的追杀。

SoftEther VPN是由日本筑波大学的登 大遊在硕士论文中提出的开源、跨平台、多重协议的虚拟专用网方案,是专门为穿过防火墙而设计的。我们可以用它在自己的VPS上搭建一个简单的VPN来使用。

服务器端

下载解压

首先要在服务器上下载并解压安装文件,一定注意是32位还是64位(可通过uname -a命令查看)。
32位系统:

wget http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Server/32bit_-_Intel_x86/softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x86-32bit.tar.gz

64位系统:

wget http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz

以上为截止发布本文时的最新版本,建议从SoftEther官方网站获取最新版本。

安装启动

先解压(建议装到/usr/local下):

tar -zxvf softether-vpnserver-*.tar.gz

cd vpnserver进入到解压目录下并启动安装脚本./.install.sh


SoftEther VPN Server (Ver 4.20, Build 9608, Intel x64 / AMD64) for Linux Install Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.


Do you want to read the License Agreement for this software ?

  1. Yes
  2. No

Please choose one of above number:

认识不认识字至少读一读,之后会出现一堆License,然后问你看懂了没:

Did you read and understand the License Agreement ?
(If you couldn’t read above text, Please read ‘ReadMeFirst_License.txt’ file with any text editor.)

  1. Yes
  2. No

Please choose one of above number:

当然没看懂也要说看懂了,然后又问你同不同意:

Did you agree the License Agreement ?

  1. Agree
  2. Do Not Agree

Please choose one of above number:

不同意就不要用了。如果提示不识别某些命令比如gcc,另行安装即可。如果没有异常则说明安装成功,执行./vpnserver start启动服务。同理./vpnserver stop停止服务。

在CentOS7以后可以用systemd启动vpnserver,先新建启动脚本/etc/systemd/system/vpnserver.service

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target

然后就可以通过systemctl start vpnserver启动了,并通过systemctl enable vpnserver设置开机自启。

设置密码

启动成功后我们需要设置远程登录密码以便本地管理服务。运行./vpncmd进入VPN的命令行:

vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
Version 4.20 Build 9608 (English)
Compiled 2016/04/17 21:59:35 by yagi at pc30
Copyright (c) SoftEther VPN Project. All Rights Reserved.

By using vpncmd program, the following can be achieved.

  1. Management of VPN Server or VPN Bridge
  2. Management of VPN Client
  3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3:

这里我们选择1,然后出现:

Specify the host name or IP address of the computer that the destination VPN Server or VPN Bridge is operating on.
By specifying according to the format ‘host name:port number’, you can also specify the port number.
(When the port number is unspecified, 443 is used.)
If nothing is input and the Enter key is pressed, the connection will be made to the port number 8888 of localhost (this computer).
Hostname of IP Address of Destination:

这里需要选择地址和端口。由于这台VPS我搭了一个网站,用了SSL占用了443端口,所以默认的443端口是用不了了,所以一定要改。我改用了5555端口,所以在这里输入localhost:5555,然后出现:

If connecting to the server by Virtual Hub Admin Mode, please input the Virtual Hub name.
If connecting by server admin mode, please press Enter without inputting anything.
Specify Virtual Hub Name:

这里就是指定一个虚拟HUB名字,用默认的直接回车就行。

Connection has been established with VPN Server “localhost” (port 5555).

You have administrator privileges for the entire VPN Server.

VPN Server>

这时我们需要输入ServerPasswordSet命令设置远程管理密码,确认密码后就可以通过Windows版的SoftEther VPN Server Manager远程管理了。

VPN管理

首先下载并安装SoftEther VPN Server Manager(居然最近移植了Mac版),其实只用到了管理工具:

Setup Wizard

安装之后运行它:

Server Manager

在这里点新建

New Connection Setting

Host Name填服务器的地址或域名,端口如果之前改过了在这也记得改过来,右下角的密码填之前设置过的密码。新建完成后Connect就会弹出Easy Setup窗口(如果提示连不上请检查一下服务器的防火墙设置):

Easy Setup

这里在第一个远程连接挑钩然后下一步即可,虚拟HUB名像之前一样默认就好。

然后会弹出一个动态DNS功能的窗口,由于不能确定它给的域名是不是被墙了,我们就不去用它,把这个窗口关了就行了。

之后会有一个协议设置的窗口:

IPsec/L2TP/EtherIP/L2TPv3 Server Settings

这里把启用L2TP挑上钩,下面设置一个IPsec预共享密钥就行了。

之后又会弹出一个VPN Azure Cloud服务的窗口,感觉没什么用,禁用了就行了。即使有用以后也可以再启用。

接下来要新建用户:

Create New User

其中用户名是必填的,验证类型选密码验证就行,然后在右侧设置用户密码。

Server Manager

之后回到管理界面,点管理虚拟HUB

Virtual Hub

这里也可以继续添加新用户。点虚拟NAT和虚拟DHCP服务器,弹出窗口:

Virtual NAT & Virtual DHCP

在里面启用SecureNAT并点SecureNAT配置

SecureNAT Configration

注意DNS要改为8.8.8.88.8.4.4。这里就算配置完毕。然后顺便生成一下OpenVPN的配置文件,点OpenVPN / MS-SSTP Setting

Server Manager

然后点击新窗口中部的按钮生成配置文件:

OpenVPN / MS-SSTP Setting

打开导出的压缩包会看到里面有两个.ovpn文件,一般我们要用到*_openvpn_remote_access_l3.ovpn这个文件,因为我们是通过IPv4地址管理的VPN,所以这个配置文件里的remote一项会是IPv4地址,如果需要使用IPv6的VPN就将其替换为相应的IPv6地址即可。

本地连接

IPv4

这里只说电脑设备,移动的设备的话配置方法类似。

Windows

首先到网络和共享中心里新建一个网络连接:

Set Up a Connection or Network

选择连接到工作区

Connect to a Workplace

这里当然要选VPN咯。

Connect to a Workplace

然后在地址栏里填上服务器地址或域名。配置完成后打开更改适配器设置

Network Connections

打开VPN连接的属性:

Properties

安全选项卡里将VPN类型改为L2TP,然后点高级设置:

Advanced Properties

在里面选上使用预共享密钥并把之前设置的密钥填进去。

Sign in

之后在VPN连接里把用户名和密码填进去就可以连上了。

Mac OS X

在网络配置里新建网络连接:

Network Preferences

接口选VPN,VPN类型选L2TP over IPSec,创建即可。

Network Preferences

然后在地址栏填服务器地址或域名,下面的账户名称填之前新建的用户名,然后点下面的认证设置

Network Preferences

密码中填上面用户的密码,共享密钥填之前设置的预共享密钥,保存并连接即可。

IPv6

因为有使用教育网通过IPv6的需求,这里也说一下IPv6的连接方法。

移动设备

iOS的应用商店里有OpenVPN的客户端,但由于软件的特殊性,中国应用商店里已经下架了,所以通过什么渠道安装请自己想办法。

如果你的Android设备支持IPv6网络的话,Play Store里也有OpenVPN的客户端下载,也可以搜一个apk自己装。

OpenVPN

上述设备安装好客户端以后,将之前生成的.ovpn文件传到设备中,用OpenVPN打开即可,之后还会需要输入之前设置的用户名密码之类的,这里不再赘述。

macOS

因为没有找到Mac上的OpenVPN客户端,所以使用了一个叫做Tunnelblick的App,功能类似。

Tunnelblick

Tunnelblick官网下载后,同样将.ovpn文件用它打开就可以了,输入用户名密码后就连上了。

Windows

从理论上讲IPv6的VPN用Windows自带的VPN连接就可以(同IPv4),把地址变一下就可以了。如果遇到不能连接的情况也可以试一下OpenVPN的Windows版,去OpenVPN官网下载即可。

Read More +

SSL证书的申请与配置

超文本传输安全协议(HTTPS)是一种网络安全传输协议。在计算机网络上,HTTPS经由超文本传输协议进行通讯,但利用SSL/TLS来对数据包进行加密。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。

如今越来越多的个人网站使用HTTPS协议,所以感觉自己的网站不装这么一个逼就落伍了。看着自己的主页地址栏前面有一个绿色的https也感觉安全了许多虽然并没有什么卵用

申请证书

要使用HTTPS协议首先要有一个值得信任的证书颁发机构给你的网站颁发的证书。目前免费的SSL证书颁发机构有很多,本文以从沃通上申请证书为例。

填写信息

首先到沃通官网注册账号并登录。

然后会出现以下界面:

填写信息

单次申请支持1个证书5个域名2年期限,证书可选中英文,提交就好了。

验证域名

签发机构需要验证域名的所有者,可以通过域名邮箱验证,也可以将指定信息放到网站上让其扫描以验证:

验证域名

如果没有域名邮箱,将指定的html文件下载下来上传到服务器上网站的根目录下然后点下面的验证就可以了。

生成签名

到订单里选择签名生成方式,可以选择第一种方式系统自动生成,设置密码:

生成签名

这个密码是最后解压证书用的,所以要记好。

下载证书

之后会弹出证书的下载链接,如果没有可以稍等片刻去订单里Get Cert,或者等待邮箱收到链接,输入刚才设置的密码就可下载压缩包了:

下载证书

部署证书

通过之前设置的密码解压压缩包,里面有各种服务器的证书,解压自己所用的服务器对应的证书即可。本文以Nginx服务器为例。

上传证书

解压后里面有一个.crt文件和一个.key文件,将它们上传到服务器上:

scp 1_your_domain_bundle.crt remote_username@remote_host:/usr/share/nginx/
scp 2_your_domain.key remote_username@remote_host:/usr/share/nginx/

监听端口

一般HTTPS使用443端口,因此要编辑/etc/nginx/conf.d下的ssl.conf文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443;
server_name your_domain;

ssl on;
ssl_certificate /usr/share/nginx/1_your_domain_bundle.crt;
ssl_certificate_key /usr/share/nginx/2_your_domain.key;

ssl_session_timeout 5m;

ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;

location / {
root /usr/share/nginx/www;
index index.html index.htm;
}
}

解开注释并将证书文件路径写进去保存,然后运行nginx -s reload重新加载配置文件即可。

强制跳转

经过之前的配置必须在地址里写上https才会跳转到HTTPS域名,不然还是会跳转到HTTP的。

所以还要编辑/etc/nginx/conf.d下的default.conf文件:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80 default_server;
server_name your_domain;
return 301 https://$server_name$request_uri;

include /etc/nginx/default.d/*.conf;

location / {
root /usr/share/nginx/www;
index index.html index.htm;
}
}

server_name下面加一个301跳转就能强制跳转到https了。

保存后运行nginx -s reload重新加载配置文件就搞定了。

Read More +