文章分类 » 入门

colorful

让Git的输出更友好: 多种颜色和自定义log格式

git多颜色输出

git默认的输出是单一颜色的,不仅不够美观,也不容易阅读。实际上,git本身就支持用多种颜色来显示其输出的信息,只需在命令行中运行以下命令来修改git的设置,即可开启多颜色输出:

git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto

执行以上命令后,git的status, diff和branch等诸命令的输出就都是带有颜色的了。见下图示例。

git-status

自定义log格式

完成上述步骤后,git log 命令的输出虽然有了点颜色,但还是显得枯燥(见下图)。

git-default-output

不要紧,强大的git提供了自定义log格式的功能,尝试输入以下命令:

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

你将看到类似下图的输出:

git-pretty-log

怎么样,不赖吧?不过,每次查看log都输出这么一长串的命令,实在是不太现实。咱们来通过git的命令别名来解决这个问题。输入以下命令:

git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"

上述命令将创建一个命令别名 lg,每次你使用命令 git lg 就相当于输入了刚才那一长串命令。现在,如果想看美观的多颜色输出,就使用 git lg,如果想看普通的log输出,就使用 git log,二者互不干扰。

如果你想让log输出某些特定的信息,可以自己调整 --pretty 参数的值,例如下面的命令将只显示commit的hash,提交时间,提交者姓名:

git log --pretty=format:'%h %ar %an'

把format后面单引号中的内容替换为你想要的格式,即可实现自定义的log输出格式。这里的%h, %ar等是一些git预定义的占位符,完整的列表如下:

%Hcommit hash
%hcommit的短hash
%Ttree hash
%ttree的短hash
%Pparent hashes
%pparent的短hashes
%an作者名字
%aNmailmap中对应的作者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%ae作者邮箱
%aE作者邮箱 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%ad日期 (–date= 制定的格式)
%aD日期, RFC2822格式
%ar日期, 相对格式(1 day ago)
%at日期, UNIX timestamp
%ai日期, ISO 8601 格式
%cn提交者名字
%cN提交者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%ce提交者 email
%cE提交者 email (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%cd提交日期 (–date= 制定的格式)
%cD提交日期, RFC2822格式
%cr提交日期, 相对格式(1 day ago)
%ct提交日期, UNIX timestamp
%ci提交日期, ISO 8601 格式
%dref名称
%eencoding
%scommit信息标题
%f过滤commit信息的标题使之可以作为文件名
%bcommit信息内容
%Ncommit notes
%gDreflog selector, e.g., refs/stash@{1}
%gdshortened reflog selector, e.g., stash@{1}
%gsreflog subject
%Cred切换到红色
%Cgreen切换到绿色
%Cblue切换到蓝色
%Creset重设颜色
%C(…)制定颜色, as described in color.branch.* config option
%mleft, right or boundary mark
%n换行
%%a raw %
%x00print a byte from a hex code
%w([<w>[,<i1>[,<i2>]]])switch line wrapping, like the -w option of git-shortlog(1).
featured-img-data-collection

PHP数据采集程序初步应用

前言

我们在写一个Web程序的时候,总会想着把自己的网站更美观一些,功能能更多一些,有时候写一些小的工具或者加上小的插件会让我们的站点更加完善。比如万年历功能,比如我们现在要讲的天气预报功能。

当然我们没法利用专业的卫星接受数据,所以我们的天气数据来自现有的天气预报网站。利用天气预报网站提供的数据服务,我们可以写一个PHP爬虫,然后动态采集我们所需要的数据,并且在目标站点更新数据的时候,我们的程序也能做到同步更新,自动地获取数据。

下面就介绍一下如何编写一个简单的PHP数据采集程序(PHP爬虫)。

原理

给定一个网页的URL,使用PHP下载该网页并得到网页内容,然后通过正则表达式将其中我们感兴趣的数据提取出来,然后输出。

具体在这个例子中,我们要抓取的网页是 http://www.weather.com.cn/weather/101050101.shtml,我们感兴趣的是页面中的未来7天天气情况。

实现

0.获取天气预报网页的URL:

$url = "http://www.weather.com.cn/weather/101050101.shtml";
$page_content = file_get_contents($url);

在这里,file_get_contents() 函数会将 $url 指向的网页下载下来,并把网页内容作为一个字符串返回。于是,$page_content 变量中就是我们要抓取的网页的全部HTML代码了。接下来,我们要从其中抽取我们需要的数据。

1.使用正则表达式匹配符合条件的字符串

先输出 $page_content 的值,然后查看网页源代码,观察可知我们需要的字符串可以在

<!--day 1 -->
......
<!--day 7 -->

这两行的注释里找到。

使用正则表达式来取得 <!--day 1--><!--day 7--> 之间的所有内容:

eregi("<!--day 1-->(.*)<!--day 7-->",$page_content,$res);

2.补全页面中图片的路径

由于远程网页中的图片路径都是像 /m2/i/icon_weather/29x20/d01.gif 这样的相对路径,我们需要把这些路径补全,在它们前面加上 http://www.weather.com.cn

$forecast = str_replace("<img src="","<img src="http://www.weather.com.cn",$res[0]);

至此,$forecast 中就是我们需要的天气预报信息了。这个简单的PHP爬虫也就写好了。

源代码

以下是这个抓取天气预报小程序的完整源代码,其中添加了一些测量各部分程序运行时间的代码,并可以通过设置 $start$end 的值来控制抓取哪几天的信息。


$url = "http://www.weather.com.cn/weather/101050101.shtml";
$t1 = time();
    
$page_content = file_get_contents($url);
$t2 = time();

$start = 1;
$end = 3;

if ($end > 7){
    echo "超出预报能力范围,请重新设置!";
}else {
    echo "未来".($end-$start)."天哈尔滨的天气预报("
              .date('Y-m-j')."发布)";

    eregi("--day $start--(.*)--day $end--", $page_content, $res);

    $forecast = str_replace("<img src=\"",
        "<img src=\"http://www.weather.com.cn", $res[0]);
    $t3 = time();

    echo $forecast;

    echo 'First step costs '.($t2 - $t1).' ms.';
    echo 'Last step costs '.($t3 - $t2).' ms.';
}

其他应用例子

同样的思路可以尝试的有:NBA每天的比分牌、今日哈工大的新闻同步、股市行情等等。都能实现同步实时更新。暂时只想到这些,欢迎大家拍砖~

Image Credit: Excavator by Megan Brown from The Noun Project