shell字符串截取

详细 http://c.biancheng.net/view/1120.html

发表在 bash | 留下评论

Golang main.go调用同目录下其它go文件时报“undefined”错误

golang main包下推荐只有一个main.go的入口文件,如果非得这样做那么go run 的时候把所有文件都得加上,否则默认只加载main.go这一个文件,只有非main包里的文件才会通过依赖去自动加载。所以你需要输入多个文件作为参数如: go run a.go b.go c.go 或 go run *.go

发表在 GO | 留下评论

安装Golang环境

# install golang from https://code.google.com/p/go/downloads/list
# here golang 1.2(linux-amd64)
$ wget https://go.googlecode.com/files/go1.2.linux-amd64.tar.gz
$ tar -xvf go1.2.linux-amd64.tar.gz
$ cp -R go /usr/local/
$ vim /etc/profile.d/golang.sh
# add below to golang.sh
# export GOROOT=/usr/local/go
# export PATH=$PATH:$GOROOT/bin
# export GOPATH=/data/apps/go
$ source /etc/profile.d/golang.sh

IDEA指定golang安装路径时出现“The selected directory is not a valid home for Go SDK”的解决办法:

https://www.cnblogs.com/smartisn/p/15737839.html

发表在 GO | 留下评论

二进制相加

假设计算机字长为8

10 + 16

10 的二进制: 0000 1010
16 的二进制: 0001 0000

相加的方式为从右(低位)往左(高位)依次按位相加: 0+0为0、0+1 or 1+0为1、1+1为0并且往左进1

注意:
1、反码二进制相加遇到最高位进位时需要+1
2、补码二进制相加遇到最高位进位时需要舍弃最高位

参考: http://c.biancheng.net/view/3300.html

发表在 概念名词 | 留下评论

机器数、真值、原码、反码、补码

之前一直搞不清这几个概念的区别联系

机器数

指的是十进制数的二进制表示,正负号用计算机字长的最高位表示,“+”用0表示,“-”用1表示
如计算机字长为8:

10 的机器数为: 000001010
-10 的机器数为: 100001010

真值

是相对机器数来说的,是机器数的十进制表示

假如计算机字长为8:

机器数为: 00001010 真值为: 10
机器数为: 10001010 真值为: -10

原码、反码、补码都属于机器数,是机器数的三种编码方式

原码的也就是待编码的机器数,即等于原来的机器数,如:

机器数为: 00001010 原码为: 00001010
机器数为: 10001010 原码为: 10001010

反码:

如果机器数的真值是正数,则 反码 = 原码
如果机器数的真值是负数,则 反码 = 原码的二进制位取反(除符号位)

真值: 10 原码为: 00001010 反码为: 00001010
真值: -10 原码为: 10001010 原码为: 11110101

补码:

如果机器数的真值是正数,则 补码 = 原码
如果机器数的真值是负数,则 补码 = 原码的二进制位取反(除符号位) + 1, 即反码 + 1

真值: 10 原码为: 00001010 反码为: 00001010
真值: -10 原码为: 10001010 原码为: 11110110

为啥要原码、反码、补码呢,存在的意义是啥?
存在即合理,因为计算机是不会通过真值来加减法的,只能转换为二进制,如:

1、要想求 10 – 5 的值,计算机是把公式表示为 10 + (-5),也就是两个数的加法

真值: 10 原码为: 00001010
真值: -6 原码为: 10000110

假设直接通过两个原码直接相加的结果肯定是不对的,这时借助反码:
真值: 10 原码为: 00001010 反码: 00001010
真值: -6 原码为: 10000110 反码: 11111001
两个反码相加为: 00000001 00000011
再转成原码为: 00000100 (反码相加进位的话要加1)
真值为: 4

2、举个补码的例子:
看起来反码就能满足加减运算了,可是为什么还要补码呢,看下面:

真值: 2 原码为: 00000010 反码: 00000010
真值: -2 原码为: 10000010 反码: 11111101
两个反码相加值为: 11111111
转成原码为: 10000000
真值为: -0

这样真值貌似也没啥问题,0的原码就可表示为: 10000000 和 00000000,明显就是不靠谱的,因此补码:

真值: 2 原码为: 00000010 反码: 00000010
真值: -2 原码为: 10000010 反码: 11111110
两个反码相加值为: 1 00000000 (补码相加进位的话要舍弃)
转成原码为: 00000000
真值为: 0

于是0的原码只能为 00000000, 这里 10000000 可以作为 -128 的原码,完美~

反码、补码背后的原理我看了好几天还是没搞懂,后面有空再看吧:

目前网上有以下几种对加减运算的理解:
1、利用同余数的特点,将进行加减法的两个值等价替换

https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html#!comments

2、利用二进制的特点,认为负数可以直接被表示,通过判断结果的正负值来调整计算公式

http://www.ruanyifeng.com/blog/2009/08/twos_complement.html

3、通过取模运算+负数等价替换来实现

https://blog.csdn.net/mkr67n/article/details/114701908

4、也是通过取模运算,只不过负数是通过拍脑门儿设置的

https://www.zhihu.com/question/30395946?sort=created

发表在 概念名词 | 留下评论

Laravel中间件原理

setContent(str_replace('{img_list}', '', $tplContent->getContent()));

        echo $tplContent->getContent(), PHP_EOL;

        return $next();
    }
}

class Title {
    public static function handle($tplContent, Closure $next) {
        $tplContent->setContent(str_replace('{title}', 'Test Title', $tplContent->getContent()));

        echo $tplContent->getContent(), PHP_EOL;

        return $next();
    }
}

$parsers = ['ImageList', 'Title'];

class TplContent {
        private $tplContent = '

{title}

{img_list}'; public function setContent($content) { $this->tplContent = $content; } public function getContent() { return $this->tplContent; } } $tplContent = new TplContent; $callback = array_reduce(array_reverse($parsers), function($stack, $pipe) use ($tplContent) { return function() use ($tplContent, $stack, $pipe) { return $pipe::handle($tplContent, $stack); }; }, function() use ($tplContent) { echo 'real process result: ', $tplContent->getContent(), PHP_EOL; }); call_user_func($callback);
发表在 涨姿势 | 留下评论

Composer 镜像

镜像源

国内的
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer config -g repo.packagist composer https://packagist.phpcomposer.com
官方的
composer config -g repo.packagist composer https://packagist.org

解决问题:

https://blog.csdn.net/u011337280/article/details/81434548

发表在 涨姿势 | 留下评论

declare(strict_types=1)跟不加有啥区别

PHP7中增加强类型校验支持,默认是弱类型转换

关闭情况下:

// declare(strict_types=1);

function val(): string {
return 1;
}

echo val();

返回: 1

打开情况下:

PHP Fatal error:  Uncaught TypeError: Return value of val() must be of the type string, integer returned in /test.php:6
发表在 php异常, 涨姿势 | 留下评论

SQL分组取每组前一(或几)条记录(排名)

https://www.cnblogs.com/netserver/p/4518995.html

发表在 mysql | 留下评论

Java基础学习

自己花了500多大洋在慕课上买的教程 https://class.imooc.com/sc/64/learn#

1、快速熟悉java
1、java基础
1、基本数据类型
整型
字符串
浮点
2、各种运算符
1、比较运算符 > == >= <=
2、布尔运算符 && ||
3、或运算符
4、小括号运算符
5、运算符优先级
6、位运算符
1、按位并 (AND) & 如果两个数的二进制位都是1,返回true
2、按位或 (OR) | 如果两个数的二进制位有一个是1,返回true
3、按位异或 (XOR) ^ 如果两个数的二进制位只要不相同那就是1,若两个位相同那就是0
4、按位取反 ~ 需要一个操作数,对一个数二进制取反
7、快速运算写法
a ^= 1
a >> = 1

3、类型转换
1、自动类型转换
2、强制类型转换
4、字符串
1、字符集、编码
2、字符串加法
5、if/else流程控制语句
6、for、while、do … while循环
7、switch
8、数组
特点:
1、数组是连续的内存空间
1、一维数组
2、多维数组
9、类、对象
10、包
11、方法
1、方法重载 (方法名相同,参数列表不同,注: 返回值类型不在考虑范围)
12、传值、传引用
1、类型分为普通数据类型、引用数据类型
普通数据类型,比如int、string等
引用数据类型:数组、对象
13、可变参数列表和数组的区别
1、可变参数列表必须排在最后
2、一个方法参数中只能有一个可变参数列表
14、面向对象
1、声明对象是在栈空间,实例化对象是在堆空间
2、构造方法
1、构造方法间可以通过this()进行构造方法的调用
2、父类的构造方法不允许被继承、不允许被重写
3、父类如果没有无参构造方法,会影响子类的对象的实例化
3、封装
不带修饰符、public、protected、private
4、static 关键字
1、无论实例化多少个对象,它们都公用一个静态成员
2、既可以通过“对象.静态成员”,也可以通过“类名称.静态成员”访问
3、可以加在类属性、方法前面
5、继承
定义:
1、两个类之间满足“A is a B”的关系就可以形成继承关系,如小轿车(或者大货车)都是汽车,那小轿车(或大货车)都继承自汽车
2、可以通过“extends”来实现
方法重写
1、是子类重写父类的方法
2、要求:方法名相同、参数列表相同(参数类型、个数、类型),返回值类型相同
3、子类的访问修饰符必须大于或等于父类方法的访问修饰符
4、子类中是可以重写父类的成员属性的
5、静态方法和final方法不能被重写
6、重写方法访问权限必须大于等于父类方法
7、继承加载顺序为:父类静态代码块 > 子类静态代码块 > 父类代码块 > 父类构造方法 > 子类代码块 > 子类构造方法
6、super关键字
1、可以访问父类属性、方法
2、子类可以通过该关键字调用父类其它构造方法
3、调用构造方法时必须放在方法体第一行
4、”super.(方法/属性)”,super()或者super(参数)必须在构造方法中执行
7、this和super的区别:
1、都不能在static方法中运行
2、this可以访问当前类的属性、方法(包括构造方法)
3、super可以访问当前类的父类的属性、方法(包括构造方法)
8、多态
1、向上转型
当父类引用指向子类实例时,父类可以调用子类重写父类的方法
2、向下转型
1、当子类引用指向父类实例时,必须对父类实例进行强制转换,这时候能调用子类特有方法(但是如果父类实例并没有该方法时,编译虽然能通过,但是执行时仍会报错 — 可以用 instanceof 运算符进行判断)
3、類型轉換
不能进行兄弟类间的强制类型转换,若编写该语法,则编译不会报错,但运行过程会报错
9、抽象
1、不能被直接实例化、只能被继承
2、包含抽象方法的类一定是抽象类
3、static、final、private不能作为抽象类的抽象方法修饰符
10、接口
1、接口类中常量可以写成 “int TMP1 = 10;”
2、接口常量在定义的时候必须初始化其值
3、接口之间可以相互继承、并且可以继承多个
11、内部类
1、分类:成员内部类、静态内部类、方法内部类、匿名内部类
2、特点:
1、内部类在外部类使用时,无法直接实例化,需要借由外部类信息才能完成实例化
2、内部类的访问修饰符,可以任意,但是访问范围会受到影响
3、内部类可以直接访问外部类的方法和属性,如果出现了相同的属性,优先使用内部类定义的
4、内部类可以使用 外部类.this.成员方法/属性 的方式,访问外部类中同名的信息
5、外部类访问内部类信息,需要通过内部类实例化访问,无法直接访问
12、方法内部类
1、内部类名称不能包含public、private、protected、static关键字
13、匿名内部类
1、适用于只用一次的场景
2、匿名内部类没有类型名称、实例对象名称
3、编译后的文件命名: 外部类名$数字.class
4、无法编写构造方法、可以添加构造代码块
5、不能出现静态成员 (带final关键字的static可以用)
14、异常
1、按类型分为: 两个大类,error和exception,exception分为: check异常(SQLexception等)、uncheck异常两类 (runtime exception:内存溢出、空指针异常等)
2、异常捕获主要靠5个关键字:try catch finally throw throws

2、java进阶 (待定)
1、jvm

2、快速搭建一个spring boot项目
1、introduction

发表在 java | 留下评论