当前位置: 首页 > 编程日记 > 正文

Docker最全教程——从理论到实战(六)

Docker最全教程——从理论到实战(六)
原文:Docker最全教程——从理论到实战(六)

托管到腾讯云容器服务

托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅。

自建还是托管?

在开始之前,我们先来讨论一个问题——是自建容器服务还是托管到云容器服务?
这里笔者建议大家托管到云容器服务。对于中小团队来说,很多情况下,团队中的运维人员是缺失的,或者运维人员的水平非常有限——大部分比网吧的网管就好那么一点,从成本、安全(云端产品往往提供了一些解决方案,比如权限控制、灾备、高可用、数据加密等)、扩展性的角度,使用云容器服务更加靠谱和省事,而且是可以直接开箱即用的(可以直接跳过自建的初始化时间)。而且随着生产力的继续发展,人的成本一定会越来越高于机器的成本,而且目前已经是远远高于机器的成本了。因此,如何选择,大家是否心中有数了呢?
接下来,我们结合官方资料进行一定的对比:

腾讯云容器服务TKE对比自建容器服务

优势
腾讯云容器服务(TKE)
自建容器服务
简单易用
简化集群管理
腾讯云容器服务提供超大规模容器集群管理、资源调度、容器编排、代码构建,屏蔽了底层基础构架的差异,简化了分布式应用的管理和运维,您无需再操作集群管理软件或设计容错集群架构,因此也无需参与任何相关的管理或扩展工作。
您只需启动容器集群,并指定想要运行的任务即可,腾讯云容器服务帮您完成所有的集群管理工作,让您可以集中精力开发 Docker 化的应用程序。
自建容器管理基础设施通常涉及安装、操作、扩展自己的集群管理软件、配置管理系统和监控解决方案,管理复杂。
灵活扩展
灵活集群托管,集成负载均衡
您可以使用容器服务灵活安排长期运行的应用程序和批量作业。您还可以使用 API 获得最新的集群状态信息,以便集成您自己的自定义计划程序和第三方计划程序。
腾讯云容器服务与负载均衡集成,支持在多个容器之间分配流量。您只需指定容器配置和要使用的负载均衡器,容器服务管理程序将自动添加和删除。另外腾讯云容器服务可以自动恢复运行状况不佳的容器,保证容器数量满足您的需求,以便为应用程序提供支持。
需要根据业务流量情况和健康情况人工确定容器服务的部署,可用性和可扩展性差
安全可靠
资源高度隔离,服务高可用
容器服务在您自己的云服务器实例中启动,不与其他客户共享计算资源。
您的集群在私有网络中运行,因此您可以使用您自己的安全组和网络 ACL,这些功能为您提供了高隔离水平,并帮助您使用云服务器构建高度安全可靠的应用程序。
容器服务采用分布式服务架构,保证服务的故障自动恢复、快速迁移;结合有状态服务后端的分布式存储,实现服务和数据的安全、高可用。
自建容器服务因其内核问题及 Namespace 不够完善,租户、设备、内核模块隔离性都比较差
高效
镜像快速部署,业务持续集成
腾讯云容器服务运行在您的私有网络中,高品质的 BGP 网络保证镜像极速上传下载,轻松支持海量容器秒级启动,极大程度降低了运行开销,使您的部署更加专注于业务运行。
您可以在腾讯云容器服务上部署业务,开发人员在 GitHub 或其他代码平台提交代码后,容器服务可立即进行构建、测试、打包集成,将集成的代码部署到预发布环境和现网环境上。
自建容器服务的网络无保证,因此无法保证使用镜像创建容器的效率
低成本
容器服务免费腾讯云容器服务没有任何附加费用,您可以在容器中免费调用 API 构建您的集群管理程序。您只需为您创建的用于存储和运行应用程序的云服务资源(例如云服务器、云硬盘等)付费。
需要投入资金构建、安装、运维、扩展自己的集群管理基础设施,成本开销大

腾讯云容器服务TKE监控与自建容器监控对比

腾讯云容器服务监控为容器集群、服务、实例提供数据收集和数据展示功能。使用容器服务监控,您可以查看集群、节点、服务、实例,容器近 30 个指标的监控统计数据,验证集群是否正常运行并创建相应告警,监控指标覆盖面全,并且在持续增加中。具体如下所示:
优势
腾讯云容器服务(TKE)
自建容器服务
指标完整
涉及到集群,服务,容器,pod 近 30 个指标
指标不完整,很多需要开发
搭建成本低
创建集群时自带
人工搭建,成本高
运维成本低
平台助力运维,保证数据准确性
人工维护
存储成本低
每个指标免费保存 3 个月数据
根据存储大小计算
扩展性高
平台侧会不断完善和增加新的指标项
需要技术人员大量投入开发新指标
告警
问题排查手段
控制台可以方便查看容器 log, 并与 webshell 结合一键登录容器快速排查问题
需要手动登录到容器或者机器排查

关于腾讯云容器服务

在使用云端产品时,我们需要先了解该产品。
腾讯云容器服务(Tencent Kubernetes Engine,即TKE)为用户解决容器集群的搭建以及运维管理工作,无缝衔接了腾讯云的计算、网络、存储、监控、安全能力,帮助用户升级开发模式、变更应用交付、重构数据管理方式。腾讯云容器服务提速应用部署、简化集群管理,助力企业快速上云。
了解腾讯云容器服务,会涉及到以下概念:
  • 集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等腾讯云资源。
  • 节点:一台已注册到集群内的云服务器。
  • 服务:由多个相同配置的容器和访问这些容器的规则组成的微服务。
  • 镜像Docker镜像,用于部署容器服务,每个镜像有特定的唯一标识(镜像的Registry地址+镜像名称+镜像Tag)。
腾讯自今年起,对腾讯云投入了大量的资源,并且给予了前所未有的重视和支持。笔者前不久受邀参与了腾讯云TKE专场技术交流会,这里分享几张照片给大家:

腾讯与容器服务

腾讯在很早的时候就已经开始使用容器服务了,并且根据内部消息透露,腾讯的新业务基本上均使用容器服务进行托管,而旧有业务也在逐步迁移到容器服务之中。比如大家所熟悉的LOL(英雄联盟),就使用了大量的容器实例用于构建和托管相关服务。
众所周知,一个复杂游戏的构建是非常不容易的。英雄联盟的构建包含了超过150个独立的任务,需要构建每个英雄联盟的特征。而构建包括各种形式和尺寸,从传统的调试构建到各种形式的未来内容构建,还包括全球合作者,如腾讯(Tencent)和竞舞台(Garena)。单单完成构建,就使用超过了450台虚拟机!后续改为使用Docker之后,构建的成本的降低大大提高了团队的迭代速度。当然,中间也出现过许多问题,这些我们后续再讲述。本篇先行略过。

一般服务部署流程

为了让大家更好的理解和使用云端产品,这里我们结合腾讯云容器服务,根据日常情况下我们服务部署的情况,来讲解本流程。
在开始之前,有很多额外的初始步骤——比如注册、充值等等,这里笔者先行略过,本篇只围绕一般情况下服务部署到云端的配置和部署流程。因此,这里再强调下前提条件:
  1. 腾讯云账号正常并且资金足够,或者无门槛代金券充足,能够满足此次使用
  2. 本地服务镜像已经打包完毕(具体可以参阅之前的讲解)
  3. 您已经充分阅读了前面的教程,或者对容器服务已经比较了解
满足了以上的前提条件,对于一般情况下,服务托管到腾讯云,我们的主体流程如下所示:

创建集群和节点

集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等腾讯云资源;
节点:一台已注册到集群内的云服务器。
如果大家对此不是很好理解的话,这里笔者做一个比喻——集群就好比某款手游,节点就如同该手游的某个区,我们要玩游戏的话,是必须登录到某个区才能玩,就如同我们的服务实例,最终也是分布在各个节点上。
注意:集群创建完毕之后,可以添加已有的节点,也就是已购买的服务器,不过,操作系统必须一致!如果不一致,添加已有节点时可以自动重置该服务器的操作系统。
创建界面如下所示:
其中,如果CIDR显示冲突,我们就改到不冲突为止。
节点这块,大家可以选择购买新的主机或者选择已有主机,这里就不多介绍了。

创建命名空间和镜像

这里我们需要了解下镜像仓库。什么是镜像仓库?镜像仓库就是用于存放Docker镜像的仓库,而Docker镜像用于部署容器服务,每个镜像有特定的唯一标识(镜像的Registry地址+镜像名称+镜像Tag)。
除了Docker官方提供了Docker Hub官方镜像仓库之外,各大云厂商往往也提供了自己的镜像仓库,比如腾讯云的镜像仓库是TencentHub。如果我们要获得最佳的体验,那么使用云端产品时,我们建议将Docker镜像推送到该云产品的镜像仓库,这样镜像拉取的延迟更小,支持粒度以及可用性更高。
注意:此步骤不是必须的,使用云端产品,我们依然可以使用官方镜像和第三方公共镜像。
在本篇教程,我们讲解使用TencentHub,也就是腾讯云的镜像仓库。在容器服务的管理页,我们就可以看到入口:
首先,我们需要创建命名空间和镜像。这里,我们进入【我的镜像】页面,先来创建命名空间。

创建命名空间

命名空间的创建比较简单:
命名空间大家可以理解为目录或者前缀,起一定的分类和约束作用,大家可以使用公司的名称或者自己心中神往的词汇,只要易于理解就行。命名空间OK之后,我们就需要创建镜像:

创建镜像

新建页面如下所示:
整个创建过程其实和我们在Github上创建一个代码库非常类似,只是这里界面的呈现不够友好(先把产品经理打一顿)。我们在创建代码库的时候,也是需要填写路径(命名空间)和项目名称(镜像名称),如下所示:
通过代码库的类比,相信你能够更好的理解镜像仓库。

创建服务

镜像有了,那么接下来就可以创建服务了,相当于是把我们的代码丢到web服务器上跑起来。服务很易于理解,比如数据库服务、web服务等等。
腾讯云容器服务的创建过程如下所示:
  • 基本设置
服务名称、容器名称我们建议和镜像名称保持一致,由于有些命名约束,比如“.”需要改成“_” )。

  • 部署设置
我们推荐使用存活检查和就绪检查,启动延时最好不要设为0,实例数量大家可以根据需要改为自动调节,比如根据CPU的使用率来弹性扩展。

  • 访问设置
提供公网访问,端口可以设置成80。如果需要提供https,那么还需要开放443端口,对于某些仅需内网访问的服务,建议大家不要开启公网端口。
服务创建完成之后,我们希望镜像在推送之后,能够自动触发服务更新。因此,我们还需要配置镜像触发器。

配置镜像触发器

镜像触发器可以在每次生成新的Tag(镜像版本)时,自行执行动作,如:自动更新使用该镜像仓库的服务
我们可以通过【我的镜像】页面,点击刚添加的镜像名称,进入详情页,然后点击【触发器】tab页来打开触发器管理页面。

点击【添加触发器】按钮可以来创建触发器。相关配置如下所示:
我们需要选择对应的容器服务。我们推荐使用全部触发这个触发条件,大家也可以根据自己的需求设置指定Tag触发,比如针对生产、测试和开发环境。

推送镜像

触发器设置好了,也就是整个水管都铺设好了,只要打开水龙头就可以开闸放水了。对于我们这里,这个水指的就是镜像。我们只需将我们的镜像推送到腾讯云镜像仓库,即可自动完成整个服务部署流程。
镜像推送的方式有很多,比如通过CI工具构建和推送,也可以通过脚本来推送已有的镜像。这里,我们将介绍通过脚本来推送镜像。
核心脚本代码为:
docker login --username {用户名} --password {密码} ccr.ccs.tencentyun.com
docker push {镜像名称}:{镜像版本}
注意:ccr.ccs.tencentyun.com为腾讯仓库的地址。username为腾讯云账号Id,密码为仓库密码。
如果忘记密码,可以在此处重置:
Magicodes.Admin框架提供了腾讯云推送脚本,相关参数如下所示:
一般情况下,我们仅需提供默认的配置即可,即配置tencentyun.config即可:
镜像地址可以从腾讯云的【我的镜像】获取:

如果没有特殊的配置,我们仅需执行此脚本即可完成编译、运行单元测试、打包、生成镜像以及镜像推送的整个过程。编译的文件会放在tsoutputs目录,如下所示:
例如,我们可以执行以下命令来发布Host工程,也就是后台服务:
./build-with-tencentyun.ps1 -pushType HOST -debug true
如果需要传递相关应用的自定义设置,脚本这边也提供了对设置文件的支持,例如:
如果在编译前需要执行单元测试并通过之后才允许发布,脚本也提供了参数进行支持:
例如:
./build-with-tencentyun.ps1 -pushType HOST -debug true -runTest true

当单元测试失败时,脚本将终止执行:

除了使用脚本推送之外,我们还可以通过CI工具或者服务来完成自动构建和推送。在后续的章节,我们会进行讲述。

问题排查

将服务托管到云端时,我们可能会碰到一些问题。掌握一些手段或技巧,能够让我们更易于排查问题以及解决问题。

镜像拉取问题

目前腾讯云容器服务日志中不会打印镜像拉取失败的具体错误,如下图所示:
我们需要在服务器上拉取镜像来查看具体日志错误,比如执行以下命令:
sudo su
docker login --username {用户名} --password {密码} ccr.ccs.tencentyun.com
docker pull {镜像名称}

远程登录

在某些情况下,我们需要登录具体的容器实例来排查问题,这点,腾讯云是能够支持的:
登录之后,我们可以直接执行命令,比如执行dir命令列出所有的文件和目录:
我们也可以上传下载容器实例中的文件,如图所示:
通过文件助手,我们能够很方便的检查和修改实例中的配置文件,或者查看具体日志。这对于我们调测或者检查问题非常重要。
注意:使用文件助手上传下载文件时,注意加上当前工作目录路径,比如“/app/appsettings.json”。

利用容器服务日志

在开发过程中,容器服务实例可能经常会崩溃或者在运行中出现问题,一方面,我们可以记录相关日志或者将日志推送到日志服务,另一方面,我们强烈推荐大家利用好容器服务日志。
在前面的【控制台日志提供程序】章节,我们有详细讲解,配置了控制台日志提供程序之后,我们可以在容器服务实例中看到所有的日志,包括导致容器实例崩溃的日志,这点对于我们排错也非常重要——因为往往崩溃太快,有可能文件日志都来不及记录或者推送。

往期内容链接

Docker最全教程——从理论到实战(一)

Docker最全教程——从理论到实战(二)

Docker最全教程——从理论到实战(三)

Docker最全教程——从理论到实战(四)

Docker最全教程——从理论到实战(五)
posted on 2019-01-14 11:43 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10266005.html

相关文章:

c#中分割字符串的几种方法

第一种方法:打开vs.net新建一个控制台项目。然后在Main()方法下输入下面的程序。 string s"abcdeabcdeabcde"; string[] sArrays.Split(c); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果:ab deab deab de 我们看到了结果…

对相机所看的视角截屏保存为图片

对相机所看的视角截屏保存为图片&#xff1a; 1 using UnityEngine;2 using System.Collections;3 using UnityEngine.UI;4 /// <summary>5 /// 对相机截图6 /// </summary>7 public class Jietu : MonoBehaviour {8 9 public Camera camera; 10 Texture2D…

fsum函数测试以及分析

#include <stdio.h> #include <stdlib.h> #include <string.h>#define BUFSIZE 256//这是一句预定义&#xff0c;定义BUFSIZE的值是100&#xff0c;是缓冲空间的大小,作为数组的。int main(int argc, char *argv[]) //第一个int argc&#xff0c;是记录你输入…

oracle学习总结二(转义字符)

1、oracle 特殊字符 转义关键词&#xff1a; oracle 转义 环境&#xff1a;oracle 9i plsql在plsql里边执行:update userinfo set pageurlmyjsp?page1&pagesize10 where idtest这条sql语句往数据库的pageurl字段放进去了一…

C语言——冒泡法排序应用

#include <stdio.h> #include <stdlib.h> int main()/*有int main 就会有return 0;如果是void main ,就不用加上return 0了 */ {int i,j,temp;/*待会要用到&#xff0c;所以先定义,因为输入的都是整数&#xff0c;所以用int整数型*/int a[10];/*定义一个一维整型数…

2017 Multi-University Training Contest 3 hdu 6063

HDU 6063 思路&#xff1a; AC代码&#xff1a; #include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "m…

[学习]GridView 学习集合 -- GridView中使用超链接的技巧

GridView中使用超链接的技巧 数据绑定方式有两种&#xff0c;如下示例&#xff1a; Eval方式 &#xff1c;%# Eval("id") %&#xff1e; Bind方式 &#xff1c;%# Bind("id","~/info.aspx?id{0}") %&#xff1e; 推荐使用第一种方式&#xff0c…

C# http 性能优化500毫秒到 60 毫秒

来源&#xff1a;https://www.cnblogs.com/hnsongbiao/p/9815808.html 偶然发现 C# 的 HttpRequest 要比 Chrome 请求同一Url 慢好多。C# HttpRequest 要500毫秒 而Chrome 只需要 39ms。 后来 整理 各种方法做了优化 HttpWebRequest request WebRequest.Create(address) as H…

一个计算机高手的成长(转)

这些日子我一直在写一个实时操作系统内核&#xff0c;已有小成了&#xff0c;等写完我会全部公开&#xff0c;希望能 够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向 &#xff0c;所以把我的经历写出来与大家共勉&#xff0c;希望能给刚如行…

正则表达式整理

1.特殊字符 ^匹配输入字符串的开始位置$匹配输入字符串的结尾位置( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符&#xff0c;请使用 \( 和 \)。* 匹配前面的子表达式零次或多次。要匹配 * 字符&#xff0c;请使用 \*。匹配前面的子表达式一…

CSS-hover

1. padding:0 10px; 表示上下边距是0&#xff0c;左右边距是10. 2. padding:0 10px 0 10px&#xff1b; 上-右-下-左。&#xff08;顺时针方向&#xff09; 3. .pg-header .menu:hover&#xff1b; 表示只要鼠标移动到当前标签上时&#xff0c;就会应用这个下面所定义的样式。 …

Error原生类型

•表示错误对象 –EvalError, URIError, RangeError, etc. •捕获方式&#xff1a; –try { …throw new Error(…) } catch(e) { … } –理论上可以throw出任意对象 •Error对象IE和FireFox公有属性 –message&#xff1a;错误信息Error浏览器特定属性 •IE&#xff1a; –des…

求矩阵两条对角线元素之和

#include <stdio.h> #include <stdlib.h>int main() {int a[3][3];//定义一个二维数组&#xff0c;三行三列&#xff0c;a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2],a[3][0],a[3][1],a[3][2]int i,j,sum0;printf("请输入9个数据给数组赋值:\n");f…

关于Java中各种修饰符与访问修饰符的说明

关于Java中各种修饰符与访问修饰符的说明 类&#xff1a; 访问修饰符 修饰符 class 类名称extends 父类名称 implement 接口名称 &#xff08;访问修饰符与修饰符的位置可以互换&#xff09;访问修饰符 名称 说明 备注 public可以被所有类访问&#xff08;使用&#xff0…

buffer IO和direct IO

最近在看很多框架&#xff0c;redis&#xff0c;kafka等底层都涉及到文件IO操作的效率问题&#xff0c;所以查了些资料&#xff0c;看到这篇文章讲的比较明白些&#xff0c;贴出来留存。 链接地址&#xff1a; https://www.ibm.com/developerworks/cn/linux/l-cn-directio/转载…

python 列表使用

下面实现的类似于java中的数组&#xff1a; names[-2]表示实现倒数的第2个参数 names[-3,-1]表示实现-3到-1的值不包含-1 增删改查 下面代码实现列表的增删改查功能&#xff1a; 复制copy 深copy:这个可以copy全部的参数列表&#xff08;一般不用&#xff09;。 For循环打印列表…

c语言——求单词个数

#include <stdio.h> #include <stdlib.h>int main() {char str[20];//定义一个字符型一维数组&#xff0c;长度为20int i,num;printf("请输入一行英文:\n");//提示语句gets(str);//输入一个字符串给字符数组strnum str[0]! ? 1:0;//? : 是条件运算符…

C# 各种进制之间相互转换 [ZT]

MessageBox.Show(Convert.ToString(12345, 2)); //10进制转换为2进制MessageBox.Show(Convert.ToString(12345, 8)); //10进制转换为8进制MessageBox.Show(Convert.ToString(12345, 16)); //10进制转换为16进制MessageBox.Show(Convert.ToInt32("1100", 2).ToStri…

慕课《深入理解计算机系统》袁林枫老师章节测试1-9

1以下有关冯.诺依曼结构思想的叙述中&#xff0c;错误的是&#xff08; C &#xff09;。 A.计算机内部以二进制形式表示指令和数据 B.程序由指令构成&#xff0c;计算机能自动执行程序中一条一条指令 C.指令和数据都放在存储器中&#xff0c;两者在形式上有差别&#xff08…

WCF 和 ASP.NET Web API

地址&#xff1a;https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/wcf-and-aspnet-web-api WCF 是 Microsoft 为生成面向服务的应用程序而提供的统一编程模型。 借助这一模型&#xff0c;开发人员可以构建既能跨平台与现有投资集成又能与现有投资交互的安全、可靠的事务…

php中操作mysql的函数库

发现php中的mysql库是一个函数库 而不是一个类库 使用面向过程的形式组织。mysql_affected_rows -- 取得前一次 MySQL 操作所影响的记录行数 mysql_change_user -- 改变活动连接中登录的用户 mysql_client_encoding -- 返回字符集的名称 mysql_close -- 关闭 MySQL 连接 mysq…

Firetruck UVA - 208

DFS并查集 如果只用DFS的话会超时&#xff0c;用并查集剪枝&#xff0c;和起点终点不联通的点就不用跑了 这题有好多人写了博客&#xff0c;但是我觉得我的代码写的比较通俗易懂所以就贴上来了&#xff0c;我觉得我写代码的目标就是让任何人都能看懂&#xff0c;越小白越好&…

MCSE2003学习之三

安装&#xff37;&#xff29;&#xff2e; &#xff38;&#xff30;&#xff38;&#xff30;的系统中&#xff0c;&#xff13;&#xff12;位的系统最大支持的&#xff32;&#xff21;&#xff2d;为&#xff14;&#xff27;&#xff0c;而&#xff16;&#xff14;位的…

【LeetCode】230#二叉搜索树中第K小的元素

题目描述 给定一个二叉搜索树&#xff0c;编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明&#xff1a; 你可以假设 k 总是有效的&#xff0c;1 ≤ k ≤ 二叉搜索树元素个数。 示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 1 示例 2: 输入: root …

runaway深度递归函数测试及相关汇编指令

这是一个深度递归的例子。 #include <stdio.h> #include <stdlib.h>int recurse(int x) {int a[1<<15]; /* 4 * 2^15 64 KiB */printf("x %d. a at %p\n", x, a); a[0] (1<<14)-1;a[a[0]] x-1;if (a[a[0]] 0)return -1;return rec…

codeforce843B Interactive LowerBound

题意&#xff1a;交互式的题&#xff0c;给你n,s, x&#xff0c;链表元素有n个&#xff0c;开始的位置是s&#xff0c;每次询问输入数组的下标&#xff0c;可以知道对应链表上的数和链表下一个数的位置&#xff0c;只能询问2000次&#xff0c;要找到第一个大于等于x的数 题解&a…

[原]SSL 开发简述(Delphi)

一、 简介 现在网上有关SSL的资料较多的是基于VC开发&#xff0c;Delphi的SSL开发资源很少。 本文主要使用OpenSSL为基础&#xff0c;讲述SSL的有关开发流程。OpenSSL功能非常丰富&#xff0c;具体可以去她的官方网看看。可惜没有中文说明。 OpenSSL&#xff1a;htt…

如何每天自动备份 SourceSafe (转)

在Microsoft Visual SourceSafe中提到管理员应该每天或者至少每周备份一次SourceSafe中的内容。这里&#xff0c;我们利用现有的工具实现每天自动备份SourceSafe中的内容。<?XML:NAMESPACE PREFIX O />1. 用到的工具a. ssarc.exe. ssarc.exe是随着SourceSafe提供…

log.net的应用示例(日志)

log.net的应用很多朋友很清楚&#xff0c; 为了使不会用的朋友快速了解&#xff0c;这里我也搜了一些朋友的贴子http://blog.hnce.net/post/246.html后做如下示例&#xff0c;希望能对大家有所帮助&#xff1a; 示例如下&#xff1a; log4net的配置文件link Log4Net.config1&l…

H国的身份证号码(搜索)

个人心得&#xff1a;巧妙利用数字进行维护就好了&#xff0c;深搜还是有点心得的&#xff1b; #1558 : H国的身份证号码I 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 H国的身份证号码是一个N位的正整数(首位不能是0)。此外&#xff0c;由于防伪需要&#xff0c;一个N…