用grep剔除掉配置文件空白行和注释
1 | grep -ve "^[[:space:]]*[#;]\|^$\|^[[:space:]]*$" /etc/samba/smb.conf |
1 | grep -ve "^[[:space:]]*[#;]\|^$\|^[[:space:]]*$" /etc/samba/smb.conf |
1 | Server = http://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo |
1 | # 配置文件是 /etc/ssh/sshd_config |
1 | pacman -Syy |
1 | pacman -S vim base-devel wpa_supplicant net-tools iw dialog wget git |
首先安装软件包组 base-devel , 以及 fakeroot 和 sudo 软件包,这样就不会在编译时缺少 gcc 或者 make 的问题。
安装 package-query:
1 | $ wget http://mir.archlinux.fr/~tuxce/releases/package-query/package-query-1.7.tar.gz |
安装 yaourtAUR:
1 | $ wget http://mir.archlinux.fr/~tuxce/releases/yaourt/yaourt-1.7.tar.gz |
今天弄到一个360的随身wifi,就想给树莓派安装上,这样就不用再用有线连接了。
由于我的 Archlinux 没有安装桌面环境,所以只能在命令行下配置。Arch在最近的版本中,
开始使用 systemd-networkd 进行网络管理了,具体可以看 Arch Wiki。
分别执行 lsusb 和 lsmod 后,发现需要自己安装mod。
但是pacman包管理中的是 MT7601 的驱动,而 360wifi 的是 MT7601U,尝试安装了 MT7601,
使用 dmesg | grep mt7601 发现有err。于是看了下 Aur,发现 Aur 下有 MT7601U 的驱动,
于是又安装了下 yaourt 。使用 yaourt -S mt7601u-dkms ,安装后即可。
1 | pacman -S wpa_supplicant |
1 | [root@alarmpi ~]# cat /etc/wpa_supplicant/wpa_supplicant-wlan0.conf |
其中 your ssid 就是热点名称了,your password 就是热点的密码了。
1 | [root@alarmpi ~]# cat /etc/systemd/network/wlan0.network |
其中 wlan0 是我的设备名称,请替换成你自己的。
1 | systemctl enable wpa_supplicant@wlan0.service |
如果你使用的是 RTL8188CUS 这个芯片的 wifi,那么可能会遇到下面的错误,
1 | nl80211: Driver does not support authentication/association or connect commands |
请先尝试下面的命令
1 | # wpa_supplicant -B -i wlan0 -D wext -c /etc/wpa_supplicant/wpa_supplicant-wlan0.conf |
如果 wlan0 成功获取到 ip 地址,则证明需要使用wext模式,那么 systemd 的配置如下:
1 | # vim /etc/systemd/system/wpa_supplicant@.service.d/wext.conf |
* -L [bind_address:]port:host:hostport
* -L [bind_address:]port:remote_socket
* -L local_socket:host:hostport
* -L local_socket:remote_socket
* -R [bind_address:]port:host:hostport
* -R [bind_address:]port:local_socket
* -R remote_socket:host:hostport
* -R remote_socket:local_socket
* -C 压缩
* -g global forward 全局转发,否则只能绑定到127.0.0.1
* -R 远程转发
* -L 本地转发
* -f 后台认证用户/密码,通常和-N连用,不用登录到远程主机
* -N 不执行脚本或命令,通常与-f连用。
如果用的是 openssh ,先设置 远端服务器 的 GatewayPorts 为 yes,否则 远程映射 时,
在远端无法绑定到 0.0.0.0 。
通过参数可以看到,除了端口外,还支持socket文件映射,所以有四种方式。
理解起来,就是把远程的端口映射到本地,我们的访问是从本地的端口开始的,最终目的地是远程端口。
解决的问题是,远程主机的防火墙只开放了 22 端口,而我们要访问远程主机的其他端口,比如 5900。
参考命令:
1 | # 192.168.1.1 是远程主机的内网IP |
通过参数可以看到,除了端口外,还支持socket文件映射,所以也有四种方式。
理解起来,就是把本地的端口映射到远端,我们的访问是从远端的端口开始的,最终目的地是本地端口。
解决的问题是,本地主机没有公网IP,而我们需要从公网访问到本地的某个服务。
需要在远程主机端的 sshd_config 中启用 GatewayPorts。
参考命令:
1 | # 192.168.1.1 是本地主机的内网IP |
如果你的远程服务器的 ssh 端口不是默认的 22,比如是 2233,
那么直接加上 -p 2233 参数即可。
在centos下编译安装shadowsocks-libev,需要先安装必要的依赖,命令如下:
1 | yum install -y gcc automake autoconf libtool make build-essential autoconf libtool gcc curl curl-devel zlib-devel openssl-devel perl perl-devel cpio expat-devel gettext-devel git asciidoc xmlto |
然后克隆下源代码,
1 | git clone https://github.com/madeye/shadowsocks-libev.git |
从源码编译安装
1 | cd shadowsocks-libev |
这样即可编译好一个新的ss,所有程序是以ss-开头,其他系统下面的编译安装,请参考
https://github.com/madeye/shadowsocks-libev。
在使用 dompdf 的时候,需要关闭 xdebug,否则会报下面的错误:
1 | DOMElement::setAttribute(): Not yet implemented |
使用 brew 安装完 nginx 后,想用 launchctl 来实现 nginx 的开机自启动。
但是由于 80 端口属于 1–1024 间的端口,需要 root 权限,于是执行下面两条命令,
即可让普通用户也可以建立80端口。该方法其实就是给 nginx 加上 s 操作权限。
让普通用户可以以 root 权限执行。
1 | sudo chown root:wheel /usr/local/Cellar/nginx/1.2.6/sbin/nginx |
在使用ubuntu的apt-get安装php-fpm的时候,默认的nginx配置文件的php相关部分少了如下一行代码
1 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; |
把这行代码加在 include fastcgi_params; 之前即可。
最近项目需要做一个欢迎页,效果差不多就是有点PPT的样子,然后用鼠标滚轮可以控制页面切换。
在实施过程中,遇到的问题就是jquery的 mousewheel 事件触发的机制让人太纠结了。
由于我们一般滚动了 x° 的圆心角才认为是滚动了一次,而计算机在滚动 x° 的过程中,只要有度数的变化,
就会触发一次事件。这个在回调事件的第二个参数即可看出来,第二个参数叫做 delta,即变化量。
也就是说这个变量其实是存储的从开始滚动到当前滚动位置,滚动过的一个类似圆心角的值。
那么我们就需要在这个回调函数里面去做文章,让我们意识中的滚动一次能实现出来。
具体的方法是,加入一个全局变量,来记录每一次的滚动开始,并且每次开始后的一秒内,
不再执行回调函数,直到1秒钟的时候重置这个全局变量。之所以设置一秒是因为我们平时的习惯,
差不多就是1秒钟滚动一次滚轮。代码差不多就是下面的这个样子:
window.is_wheel = false;
$('body').bind('mousewheel', function(event, delta) {
if(window.is_wheel==true)return;
window.is_wheel = true;
setTimeout(function(){
window.is_wheel = false;
}, 1000);
if(delta > 0){
next_page();
} else {
prev_page();
}
return false;
});
这样,频繁触发的问题就解决了。另外需要注意的是,如果翻页是个动画效果,那么请把翻页动画效果的时间设置在一秒内,
因为可以保证每次滚动滚轮只执行了一次翻页操作,即翻页动画的回调函数也会按照预期顺序执行。