<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[num197的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/num197</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; num197]]></copyright><item><title><![CDATA[算法学习（1）递归]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80685975</link><guid>https://blog.youkuaiyun.com/num197/article/details/80685975</guid><author>num197</author><pubDate>Wed, 13 Jun 2018 22:12:19 +0800</pubDate><description><![CDATA[一. 引子

　　 大师 L. Peter Deutsch 说过：To Iterate is Human, to Recurse, Divine.中文译为：人理解迭代，神理解递归。毋庸置疑地，递归确实是一个奇妙的思维方式。对一些简单的递归问题，我们总是惊叹于递归描述问题的能力和编写代码的简洁，但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。在正式介绍递归之前，我们首先...]]></description><category></category></item><item><title><![CDATA[MySql 学习（4）Linux MySql 开启远程服务]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80669460</link><guid>https://blog.youkuaiyun.com/num197/article/details/80669460</guid><author>num197</author><pubDate>Tue, 12 Jun 2018 18:35:44 +0800</pubDate><description><![CDATA[1.MySql设授权远程访问 

（1）使用mysql -u root -p登录mysql 


（2）使用mysql数据库（真正的数据库，而非数据库软件），将所有数据库的所有表（.）的所有权限（all privileges），授予通过任何ip（%）访问的root用户，密码为123456，最后刷新（flush privileges）即可。 


2、防火墙开放3306端口

查看firewalld...]]></description><category></category></item><item><title><![CDATA[MySql 学习（3）Linux MySql 常用操作]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80667663</link><guid>https://blog.youkuaiyun.com/num197/article/details/80667663</guid><author>num197</author><pubDate>Tue, 12 Jun 2018 16:43:36 +0800</pubDate><description><![CDATA[1、添加环境变量 
[root@localhost ~]# vi /etc/profile

 export MYSQL_HOME=/usr/local/mysql
 export PATH=$PATH:$MYSQL_HOME/bin


2、系统服务

# chkconfig --list        列出所有系统服务
# chkconfig --list | grep on     列出所有...]]></description><category></category></item><item><title><![CDATA[MySql 学习（2）rpm MySql 安装目录]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80667306</link><guid>https://blog.youkuaiyun.com/num197/article/details/80667306</guid><author>num197</author><pubDate>Tue, 12 Jun 2018 16:26:49 +0800</pubDate><description><![CDATA[1、RPM MySql 安装目录 
MySQL安装完成后不象SQL Server默认安装在一个目录，它的数据库文件、配置文件和命令文件分别在不同的目录，了解这些目录非常重要，尤其对于Linux的初学者，因为 Linux本身的目录结构就比较复杂，如果搞不清楚MySQL的安装目录那就无从谈起深入学习。下面就介绍一下这几个目录。 
  1）、数据库目录 
  /var/lib/mysql/ 
  2）、...]]></description><category></category></item><item><title><![CDATA[MySql 学习（1）CentOS7 安装MySql5.7]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80666566</link><guid>https://blog.youkuaiyun.com/num197/article/details/80666566</guid><author>num197</author><pubDate>Tue, 12 Jun 2018 15:52:23 +0800</pubDate><description><![CDATA[1、载并安装MySQL官方的 Yum Repository   

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 
 
使用上面的命令就直接下载了安装用的Yum Repository，大概25KB的样子，然后就可以直接yum安装了。 
[root@localhost ~]# yum -...]]></description><category></category></item><item><title><![CDATA[SQL Server数据库性能优化（1）T-SQL]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80488594</link><guid>https://blog.youkuaiyun.com/num197/article/details/80488594</guid><author>num197</author><pubDate>Mon, 28 May 2018 20:57:43 +0800</pubDate><description><![CDATA[1. Select 语句的性能 
1）只查询需要的字段，避免使用Select *。 
 只查询需要的字段，可以避免许多不必要的IO。 
 减少字段的输出，可以更有效地利用覆盖索引。 
2）限定查询结果集的数量。 
使用TOP字句等限制结果集的大小，可以避免批量数据的操作，并且有效地使用索引，防止扫描操作带来的大量IO和内存的使用。 
3）尽量地使用有效的索引 
当需要对数据进行行过滤的时候，应该优...]]></description><category></category></item><item><title><![CDATA[C# 基础 (3) 垃圾回收机制（Garbage Collector）]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80344624</link><guid>https://blog.youkuaiyun.com/num197/article/details/80344624</guid><author>num197</author><pubDate>Wed, 16 May 2018 23:19:20 +0800</pubDate><description><![CDATA[一、GC的前世与今生

虽然本文是以.net作为目标来讲述GC，但是GC的概念并非才诞生不久。早在1958年，由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能，这是GC的第一次出现。Lisp的程序员认为内存管理太重要了，所以不能由程序员自己来管理。但后来的日子里Lisp却没有成气候，采用内存手动管理的语言占据了上风，以C为代表。出于同样的理由，不同的人却又...]]></description><category></category></item><item><title><![CDATA[C# 基础 (2) 堆与栈]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80343513</link><guid>https://blog.youkuaiyun.com/num197/article/details/80343513</guid><author>num197</author><pubDate>Wed, 16 May 2018 21:38:20 +0800</pubDate><description><![CDATA[一、值类型与引用类型的存储方式：

引用类型：引用类型存储在堆中。类型实例化的时候，会在堆中开辟一部分空间存储类的实例。类对象的引用还是存储在栈中。

值类型：值类型总是分配在它声明的地方，做为局部变量时，存储在栈上；类对象的字段时，则跟随此类存储在堆中。

我们再看看引用类型和值类型的内存分配情况（我们对着代码与图看） 
示列代码： 
 
内存分布情况： 


从上面两张图我们可以看出： 
1）...]]></description><category></category></item><item><title><![CDATA[C# 基础 (1) 值类型和引用类型]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80343048</link><guid>https://blog.youkuaiyun.com/num197/article/details/80343048</guid><author>num197</author><pubDate>Wed, 16 May 2018 21:07:01 +0800</pubDate><description><![CDATA[1.值类型(ValueType)

值类型包括：数值类型，结构体，bool型，用户定义的结构体，枚举，可空类型。 
值类型的变量直接存储数据，分配在托管栈中。变量会在创建它们的方法返回时自动释放，例如在一个方法中声明Char型的变量name=’C’，当实例化它的方法结束时，name变量在栈上占用的内存就会自动释放 
C#的所有值类型均隐式派生自System.ValueType。

结构体：stru...]]></description><category></category></item><item><title><![CDATA[C# 多线程（4）Task的使用]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80320819</link><guid>https://blog.youkuaiyun.com/num197/article/details/80320819</guid><author>num197</author><pubDate>Tue, 15 May 2018 11:47:02 +0800</pubDate><description><![CDATA[一、Task的机制

在C#4.0之前需要执行一个复杂的异步操作时，只能使用CLR线程池技术来执行一个任务。线程池执行异步任务时,不知道任务何时完成,以及任务的在任务完成后不能获取到返回值。但是在C#4.0中引人了一个的任务（System.Threading.Tasks命名空间的类型）机制来解决异步操作完成时间和完成后返回值的问题。

其实现机制大致类似于线程池ThreadPool，不过对于Thr...]]></description><category></category></item><item><title><![CDATA[C# 多线程（3）CLR线程池]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80315328</link><guid>https://blog.youkuaiyun.com/num197/article/details/80315328</guid><author>num197</author><pubDate>Mon, 14 May 2018 21:10:42 +0800</pubDate><description><![CDATA[一、关于CLR线程池

使用ThreadStart与ParameterizedThreadStart建立新线程非常简单，但通过此方法建立的线程难于管理，若建立过多的线程反而会影响系统的性能。 
有见及此，.NET引入CLR线程池这个概念。CLR线程池并不会在CLR初始化的时候立刻建立线程，而是在应用程序要创建线程来执行任务时，线程池才初始化一个线程。线程的初始化与其他的线程一样。在完成任务以后，该...]]></description><category></category></item><item><title><![CDATA[C# 多线程（2）多线程同步]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80312998</link><guid>https://blog.youkuaiyun.com/num197/article/details/80312998</guid><author>num197</author><pubDate>Mon, 14 May 2018 17:56:01 +0800</pubDate><description><![CDATA[我们在编程的时候，有时会使用多线程来解决问题，比如你的程序需要在后台处理一大堆数据，但还要使用户界面处于可操作状态；或者你的程序需要访问一些外部资源如数据库或网络文件等。这些情况你都可以创建一个子线程去处理，然而，多线程不可避免地会带来一个问题，就是线程同步的问题。如果有多个线程同时访问共享数据的时候，就必须要用线程同步，防止共享数据被破坏。如果多个线程不会同时访问共享数据，可以不用线程同步。如果...]]></description><category></category></item><item><title><![CDATA[C# 多线程（1）多线程基础]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80307592</link><guid>https://blog.youkuaiyun.com/num197/article/details/80307592</guid><author>num197</author><pubDate>Mon, 14 May 2018 11:39:37 +0800</pubDate><description><![CDATA[一、基本概念

进程（Process）是Windows系统中的一个基本概念，它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程，进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元，在进程中可以有多个线程同时执行代码。进程之间是相对独立的，一个进程无法访问另一个进程的数据（除非利用分布式计算方式），一个进程运行的失败也不会影响其他进程的运行，Windo...]]></description><category></category></item><item><title><![CDATA[设计模式-（9）桥接模式（Bridge Pattern）]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80300540</link><guid>https://blog.youkuaiyun.com/num197/article/details/80300540</guid><author>num197</author><pubDate>Sun, 13 May 2018 16:47:25 +0800</pubDate><description><![CDATA[一、引言 
这里以电视遥控器的一个例子来引出桥接模式解决的问题，首先，我们每个牌子的电视机都有一个遥控器，此时我们能想到的一个设计是——把遥控器做为一个抽象类，抽象类中提供遥控器的所有实现，其他具体电视品牌的遥控器都继承这个抽象类，具体设计类图如下：



这样的实现使得每部不同型号的电视都有自己遥控器实现，这样的设计对于电视机的改变可以很好地应对，只需要添加一个派生类就搞定了，但随着时间的推移，...]]></description><category></category></item><item><title><![CDATA[设计模式-（8）适配器模式（Adapter Pattern）]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80300251</link><guid>https://blog.youkuaiyun.com/num197/article/details/80300251</guid><author>num197</author><pubDate>Sun, 13 May 2018 16:24:03 +0800</pubDate><description><![CDATA[一、引言 
在实际的开发过程中，由于应用环境的变化（例如使用语言的变化），我们需要的实现在新的环境中没有现存对象可以满足，但是其他环境却存在这样现存的对象。那么如果将“将现存的对象”在新的环境中进行调用呢？解决这个问题的办法就是我们本文要介绍的适配器模式——使得新环境中不需要去重复实现已经存在了的实现而很好地把现有对象（指原来环境中的现有对象）加入到新环境来使用。

二、适配器模式的详细介绍

2...]]></description><category></category></item><item><title><![CDATA[设计模式-（7）原型模式 （Prototype Pattern）]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80299951</link><guid>https://blog.youkuaiyun.com/num197/article/details/80299951</guid><author>num197</author><pubDate>Sun, 13 May 2018 15:58:23 +0800</pubDate><description><![CDATA[一、引言 
在软件系统中，当创建一个类的实例的过程很昂贵或很复杂，并且我们需要创建多个这样类的实例时，如果我们用new操作符去创建这样的类实例，这未免会增加创建类的复杂度和耗费更多的内存空间，因为这样在内存中分配了多个一样的类实例对象，然后如果采用工厂模式来创建这样的系统的话，随着产品类的不断增加，导致子类的数量不断增多，反而增加了系统复杂程度，所以在这里使用工厂模式来封装类创建过程并不合适，然而...]]></description><category></category></item><item><title><![CDATA[设计模式-（6）建造者模式（Builder Pattern）]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80293085</link><guid>https://blog.youkuaiyun.com/num197/article/details/80293085</guid><author>num197</author><pubDate>Sat, 12 May 2018 17:08:54 +0800</pubDate><description><![CDATA[一、引言 
　　在软件系统中，有时需要创建一个复杂对象，并且这个复杂对象由其各部分子对象通过一定的步骤组合而成。例如一个采购系统中，如果需要采购员去采购一批电脑时，在这个实际需求中，电脑就是一个复杂的对象，它是由CPU、主板、硬盘、显卡、机箱等组装而成的，如果此时让采购员一台一台电脑去组装的话真是要累死采购员了，这里就可以采用建造者模式来解决这个问题，我们可以把电脑的各个组件的组装过程封装到一个建...]]></description><category></category></item><item><title><![CDATA[设计模式-（5）抽象工厂模式（Abstract Factory Pattern）]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80292043</link><guid>https://blog.youkuaiyun.com/num197/article/details/80292043</guid><author>num197</author><pubDate>Sat, 12 May 2018 15:44:12 +0800</pubDate><description><![CDATA[一、引言 
在上一专题中介绍了工厂方法模式，工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码，而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中，一个工厂只创建单个产品这样的例子很少，因为现在的工厂都多元化了，一个工厂创建一系列的产品，如果我们要设计这样的系统时，工厂方法模式显然在这里不适用，然后...]]></description><category></category></item><item><title><![CDATA[设计模式-（4）工厂方法模式（Factory Method Pattern）]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80290146</link><guid>https://blog.youkuaiyun.com/num197/article/details/80290146</guid><author>num197</author><pubDate>Sat, 12 May 2018 11:50:25 +0800</pubDate><description><![CDATA[一、引言 
　　在简单工厂模式中讲到简单工厂模式的缺点，有一点是——简单工厂模式系统难以扩展，一旦添加新产品就不得不修改简单工厂方法，这样就会造成简单工厂的实现逻辑过于复杂，然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题，下面就具体看看工厂模式是如何解决该问题的。

二、工厂方法模式的实现 
　　工厂方法模式之所以可以解决简单工厂的模式，是因为它的实现把具体产品的创建推迟到子类中...]]></description><category></category></item><item><title><![CDATA[设计模式-（3）简单工厂模式（Simple Factory Pattern）]]></title><link>https://blog.youkuaiyun.com/num197/article/details/80287273</link><guid>https://blog.youkuaiyun.com/num197/article/details/80287273</guid><author>num197</author><pubDate>Fri, 11 May 2018 22:18:06 +0800</pubDate><description><![CDATA[在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”，不仅是一个操作，像一部...]]></description><category></category></item></channel></rss>