在Github和Git上fork之简单指南

编译自:http://www.dataschool.io/simple-guide-to-forks-in-github-and-git/

作者: Kevin Markham

原创:LCTT https://linux.cn/article-4292-1.html

译者: su-kaiyao

本文地址:https://linux.cn/article-4292-1.html

如果你是习惯于先理解概念,再着手代码的学习者,而且你也是Git和GitHub的初学者,我建议你先理解清楚什么是fork。为什么呢 ?

  1. Fork是在GitHub起步最普遍的方式。
  2. Fork只需要很少的Git命令,但是起得作用却非常大。
  3. Fork提供了对Git和GitHub最基础的了解,有益于你之后的工作。

本篇指南使用两张简单的图表,来教会你fork的两种主要工作流程。我并不打算涉及任何代码,但是在结论中,我会把你需要使用的代码的链接给你。

fork并且更新一个仓库

现在有这样一种情形:有一个叫做Joe的程序猿写了一个游戏程序,而你可能要去改进它。并且Joe将他的代码放在了GitHub仓库上。下面是你要做的事情:

Alt text

Alt text

fork并且更新GitHub仓库的图表演示

  1. Fork他的仓库:这是GitHub操作,这个操作会复制Joe的仓库(包括文件,提交历史,issues,和其余一些东西)。复制后的仓库在你自己的GitHub帐号下。目前,你本地计算机对这个仓库没有任何操作。
  2. Clone你的仓库:这是Git操作。使用该操作让你发送”请给我发一份我仓库的复制文件”的命令给GitHub。现在这个仓库就会存储在你本地计算机上。
  3. 更新某些文件:现在,你可以在任何程序或者环境下更新仓库里的文件。
  4. 提交你的更改:这是Git操作。使用该操作让你发送”记录我的更改”的命令至GitHub。此操作只在你的本地计算机上完成。
  5. 将你的更改push到你的GitHub仓库:这是Git操作。使用该操作让你发送”这是我的修改”的信息给GitHub。Push操作不会自动完成,所以直到你做了push操作,GitHub才知道你的提交。
  6. 给Joe发送一个pull request:如果你认为Joe会接受你的修改,你就可以给他发送一个pull request。这是GitHub操作,使用此操作可以帮助你和Joe交流你的修改,并且询问Joe是否愿意接受你的”pull request”,当然,接不接受完全取决于他自己。

如果Joe接受了你的pull request,他将把那些修改拉到自己的仓库。胜利!

同步一个fork

Joe和其余贡献者已经对这个项目做了一些修改,而你将在他们的修改的基础上,还要再做一些修改。在你开始之前,你最好”同步你的fork”,以确保在最新的复制版本里工作。下面是你要做的:

同步GitHub fork的图表示意图

同步GitHub fork的图表示意图

  1. 从Joe的仓库中取出那些变化的文件:这是Git操作,使用该命令让你可以从Joe的仓库获取最新的文件。
  2. 将这些修改合并到你自己的仓库:这是Git操作,使用该命令使得那些修改更新到你的本地计算机(那些修改暂时存放在一个”分支”中)。记住:步骤1和2经常结合为一个命令使用,合并后的Git命令叫做”pull”。
  3. 将那些修改更新推送到你的GitHub仓库(可选):记住,你本地计算机不会自动更新你的GitHub仓库。所以,唯一更新GitHub仓库的办法就是将那些修改推送上去。你可以在步骤2完成后立即执行push,也可以等到你做了自己的一些修改,并已经本地提交后再执行推送操作。

比较一下fork和同步工作流程的区别:当你最初fork一个仓库的时候,信息的流向是从Joe的仓库到你的仓库,然后再到你本地计算机。但是最初的过程之后,信息的流向是从Joe的仓库到你的本地计算机,之后再到你的仓库。

结论

我希望这是一篇关于GitHub和Git 的 fork有用概述。现在,你已经理解了那些概念,你将会更容易地在实际中执行你的代码。GitHub关于fork和同步的文章将会给你大部分你需要的代码。

如果你是Git的初学者,而且你很喜欢这种学习方式,那么我极力推荐书籍Pro Git的前两个章节,网上是可以免费查阅的。

如果你喜欢视频学习,我创建了一个11部分的视频系列(总共36分钟),来向初学者介绍Git和GitHub。

Linux下查看文件和文件夹大小

当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择。

df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。
du可以查看文件及文件夹的大小。

两者配合使用,非常有效。比如用df查看哪个一级目录过大,然后用df查看文件夹或文件的大小,如此便可迅速确定症结。

df命令可以显示目前所有文件系统的可用空间及使用情形,请看下列这个例子:

df -h

du:查询文件或文件夹的磁盘使用空间

如果当前目录下文件和文件夹很多,使用不带参数du的命令,可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的,所以得指定深入目录的层数,参数:–max-depth=,这是个极为有用的参数!如下,注意使用“*”,可以得到文件的使用空间大小.
提醒:一向命令比linux复杂的FreeBSD,它的du命令指定深入目录的层数却是比linux简化,为 -d。

du -h --max-depth=1

php手机号中间几位替换星号方法总结

1、字符串中包含多个手机号码

<?php
$s='王经理:13999312365 李经理:13588958741';
$s=preg_replace('#(\d{3})\d{5}(\d{3})#', '${1}*****${2}', $s);
echo $s;
//王经理:139*****365 李经理:135*****741
?>

2、字符串中只有一个手机号码

<?php
$haoma="15012345678";
echo preg_replace("/(\d{3})\d{5}/","$1*****",$haoma);
//150*****678
?>

不用正则表达式实现
1、使用substr_replace字符串部分替换函数

<?php
$string1="13264309555";
echo substr_replace($string1,'*****',3,5);
//132*****555
?>

2、使用字符串截取函数substr

<?php
echo substr($string1,0,3)."*****".substr($string1,8,3);
//132*****555
?>

Mobile Device Detection Framework (PHP)

//initialize all known devices as false
$iPod = false;
$iPhone = false;
$iPad = false;
$iOS = false;
$webOSPhone = false;
$webOSTablet = false;
$webOS = false;
$BlackBerry9down = false;
$BlackBerry10 = false;
$RimTablet = false;
$BlackBerry = false;
$NokiaSymbian = false;
$Symbian = false;
$AndroidTablet = false;
$AndroidPhone = false;
$Android = false;
$WindowsPhone = false;
$WindowsTablet = false;
$Windows = false;
$Tablet = false;
$Phone = false;

//Detect special conditions devices & types (tablet/phone form factor)
if(stripos($_SERVER['HTTP_USER_AGENT'],"iPod")){
    $iPod = true;
    $Phone = true;
    $iOS = true;
}
if(stripos($_SERVER['HTTP_USER_AGENT'],"iPhone")){
    $iPhone = true;
    $Phone = true;
    $iOS = true;
}
if(stripos($_SERVER['HTTP_USER_AGENT'],"iPad")){
    $iPad = true;
    $Tablet = true;
    $iOS = true;
}
if(stripos($_SERVER['HTTP_USER_AGENT'],"webOS")){

    $webOS = true;

    if(stripos($_SERVER['HTTP_USER_AGENT'],"Pre") || stripos($_SERVER['HTTP_USER_AGENT'],"Pixi")){
        $webOSPhone = true;
        $Phone = true;
    }
    if(stripos($_SERVER['HTTP_USER_AGENT'],"TouchPad")){
        $webOSTablet = true;
        $Tablet = true;
    }
}
if(stripos($_SERVER['HTTP_USER_AGENT'],"BlackBerry")){
    $BlackBerry = true;
    $BlackBerry9down = true;
    $Phone = true;
{
if(stripos($_SERVER['HTTP_USER_AGENT'],"BB10")){
    $BlackBerry = true;
    $BlackBerry10 = true;
    $Phone = true;
{
if(stripos($_SERVER['HTTP_USER_AGENT'],"RIM Tablet")){
    $BlackBerry = true;
    $RimTablet = true;
    $Tablet = true;
}
if(stripos($_SERVER['HTTP_USER_AGENT'],"SymbianOS")){
    $Symbian = true;
    $NokiaSymbian = true;
    $Phone = true;
}
if(stripos($_SERVER['HTTP_USER_AGENT'],"Android")){

    $Android = true;

    if(stripos($_SERVER['HTTP_USER_AGENT'],"mobile")){
        $AndroidPhone = true;
        $Phone = true;
    }else{
        $AndroidTablet = true;
        $Tablet = true;
    }
}
if(stripos($_SERVER['HTTP_USER_AGENT'],"Windows")){

    $Windows = true;

    if(stripos($_SERVER['HTTP_USER_AGENT'],"Touch")){
        $WindowsTablet = true;
        $Tablet = true;
    }
    if(stripos($_SERVER['HTTP_USER_AGENT'],"Windows Phone")){
        $WindowsPhone = true;
        $Phone = true;
    }
}



//Target form factors
if( $Phone ){
    //we're phone form factor
}else if( $Tablet ){
    //we're a tablet form factor
}else{
    //we're neither a phone or tablet
}




//Target operating systems
if( $iOS ){
    //we're an iOS device
}else if( $Android ){
    //we're an Android device
}else if( $Windows ){
    //we're a Windows device
}else if( $BlackBerry ){
    //we're a BlackBerry device
}else if( $webOS ){
    //we're a webOS device
}else if( $Symbian ){
    //we're a Symbian device
}else{
    //we're neither a phone or tablet
}




//Target individual devices
if( $iPod || $iPhone ){
    //we're an iPhone/iPod touch -- do something here
}else if($iPad){
    //we're an iPad -- do something here
}else if($AndroidPhone){
    //we're an Android Phone -- do something here
}else if($AndroidTablet){
    //we're an Android Tablet -- do something here
}else if($WindowsPhone){
    //we're an Windows Phone -- do something here
}else if($WindowsTablet){
    //we're an Windows Tablet -- do something here
}else if($webOSPhone){
    //we're a webOS phone -- do something here
}else if($webOSTablet){
    //we're a webOS tablet -- do something here
}else if($BlackBerry9down){
    //we're an outdated BlackBerry phone -- do something here
}else if($BB10){
    //we're an new BlackBerry phone -- do something here
}else if($RimTablet){
    //we're a RIM/BlackBerry Tablet -- do something here
}else if($NokiaSymbian){
    //we're a Nokia Symbian device -- do something here
}else{
    //we're not a known device.
}

网站记录js错误

//<![CDATA[
        // for debugging javascript!
        (function (window) {
            window.onerror = function (msg, url, ln) {
                //transform errors
                if (typeof(msg) === 'object' && msg.srcElement && msg.target) {
                    if (msg.srcElement == '[object HTMLScriptElement]' && msg.target == '[object HTMLScriptElement]') {
                        msg = 'Error loading script';
                    } else {
                        msg = 'Event Error - target:' + msg.target + ' srcElement:' + msg.srcElement;
                    }
                }

                msg = msg.toString();

                //ignore errors
                if (msg.indexOf("Location.toString") > -1) {
                    return;
                }
                if (msg.indexOf("Error loading script") > -1) {
                    return;
                }

                //report errors
                window.onerror = function () {
                };
                (new Image()).src = "/jserror?msg=" + encodeURIComponent(msg) + "&error_url=" + encodeURIComponent(url || document.location.toString().replace(/#.*$/, "")) + "&ln=" + parseInt(ln || 0) + "&r=" + (+new Date());
            };
        })(window);
        //]]>

PHP 扩展模块几个重要的函数

1、PHP_MINIT_FUNCTION(MyModule);

当模块被Zend Engine(ZE)加载后,例如Apache启动,加载了PHP模块,ZE会对每一个扩展模块调用此函数(如果有的话),可以在该函数里进行一些初始化操作。

2、PHP_RINIT_FUNCTION(MyModule);

对于每一个“使用”该模块的PHP脚本请求前,都执行该函数(如果有的话),最好的例子:Session扩展模块,如果在一个PHP脚本里执行session.start(),Session模块的PHP_RINIT_FUNCTION()将被调用。详情可以看看session模块的源代码。

3、PHP_RSHUTDOWN_FUNCTION(MyModule);

与PHP_RINIT_FUNCTION()相反,该函数是在一个PHP脚本执行完毕后执行。

4、PHP_MSHUTDOWN_FUNCTION(MyModule);

当ZE收到shutdown信号后,例如apache卸载PHP模块,ZE对每一个模块调用此函数,最后关闭自己的核心子系统。

实例:并发最简单计数器

Linux下管理员强行踢出用户的命令使用方法

一、输入w命令查看已登录用户信息

 19:22:31 up  2:11,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.1.178    18:41    0.00s  0.16s  0.01s w
root     pts/1    192.168.1.178    19:22    4.00s  0.14s  0.05s ssh localhost
root     pts/2    localhost.locald 19:22    4.00s  0.07s  0.07s -bash

二、使用命令pkill -kill -t 用户tty

登陆用户信息说明:

USER:显示登陆用户帐号名。用户重复登陆,该帐号也会重复出现。

TTY:用户登陆所用的终端。

FROM:显示用户在何处登陆系统。

LOGIN@:是LOGIN AT的意思,表示登陆进入系统的时间。

IDLE:用户空闲时间,从用户上一次任务结束后,开会记时。

JCPU:一终端代号来区分,表示在摸段时间内,所有与该终端相关的进程任务所耗费的CPU时间。

PCPU:指WHAT域的任务执行后耗费的CPU时间。

WHAT:表示当前执行的任务。

CSS定位

1. position:static
元素的 position 属性默认值是:static,元素出现在文档的常规位置,不会重新定位。
通常此属性值可以不设置,除非是要覆盖之前的定义。

#div-1 {
 position:static;
}

2. position:relative
设置了 position:relative,便可以结合top 、 bottom、 left 、 right 的属性来偏移其文档的常规位置。
例如将 div-1 向下移动 20 像素、向左移动 40 像素:

#div-1 {
 position:relative;
 top:20px;
 left:-40px;
}

注意 div-1 未被移动之前的地方,现在多了一点空隙,紧接著 div-1 的元素(div-after)却没有被移动,事实上即便 div-1 被移动了,它仍佔据原始位置。
貌似 position:relative 用处不大(我到觉得这点很有用),但在后面的内容中显得尤为重要。

3. position:absolute
设置了 position:absolute,即绝对定位,便可以将元素放在文档中任何想放的位置。
例如将 div-1a 放置到右上角:

#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}

注意!由于 div-1a 被移走, 页面中的其他元素位置也变了: div-1b, div-1c, div-after 都因此上移了。
div-1a 被放置在页面的右上角。 能直接地定位元素很方便,但作用也不大。
这裡真正要做的是将 div-1a 相对于 div-1 定位,这就又要讲到 relative 属性了。
注:IE浏览器Bug:设置了相对宽度(如 “width:50%”),该宽度将基于父元素而非自身。

4. position:relative + position:absolute

设置div-1的位置为 relative , div-1中元素的定位都将相对于div-1。现将div-1a的position设为:absolute,可以实现将其置于div-1的右上角:

#div-1 {
 position:relative;
}
#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}

5. 两列绝对定位

接下来使用relative 和absolute 实现两列的绝对定位:

#div-1 {
 position:relative;
}
#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}
#div-1b {
 position:absolute;
 top:0;
 left:0;
 width:200px;
}

使用绝对定位(absolute positioning)的优点就是不需考虑元素在html中的位置,可以对元素任意放置,此处故意将div-1b放到div-1a之前;
注意,还有个元素被绝对定位的元素遮住了,怎麽办?

6. two column absolute height
一种办法是设置固定高度。
但不是万全之策,因为元素的高度、字体的大小并不总是确定的。

#div-1 {
 position:relative;
 height:250px;
}
#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}
#div-1b {
 position:absolute;
 top:0;
 left:0;
 width:200px;
}

7. float(浮动)
针对高度不定的情况,绝对定位不好用,于是想到另一方案。
可以尽量使用向左或向右浮动来实现文字环绕,特别是环绕图片,此处用于更複杂的佈局工作(也只有用这种方法)。

#div-1a {
 float:left;
 width:200px;
}

8. 多列浮动
将两列都像左浮动,可以实现两列并列。

#div-1a {
 float:left;
 width:150px;
}
#div-1b {
 float:left;
 width:150px;
}

9. 多列浮动后清除浮动
将元素浮动后,再使用”clear” 清除浮动,后面内容拉向下。

#div-1a {
 float:left;
 width:190px;
}
#div-1b {
 float:left;
 width:190px;
}
#div-1c {
 clear:both;
}

Cron and Crontab usage and examples

string         meaning
------         -------
@reboot        Run once, at startup.
@yearly        Run once a year, "0 0 1 1 *".
@annually      (same as @yearly)
@monthly       Run once a month, "0 0 1 * *".
@weekly        Run once a week, "0 0 * * 0".
@daily         Run once a day, "0 0 * * *".
@midnight      (same as @daily)
@hourly        Run once an hour, "0 * * * *".
# Minute   Hour   Day of Month       Month          Day of Week      Command    
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)                
    0        2          12             *                *            /usr/bin/find