mac下快速输入长命令行的两种方法

本文介绍两种在mac下快捷输入长命令行的方法
以启动redis服务的命令/usr/local/bin/redis-server /etc/redis.conf为例

方法一: alias

1
2
3
4
5
6
cd ~ //进入用户目录
vim .zshrc //如果安装了zsh的话,打开这个配置,否则使用 vim .bash_profile
//编辑配置文件
alias redis.start="/usr/local/bin/redis-server /etc/redis.conf"//注意,等号左右不能有空格
//完成编辑
source .zshrc //保存配置,同理,未安装zsh的使用 source .bash_profile

这样,别名就设置好了
直接在终端使用redis.start就可以启动你的redis服务了
甚至,你还可以将多个alias结合起来使用(见文末)

方法二:atext

注:也可以使用其他类似的软件,如TextExpander

1.下载并安装atext

2.atext设置
先在偏好设置里设置触发片段的热键,如ctrl+\
然后打开atext,新建一个片段组New Group,并如下图所示设置组的属性
atext设置
这样设置之后,我们输入片段+热键就能触发命令,展开片段对应的内容

3.编辑常用命令
如图所示,在组下面新建常用的片段
atext使用示意图
4.使用
这时候,在终端输入设置好的片段名称,如redis.start,再按设置好的热键,如 ctrl+\ ,就会自动展开成/usr/local/bin/redis-server /etc/redis.conf
,按return即可使用该命令了

两种方法的比较

第一种alias的方法比较快捷,不用再输入热键,可以可以将多个alias组合起来使用,如:

1
2
3
alias fpm.start="sudo php55-fpm start"
alias fpm.stop="sudo php55-fpm stop"
alias fpm.restart='fpm.stop && fpm.start'

局限性:只能在自己的终端上使用,不能在别的地方用,只能给命令行设置别名

第二种atext的使用范围很广,不但可以在自己的终端上使用,还可以在远程服务的终端上使用,还可以记录常用的代码片段,在coding的时候使用(话说最后才是atext最常用的功能吧:)- 来自本人的吐槽

在oh my zsh的基础上添加终端的欢迎界面

先上效果图,就是这只萌萌哒的小牛以及牛说的每日格言啦,怎么做出这种效果呢,往下看。

准备工作

假设你已经完成了下面的准备工作

*安装了items2+zsh+oh my zsh(安装过程在这里不赘述了,网上一堆教程,推荐迟建强老师的教程:终极 Shell)

*安装了homebrew

开始安装zsh的欢迎界面

第一步,先用homebrew安装两个依赖的包

1
2
brew install fortune
brew install cowsay

第二步,安装oh my zshchucknorris插件
打开终端配置文件

vim ~/.zshrc

修改plugins = ( )这一行
括号里表示你安装过的插件,以空格区分,只要加上chucknorris就可以了,下面是我安装的所有的oh my zsh的插件,以供参考

1
plugins=(brew git z extract history catimg wd last-working-dir chucknorris )

再在.zshrc文件的最后一行添一句命令:

chuck_cow
即可

保存并退出,重新加载配置文件

source ~/.zshrc

重启终端,牛牛就出来啦,enjoy it!

mac环境下通过homebrew安装的php报错解决:PHP Startup: Unable to load dynamic library

背景

注:可以直接查看最下面的解决方案

事情的起因是这样的:
通过下面的命令安装imagic扩展(不要问我为什么装这玩意儿,抽风了可能)

brew install php55-imagick

运行 php --version发现报错信息
安装imagick报错

注:此处解决方案参考了这里
https://github.com/Homebrew/homebrew-php/issues/1556

报错原因是因为安装的imagick扩展与php版本不匹配,通过下面的命令重新安装

1
brew reinstall php55-imagick --build-from-source

运行 php --version发现新的报错信息
imagick报错信息

这个原因一直没找到

然后我一想:我管它什么原因,这玩意儿我压根就不需要吧,卸载了就是了
执行

1
brew uninstall php55-imagick

果然,又报错了:

stackoverflow上搜索了半天,几乎所有提供的解决方案都是重装imagick
but,前面装过了还是会报错啊

先是在php.ini文件中看看在哪里启用了imagick这个扩展,并没有发现

附:php.ini的路径是:
/usr/local/etc/php/5.5(如果你跟我一样是通过homebrew安装的php的话)

最终解决方案

注:最后的解决方法参考这里
http://stackoverflow.com/questions/5282264/php-warning-php-startup-unable-to-load-dynamic-library

先执行下面的命令,获取所有跟php配置相关的文件的路径,终于找到了通过homebrew安装的扩展的位置

1
php -i | grep ini

接下来就简单了,打开ext-imagick.ini文件

1
2
cd /usr/local/etc/php/5.5/conf.d/
vim ext-imagick.ini

注销掉extentions=""这行就可以了

这下,世界终于安静了,每次启动php的时候静悄悄的,再也没有烦人的warning提示了

在php中使用json

关于json

  1. 为什么要使用json
    json字符串容易存储,尤其是要将一个数组存入数据库或缓存或记录日志的时候

  2. json_encode

1
$str = json_encode($arr);
  1. json_decode
    Dash中的函数格式如下
1
mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

注意第二个参数,当json_decode()的第二个参数不填的时候,json解析的到的结果是个object对象,只有当第二个参数是true的时候,json解析的结果才是list数组

1
2
$object = json_decode($str);
$array = json_decode($str,true);

如果是做API接口开发,经常和客户端联调的筒子们肯定就知道,object类型和list类型对于安卓来说相差甚远,直接关系到接口是否能够解析

关于json工具

  1. 在线json解析
    (1)Json Parser Online:http://json.parser.online.fr/
    优势:界面简洁美观,json解析框够大,适用于解析很长的json字符串

    (2) Be Json


    优势:json解析出错时会给出错误提示

  2. Chrome的json解析扩展 - JSONVIEW
    安装完成后调用接口直接在页面上显示json解析后的内容

下载链接:
https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc

效果图:

magento日志

一 关于错误日志

使用magento的过程中经常出现图示的错误页面
magento错误页面
红框中的部分是错误日志的编号,以下是查看对应的错误日志的方法:

  1. 项目根目录/var/report/错误日志编号文件中即可查看对应的错误信息
  2. 在页面上直接显示错误信息的方法:将项目根目录/errors/local.xml.sample修改为local.xml即可(最好保留原文件)
    附:通过终端命令行复制文件
    1
    2
    cd 你的项目根目录路径/errors
    cp local.xml.sample local.xml

在magento中配置使用redis缓存

php常用的缓存工具:memcached和redis,本文讲的是在magento框架中借助magento的模块来使用redis

准备工作

确保你的电脑安装并启动了redis服务、配置了php的redis扩展

magento配置reids

  1. 确保magento框架中安装并启用了Cm_Cache_Backend_Redis模块

  2. 修改以下路径中的local配置文件
    项目根目录/app/etc/local.xml
    config/global下添加子节点cache如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<cache>
<backend>Cm_Cache_Backend_Redis</backend>
<backend_options>
<server>127.0.0.1</server> <!-- or absolute path to unix socket -->
<port>6379</port>
<persistent></persistent> <!-- Specify unique string to enable persistent connections. E.g.: sess-db0; bugs with phpredis and php-fpm are known: https://github.com/nicolasff/phpredis/issues/70 -->
<database>0</database> <!-- Redis database number; protection against accidental data loss is improved by not sharing databases -->
<password></password> <!-- Specify if your Redis server requires authentication -->
<force_standalone>0</force_standalone> <!-- 0 for phpredis, 1 for standalone PHP -->
<connect_retries>1</connect_retries> <!-- Reduces errors due to random connection failures; a value of 1 will not retry after the first failure -->
<read_timeout>10</read_timeout> <!-- Set read timeout duration; phpredis does not currently support setting read timeouts -->
<automatic_cleaning_factor>0</automatic_cleaning_factor> <!-- Disabled by default -->
<compress_data>1</compress_data> <!-- 0-9 for compression level, recommended: 0 or 1 -->
<compress_tags>1</compress_tags> <!-- 0-9 for compression level, recommended: 0 or 1 -->
<compress_threshold>20480</compress_threshold> <!-- Strings below this size will not be compressed -->
<compression_lib>gzip</compression_lib> <!-- Supports gzip, lzf, lz4 (as l4z) and snappy -->
<use_lua>0</use_lua> <!-- Set to 1 if Lua scripts should be used for some operations -->
</backend_options>
</cache>
  1. 清空magento缓存使得配置文件生效,关于如何清空magento缓存,参考《magento二次开发 - 如何清除magento缓存》

可能遇到的问题

  • 6-22:今天上午打开本地网站时报如下错误connection to Redis failed

错误页面

发现是因为redis服务没有开启导致的,开启redis即可

说明magento在配置了redis之后那么要保持reids服务一直处于开启状态

参考:
[1]在magento中配置redis文档:

http://devdocs.magento.com/guides/m1x/ce18-ee113/using_redis.html

[2]Cm_Cache_Backend_Redis配置

https://github.com/colinmollenhour/Cm_Cache_Backend_Redis/blob/master/README.md

  • 7-26:在redis-cli中执行keys *命令没有看到任何缓存信息

查看local.xml的配置:

1
<session_save>db</session_save>

session存储的方式设置为db而不是file的时候,需要指定数据库的编号0-15,默认的数据库是1

可以用如下的命令打开redis客户端

1
redis-cli -n 1

也可以在客户端中选择数据库

1
2
redis-cli
select 1

mac下安装redis

一 准备工作

安装了homebrew
安装了php、nginx(或apache)或集成环境

二 安装redis服务器

  1. 通过homebrew安装

    1
    brew install redis
  2. 直接下载安装
    本人是用这种方法安装的,安装完后才发现可以用homebrew安装

1
2
3
4
5
6
7
8
curl -O http://redis.googlecode.com/files/redis-2.8.7.tar.gz
sudo tar -zxf redis-2.8.7.tar.gz
mv redis-2.8.7 /usr/local/redis
cd redis
sudo make
sudo make test
sudo make install
mv redis.conf /etc/reds.conf

安装成功

三 redis服务器的启动、使用和退出

1 启动redis服务
执行以下命令

1
/usr/local/bin/redis-server /etc/redis.conf

出现下面的界面说明redis服务器安装成功

进入/usr/local/bin目录可以看到以下文件

dump.rdb 用于将缓存以文件的形式存储在硬盘中,需要设置权限,见文末
redis-cli 用于启动redis客户端

2 查看redis服务是否启动

1
ps aux | grep redis

3 使用redis服务

注:启动redis服务器后终端所在的窗口就不能输入别的命令了(如下图所示),需要在终端打开新的窗口才能使用客户端功能

通过redis-cli命令可以启动redis客户端

1
redis-cli

常用命令

keys * 查看所有键值
set (key) (value) 设置键key的值为value
append (key) (value2) 在键key的值后面加上value2
get (key) 查看键key的值

redis客户端使用举例:

6.23补充:如何设置和查看缓存时间

set a 123;//设置缓存:a=>123
EXPIRE a 3600;//设置缓存时间(秒)
TTL a;//查看缓存剩余时间

6.24补充:如何清空所有缓存

flushall //执行该命令后会清空redis服务器的所有缓存,一般用于应急处理,不应该作为常用命令

4 退出redis服务
(1)客户端退出
执行

1
redis-cli shutdown

(2)关闭pid
先运行

1
ps -u jim(替换成你的用户名) -o pid,rss,command | grep redis-server

查看所有redis服务的pid号

16.6.24日补充:还可以通过mac自带的活动监视器查看pid
如下图所示
通过Spotlight或alfred搜索activity monitor打开活动监视器
在活动监视器中搜索redis-server,即可得到pid号

补充:如果你的电脑安装了oh my zsh
那么只需要在终端输入

1
kill redis

按tab,会自动替换成对应的pid(喜大普奔啊,各位)

再运行

1
kill -9 27355

关闭redis服务对应的pid号,即可关闭redis服务

四 配置php使用redis服务

  1. 安装php的redis扩展
    1
    brew install php55-redis --build-from-source

php55是本机安装的php的版本(5.5),--build-from-source是让安装的扩展与php的版本保持一致

查看phpinfo(),出现redis选项说明redis配置成功

  1. 在php代码中使用redis服务
1
2
3
4
5
6
$redis = new Redis();
$redis->connect('127.0.0.1','host');//redis服务器ip及端口号
$redis->set($key,$value,$timeout);//设置缓存:键-值-缓存时间
$redis->get($key);//查找缓存
$redis->del($key);//删除缓存
$redis->delete($key);//删除缓存

##五 常见问题
(1)Redis: Failed opening .rdb for saving: Permission denied
redis服务器会生成dump.rdb文件存储缓存,如果文件权限不够则无法读写该文件

1
cd /usr/loal/bin

/usr/local/bin/(默认文件目录)下执行命令

1
chmod 777 dump.rdb

homebrew、homebrew-cask及cakebrew

一 用homebrew安装常用包

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

在终端运行brew命令可得到常用命令

Example usage:
查询包是否存在:brew search [TEXT|/REGEX/]
查询包信息及可用安装命令:brew (info|home|options) [FORMULA…]
安装包:brew install FORMULA…
更新homebrew:brew update
更新包:brew upgrade [FORMULA…]
卸载包:brew uninstall FORMULA…
查看已安装包:brew list [FORMULA…]

Troubleshooting:
brew config
检查homebrew状况:brew doctor
brew install -vd FORMULA

Brewing:
brew create [URL [–no-fetch]]
brew edit [FORMULA…]
https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Formula-Cookbook.md

Further help:
man brew
brew help [COMMAND]
brew home

如:

brew search brew-cask
brew install nginx
brew search php
brew uninstall mysql

二 用homebrew-cask安装常用软件

比在网上下载安装文件安装的优势在于:
(1)节省下载安装包的过程,一行命令即可安装
(2)一些在网上搜不到安装文件的软件也可以通过这种方法安装

1
2
brew tap phinze/homebrew-cask
brew install brew-cask

使用方法:将上面的brew换成brew-cask即可,如

brew-cask install qq

三 用cakebrew可视化你的homebrew

如果你不熟悉终端命令,可以下载cakebrew,它是homebrew的客户端,可以实现常用的搜索、安装、卸载操作
官网下载安装

https://www.cakebrew.com

或执行以下命令

1
brew cask install cakebrew

效果图:

通过Fiddler工具进行接口代理-改变线上网页的显示结果

Fiddler是抓取请求的工具的一种,类似的还有Charles等,使用Fidder之前应先关闭其他的代理工具

需求如下:

网站前端和服务端配合开发了一个页面,会调取接口A的数据并在页面上呈现,现在由于业务要求需要开发新的接口B,在原有的前端逻辑下正常展示。那么,在开发的过程中,在没有前端配合的情况下,服务端如何让这个页面调取B的接口并呈现呢?

解决方案是这样:

以去哪儿的某款产品为例:http://szgq1.package.qunar.com/user/id=187688454&abt=a#tf=tejiaqunar

用chrome打开该链接,打开开发者工具,依次选择Network -XHR可以看到页面调用的服务端的接口列表