[记录] Brew install 命令补全总是有两个的解决办法

问题如下, 输入到 ins, 一按 tab 键... 真是够了!!

fengqi@fengqi-MacBookPro ~$ brew ins
instal   install  

instalinstall 的别名, 就是说允许少输入一个 l 也能用,
但是我想 输入 ins 然后按 tab 补全到 brew install xxx

治疗办法是:
打开 vi /usr/local/Library/Homebrew/global.rb, 找到如下部分

'ln' => 'link',
'instal' => 'install', # gem does the same
'rm' => 'uninstall',

删除 'instal' => 'install', 保存退出.

[原创] Yaf 使用 Eloquent ORM 做数据层

Yaf 默认是不提供数据层处理功能的, 需要自行扩展.

Eloquent ORMLaravel 的内置 ORM 功能非常强大, 而且已经独立成组建, 任何项目都可以选择使用它.

目前最新版是5.0.28, 主要版本是跟随 Laravel 更新的, 下一个版本是 5.1 LTS 版, 非常棒.

在进行集成前, 需要开启 Yaf 的 namespace, 确保 php.ini 有如下配置:

yaf.use_namespace=1

为了方便管理, 建议使用 Composer 管理扩展, 以下示例均使用 Composer.

安装 Eloquent ORM, 在项目根目录创建 composer.json, 内容如下:

{
    "require": {
        "illuminate/database": "5.0.*",
        "illuminate/events": "5.0.*",
        "symfony/debug": "2.6.*",
        "symfony/var-dumper": "2.6.*"
    }
}

然后运行 composer update 下载代码, 并在 index.php 引入 vendor 目录下的 autoload.php 速度不理想可尝试我共享的镜像 http://composer.fengqi.me.

<?php

// 程序启动时间
define('APP_START_TIME', microtime(true));

// 程序跟目录
define('ROOT_PATH', realpath(__DIR__.'/../'));

// 加载 Composer
require ROOT_PATH.'/vendor/autoload.php';

// 启动程序
$app  = new Yaf\Application(ROOT_PATH."/config/application.ini");
$app->bootstrap()->run();

配置数据库信息, application.ini 增加以下内容:

; database
database.driver     = mysql
database.host       = 127.0.0.1
database.database   = yaf
database.username   = root
database.password   = 123456
database.port       = 3306
database.charset    = utf8
database.collation  = utf8_unicode_ci
database.prefix     = ""

这里使用 MySQL 作为示例, Eloquent 支持 MySQL, Postgres, SQL Server, SQLite.

- 阅读剩余部分 -

[总结]使用 Xinetd 代理 Gmail 的 SMTP 和 IMAP

参考了解: xinted端口转发

Gmail 的 SMTP 和 IMAP 本来一直都是正常的,自从上次无故屏蔽后,虽然后来解封了,但是也变得断断续续了,不稳定。

这里简单分享下用 Linux 下的 Xinetd 代理 SMTP 和 IMAP 收发邮件的方法,原理是使用 Xinetd 进行端口转发,前提你你有一台能正常访问 Gmail 的服务器。

此法针对客户端,Web 端请自己想办法。

安装

以 Ubuntu 14.04.2 为例:

sudo apt-get install -y xinetd

创建配置文件 /etc/xinetd.d/gmail,内容如下:

- 阅读剩余部分 -

[分享]做了一个简单的 Google Fonts 代理

链接地址: http://fonts.fengqi.me

原理很简单, 就是用 PHP 请求原本 fonts.googleapi.com 域名下的资源, 然后把 CSS 里面的链接也转换成我的域名, 链接是字体.

同时对字体文件做反向代理, 这个通过 Nginx 的 Proxy 实现.

需要注明的一个地方是, Google Fonts 针对不同的浏览器会输出不同的 CSS 和字体, 所以需要把用户的 USER_AGENT 也传递给 Google Fonts.

代码放到 GithubGist 上了.

- 阅读剩余部分 -

[原创] 利用 IFTTT 和 FEED43 自动把把订阅丢到 Evernote,以知乎收藏夹为例。

平时玩手机除听歌看电子书外,更多的是刷知乎,碰到感兴趣的有意思的答案和问题会分享出去,后来觉得扰民就不再分享了,而是选择收藏起来。

在知乎客户端可以收藏到收藏夹,也可以直接导入到 Pocket、有道笔记、Evernote,我偏好 Evernote,主要的原因是他做的比较早,支持的 App 更多。

但是电脑上是不可以的,这里可以借助 IFTTT 和 在线 FEED 来自动收集,其实用浏览器剪藏插件也是可以的不过我想简化下操作:手机电脑都直接收藏就好。

另外就是适用面太窄,比如别人的公开收藏夹,比如你喜欢的一些博客更新了,不用挨个过去看是否更新,等邮件提醒就知道了,所以建议用好邮箱。

- 阅读剩余部分 -

[总结]利用 Privoxy 让命令行下的 wget 和 curl 等命令实现自动代理

curl 和 wget 都可以通过附带参数来使用代理

curl -x http://127.0.0.1:8087 github.com
wget -e "http_proxy=127.0.0.1:8087" github.com

临时用用还好,但是经常使用也就麻烦了,可以通过配置文件简化

shell> cat ~/.wgetrc
https_proxy = http://127.0.0.1:8087
http_proxy = http://127.0.0.1:8087
ftp_proxy = http://127.0.0.1:8087

use_proxy = on
continue = on
check_certificate = off

shell> cat ~/.curlrc
-L
proxy = 127.0.0.1:8087

参数解释:

- 阅读剩余部分 -

[转载] awk与cut在以空格为分割域时的区别

原文地址:awk与cut在以空格为分割域时的区别

awk默认以空格为分割域,比如我想获得某进程pid:

[root@SHCTC-GAME12-44 ~]# ps -ef|grep "sshd -f"|grep -v grep
root      5088     1  0 14:28 ?        00:00:00 /usr/sbin/sshd -f /app/oslinkd/oslinkd_config

用awk如下写:

ps -ef|grep "sshd -f"|grep -v grep|awk '{print $2}'

这样即可获得pid : 5088

但是用cut,若以空格为分隔域,则并不是第二个域,而是第七个域,因为root与5088之间有6个空格:

ps -ef|grep "sshd -f"|grep -v grep|cut -d' ' -f7

结论:
awk 以空格为分割域时,是以单个或多个连续的空格为分隔符的;
cut则是以单个空格作为分隔符。

[总结] Laravel 如何在预加载试控制返回的字段

参考链接:Get specific columns using “with()” function in Laravel Eloquent

Laravel 的预加载使用方式是:

Post::with('user', 'user.extend')->orderBy('id', 'DESC')->paginate(10, array('id', 'content'));

拿到用户和扩展信息太方便了,但是问题是返回的数据太多了,站在一个强迫症的角度简直无法容忍啊。

控制返回的字段有两种方法,一个是在 model 里定义关系时指定好字段,但是不太灵活,还一种是在 ->with() 这里做文章:

Post::with(array(
    'user' => function($query) { $query->select('id', 'name'); },
    'user.extend' => function($query) { $query->select('birth', 'intro'); },
))->paginate(10, array('id', 'content'));

就这样。
既然可以指定字段那还可以做一些别的什么呢???