热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:DevOpsGitlab环境部署

本文由编程笔记#小编为大家整理,主要介绍了DevOpsGitlab环境部署相关的知识,希望对你有一定的参考价值。DevOps介绍
本文由编程笔记#小编为大家整理,主要介绍了DevOps Gitlab环境部署相关的知识,希望对你有一定的参考价值。

DevOps 介绍

目录
  • DevOps 介绍
    • 一、DevOps 介绍
      • 1.1.1 DevOps 介绍
      • 1.1.2 CI/CD简介
      • 1.1.2 Gitlab安装与使用

一、DevOps 介绍


1.1.1 DevOps 介绍



  1. DevOps介绍


DevOps 是Development和Operations的组合,也就是开发和运维的简写。
1、DevOps集文化理念、实践与工具与一身,可以提高组织高速交付应用程序和服务的能力,与使用 传统软件开发和基础设施管理流程相比,能够帮助企业更快速的发展和改进产品,这种速度使企业 能够更好地服务于客户,并在市场上高效地参与竞争。
2、DevOps 是针对企业中的研发人员、运维人员和测试人员的工作理念,是他们在应用开发、代码部 署和质量测试等整条生命周期中协作和沟通的最佳实践,DevOps 强调整个组织的合作以及交付和 基础设施变更的自动化、从而实现持续集成、持续部署和持续交付。
3、DevOps 平台:代码托管(gitlab/svn)、项目管理(jira/禅道/Teambition)、运维平台(腾讯蓝鲸/自主研发 平台)、持续交付(Jenkins/gitlab)。
技术图片



  1. . 为什么要推广DevOps


DevOps 强调团队协作、相互协助、持续发展,然而传统的模式是开发人员只顾开发程序,运维 只负责基础环境管理和代码部署及监控等,其并不是为了一个共同的目标而共同实现最终的目的, 而DevOps 则实现团队作战,即无论是开发、运维还是测试,都为了最终的代码发布、持续部署和业 务稳定而付出各自的努力,从而实现产品设计、开发、测试和部署的良性循环,实现产品的最终持 续交付。

3.DevOps的优势

速度:应用版本快速的迭代更新,以更好地适应不断变化的市场需求。 快速交付:更快的将应用交付至生产环境。 可靠性:保证应用交付的结果是成功的。 规模:可以在大规模环境下且可靠的交付应用。 增强合作:建立适应DevOps文化模式的团队,开发人员和运维人员协同工作。 安全性:在快速迭代的同时保证应用的质量。

1.1.2 CI/CD简介



  1. 什么是持续集成(CI-Continuous integration)


持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代 码行合并到一起并切相互不影响工作。
技术图片
2.什么是持续部署(CD-continuous deployment)
是基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实 现交付高质量的产品,持续部署在某种程度上代表了一个开发团队的更新迭代 速率
技术图片
技术图片
技术图片


1.1.2 Gitlab安装与使用



  1. Git、Gitlab、GitHub介绍


Git: 由linux之父Linus Torvalds(林纳斯·托瓦兹,1969年12月28日出生)在2005年开发的一个分 布式持续集成工具,设计之初就具备了以下优点: 可靠性:数据的上传和下载必须是安全的、一致的,所有行为都要进行验证,数据的变更通过不同的版本 进行逻辑隔离。 分布式:Linus Torvalds认为之前的集中式版本控制系统性能太差,于是git的代码恢复不依赖于中央服务 器,而是每个开发电脑都是一个本地仓库,可用于代码提交与回滚。 高效:Git基于分布式的功能实现代码的快速提交与秒级回滚。
Github:基于git的一个公有代码仓库,GitHub于2008年4月10日正式上线,2018年6月,微软宣布通 过75亿美元的股票交易收购GitHub。
Gitlab:基于git的一个私有代码仓库。



  1. Gitlab部署

[root@gitlab ~]# mkdir -p /server/tools
[root@gitlab ~]# cd /server/tools/
[root@gitlab /server/tools]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
--2020-07-01 23:02:46-- https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
[root@gitlab /server/tools]# ll
total 648548
-rw-r--r-- 1 root root 664112883 Jul 1 22:16 gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
[root@gitlab /server/tools]# yum install policycoreutils-python -y
[root@gitlab /server/tools]# rpm -ivh gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
warning: gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID f27eab47: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:gitlab-ce-11.11.8-ce.0.el7 ################################# [100%]
[root@gitlab ~]# rpm -qa gitlab-ce
gitlab-ce-11.11.8-ce.0.el7.x86_64

配置Gitlab.rb

gitlab官方文档有各邮箱详细配置
https://docs.gitlab.com/omnibus/settings/smtp.html
external_url ‘http://10.4.7.56‘ #域名或IP地址
gitlab_rails[‘smtp_enable‘] = true
gitlab_rails[‘smtp_address‘] = "smtp.qq.com"
gitlab_rails[‘smtp_port‘] = 465
gitlab_rails[‘smtp_user_name‘] = "XXXX@qq.com" #qq邮箱账号
gitlab_rails[‘smtp_password‘] = "ypyvpirefumrbjed" # #qq授权码
gitlab_rails[‘smtp_domain‘] = "smtp.qq.com"
gitlab_rails[‘smtp_authentication‘] = "login"
gitlab_rails[‘smtp_enable_starttls_auto‘] = true
gitlab_rails[‘smtp_tls‘] = true
gitlab_rails[‘gitlab_email_from‘] = XXXX@qq.com #和smtp_user_name一致
gitlab_rails[‘gitlab_email_enabled‘] = true
重新加载配置文件
[root@gitlab ~]# gitlab-ctl reconfigure
[root@gitlab ~]# gitlab-ctl status
run: alertmanager: (pid 5965) 317s; run: log: (pid 5688) 354s
run: gitaly: (pid 5848) 322s; run: log: (pid 4910) 516s
run: gitlab-monitor: (pid 5900) 321s; run: log: (pid 5562) 387s
run: gitlab-workhorse: (pid 5879) 322s; run: log: (pid 5410) 427s
run: logrotate: (pid 5459) 412s; run: log: (pid 5474) 409s
run: nginx: (pid 5426) 423s; run: log: (pid 5440) 420s
run: node-exporter: (pid 5891) 322s; run: log: (pid 5524) 398s
run: postgres-exporter: (pid 5979) 317s; run: log: (pid 5776) 343s
run: postgresql: (pid 5065) 503s; run: log: (pid 5082) 500s
run: prometheus: (pid 5919) 321s; run: log: (pid 5629) 365s
run: redis: (pid 4839) 525s; run: log: (pid 4852) 522s
run: redis-exporter: (pid 5909) 321s; run: log: (pid 5594) 376s
run: sidekiq: (pid 5355) 441s; run: log: (pid 5372) 437s
run: unicorn: (pid 5297) 452s; run: log: (pid 5328) 449s
#gitlab安装目录:
/etc/gitlab #配置文件目录
/run/gitlab #运行pid目录
/opt/gitlab #安装目录
/var/opt/gitlab #数据目录
/var/log/gitlab #日志目录
# gitlab-ctl #客户端命令行操作行
# gitlab-ctl stop #停止gitlab
# gitlab-ctl start #启动gitlab
# gitlab-ctl restart #重启gitlab
# gitlab-ctl status #查看组件运行状态
# gitlab-ctl tail nginx #查看某个组件的日志
浏览器访问:520报错解决
chmod -R 755 /var/log/gitlab #502报错

技术图片
4. Git命令的使用
技术图片

基础命令:
git clone #克隆项目到本地
git add #添加项目到暂存区
git status #查看本地工作区和暂存区的状态
git comit -m ‘‘ #提交项目到本地
git push #提交项目到远程仓库
[root@jenkins ~]# yum install git -y
[root@jenkins ~]# rpm -qa git
git-1.8.3.1-23.el7_8.x86_64
[root@jenkins ~]# cd /opt/
[root@jenkins /opt]# git clone http://10.4.7.56/magedu/devops.git
Cloning into ‘devops‘...
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
[root@jenkins /opt]# ll
total 0
drwxr-xr-x 3 root root 36 Jul 2 21:37 devops
#注意:clone的时候项目里文件不能为空,需要代码。否则会有坑。
编辑项目:
[root@jenkins /opt]# cd devops/
[root@jenkins /opt/devops]# vim index.html
[root@jenkins /opt/devops]# cat index.html

hello world!!


v222222222222


v333333333333


提交项目到暂存区
[root@jenkins /opt/devops]# git add index.html
查看项目
[root@jenkins /opt/devops]# git status;
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: index.html
#
提交项目到本地仓库
[root@jenkins /opt/devops]# git commit -m ‘v3‘ ./
[master d2f8e8f] v3
1 file changed, 1 insertion(+)
提交项目到远程仓库
[root@jenkins /opt/devops]# git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from ‘matching‘ to ‘simple‘. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See ‘git help config‘ and search for ‘push.default‘ for further information.
(the ‘simple‘ mode was introduced in Git 1.7.11. Use the similar mode
‘current‘ instead of ‘simple‘ if you sometimes use older versions of Git)
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 273 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
d49a0a9..d2f8e8f master -> master


  1. 设置全局用户和邮箱

[root@jenkins /opt/devops]# git config --global user.name ‘user1‘
[root@jenkins /opt/devops]# git config --global user.email ‘user1@163.com‘
#注意用户和邮箱可为真亦可为假。只要格式正确(上面设置为假)
[root@jenkins /opt/devops]# git config --global push.default current


  1. git 其它命令使用

git log #查看操作日
[root@jenkins /opt/devops]# git log
commit dfa58caf1adfd64962d3f200fa29e50cf526f69b
Author: root
Date: Thu Jul 2 22:22:04 2020 +0800
v4
commit d2f8e8fb622e9a6f4a2f206626add8ee569d03ae
Author: root
Date: Thu Jul 2 21:56:54 2020 +0800
v3
commit d49a0a94994496d90014891f95f9d36ab91cc4c3
Author: root
Date: Thu Jul 2 21:04:07 2020 +0800
v2
commit ba59ed9d0f3e32ac889bfe06b8ce54334714504e
Author: zhangxiaoming
Date: Thu Jul 2 20:53:50 2020 +0800
v1
.gitignore #定义忽略某些指定文件或者目录不上传至gitlab 默认是没有的需要创建
比如:mysql.cnf里面有一些敏感(保密)的信息,不想上传到Gitlab上,就可以这样操作
[root@jenkins /opt/devops]# vim my.cnf #里面随便一点内容做测试
[root@jenkins /opt/devops]# vim .gitignore
[root@jenkins /opt/devops]# cat .gitignore
my.cnf #忽略my.cnf文件不git push 远程仓库
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m ‘config‘ ./
[master e846f4f] config
1 file changed, 1 insertion(+)
create mode 100644 .gitignore
[root@jenkins /opt/devops]# git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from ‘matching‘ to ‘simple‘. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See ‘git help config‘ and search for ‘push.default‘ for further information.
(the ‘simple‘ mode was introduced in Git 1.7.11. Use the similar mode
‘current‘ instead of ‘simple‘ if you sometimes use older versions of Git)
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 256 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
b25ff63..e846f4f master -> master
假如你的zookeeper.cnf配置文件没有加入.gitignore里面,就会上传到远程仓库
[root@jenkins /opt/devops]# cp my.cnf zookeeper.cnf
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m "zookeeper.cnf"
[master e7712c3] zookeeper.cnf
2 files changed, 99 insertions(+)
create mode 100644 .gitignore
create mode 100644 zookeeper.cnf
[root@jenkins /opt/devops]# git status
# On branch master
# Your branch is ahead of ‘origin/master‘ by 1 commit.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
[root@jenkins /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 1.20 KiB | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
4bae31f..e7712c3 HEAD -> master

技术图片
没有上传mysql的配置文件但有zookeeper的配置文件
7. git 版本回滚命令

git reset --hard HEAD^^ #git版本回滚,HEAD为当前版本,加一个^为上一个,^^为上上一个版本
git reflog #获取每次提交的ID,可以使用--hard根据提交的ID进行版本回退
git reset --hard 5ae4b06 #回退到指定id的版本
多添加几个版本做测试:
[root@jenkins /opt/devops]# vim index.html
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m "v5"
[master e746a8f] v5
1 file changed, 1 insertion(+)
[root@jenkins /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 335 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
e7712c3..e746a8f HEAD -> master
[root@jenkins /opt/devops]# vim index.html
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m "v6"
[master a840fa7] v6
1 file changed, 1 insertion(+)
[root@jenkins /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 337 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
e746a8f..a840fa7 HEAD -> master
[root@jenkins /opt/devops]# vim index.html
[root@jenkins /opt/devops]# git add ./
[root@jenkins /opt/devops]# git commit -m "v7"
[master fd75b2e] v7
1 file changed, 1 insertion(+)
[root@jenkins /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 335 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
a840fa7..fd75b2e HEAD -> master
[root@jenkins /opt/devops]# git log
commit fd75b2ed1e3bff195f6c0356a117c903122d0b4e
Author: user1
Date: Thu Jul 2 23:35:58 2020 +0800
v7
commit a840fa7eaab4a05402781251f81dd5a7e0175af7
Author: user1
Date: Thu Jul 2 23:34:32 2020 +0800
v6
commit e746a8f8c98c769b6536f62f512c8f64288f05b3
Author: user1
Date: Thu Jul 2 23:31:36 2020 +0800
v5
回到v6版本
[root@jenkins /opt/devops]# git re
rebase relink repack request-pull revert
reflog remote replace reset
[root@jenkins /opt/devops]# git reset --hard HEAD^
HEAD is now at a840fa7 v6
[root@jenkins /opt/devops]# cat index.html

hello world!!


v222222222222


v333333333333


v444444444444


v555555555555


v666666666666


跨版本回滚
[root@jenkins /opt/devops]# git pull
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Updating a840fa7..fd75b2e
Fast-forward
index.html | 1 +
1 file changed, 1 insertion(+)
[root@jenkins /opt/devops]# cat index.html

hello world!!


v222222222222


v333333333333


v444444444444


v555555555555


v666666666666


v777777777777


查看commit id 号(全局唯一不重复)
[root@jenkins /opt/devops]# git log
commit fd75b2ed1e3bff195f6c0356a117c903122d0b4e #这就是ID号
Author: user1
Date: Thu Jul 2 23:35:58 2020 +0800
比如回滚到zookeeper
[root@jenkins /opt/devops]# git reset --hard e7712c
HEAD is now at e7712c3 zookeeper.cnf
查看commit ID号的命令还有一个git reflog (更加详细)
[root@jenkins /opt/devops]# git reflog
e7712c3 HEAD@{0}: reset: moving to e7712c
fd75b2e HEAD@{1}: pull: Fast-forward
a840fa7 HEAD@{2}: reset: moving to HEAD^
fd75b2e HEAD@{3}: commit: v7
a840fa7 HEAD@{4}: commit: v6
e746a8f HEAD@{5}: commit: v5
e7712c3 HEAD@{6}: commit: zookeeper.cnf
4bae31f HEAD@{7}: clone: from http://10.4.7.56/magedu/devops.git


  1. 分支相关命令

git branch #查看当前所处的分支
git branch develop #创建新分支
git checkout -b develop #创建并切换到一个新分支
git checkout develop #切换分支
git branch -d 分支名 #删除本地已经合并了的分支.
git branch –D 分支名 #删除本地未合并的分支
git push origin –delete 分支名 #要删除服务器远端的分支。
查看当前分支
[root@jenkins /opt/devops]# git branch
* master
创建分支
[root@jenkins /opt/devops]# git checkout -b develop
Switched to a new branch ‘develop‘
切换分支
[root@jenkins /opt/devops]# git checkout develop
Switched to branch ‘develop‘
常见的分支结构: 单分支模型:只有master分支
生产/开发模型:master分支与develop类型分支
特性/发布模型:master/develop/feature类型分支
开发/发布/分离模型:master/develop/feature/release类型分支
开发/发布/缺陷分离模型:master/develop/feature/release/hotfix类型分支

8 git分支合并

换一台虚拟主机做测试:
[root@db03 /opt]# cd /opt/
[root@db03 /opt]# yum install git -y
clone指定分支:-b 分支名
[root@db03 /opt]# git clone -b develop http://10.4.7.56/magedu/devops.git
Cloning into ‘devops‘...
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
remote: Enumerating objects: 35, done.
remote: Counting objects: 100% (35/35), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 35 (delta 8), reused 25 (delta 5)
Unpacking objects: 100% (35/35), done.
[root@db03 /opt/devops]# git branch
* develop
[root@db03 /opt/devops]# vim index.html
[root@db03 /opt/devops]# cat index.html

hello world!!


v222222222222


v333333333333


v444444444444


v555555555555


v666666666666


v777777777777


v888888888888

#加这么一行
[root@db03 /opt/devops]# git config --global user.name ‘user1‘
[root@db03 /opt/devops]# git config --global user.email ‘user1@163.com‘
[root@db03 /opt/devops]# git config --global push.default current
添加代码到暂存区
[root@db03 /opt/devops]# git add ./
提交代码
[root@db03 /opt/devops]# git commit -m "v9"
[develop 7755ca9] v9
1 file changed, 1 insertion(+)
提交代码到远程仓库
[root@db03 /opt/devops]# git push
Username for ‘http://10.4.7.56‘: zhangxiaoming
Password for ‘http://zhangxiaoming@10.4.7.56‘:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 339 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote:
remote: To create a merge request for develop, visit:
remote: http://10.4.7.56/magedu/devops/merge_requests/new?merge_request%5Bsource_branch%5D=develop
remote:
To http://10.4.7.56/magedu/devops.git
fd75b2e..7755ca9 HEAD -> develop
换一台主机或者在Windows上将最新的的代码pull到本地
小黄人@LAPTOP-FSRNDRDD MINGW64 /f/gittest/devops (master)
$ git pull
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 12 (delta 3), reused 0 (delta 0)
Unpacking objects: 100% (12/12), done.
From http://10.4.7.56/magedu/devops
e7712c3..fd75b2e master -> origin/master
* [new branch] develop -> origin/develop
Updating e7712c3..fd75b2e
Fast-forward
index.html | 3 +++
1 file changed, 3 insertions(+)
分支合并
小黄人@LAPTOP-FSRNDRDD MINGW64 /f/gittest/devops (master)
$ git merge origin/develop
Updating fd75b2e..7755ca9
Fast-forward
index.html | 1 +
1 file changed, 1 insertion(+)
上传远程仓库
小黄人@LAPTOP-FSRNDRDD MINGW64 /f/gittest/devops (master)
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To http://10.4.7.56/magedu/devops.git
fd75b2e..7755ca9 master -> master

技术图片
分支版本已经合并master分支

除了在本地合并外,还可以在web页面合并(生产常用)
开发申请合并
技术图片
技术图片
技术图片
技术图片
技术图片
项目负责人登录web合并分支
技术图片
技术图片
合并分支成功





























推荐阅读
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 阿里巴巴DevOps实践指南 | 云端开发
    开发者工具打造围绕开发者全生命周期的工具产品https:developer.aliyun.comtool?spma1z389.11499242.0.0.654524137BG3J ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
author-avatar
_我是谁谁谁__950
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有