Hexo Blog

fsh的博客


  • 首页

  • 归档

建模欲望09

发表于 2019-02-21 更新于 2019-03-12 分类于 Diary

转载YJango

一、好奇心的作用

人们现在都意识到好奇心的重要性,但却发现,随着年龄的增长,好奇心会慢慢消退,不仅如此,学习能力也不如以前。

于是人们得出一个结论:好奇心和学习能力会随年龄增长而下降,很多人因此觉得自己已经来不及学习,这辈子就认命了。这是多数人对好奇心的认识。

然而这个认识却完全错了,因为不管年龄是否与好奇心相关,都会随着时间而增长,无法认为年龄就是影响好奇心的因素。

事实上,好奇心和食欲、性欲一样,是人类的基本欲望。和好奇心相关的大脑区域就是负责奖励机制的伏膈核,也正是对成瘾行为起重要作用的区域。因为我们不得不依赖自己的模型而存活,所以一定会想尽办法的去建立模型(学习),而好奇心便是演化出来促进学习的奖励机制,每个人生下来就是一部终身好奇的学习机器。

但这却和我们的普遍认知不符。因为很多家长费劲了脑汁也无法让孩子喜欢“学习”,有些人也觉得自己根本不爱“学习”。怎么能说好奇心和食欲一样是人类的基本欲望呢?

事实上,我们不是不喜欢学习,而是不喜欢不符合大脑特点的记忆。当我们对食物饥饿时,大脑会产生进食欲,会无法抑制的想要进食。学习和进食一样,当我们对知识饥饿时,大脑会产生求知欲,也会无法抑制的想要学习。

但多数人的“学习”并不是这样。他只是知道自己需要学习,却没有产生过好奇心,最终变成了强迫自己去记忆知识,又怎么可能会喜欢呢?


二、好奇心的对象

既然好奇心是促进学习的关键,那么如何调动自己的好奇心呢?回答这个问题首先要搞清楚的就是:我们到底对什么好奇?

好奇心的目的是为了构建知识,让我们可以适应当前环境,得以生存,因此我们对知识好奇。然而最为关键的一点是,我们无法通过记忆知识来学习知识,只能通过归纳例子来构建知识,因此我们更为好奇的内容其实是例子。而在生活中的例子正是故事。

这就解释了为什么我们如此喜欢故事,为什么大多数的演讲都是以一个故事作为开始,为什么春秋战国时期的纵横家都是以讲故事的方式来游说君主。因为一个故事可以瞬间让大脑清楚知识的输入和输出。

而例子是从输入到输出的一个具体变换,缺一不可,所以当只有输入或输出时,好奇心会使我们的大脑急切的想要知道另一个,帮助自己搜集完整的例子。

现在我们来回答网络标题是如何利用好奇心来引诱大众的。大致可分为例子残缺和知识白送两大类。

1.例子残缺

例子残缺的特点是:标题只给你输入或输出,但绝不完整的提供二者,让你的好奇心来点击内容。

1.1. 不提供输入(“普及类”居多)

例1:网上这些招数一直在把你当小猫诱骗(招数 X –> 诱惑的)
例2:这个东西不能乱玩,否则后悔来不及(东西 X –> 危险的)
例3:男人不育居然是这些习惯导致的(习惯 X –> 使不育)
例4:长寿秘诀破解,最关键的因素居然是这个…(因素 X –> 使长寿)
例5:赵丽颖和冯绍峰结婚背后的真相竟然是(原因 X –> 使结婚)

1.2. 不提供输出(新闻类居多):

例1:新手司机误把油门当刹车 结果…( 错踩油门 –> 后果 Y)
例2:世界上最不合拍的两个星座在一起了(不合拍在一起 –> 后果 Y)
例3:那些辞职去考研的人,后来怎么样了?(辞职考研 –> 结果 Y)
例4:如果世界上只剩一个女人,将会发生什么?( 极端情况 –> 结果 Y)
例5:面试官问期望的薪酬是在问什么?(表面问题 –> 实际问题 Y)

2.知识白送

而白送的知识分为两种,正是《知识的分类(下)》里介绍的回归知识(程序性知识)与分类知识(陈述性知识)。

2.1. 对分类知识,我们好奇的是“判断依据”

例1:开车遇到这种情况,赶紧加速离开(你–>赶紧离开,情况依据 B)
例2:一个男生,真正爱你的八种表现(男生–>爱你,表现依据 B)
例3:HR教你如何判断一个公司的好坏(公司–>好or坏,判断依据 B)
例4:没有感冒却长期咳嗽有这些症状快就医(你–>有病,症状依据 B)
例5:越没本事的男人,爱说下面四句话(男人–>没本事,言语依据 B)

2.2.对回归知识,我们好奇的是“如何做到”

例1:6 分钟视频教你如何成为爱情高手(方法 P )
例2:教你怎么涂粉底液三个小诀窍摆脱墙壁脸(诀窍 P )
例3:学会这个技巧,关键时刻能救你一命(技巧 P )
例4:像有钱人一样思考15个秘诀让你不知不觉发财(秘诀 P )
例5:学会这一招 葱蒜姜放半年都不会坏(招 P )

从上面的例子你会发现,只要产生了好奇心,都难以抵挡这种诱惑,也就是说没有一个人是不喜欢学习的。所以家长们在教育孩子的时候请不要对他的好奇心不耐烦,因为我们当代的教育系统已经是好奇心的最强杀手了。

3. 自我应用

然而我们最感兴趣的是如何将好奇心应用到我们日常学习之中。关于这一点,我其实在《学习观5.5》中已经分享出来了。正是画思维导图时的自我提问。

有些人看完《学习观5.5》后觉得还是不会画思维导图。然而思维导图是用来拆分要学习的新知识。每次我们都需要重新思考新知识与子知识之间的关系,这些人真的有思考过吗?真的有进行那些自我提问吗?那些自我提问不仅可以帮助我们拆分知识,更会调动我们的好奇心来促进我们的学习。

三、好奇心的敌人

但知道了如何应用好奇心后还有一个关键问题没有回答那就是为什么随着年龄的增长自己的好奇心会下降呢?实际上,阻碍我们好奇心的根本不是年龄,恰恰是我们已有的知识。

1.固执心理

因为我们依赖模型而活,因此不仅进化出了用于构建模型的好奇心,也同时进化出了用于保护已有模型的固执心。 倘若什么都信,那就会像受骗的老人一样把钱财交出去。 而固执心有两个常见的表现:

1.1.拒绝新知识

看到新知识后,会说服自己,这个没用,然后心安理得的不学习它。

1.2.归为旧已知

看到新知识后,会说,这个不就是那个啥吗?我知道。然后忽略了细小差异。比如用中文发音系统来学习英语。

小孩子由于没有任何知识,固执心弱,所以好奇心强,学习能力强;但抗欺骗力弱。 而成人由于已经构建知识,固执心强,所以好奇心弱,学习能力差;更新能力也弱。

固执心是进化出的保护机制,没什么不对的,这样反而不容易陷入知识恐慌。 但你又想要让自己有创造力,就唯有保持初学者那种一无所知的心态,才会激起好奇心,才会保持对知识的饥渴。

这正是乔布斯留给新生的 stay hungry, stay foolish(乔布斯更可能传达的是另一种意思)。

2.权威思维

除了固执心理外,好奇心还有另一个敌人,是权威思维。这种思维是不独立思考,只相信权威,认为任何问题都有一个官方的、唯一的知识。看到新知识后,就相信一定有一本教科书罗列了所有内容。而这是当代教育环境最容易让人们形成的一种学生思维。

有些人对于只要加上科学二字的内容就无条件相信。当意识到自己被骗后,就得出了科学不可相信的结论。但上面所指的“科学”是该人通过网络所形成的对科学的认识,而真正的科学是对知识不断验证和更新的一个过程。

地心说在当时可以满足所有的观测,是最科学的知识,而观测到更多新数据后,科学又将知识更新为了日心说,但当发现太阳也不是宇宙中心后,就又再次更新了知识。正是科学这种以验证为标准,又不断完善的精神才被人们所推崇。

所以我并不想要教任何现有知识,因为知识是无限的,当下的知识在未来一定会更新,我根本教不完,而当我死了之后呢?我做的所有努力都不会有任何意义。所以我想传达的是如何学习知识,如何判断知识。

以上是我个人对我所看到的数据所总结的知识,那是否就一定是完善的呢?当然不是,上面就没有提影响好奇心的另一个重要因素:要与自己相关,毕竟我们只会去构建与自己相关的知识。然而即使加入了“与自己相关的”这个要素,我们对好奇心的认识仍然需要不断更新完善的。

Spring-Boot-MyBatis整合

发表于 2019-02-20 更新于 2019-03-05

什么是Spring Boot

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration.

什么是 MyBatis ?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

配置pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--<optional>true</optional>-->
</dependency>

</dependencies>

开始配置

application.properties

1
2
3
4
spring.datasource.jdbc-url=jdbc:mysql://127.0.0.1:3306/data
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mapper

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.demo;

import com.example.demo.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper {
@Select("SELECT * FROM t_sys_user;")
List<User> findAll();
}

实体

1
2
3
4
5
6
7
8
@Data
public class User {
private Integer id;
private String username;
private String password;
private String nickname;
private Integer available;
}

Controller

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
public class UserController {

//This is also expected - UserDao is an interface and Spring can't make a bean from an interface
@Autowired
private UserMapper userMapper;

@RequestMapping("/list")
public ResponseEntity<Collection> findAll() {
return new ResponseEntity<>(userMapper.findAll(), HttpStatus.OK);
}
}

遇到的问题

userMapper 注入失败

1
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userMapper' defined in file...

解决:试过多种mapper没扫描到,似乎@Mapper没起作用,尝试换成@MapperScan(“com.example.demo.domain.User”)

报SqlSessionFactory 和 SqlSessionTemplate 没有注入,按道理SpringBoot应该自动注册和注入,事实上没有。查阅文档,发现一开始导入的包有问题,应该导入的是mybatis-spring-boot-starter,下面是正确的导包

1
2
3
4
5
6
7
8
9
10
11
<!--		<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>-->

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>

mapper的注入方式

官网示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@SpringBootApplication
public class SampleMybatisApplication implements CommandLineRunner {

private final CityMapper cityMapper;

public SampleMybatisApplication(CityMapper cityMapper) {
this.cityMapper = cityMapper;
}

public static void main(String[] args) {
SpringApplication.run(SampleMybatisApplication.class, args);
}

@Override
public void run(String... args) throws Exception {
System.out.println(this.cityMapper.findByState("CA"));
}

}

示例上Mapper的注入是通过构造方法注入的,而不是常见用注解的方式注入的,这样做的好处:

  • 保证依赖不可变(final关键字)
  • 保证依赖不为空(省去了我们对其检查)
  • 保证返回客户端(调用)的代码的时候是完全初始化的状态
  • 避免了循环依赖
  • 提升了代码的可复用性

运行报错

1
Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

看来只能自己动手配置数据源了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
public class DataSourceConfiguration {

@Bean(name="dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSourceConfig(){
DataSource dataSource = DataSourceBuilder.create().build();
return dataSource;
}

@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSourceConfig());
return sessionFactory.getObject();
}
}

MyBatis-Spring-Boot-Starter文档

MyBatis-Spring-Boot-Starter will:

  • Autodetect an existing DataSource.
  • Will create and register an instance of a SqlSessionFactory passing that DataSource as an input using the SqlSessionFactoryBean.
  • Will create and register an instance of a SqlSessionTemplate got out of the SqlSessionFactory.
  • Autoscan your mappers, link them to the SqlSessionTemplate and register them to Spring context so they can be injected into your beans.

文档介绍发现应该是第一步DataSource没有注入,所以sqlSessionFactory()可以注掉同样可以运行,不过在多数据源的时候可以通过setDataSource()来设置数据源,通过getObject()获取sqlSessionFactory实例。

DataSource没有注入

@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
将括号里面的exclude去掉 就可以自动注入了

application.properties
当自动注入时里面url必须是spring.datasource.url
如果是自定义数据源时则必须是spring.datasource.jdbc-url

文档

SpringBoot Documentation
mybatis
mybatis blog

TODO

发表于 2019-02-14 更新于 2019-08-01

(Https协议详解)[http://www.cnblogs.com/zxj015/p/6530766.html]

(你遇到过哪些质量很高的 Java 面试?)[https://www.zhihu.com/question/60949531/answer/182115799]

(我简历上的Java项目都好low,怎么办?)[https://zhuanlan.zhihu.com/p/56807872]

系统设计

nginx 配置自签名的ssl证书
https://www.cnblogs.com/shindo/p/6117647.html?tdsourcetag=s_pcqq_aiomsg

提取JKS文件的证书和私钥
https://jingyan.baidu.com/article/066074d61de50cc3c21cb0ba.html?qq-pf-to=pcqq.c2c

redis应用
http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html

中间间https://juejin.im/post/5c1214a66fb9a049bb7c3410

为什么开发人员必须要了解数据库锁?https://mp.weixin.qq.com/s/yzXbbutzVJ1hIZgVszIBgw

云服务

发表于 2019-02-13 更新于 2019-03-14

数据分离,来满足多客户需求

两台服务器中没有公网IP的服务器怎么连接外网

VPN,代理,转发等方法实现
http://blog.liujason.com/2859.html

前台打包部署

发表于 2019-01-28 更新于 2019-03-18

简书

Node.js

简单的说 Node.js 就是运行在服务端的 JavaScript。
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

NPM 使用介绍

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 “npm -v” 来测试是否成功安装。

国内直接使用 npm 的官方镜像是非常慢的,推荐使用淘宝 NPM 镜像

1
$ npm install -g cnpm --registry=https://registry.npm.taobao.org

这样就可以使用 cnpm 命令来安装模块了:

1
$ cnpm install [name]

npm 更新

1
$ npm install -g npm

npm 安装 Node.js 模块

1
$ npm install <Module Name>

eg 我们使用 npm 命令安装常用的 Node.js web框架模块 express:

1
$ npm install express

安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require(‘express’) 的方式就好,无需指定第三方包路径。

1
var express = require('express');

设计一个用来模拟人的程序

发表于 2019-01-26 更新于 2019-03-12 分类于 Diary

分析rimworld 是如何模拟人的思想

人共有五大需求
生理上的需要 呼吸,水,食物,睡眠,生理平衡
安全上的需要 健康保障,资源所有性,财产所有性,道德保障,工作职位保障,家庭安全
情感归属的需要 友情,爱情,性亲密
尊重的需要 自我尊重,信心,成就,对他人尊重,被他人尊重
自我实现的需要 道德,创造力,自觉性,问题解决能力,公正度,接受现实能力

将所有的需求设置一个值,每隔一段时间设置判断,不满足条件时扣除,满足时增加,当需求值下降到基线时,驱动人去做满足条件的事件。以此来模拟人的思想。

构建一颗简单的树

发表于 2019-01-24 更新于 2019-01-28

利用java中对象的修改是引用传递

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//将节点放入map中
Map<String, T> nodeMap = new HashMap<>();

for (TreeNode node : nodeMap.values()) {

if (node.isRoot()) {
continue;
}

String parentKey = node.getParentKey();
if (nodeMap.containsKey(parentKey)) {
/**
* 获取父节点直接添加 利用map的特性直接修改值,后续添加子节点时前面加过的也回修改,
* 最后取到根节点就可以获得整颗树
*/
TreeNode parentNode = nodeMap.get(parentKey);
if (parentNode == null) {
throw new InternalException("生成树失败");
} else {
parentNode.addChildNode(node);
}
}
}

最后取出map中的根节点,就会发现根节点已经是一颗树了

创建自定义异常类

发表于 2019-01-15 更新于 2019-01-28

创建自定义异常类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Data
public class myException extends RuntimeException{
//异常code码用来处理国际化信息
private String messageID;

public myException(String messageID) {
this.messageID = messageID;
}

//通过异常code和message提示异常
public myException(String messageID,String message) {
super(message);
this.messageID = messageID;
}
}

Java文件拷贝工具类

发表于 2019-01-09 更新于 2019-03-12 分类于 IO , 文件流

系统的路径分隔符

1
String separator = FileSystems.getDefault().getSeparator();

耗时计算

1
2
3
long startTime=System.currentTimeMillis();
long endTime=System.currentTimeMillis();
long costTime=endTime-startTime;

按字节写文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//读取配置文件,获取文件上传路径
Path path = Paths.get("/text.txt");
if (!Files.exists(path)) {
Files.createDirectories(path);
}
//1.按字节一次写入,如果文件过大在实际项目中会造成内存溢出
byte[] bytes = file.getBytes();
Files.write(path, bytes);

//2.限制字节长度写入
File file = new File(path.toUri());
InputStream ins = file.getInputStream();
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();

文件夹拷贝

Files工具类中有个walkFileTree用来遍历文件

1
2
3
4
5
6
7
8
9

public static Path walkFileTree(Path start, FileVisitor<? super Path> visitor)
throws IOException
{
return walkFileTree(start,
EnumSet.noneOf(FileVisitOption.class),
Integer.MAX_VALUE,
visitor);
}

看上面注释得出start参数是要遍历文件的位置,visitor则是一个接口规定了遍历文件将要做的事情
而visitor有4个方法:

  • 访问文件前preVisitDirectory
  • 访问文件visitFile时
  • 访问文件失败时
  • 访问文件后visitFileFailed

因此在visitor考虑实现文件的拷贝,在构造visitor类时将拷贝输出的路径传入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class CopyFileTree extends SimpleFileVisitor<Path>{

private Path targetPath;
private Path sourcePath;

public CopyFileTree(Path targetPath, Path sourcePath){
this.targetPath=targetPath;
this.sourcePath=sourcePath;
}

@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Path target=getTargetPath(file);
if (Files.exists(target)){
Files.delete(target);
}
Files.createDirectories(target.getParent());
Files.copy(file,target);
return FileVisitResult.CONTINUE;
}

...
}

文件夹压缩

FileOutputStream 将数据写入文件的输出流,用于写入原始字节流如图像数据。 要编写字符流,请考虑使用。

ZipOutputStream 压缩文件并生成压缩文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private static void doZipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
//如果文件隐藏则跳过
if (fileToZip.isHidden()) {
return;
}
if (fileToZip.isDirectory()) {
//如果文件是
if (!fileName.endsWith(File.separator)) {
//Creates a new zip entry with the specified name.
fileName += File.separator;
}
//放入下一个队列
zipOut.putNextEntry(new ZipEntry(fileName));
zipOut.closeEntry();
File[] children = fileToZip.listFiles();
for (File childFile : children) {
doZipFile(childFile, fileName + File.separator + childFile.getName(), zipOut);
}
return;
}
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileName);
zipOut.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
fis.close();
}

文件压缩目前只能通过递归来压缩了,这里要注意的就是递归的结束条件不要陷入死循环了

遇见的错误

Input length = 1
编码不是UTF-8却按UTF-8读取了
Files.readAllLines(filePath, StandardCharsets.UTF_8)

如果要继续深入了解的文件的操作可以继续研究NIO。

搭建GitLab之配置Linux环境

发表于 2019-01-04 更新于 2019-03-20

Mstsc (Microsoft terminal services client)

创建与终端服务器或其他远程计算机的连接,编辑现有“远程桌面连接(.rdp)”配置文件,并将 Windows XP 连接(使用“客户端国防部设备 接管理器”创建的连接)迁移到新的 .rdp 文件中。
Mstsc还有一种说法,Microsoft Telnet Screen Control ,即“微软远程桌面控制”。

远程工具

XShell来远程操作

Ubuntu操作系统

Ubuntu(o͝oˈbo͝onto͞o) 乌班图
Ubuntu 是基于DebianGNU/Linux,支持x86、amd64(即x64)和ppc架构,是一个以桌面应用为主的开源GNU/Linux操作系统。

GitLab

GitLab官网在改版后,安装难找了很多,Installation

安装前准备

切换用户

1
2
3
4
登入管理员
sudo su
登出*
exit

检查磁盘

1
2
3
4
//查看当前系统磁盘使用空间
df -h
//查看当前目录文件占用空间大小
du -sh *

安装依赖

1
2
3
4
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
#安装邮箱可选
#sudo apt-get install -y postfix

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具

安装资源

1
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash

建议选择文件夹安装

设置服务地址和安装

1
sudo EXTERNAL_URL="http://gitlab.example.com" apt-get install gitlab-ee

也可以后续修改

1
vi /etc/gitlab/gitlab.rb

进入文本编辑并修改配置文件

vim编辑文本
i 进入编辑
Esc + “:wq” 保存并退出

1
2
3
4
5
6
7
8
sudo gitlab-ctl start                             # 启动所有 gitlab 组件;
sudo gitlab-ctl stop # 停止所有 gitlab 组件;
sudo gitlab-ctl restart # 重启所有 gitlab 组件;
sudo gitlab-ctl status # 查看服务状态;
sudo gitlab-ctl reconfigure # 启动服务;
sudo vim /etc/gitlab/gitlab.rb # 修改默认的配置文件;
gitlab-rake gitlab:check SANITIZE=true --trace # 检查gitlab;
sudo gitlab-ctl tail # 查看日志;

卸载删除gitlab方法

1
2
3
4
5
gitlab-ctl stop
#移除式卸载
apt-get remove softname1;
#清除式卸载(清除配置)
apt-get –purge remove softname1;

遇到的问题

安装GitLab,主要是GitLab端口开启的太多,可能照成的冲突太多,需要一个个修改,不然就是一个502

重启

shutdown -r now

更新失败sudo apt-get update

第一步:先删除缓存
sudo rm -vfr /var/lib/apt/lists/*
第二步:修改dns
sudo vim /etc/resolv.conf
删了原本的dns,修改dns为
nameserver 8.8.8.8

还是不行则修改 成国内镜像文件 并重复一二步
vi /etc/apt/sources.list

1234…6

fsh

54 日志
4 分类
20 标签
© 2019 fsh
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.3.0