月度归档:2017年08月

Mac 定义自己的系统

苹果Mac系列产品:
MacBook Air 轻薄本,主流11和13英寸
MacBook Pro 笔记本,主流13,15英寸
Mac mini 一个盒子(可看做是一个主机,普通主机或服务器)
iMac 一体机
Mac Pro 台式机

OS X扫盲
OS X是一个基于Unix Darwin内核构建的系统。

每个用户对应/Users目录下的一个以用户名称命名目录(一般是如此)。所有与用户相关的内容都在这个目录内。

Finder是一个资源管理器。
Dock是一个工具栏,是一个资源访问的快捷方式。

OS X中,磁盘映像文件后缀名是dmg,双击dmg文件可以直接打开,然后在Finder左边的设备总可以找到挂接好的磁盘映像。

OS X中,安装一个软件实际就是打开dmg文件并启用的应用拖入/Application,卸载就是从其中删除。

OS X 下的大部分软件具备状态保持的功能(记住上次打开的状态)

快捷键
Mac的键盘跟Windows键盘有一些不一样。有些键没有,比如Home和End键和PageUP和PageDown和Backspace,另外ALT键也叫Option键,Windows中的Wind键对应Command键。

具体的快捷键可以参考:https://support.apple.com/zh-cn/HT201236

最常用的复制粘贴等组合键,在Mac中用Command对应Control键:Control + C对应Command + C。

为了高效工作,以下键必须记一记:

Command + Tab		向前循环切换应用程序
Shift + Command + Tab	向后循环切换应用程序
Command + Delete	把选中的资源移到废纸篓
Shift + Command + Delete清空废纸篓(清空回收站,提示)
Command + ~		同一个应用多窗口切换(开了多窗口是有用)
Command + C/V		复制粘贴
Command + Option + V	移动(先复制,后粘贴,类似剪贴)
Command + N		新建应用程序窗口
Command + Q		退出应用程序(一个应用可以开多窗口,窗口的叉表示关闭窗口,而应用未关闭)
Command + +/-		放大缩小字体
Control + Space		输入法切换
Command + Space		调出Spotlight


FN + 左键 		HOME
FN + 右键     		END
FN + 上键 		PageUP
FN + 下键 		PageDown
FN + DELETE 		后删除(CTR + D)

比较遗憾的是,最小化所有窗口没有找到对应的快捷键(Option + Command + H再结合Command + M)。

鼠标与触摸板
系统偏好设置 – 鼠标

其中滚动方式:自然,默认是勾上的,这个和Window下的默认设置刚好相反,所以如果不习惯需要去掉勾选。

系统偏好设置 – 触控板

1 光标与点按
一般都勾上,单个手指轻按模拟鼠标左键点击,两个手指轻安模拟鼠标右击,三个手指轻击进行文本查询(比如翻译)
2 滚动与缩放
两个手指触摸移动模拟鼠标滚动,不勾上时,方向和Window一样。
3 更多手势
三个手指向上滑动(Mission Control),四个手指抓(LaunchPad),四个手指快速展开(显示桌面)

另外,如果需要使用触控板来实现拖动窗口,就复杂一些:
系统偏好设置 – 辅助功能 – 鼠标与触控板 – 触控板选项

启动三指拖动。

Dock
Dock就是一个停靠条。默认放在最下方。可以通过简单拖放的方式,把应用放到Dock中,以一目了然地知道启动了那些应用以及快速管理常用的应用。

注意:连按窗口标题栏以 这里默认是最小化,可以宣威缩放,这样就可以实现最大化。

AppStore
这个就是安装App的入口,里面有非常多的软件,一般建议注册个apple id,然后通过AppStore来进行安装应用,AppStore是无法包含所有应用。可以直接下载第三方应用镜像包来进行安装。一般是dmg镜像,双击自动进行挂载斌打开镜像包,然后把应用直接拖入Application文件夹就完成安装(当然也可以来一个安装步骤导向)。


工具:

1 搜索
Spotlight 是OS X 自带的搜索工具(Command + Space)。

2.Launcher(应用程序 – Launcher,有对应手势:抓动作)
Launcher(启动器)的主要作用之一就是快速定位并启动应用程序。

开发工具:
SecureCRT(收费)
Chrome + SwitchyOmega
FireFox
SourceTree
PhpStorm(收费)
Navicat(收费)
TeamView
VMware Fusion(收费)
VirtualBox
FileZilla

Microsoft Office (收费)
钉钉
QQ

Avast Security(家庭免费版)
ShadowsocksX-NG
PDF Reader

Mac 文件共享与远程虚拟机映射

在Mac中设置共享文件夹:

系统偏好设置 – 共享 – 文件共享:选择要共享的文件夹(不能自定义名字),选择用户和用户权限,然后点击“选项”:

如果使用SMB来共享,需要按照”Windows文件共享”说明来设置(大体就是设置一个跟系统不一样的密码,这个密码专门让Window来存储)。

在远程机器上,可以mount这个共享:

#CentOS 
yum install cifs-utils
#Ubuntu
sudo apt-get install cifs-utils

然后安装如下脚本格式进行Mount:

#mount共享文件夹
mount -t cifs //192.168.1.121/www /var/www -o username=administrator,password='xxx',uid=1000,gid=1000

如果远程机器是Windows,那么直接使用映射即可。

其它参考:http://blog.ifeeline.com/2512.html

Mac 开发环境搭建

进入Mac的默认Shell终端,安装Homebrew工具:

#https://brew.sh/index_zh-cn.html
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrew是一个Ruby工具,类似Ubuntu下的apt-get和CentOS下的YUM。后面安装的软件就依靠它来完成。

关于Homebrew,还需要知道的:
通过brew安装的软件,默认总是安装/usr/local/Cellar这个目录中,其它方式的组织是通过软链接的方式链接到对应的文件。
通过brew安装的软件,一般可以把/usr/local看做跟目录,比如工具对应的配置和可执行文件,分别位于或对应于/usr/local/etc/xxx,/usr/local/bin/xxx,/usr/local/sbin/xxx;其中的可执行文件均为符合链接。
搜索软件使用brew search xxx, 安装使用brew install xxx,卸载使用brew uninstall xxx。

另一个需要注意的是:Mac当前登录的用户,是普通用户,如果某个软件需要以root权限启动,那么就需要首先打入sudo来临时切换到以root身份运行某个命令。

一 安装PHP

#搜索,会出现几个分之,比如PHP56 PHP71
brew search php
#过滤,只要71分支,提供了非常多扩展包
brew search php71
#安装(选择需要的扩展包)
brew install homebrew/php/php71 homebrew/php/php71-apcu homebrew/php/php71-redis homebrew/php/php71-mongodb homebrew/php/php71-opcache omebrew/php/php71-swoole

大部分PHP的模块,都包含在了homebrew/php/php71中,是编译到内核的(非动态模块),上面的apcu,redis,mogondb,swoole是动态模块,模块安装位置:/usr/local/opt/,比如:/usr/local/opt/php71-apcu/apcu.so。配置文件自然是/usr/local/etc/php/7.1/php.ini,扩展的配置放在/usr/local/etc/php/7.1/conf.d/*.ini。

php -v
php -m

编译到内核的模块确实是大而全,然后还需要调整一下php.ini的配置(才能符合开发环境要求):

#设置时区
date.timezone = Asia/Shanghai
 
#CGI相关参数,实际上建议修改的是force_redirect,其它均保留默认值
cgi.force_redirect = 0   #默认为1,改为0
cgi.fix_pathinfo = 1     #默认是1,保留
fastcgi.impersonate = 1  #默认是1,保留
cgi.rfc2616_headers = 0  #默认是0,保留

#其它参数调整,根据实际情况调整
upload_max_filesize = 64M
max_execution_time = 1200
max_input_time = 600
max_input_nesting_level = 128
max_input_vars = 2048
memory_limit = 1024M
 
post_max_size = 64M

如果要启动PHPFPM,FPM主配置文件/usr/local/etc/php/7.1/php-fpm.conf,池配置在/usr/local/etc/php/7.1/php-fpm.d中,需要注意的是,池配置中,默认的运行用户是和用户组均为_www,所以需要检查文件的权限,保证对_www具有读和执行(默认是符合的),如果要写入,那么还需要保证对应的文件夹有被写入的权限。

启动PHPFPM,由于php-fpm这个命令放入到了/usr/local/sbin中,默认shell并不搜索这个路径,所以要想添加环境变量:

#设置环境变量
export PATH="/usr/local/sbin:$PATH"  
echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.bash_profile

#确认命令能找到
which php-fpm
which php71-fpm

#手动启动,PHPFPM可以不使用root身份启动(user和group指令无用),会使用当前用户运行
sudo php71-fpm start
sudo php71-fpm stop

对于开发环境,PHPFPM可以不用启动,直接使用PHP内置的HTTP服务器也可以。

二 安装Nginx

brew install --with-http2 nginx  

如果要绑定到80端口,那么Nginx就必须以root身份运行。默认的server配置位于(可改):/usr/local/etc/nginx/servers。可以往里面方式配置:

server {
    listen 80;
    #listen 443 ssl http2;
    server_name test.app;
    root "/Users/xx/www/test/public";
 
    index index.html index.htm index.php;
 
    charset utf-8;
 
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
 
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
 
    access_log off;
 
    sendfile off;
 
    location ~ \.php$ {
        client_max_body_size 64M;
        fastcgi_intercept_errors off;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 32k;
        fastcgi_buffers 64 32k;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
 
    location ~ /\.ht {
        deny all;
    }
 
    #ssl_certificate     /etc/nginx/ssl/test.app.crt;
    #ssl_certificate_key /etc/nginx/ssl/test.app.key;
}

Nginx的主配置文件设置的启动user一般应该和PHPFPM相同,或者需要保证Nginx对文件具备读和执行的权限。如果是文件上传,还需要确保Nginx对临时中间文件夹具备写入权限。

启动关闭等:

sudo nginx -t
sudo nginx -s start
sudo nginx -s stop

三 安装MySQL

#安装最新版本(5.7.xx)
brew install mysql

#确定搜索路径:
which mysqld
mysqld —verbose —help | grep -A 1 ‘Default options’

/etc/my.cnf  /etc/mysql/my.cnf  /usr/local/etc/my.cnf  ~/.my.cnf

#
mysql.server start
mysql_secure_installation

# 停止
mysql.server stop

MySQL不需要以root身份启动。

关于启动问题:
在Mac下,如果要开机启动,可以参考如下配置(一般不需要):

#Nginx
cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist  

# PHP-FPM
cp /usr/local/opt/php70/homebrew.mxcl.php71.plist ~/Library/LaunchAgents/  
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php71.plist  

# MySQL
cp /usr/local/opt/mysql/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/  
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

## 卸载
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist  
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.php71.plist  
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist  
rm ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist  
rm ~/Library/LaunchAgents/homebrew.mxcl.php71.plist  
rm ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

更加实际的方法:进入操作系统后,启动Nginx和PHPFPM(因为要sudo,需要输入密码),MySQL则在需要时启动,比如本地一般链接远程数据库。所以可以这个别名:(往.bash_profile中写入)

alias servers.start='sudo nginx && php-fpm --fpm-config /usr/local/etc/php/7.1/php-fpm.conf -D'
alias servers.stop='sudo bash -c "killall -9 php-fpm && nginx -s stop"'                       
alias nginx.logs='tail -f /usr/local/opt/nginx/access.log'
alias nginx.errors='tail -f /usr/local/opt/nginx/error.log'

遇到问题:
1 Nginx启动提示

nginx: [emerg] getgrnam("

提示大体就是找不到用户组的意思。在Nginx配置中,user如果只指定了用户名,默认会去寻找同名的用户组,在Mac中,用户不一定对应一个同名的用户组,所以出现这种情况就是需要明确指定存在的用户组,可以通过如下方式来确定用户和用户组:

#当前登录的用户名
whoami
www

#确认用户组(可见www的uid是502,对应的组id是20,名称是staff)
id
uid=502(www) gid=20(staff) groups=20(staff),12(everyone)

把www和staff对应填入,错误提示消失。

Hack PHP: 黑你没商量

PHP7和它之前的版本比较,有了巨大的性能提升。对于一门具有20多年历史的语言,还能有如此大的性能提升,确实不容易。不过这也间接说明PHP7之前的版本有点烂吧。PHP7之后的PHP7.1和PHP7.2,都没有加入JIT,说好的JIT在PHP7中被跳票了。PHP的历史包袱是很重的,需要多方面兼顾。说PHP7接近HHVM运行PHP的性能,这其实是需要打问号的。从原理上来说,一个没有JIT的运行引擎会比一个具备JIT的运行引擎更快应该不可能,否则PHP还搞什么JIT。

PHP是弱类型的,这个对JIT来说不太友好。在运行时,需要类型推断,而且需要推断正确才能发挥JIT的作用。对于强类型语言,JIT就好做的多,于是出现了Hack(Hack PHP一把的意思),它引入了类型系统,用Hack写的PHP,HHVM的JIT可以充分发挥,从这个角度来说,HHVM是向JVM看齐的(它的多线程架构也和JAVA类似)。

所以,当前的PHP7和HHVM下的PHP相比,差的何止一点点。PHP7.0引入了类型系统(默认关闭),PHP7.1引入了类型推断优化opcode,PHP7.2还是看不到JIT的影子。这个大概就是PHP自身坚持弱类型,但是又要打造一个实用的JIT之间的矛盾。如果没有HHVM的出现,估计PHP压根没有打造自己的JIT的打算,这事本身就极具悲剧色彩,说HHVM拯救了PHP不为过。

从纯计算的角度,C/C++比Java快,Java比Node.js快,Node.js比PHP快。Java比PHP快一个数量级,不奇怪。Node.js携带的V8引擎自带JIT,可能已经到达极限,瓶颈在弱类型。目前Node.js在吞噬PHP的市场,它的生态虽然很火爆,但是工程化比PHP还是差很多。Java虽然运行很快,但是由于其臃肿的体积,在Web领域,无法撼动PHP的市场。多语言并存,相互协作已是常态。

PHP引入JIT还是非常值得期待的,从现有思路来看,官方希望在opcode上进行透明操作,或者提供一个开关也是一个不错的做法。比如对应新的项目,开启类型系统,开启JIT。