Go 语言实现并发爬虫

目的:

搜索CSDN博客,将搜索到博客,爬取博客名称、博客作者、博客链接、发布时间、阅读量。

输入搜索开始页码、结束页码,对每页搜索结果进行多协程爬取。

实现步骤:

1.  博客主页搜索“区块链”,点击第2页,跳转到第2页。得到搜索结果的第2页的网址 

https://so.csdn.net/so/search/s.do?p=2&q=%E5%8C%BA%E5%9D%97%E9%93%BE&t=blog&domain=&o=&s=&u=&l=&f=&rbg=0

2.找到搜索结果页码规律,p=2,替换2,就可以跳转到相应搜索结果页面。

3. 查看搜索页码的源码,用正则表达式,提取博客url。

4. 根据url,爬取博客详情,将爬取的结果用正则表达式,提取博客名称、博客作者、博客链接、发布时间、阅读量。

5.将爬取的每页的结果保存到一个文件中。

根据以上步骤,可将本程序代码,应用到其他网页。只要找到源码的规律,替换相关的url和正则表达式,即可爬取相关页码内容。

注意:go语言在实现高并发爬取时,要用到channel类型,是go非常特别的一种类型,类似管道,可以实现线程同步、线程间通信。双通道chan类型管道中无数据时会阻塞线程,所以可以监控页面是否爬取完成,页面爬取完成后在chan中放入数据,在主线程中迭代chan,直到全部页码爬取完成,程序结束。

代码如下:代码要从下开始往上看,执行顺序也是这样,执行步骤如上所述,注释也很清楚

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"regexp"
	"strconv"
	//	"strings"
)

//爬取博主名author,博客名title,博客地址blogSite,发布日期publishTime,浏览量browingTimes

//封装一个函数,爬取一页内容
func SpiderOnePage(url string) (result string, err error) {
	resp, err1 := http.Get(url)
	if err1 != nil {
		err = err1
		fmt.Println("http.Get err1 = ", err1)
		return
	}
	defer resp.Body.Close()

	//读取网页的内容
	buf := make([]byte, 4*1024)

	for {
		n, err2 := resp.Body.Read(buf)
		if n == 0 {
			//如果读取接收,直接break
			if err2 == io.EOF {
				break
				//如果是其他错误,就打印出来
			} else {
				fmt.Println("resp.Body.Read err2 = ", err2)
				break
			}
		}
		result += string(buf[:n]) //读取多少,写多少
	}

	return
}

//获取博客作者Id
func getAuthor(srcResult string) (author string) {
	//原文格式 var username = "ijxr1a64ji53l"
	re := regexp.MustCompile(`var username = "(?s:(.*?))"`)
	if re == nil {
		fmt.Println("regexp.MustCompile err")
	}
	tmpt := re.FindAllStringSubmatch(srcResult, 1)

	for _, data := range tmpt {
		author = data[1]
		break
	}
	return
}

//获取博客title
func getBlogTitle(blogResult string) (title string) {
	// 原文格式 【资讯】福布斯:旅行积分计划是区块链主要目标,对旅行者来说是好消息 - CSDN博客
	re := regexp.MustCompile(`(?s:(.*?)) -`)
	if re == nil {
		fmt.Println("regexp.MustCompile err")
	}
	tempTitle := re.FindAllStringSubmatch(blogResult, -1)

	//
	for _, data := range tempTitle {
		title = data[1]
		break
	}
	return

}

//获取博客发布时间
func getBlogPTime(blogResult string) (publishTime string) {
	//原文格式 <span class="link_postdate">2018年01月30日 16:14:25</span>
	re := regexp.MustCompile(`<span class="link_postdate">(?s:(.*?))</span`)
	if re == nil {
		fmt.Println("regexp.MustCompile err")
	}
	temp := re.FindAllStringSubmatch(blogResult, 1)

	for _, data := range temp {
		publishTime = data[1]
		//如果爬取到内容,则直接返回
		if publishTime != "" {
			return
		}
		break
	}

	//第二种原文格式 <span class="time">2018年01月12日 00:00:00</span>
	re1 := regexp.MustCompile(`<span class="time">(?s:(.*?))</span`)
	if re1 == nil {
		fmt.Println("regexp.MustCompile err")
	}
	temp1 := re1.FindAllStringSubmatch(blogResult, 1)
	var publishTime1 string

	for _, data1 := range temp1 {
		publishTime1 = data1[1]
		break
	}

	publishTime = publishTime + publishTime1

	return

}

//获取博客阅读次数
func getReadTimes(blogResult string) (readTimes string) {
	//原文格式 <span class="link_view" title="阅读次数">5485人阅读</span>
	re := regexp.MustCompile(`<span class="link_view" title="阅读次数">(?s:(.*?))人阅读</span`)
	if re == nil {
		fmt.Println("regexp.MustCompile err")
	}
	temp := re.FindAllStringSubmatch(blogResult, 1)

	for _, data := range temp {
		readTimes = data[1]
		if readTimes != "" {
			return
		}

		break
	}
	//原文原代码第二种格式 <i class="icon iconfont icon-read"></i><span class="txt">428</span></button></li>
	re1 := regexp.MustCompile(`<i class="icon iconfont icon-read"></i><span class="txt">(?s:(.*?))</span`)
	if re1 == nil {
		fmt.Println("regexp.MustCompile err")
	}
	temp1 := re1.FindAllStringSubmatch(blogResult, 1)
	var readTimes1 string
	for _, data1 := range temp1 {
		readTimes1 = data1[1]
		break
	}

	//如第一种匹配不到,则为空,两种格式的结果相加,得到最终结果
	readTimes = readTimes + readTimes1

	return
}

//获取具体博客页码结果
func getBlogResult(srcResult string) (result string) {
	//获取博客网址
	// <a href="https://blog.csdn.net/IJXR1A64JI53L/article/details/78047489"  target=
	re := regexp.MustCompile(`<a href="(?s:(.*?))"  target=`)
	if re == nil {
		fmt.Println("regexp.MustCompile err")
	}
	tmpt := re.FindAllStringSubmatch(srcResult, -1)

	for i, data := range tmpt {

		//按照获取的网址地址规律,取出i=1,4,7,...等的数据
		if i%3 == 1 {
			blogUrl := string(data[1])
			//			fmt.Printf("blogUrl #%d#= #%v#\n", i, blogUrl)
			//获取博客详情
			blogdetail, err := getBlogDetail(blogUrl)
			if err != nil {
				fmt.Println("getBlogDetail err=", err)
				return
			}
			if i > 28 {
				break
			}

			result += blogdetail + "\n"

			//分隔每个博客
			result += "----------------------------------------------------------\n\n"
		}
	}
	return
}

func getBlogDetail(blogUrl string) (blogDetail string, err error) {

	//获取具体博客页码结果
	blogPage, err2 := SpiderOnePage(blogUrl) //得到页面全部内容
	if err2 != nil {
		err = err2
		fmt.Println("blogResult SpiderOnePage(blogUrl) err2 = ", err2)
		return
	}

	//根据得到的页面全部内容,提取博客详情
	//获取博客title
	title := getBlogTitle(blogPage)
	//	fmt.Println("getBlogTitle title = ", title)
	blogDetail = "title=" + title + "\n"

	//获取博客作者Id
	author := getAuthor(blogPage)
	//	fmt.Printf("blogAuthor = #%v#\n", author)
	blogDetail += "author =" + author + "\n"

	blogDetail += "blogUrl =" + blogUrl + "\n"

	//获取博客发布时间
	publishTime := getBlogPTime(blogPage)
	//	fmt.Println("getBlog publishTime = ", publishTime)
	blogDetail += "publishTime =" + publishTime + "\n"

	//获取博客阅读量
	readTimes := getReadTimes(blogPage)
	//	fmt.Println("getBlog readTimes = ", readTimes)
	blogDetail += "readTimes =" + readTimes + "\n"

	return
}

//爬取博客内容,得到每一页的结果
func GetBlog(url string) (result string, err error) {
	//获取搜索的页面内容
	srcResult, err1 := SpiderOnePage(url)
	if err1 != nil {
		err = err1
		return
	}

	//爬取搜索的页面
	result = getBlogResult(srcResult)

	fmt.Println("getBlogResult result= \n", result)

	return
}

func SpiderPage(i int, page chan int) {
	//搜索返回得到的网址为三部分,中间部分为页码
	urlHead := "https://so.csdn.net/so/search/s.do?p="
	urlEnd := "&q=%E5%8C%BA%E5%9D%97%E9%93%BE&t=blog&domain=&o=&s=&u=&l=&f=&rbg=0"
	url := urlHead + strconv.Itoa(i) + urlEnd
	fmt.Println("url=", url)
	//爬取博客内容,得到每一页的结果
	result, err := GetBlog(url)
	if err != nil {
		fmt.Println("StartSpider err=", err)
		return
	}

	//把爬取的内容写入到文件

	fileName := "csdn区块链博客" + strconv.Itoa(i) + ".txt"
	f, err := os.Create(fileName)
	if err != nil {
		fmt.Println("os.Create err ", err)
		return
	}

	f.WriteString(result)
	defer f.Close()
	page <- i
}

//在csdn博客主页输入区块链,进行搜索
func StartSpider(startPage, endPage int) {
	//for循环,遍历每一页的地址
	page := make(chan int)
	for i := startPage; i <= endPage; i++ {
		go SpiderPage(i, page) //并发的爬取每一页内容
	}
	for i := startPage; i <= endPage; i++ {
		fmt.Printf("第%d个网页爬取完成\n", <-page)
	}

}

func main() {
	var startPage, endPage int
	fmt.Println("请输入爬取的第一页")
	fmt.Scan(&startPage)
	fmt.Println("请输入爬取的最后一页")
	fmt.Scan(&endPage)
	StartSpider(startPage, endPage)
}</code></pre> 
  <p><br></p> 
  <p>执行结果:</p> 
  <p>命令行输入开始和结束页码</p> 
  <p><a href="http://img.e-com-net.com/image/info8/e1e46b514eaa4e07bf5a15c139d044c6.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/e1e46b514eaa4e07bf5a15c139d044c6.png" alt="Go 语言实现并发爬虫_第1张图片" width="892" height="233" style="border:1px solid black;"></a><br></p> 
  <p>输出结果</p> 
  <p><a href="http://img.e-com-net.com/image/info8/3b0080a208274f3e82fdbde972935ac8.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/3b0080a208274f3e82fdbde972935ac8.png" alt="Go 语言实现并发爬虫_第2张图片" width="627" height="519" style="border:1px solid black;"></a><br></p> 
  <p><br></p> 
  <p>用Notepad++打开的爬取搜索第3页的结果:</p> 
  <p><a href="http://img.e-com-net.com/image/info8/120004bde6ad481799a642fb7cd2f615.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/120004bde6ad481799a642fb7cd2f615.png" alt="Go 语言实现并发爬虫_第3张图片" width="632" height="385" style="border:1px solid black;"></a><br></p> 
  <p><br></p> 
  <p><br></p> 
  <p>生成的文件:</p> 
  <p><a href="http://img.e-com-net.com/image/info8/875d755c68664a9ab1a83ade69462326.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/875d755c68664a9ab1a83ade69462326.jpg" alt="Go 语言实现并发爬虫_第4张图片" width="650" height="257" style="border:1px solid black;"></a><br></p> 
  <p><br></p> 
  <p>得到的结果为key-value结果,后续可将其储存到数据库,或者用其他方式调用。</p> 
  <p>后面将推出将爬取结果保存到数据库的博客。</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1292947114900398080"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Go)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1835504723210366976.htm"
                           title="第四天旅游线路预览——从换乘中心到喀纳斯湖" target="_blank">第四天旅游线路预览——从换乘中心到喀纳斯湖</a>
                        <span class="text-muted">陟彼高冈yu</span>
<a class="tag" taget="_blank" href="/search/%E5%9F%BA%E4%BA%8EGoogle/1.htm">基于Google</a><a class="tag" taget="_blank" href="/search/earth/1.htm">earth</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/%E7%9A%84%E6%97%85%E6%B8%B8%E8%A7%84%E5%88%92%E5%92%8C%E9%A2%84%E8%A7%88/1.htm">的旅游规划和预览</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a>
                        <div>第四天:从贾登峪到喀纳斯风景区入口,晚上住宿贾登峪;换乘中心有4路车,喀纳斯①号车,去喀纳斯湖,路程时长约5分钟;将上面的的行程安排进行动态展示,具体步骤见”Googleearthstudio进行动态轨迹显示制作过程“、“Googleearthstudio入门教程”和“Googleearthstudio进阶教程“相关内容,得到行程如下所示:Day4-2-480p</div>
                    </li>
                    <li><a href="/article/1835504470440636416.htm"
                           title="Goolge earth studio 进阶4——路径修改与平滑" target="_blank">Goolge earth studio 进阶4——路径修改与平滑</a>
                        <span class="text-muted">陟彼高冈yu</span>
<a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/earth/1.htm">earth</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E9%98%B6%E6%95%99%E7%A8%8B/1.htm">进阶教程</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a>
                        <div>如果我们希望在大约中途时获得更多的城市鸟瞰视角。可以将相机拖动到这里并创建一个新的关键帧。camera_target_clip_7EarthStudio会自动平滑我们的路径,所以当我们通过这个关键帧时,不是一个生硬的角度,而是一个平滑的曲线。camera_target_clip_8路径上有贝塞尔控制手柄,允许我们调整路径的形状。右键单击,我们可以选择“平滑路径”,这是默认的自动平滑算法,或者我们可</div>
                    </li>
                    <li><a href="/article/1835504218178416640.htm"
                           title="Google earth studio 简介" target="_blank">Google earth studio 简介</a>
                        <span class="text-muted">陟彼高冈yu</span>
<a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a>
                        <div>GoogleEarthStudio是一个基于Web的动画工具,专为创作使用GoogleEarth数据的动画和视频而设计。它利用了GoogleEarth强大的三维地图和卫星影像数据库,使用户能够轻松地创建逼真的地球动画、航拍视频和动态地图可视化。网址为https://www.google.com/earth/studio/。GoogleEarthStudio是一个基于Web的动画工具,专为创作使用G</div>
                    </li>
                    <li><a href="/article/1835503965563875328.htm"
                           title="python os.environ_python os.environ 读取和设置环境变量" target="_blank">python os.environ_python os.environ 读取和设置环境变量</a>
                        <span class="text-muted">weixin_39605414</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/os.environ/1.htm">os.environ</a>
                        <div>>>>importos>>>os.environ.keys()['LC_NUMERIC','GOPATH','GOROOT','GOBIN','LESSOPEN','SSH_CLIENT','LOGNAME','USER','HOME','LC_PAPER','PATH','DISPLAY','LANG','TERM','SHELL','J2REDIR','LC_MONETARY','QT_QPA</div>
                    </li>
                    <li><a href="/article/1835499681732456448.htm"
                           title="SQL Server_查询某一数据库中的所有表的内容" target="_blank">SQL Server_查询某一数据库中的所有表的内容</a>
                        <span class="text-muted">qq_42772833</span>
<a class="tag" taget="_blank" href="/search/SQL/1.htm">SQL</a><a class="tag" taget="_blank" href="/search/Server/1.htm">Server</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/sqlserver/1.htm">sqlserver</a>
                        <div>1.查看所有表的表名要列出CrabFarmDB数据库中的所有表(名),可以使用以下SQL语句:USECrabFarmDB;--切换到目标数据库GOSELECTTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWHERETABLE_TYPE='BASETABLE';对这段SQL脚本的解释:SELECTTABLE_NAME:这个语句的作用是从查询结果中选择TABLE_NAM</div>
                    </li>
                    <li><a href="/article/1835493374514262016.htm"
                           title="MongoDB Oplog 窗口" target="_blank">MongoDB Oplog 窗口</a>
                        <span class="text-muted">喝醉酒的小白</span>
<a class="tag" taget="_blank" href="/search/MongoDB/1.htm">MongoDB</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>在MongoDB中,oplog(操作日志)是一个特殊的日志系统,用于记录对数据库的所有写操作。oplog允许副本集成员(通常是从节点)应用主节点上已经执行的操作,从而保持数据的一致性。它是MongoDB副本集实现数据复制的基础。MongoDBOplog窗口oplog窗口是指在MongoDB副本集中,从节点可以用来同步数据的时间范围。这个窗口通常由以下因素决定:Oplog大小:oplog的大小是有限</div>
                    </li>
                    <li><a href="/article/1835484293607026688.htm"
                           title="【Git】常见命令(仅笔记)" target="_blank">【Git】常见命令(仅笔记)</a>
                        <span class="text-muted">好想有猫猫</span>
<a class="tag" taget="_blank" href="/search/Git/1.htm">Git</a><a class="tag" taget="_blank" href="/search/Linux%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">Linux学习笔记</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>文章目录创建/初始化本地仓库添加本地仓库配置项提交文件查看仓库状态回退仓库查看日志分支删除文件暂存工作区代码远程仓库使用`.gitigore`文件让git不追踪一些文件标签创建/初始化本地仓库gitinit添加本地仓库配置项gitconfig-l#以列表形式显示配置项gitconfiguser.name"ljh"#配置user.namegitconfiguser.email"123123@qq.c</div>
                    </li>
                    <li><a href="/article/1835483159630802944.htm"
                           title="nosql数据库技术与应用知识点" target="_blank">nosql数据库技术与应用知识点</a>
                        <span class="text-muted">皆过客,揽星河</span>
<a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a><a class="tag" taget="_blank" href="/search/nosql/1.htm">nosql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E9%9D%9E%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">非关系型数据库</a>
                        <div>Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)</div>
                    </li>
                    <li><a href="/article/1835476983614631936.htm"
                           title="Python开发常用的三方模块如下:" target="_blank">Python开发常用的三方模块如下:</a>
                        <span class="text-muted">换个网名有点难</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>Python是一门功能强大的编程语言,拥有丰富的第三方库,这些库为开发者提供了极大的便利。以下是100个常用的Python库,涵盖了多个领域:1、NumPy,用于科学计算的基础库。2、Pandas,提供数据结构和数据分析工具。3、Matplotlib,一个绘图库。4、Scikit-learn,机器学习库。5、SciPy,用于数学、科学和工程的库。6、TensorFlow,由Google开发的开源机</div>
                    </li>
                    <li><a href="/article/1835464504918503424.htm"
                           title="Java面试题精选:消息队列(二)" target="_blank">Java面试题精选:消息队列(二)</a>
                        <span class="text-muted">芒果不是芒</span>
<a class="tag" taget="_blank" href="/search/Java%E9%9D%A2%E8%AF%95%E9%A2%98%E7%B2%BE%E9%80%89/1.htm">Java面试题精选</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a>
                        <div>一、Kafka的特性1.消息持久化:消息存储在磁盘,所以消息不会丢失2.高吞吐量:可以轻松实现单机百万级别的并发3.扩展性:扩展性强,还是动态扩展4.多客户端支持:支持多种语言(Java、C、C++、GO、)5.KafkaStreams(一个天生的流处理):在双十一或者销售大屏就会用到这种流处理。使用KafkaStreams可以快速的把销售额统计出来6.安全机制:Kafka进行生产或者消费的时候会</div>
                    </li>
                    <li><a href="/article/1835451016456269824.htm"
                           title="MongoDB知识概括" target="_blank">MongoDB知识概括</a>
                        <span class="text-muted">GeorgeLin98</span>
<a class="tag" taget="_blank" href="/search/%E6%8C%81%E4%B9%85%E5%B1%82/1.htm">持久层</a><a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a>
                        <div>MongoDB知识概括MongoDB相关概念单机部署基本常用命令索引-IndexSpirngDataMongoDB集成副本集分片集群安全认证MongoDB相关概念业务应用场景:传统的关系型数据库(如MySQL),在数据操作的“三高”需求以及应对Web2.0的网站需求面前,显得力不从心。解释:“三高”需求:①Highperformance-对数据库高并发读写的需求。②HugeStorage-对海量数</div>
                    </li>
                    <li><a href="/article/1835449249425354752.htm"
                           title="Python算法L5:贪心算法" target="_blank">Python算法L5:贪心算法</a>
                        <span class="text-muted">小熊同学哦</span>
<a class="tag" taget="_blank" href="/search/Python%E7%AE%97%E6%B3%95/1.htm">Python算法</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/1.htm">贪心算法</a>
                        <div>Python贪心算法简介目录Python贪心算法简介贪心算法的基本步骤贪心算法的适用场景经典贪心算法问题1.**零钱兑换问题**2.**区间调度问题**3.**背包问题**贪心算法的优缺点优点:缺点:结语贪心算法(GreedyAlgorithm)是一种在每一步选择中都采取当前最优或最优解的算法。它的核心思想是,在保证每一步局部最优的情况下,希望通过贪心选择达到全局最优解。虽然贪心算法并不总能得到全</div>
                    </li>
                    <li><a href="/article/1835447985601867776.htm"
                           title="Mongodb Error: queryTxt ETIMEOUT xxxx.wwwdz.mongodb.net" target="_blank">Mongodb Error: queryTxt ETIMEOUT xxxx.wwwdz.mongodb.net</a>
                        <span class="text-muted">佛一脚</span>
<a class="tag" taget="_blank" href="/search/error/1.htm">error</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>背景每天都能遇到奇怪的问题,做个记录,以便有缘人能得到帮助!换了一台电脑开发nextjs程序。需要连接mongodb数据,对数据进行增删改查。上一台电脑好好的程序,新电脑死活连不上mongodb数据库。同一套代码,没任何修改,搞得我怀疑人生了,打开浏览器进入mongodb官网毫无问题,也能进入线上系统查看数据,网络应该是没问题。于是我尝试了一下手机热点,这次代码能正常跑起来,连接数据库了!!!是不</div>
                    </li>
                    <li><a href="/article/1835446560582889472.htm"
                           title="怎么做才能真正限制塑料袋的使用?" target="_blank">怎么做才能真正限制塑料袋的使用?</a>
                        <span class="text-muted">BalNews</span>

                        <div>Environmentalpollutionisalwaysamajorlivelihoodissue.Morethanadecadeago,ourgovernmenthadintroducedapolicyaboutrestrictionsontheuseofplasticbags,wecallitrestrictionsontheuseofplasticbags.Butmorethan10ye</div>
                    </li>
                    <li><a href="/article/1835443823287824384.htm"
                           title="Python实现下载当前年份的谷歌影像" target="_blank">Python实现下载当前年份的谷歌影像</a>
                        <span class="text-muted">sand&wich</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在GIS项目和地图应用中,获取最新的地理影像数据是非常重要的。本文将介绍如何使用Python代码从Google地图自动下载当前年份的影像数据,并将其保存为高分辨率的TIFF格式文件。这个过程涉及地理坐标转换、多线程下载和图像处理。关键功能该脚本的核心功能包括:坐标转换:支持WGS-84与WebMercator投影之间转换,以及处理中国GCJ-02偏移。自动化下载:多线程下载地图瓦片,提高效率。图像</div>
                    </li>
                    <li><a href="/article/1835443696431099904.htm"
                           title="笋丁网页自动回复机器人V3.0.0免授权版源码" target="_blank">笋丁网页自动回复机器人V3.0.0免授权版源码</a>
                        <span class="text-muted">希希分享</span>
<a class="tag" taget="_blank" href="/search/%E8%BD%AF%E5%B8%8C%E7%BD%9158soho_cn/1.htm">软希网58soho_cn</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81%E8%B5%84%E6%BA%90/1.htm">源码资源</a><a class="tag" taget="_blank" href="/search/%E7%AC%8B%E4%B8%81%E7%BD%91%E9%A1%B5%E8%87%AA%E5%8A%A8%E5%9B%9E%E5%A4%8D%E6%9C%BA%E5%99%A8%E4%BA%BA/1.htm">笋丁网页自动回复机器人</a>
                        <div>笋丁网页机器人一款可设置自动回复,默认消息,调用自定义api接口的网页机器人。此程序后端语言使用Golang,内存占用最高不超过30MB,1H1G服务器流畅运行。仅支持Linux服务器部署,不支持虚拟主机,请悉知!使用自定义api功能需要有一定的建站基础。源码下载:https://download.csdn.net/download/m0_66047725/89754250更多资源下载:关注我。安</div>
                    </li>
                    <li><a href="/article/1835420248484966400.htm"
                           title="非对称加密算法————RSA理论及详情" target="_blank">非对称加密算法————RSA理论及详情</a>
                        <span class="text-muted">hu19930613</span>

                        <div>转自:https://www.kancloud.cn/kancloud/rsa_algorithm/48484一、一点历史1976年以前,所有的加密方法都是同一种模式:(1)甲方选择某一种加密规则,对信息进行加密;(2)乙方使用同一种规则,对信息进行解密。由于加密和解密使用同样规则(简称"密钥"),这被称为"对称加密算法"(Symmetric-keyalgorithm)。这种加密模式有一个最大弱点</div>
                    </li>
                    <li><a href="/article/1835411371123109888.htm"
                           title="思考成长" target="_blank">思考成长</a>
                        <span class="text-muted">丁昆朋</span>

                        <div>这篇文章是加紧赶出来“应付”日更,一方面不想要再晚睡了;另一方面不想失去日更达人的称号,只能坐下来匆忙写下一点文字。既然标题是成长,先来总结一下这段时间的收获:1、整理箱子站着可以看电脑,坐着反而是一种享受,减少了坐着腰酸背痛的现象;2、使用讯飞输入法大大增加自己的输出量;3、Anaconda+“pythontutor.com"+Google算是简单入门python;4、英语的阅读文章能力、听力提</div>
                    </li>
                    <li><a href="/article/1835410918452850688.htm"
                           title="效率神器来了:AI工具手把手教你快速提升工作效能" target="_blank">效率神器来了:AI工具手把手教你快速提升工作效能</a>
                        <span class="text-muted">kkai人工智能</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%AA%92%E4%BD%93/1.htm">媒体</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a><a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</a>
                        <div>随着科技的进步,AI工具已经成为提升工作效率的关键手段。本文将介绍一些实用的AI工具和方法,帮助你自动化繁琐的重复性任务、优化数据管理、促进团队协作与沟通,并提升决策质量。背景:OOPAI-免费问答学习交流-GPT自动化重复性任务Zapier:Zapier可以自动化多个应用程序之间的工作流程。例如,它能自动将Gmail中的附件保存至GoogleDrive,或在你发布新文章时,自动分享至社交媒体平台</div>
                    </li>
                    <li><a href="/article/1835408447806468096.htm"
                           title="Ubuntu18.04 Docker部署Kinship(Django)项目过程" target="_blank">Ubuntu18.04 Docker部署Kinship(Django)项目过程</a>
                        <span class="text-muted">Dante617</span>

                        <div>1Docker的安装https://blog.csdn.net/weixin_41735055/article/details/1003551792下载镜像dockerpullprogramize/python3.6.8-dlib下载的镜像里包含python3.6.8和dlib19.17.03启动镜像dockerrun-it--namekinship-p7777:80-p3307:3306-p55</div>
                    </li>
                    <li><a href="/article/1835404621376483328.htm"
                           title="Golang语言基础知识点总结" target="_blank">Golang语言基础知识点总结</a>
                        <span class="text-muted">最帅猪猪侠</span>
<a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>Golang语言基础知识点小总结1.go语言有两大类型:值类型:数值类型,bool,string,数组,struct结构体变量直接存储值,内存通常在栈中分配,修改值,不会对源对象产生影响引用类型:指针,slice切片,管道chan,map,interface变量存储的是一个地址,这个地址对应的空间才真正存储数据值,内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾</div>
                    </li>
                    <li><a href="/article/1835404369252675584.htm"
                           title="Go语言基础总结" target="_blank">Go语言基础总结</a>
                        <span class="text-muted">Alice_小哪吒</span>
<a class="tag" taget="_blank" href="/search/Go%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">Go学习笔记</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>一、Go语言结构包声明引入包函数变量语句&表达式注释下面简单给出hello.go文件。packagesrc/*定义包名*/import"fmt"/*引入包*/funchello(){/*函数*/fmt.Println("Hello,World!")/*语句&表达式*/fmt.Println("菜鸟教程:runoob.com")}二、Go语言基础语法Go程序可以由多个标记构成。可以是关键字、标识符、</div>
                    </li>
                    <li><a href="/article/1835397938482868224.htm"
                           title="golang获取用户输入的几种方式" target="_blank">golang获取用户输入的几种方式</a>
                        <span class="text-muted">余生逆风飞翔</span>
<a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>一、定义结构体typeUserInfostruct{Namestring`json:"name"`Ageint`json:"age"`Addstring`json:"add"`}typeReturnDatastruct{Messagestring`json:"message"`Statusstring`json:"status"`DataUserInfo`json:"data"`}二、get请求的</div>
                    </li>
                    <li><a href="/article/1835395418381447168.htm"
                           title="【Golang】实现 Excel 文件下载功能" target="_blank">【Golang】实现 Excel 文件下载功能</a>
                        <span class="text-muted">RumIV</span>
<a class="tag" taget="_blank" href="/search/Golang/1.htm">Golang</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/excel/1.htm">excel</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在当今的网络应用开发中,提供数据导出功能是一项常见的需求。Excel作为一种广泛使用的电子表格格式,通常是数据导出的首选格式之一。在本教程中,我们将学习如何使用Go语言和GinWeb框架来创建一个Excel文件,并允许用户通过HTTP请求下载该文件。准备工作在开始之前,请确保您的开发环境中已经安装了Go语言和相关的开发工具。此外,您还需要安装GinWeb框架和excelize包,这两个包都将用于我</div>
                    </li>
                    <li><a href="/article/1835395039572881408.htm"
                           title="Dockerfile命令详解之 FROM" target="_blank">Dockerfile命令详解之 FROM</a>
                        <span class="text-muted">清风怎不知意</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8%E5%8C%96/1.htm">容器化</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>许多同学不知道Dockerfile应该如何写,不清楚Dockerfile中的指令分别有什么意义,能达到什么样的目的,接下来我将在容器化专栏中详细的为大家解释每一个指令的含义以及用法。专栏订阅传送门https://blog.csdn.net/qq_38220908/category_11989778.html指令不区分大小写。但是,按照惯例,它们应该是大写的,以便更容易地将它们与参数区分开来。(引用</div>
                    </li>
                    <li><a href="/article/1835394216155508736.htm"
                           title="8" target="_blank">8</a>
                        <span class="text-muted">冰鈊夢</span>

                        <div>transition动画transform.box{width:200px;height:200px;background-color:gold;margin:50pxauto0;transition:all1sease;}.box:hover{transform:translate(50px,50px);}.box2{width:200px;height:200px;background-col</div>
                    </li>
                    <li><a href="/article/1835391887482122240.htm"
                           title="golang 实现文件上传下载" target="_blank">golang 实现文件上传下载</a>
                        <span class="text-muted">wangwei830</span>
<a class="tag" taget="_blank" href="/search/go/1.htm">go</a>
                        <div>Gin框架上传下载上传(支持批量上传)httpRouter.POST("/upload",func(ctx*gin.Context){forms,err:=ctx.MultipartForm()iferr!=nil{fmt.Println("error",err)}files:=forms.File["fileName"]for_,v:=rangefiles{iferr:=ctx.SaveUplo</div>
                    </li>
                    <li><a href="/article/1835390122640633856.htm"
                           title="使用selenium调用firefox提示Profile Missing的问题解决" target="_blank">使用selenium调用firefox提示Profile Missing的问题解决</a>
                        <span class="text-muted">歪歪的酒壶</span>
<a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>在Ubuntu22.04环境中,使用python3运行selenium提示ProfileMissing,具体信息为:YourFirefoxprofilecannotbeloaded.Itmaybemissingorinaccessible在这个问题的环境中firefox浏览器工作正常。排查中,手动在命令行执行firefox可以打开浏览器,但是出现如下提示Gtk-Message:15:32:09.9</div>
                    </li>
                    <li><a href="/article/1835382938447998976.htm"
                           title="go基础知识归纳总结" target="_blank">go基础知识归纳总结</a>
                        <span class="text-muted">悟空丶123</span>
<a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>无缓冲的channel和有缓冲的channel的区别?在Go语言中,channel是用来在goroutines之间传递数据的主要机制。它们有两种类型:无缓冲的channel和有缓冲的channel。无缓冲的channel行为:无缓冲的channel是一种同步的通信方式,发送和接收必须同时发生。如果一个goroutine试图通过无缓冲channel发送数据,它会阻塞,直到另一个goroutine从该</div>
                    </li>
                    <li><a href="/article/1835382812061036544.htm"
                           title="golang实现从服务器下载文件到本地指定目录" target="_blank">golang实现从服务器下载文件到本地指定目录</a>
                        <span class="text-muted">余生逆风飞翔</span>
<a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>一、连接服务器,采用sftp连接模式packagemiddlewaresimport("fmt""time""github.com/pkg/sftp""golang.org/x/crypto/ssh")//建立服务器连接funcConnect(user,password,hoststring,portint)(*sftp.Client,error){var(auth[]ssh.AuthMethod</div>
                    </li>
                                <li><a href="/article/86.htm"
                                       title="linux系统服务器下jsp传参数乱码" target="_blank">linux系统服务器下jsp传参数乱码</a>
                                    <span class="text-muted">3213213333332132</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                                    <div>在一次解决乱码问题中, 发现jsp在windows下用js原生的方法进行编码没有问题,但是到了linux下就有问题, escape,encodeURI,encodeURIComponent等都解决不了问题 
但是我想了下既然原生的方法不行,我用el标签的方式对中文参数进行加密解密总该可以吧。于是用了java的java.net.URLDecoder,结果还是乱码,最后在绝望之际,用了下面的方法解决了</div>
                                </li>
                                <li><a href="/article/213.htm"
                                       title="Spring 注解区别以及应用" target="_blank">Spring 注解区别以及应用</a>
                                    <span class="text-muted">BlueSkator</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>1. @Autowired 
@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个UserDao类型的bean,或者不存在UserDao类型的bean,会抛出 BeanCreationException异常,这时可以通过在该属性上再加一个@Qualifier注解来声明唯一的id解决问题。 
  
2. @Qualifier 
当spring中存在至少一个匹</div>
                                </li>
                                <li><a href="/article/340.htm"
                                       title="printf和sprintf的应用" target="_blank">printf和sprintf的应用</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/sprintf/1.htm">sprintf</a><a class="tag" taget="_blank" href="/search/printf/1.htm">printf</a>
                                    <div><?php
printf('b: %b <br>c: %c <br>d: %d <bf>f: %f', 80,80, 80, 80);
echo '<br />';
printf('%0.2f <br>%+d <br>%0.2f <br>', 8, 8, 1235.456);

printf('th</div>
                                </li>
                                <li><a href="/article/467.htm"
                                       title="config.getInitParameter" target="_blank">config.getInitParameter</a>
                                    <span class="text-muted">171815164</span>
<a class="tag" taget="_blank" href="/search/parameter/1.htm">parameter</a>
                                    <div>web.xml 
 
 <servlet>
  	<servlet-name>servlet1</servlet-name>
  	<jsp-file>/index.jsp</jsp-file>
  	<init-param>
  		<param-name>str</param-name>
</div>
                                </li>
                                <li><a href="/article/594.htm"
                                       title="Ant标签详解--基础操作" target="_blank">Ant标签详解--基础操作</a>
                                    <span class="text-muted">g21121</span>
<a class="tag" taget="_blank" href="/search/ant/1.htm">ant</a>
                                    <div>        Ant的一些核心概念: 
        build.xml:构建文件是以XML 文件来描述的,默认构建文件名为build.xml。        project:每个构建文</div>
                                </li>
                                <li><a href="/article/721.htm"
                                       title="[简单]代码片段_数据合并" target="_blank">[简单]代码片段_数据合并</a>
                                    <span class="text-muted">53873039oycg</span>
<a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81/1.htm">代码</a>
                                    <div>        合并规则:删除家长phone为空的记录,若一个家长对应多个孩子,保留一条家长记录,家长id修改为phone,对应关系也要修改。 
        代码如下: 
       </div>
                                </li>
                                <li><a href="/article/848.htm"
                                       title="java 通信技术" target="_blank">java 通信技术</a>
                                    <span class="text-muted">云端月影</span>
<a class="tag" taget="_blank" href="/search/Java+%E8%BF%9C%E7%A8%8B%E9%80%9A%E4%BF%A1%E6%8A%80%E6%9C%AF/1.htm">Java 远程通信技术</a>
                                    <div>在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来</div>
                                </li>
                                <li><a href="/article/975.htm"
                                       title="string与StringBuilder 性能差距到底有多大" target="_blank">string与StringBuilder 性能差距到底有多大</a>
                                    <span class="text-muted">aijuans</span>

                                    <div>  
        之前也看过一些对string与StringBuilder的性能分析,总感觉这个应该对整体性能不会产生多大的影响,所以就一直没有关注这块! 
        由于学程序初期最先接触的string拼接,所以就一直没改变过自己的习惯! 
        </div>
                                </li>
                                <li><a href="/article/1102.htm"
                                       title="今天碰到 java.util.ConcurrentModificationException 异常" target="_blank">今天碰到 java.util.ConcurrentModificationException 异常</a>
                                    <span class="text-muted">antonyup_2006</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/IBM/1.htm">IBM</a>
                                    <div>今天改bug,其中有个实现是要对map进行循环,然后有删除操作,代码如下: 

Iterator<ListItem> iter = ItemMap.keySet.iterator();
while(iter.hasNext()){
ListItem it = iter.next();
//...一些逻辑操作
ItemMap.remove(it);
}
 
结果运行报Con</div>
                                </li>
                                <li><a href="/article/1229.htm"
                                       title="PL/SQL的类型和JDBC操作数据库" target="_blank">PL/SQL的类型和JDBC操作数据库</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/PL%2FSQL%E8%A1%A8/1.htm">PL/SQL表</a><a class="tag" taget="_blank" href="/search/%E6%A0%87%E9%87%8F%E7%B1%BB%E5%9E%8B/1.htm">标量类型</a><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%A0%87/1.htm">游标</a><a class="tag" taget="_blank" href="/search/PL%2FSQL%E8%AE%B0%E5%BD%95/1.htm">PL/SQL记录</a>
                                    <div>PL/SQL的标量类型: 
   字符,数字,时间,布尔,%type五中类型的 
--标量:数据库中预定义类型的变量
--定义一个变长字符串 
v_ename varchar2(10); 

--定义一个小数,范围 -9999.99~9999.99 
v_sal number(6,2); 

--定义一个小数并给一个初始值为5.4 :=是pl/sql的赋值号 
</div>
                                </li>
                                <li><a href="/article/1356.htm"
                                       title="Mockito:一个强大的用于 Java 开发的模拟测试框架实例" target="_blank">Mockito:一个强大的用于 Java 开发的模拟测试框架实例</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/mockito/1.htm">mockito</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a>
                                    <div>Mockito框架: 
        Mockito是一个基于MIT协议的开源java测试框架。         Mockito区别于其他模拟框架的地方主要是允许开发者在没有建立“预期”时验证被测系统的行为。对于mock对象的一个评价是测试系统的测</div>
                                </li>
                                <li><a href="/article/1483.htm"
                                       title="精通Oracle10编程SQL(10)处理例外" target="_blank">精通Oracle10编程SQL(10)处理例外</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a>
                                    <div>/*
 *处理例外
 */
--例外简介
--处理例外-传递例外
declare
   v_ename emp.ename%TYPE;
begin
   SELECT ename INTO v_ename FROM emp
      where empno=&no;
   dbms_output.put_line('雇员名:'||v_ename);
exceptio</div>
                                </li>
                                <li><a href="/article/1610.htm"
                                       title="【Java】Java执行远程机器上Linux命令" target="_blank">【Java】Java执行远程机器上Linux命令</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/linux%E5%91%BD%E4%BB%A4/1.htm">linux命令</a>
                                    <div>Java使用ethz通过ssh2执行远程机器Linux上命令, 
  
封装定义Linux机器的环境信息 
  
package com.tom;


import java.io.File;

public class Env {
    private String hostaddr; //Linux机器的IP地址
    private Integer po</div>
                                </li>
                                <li><a href="/article/1737.htm"
                                       title="java通信之Socket通信基础" target="_blank">java通信之Socket通信基础</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/socket/1.htm">socket</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a>
                                    <div>正处于网络环境下的两个程序,它们之间通过一个交互的连接来实现数据通信。每一个连接的通信端叫做一个Socket。一个完整的Socket通信程序应该包含以下几个步骤: 
①创建Socket; 
②打开连接到Socket的输入输出流; 
④按照一定的协议对Socket进行读写操作; 
④关闭Socket。 
  
Socket通信分两部分:服务器端和客户端。服务器端必须优先启动,然后等待soc</div>
                                </li>
                                <li><a href="/article/1864.htm"
                                       title="angular.bind" target="_blank">angular.bind</a>
                                    <span class="text-muted">boyitech</span>
<a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/angular.bind/1.htm">angular.bind</a><a class="tag" taget="_blank" href="/search/AngularJS+API/1.htm">AngularJS API</a><a class="tag" taget="_blank" href="/search/bind/1.htm">bind</a>
                                    <div>angular.bind   描述:           上下文,函数以及参数动态绑定,返回值为绑定之后的函数. 其中args是可选的动态参数,self在fn中使用this调用。    使用方法:            angular.bind(se</div>
                                </li>
                                <li><a href="/article/1991.htm"
                                       title="java-13个坏人和13个好人站成一圈,数到7就从圈里面踢出一个来,要求把所有坏人都给踢出来,所有好人都留在圈里。请找出初始时坏人站的位置。" target="_blank">java-13个坏人和13个好人站成一圈,数到7就从圈里面踢出一个来,要求把所有坏人都给踢出来,所有好人都留在圈里。请找出初始时坏人站的位置。</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>
import java.util.ArrayList;
import java.util.List;


public class KickOutBadGuys {

	/**
	 * 题目:13个坏人和13个好人站成一圈,数到7就从圈里面踢出一个来,要求把所有坏人都给踢出来,所有好人都留在圈里。请找出初始时坏人站的位置。
	 * Maybe you can find out </div>
                                </li>
                                <li><a href="/article/2118.htm"
                                       title="Redis.conf配置文件及相关项说明(自查备用)" target="_blank">Redis.conf配置文件及相关项说明(自查备用)</a>
                                    <span class="text-muted">Kai_Ge</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a>
                                    <div>   Redis.conf配置文件及相关项说明 
# Redis configuration file example
 
# Note on units: when memory size is needed, it is possible to specifiy
# it in the usual form of 1k 5GB 4M and so forth:
#
</div>
                                </li>
                                <li><a href="/article/2245.htm"
                                       title="[强人工智能]实现大规模拓扑分析是实现强人工智能的前奏" target="_blank">[强人工智能]实现大规模拓扑分析是实现强人工智能的前奏</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                                    <div> 
 
     真不好意思,各位朋友...博客再次更新... 
 
     节点数量太少,网络的分析和处理能力肯定不足,在面对机器人控制的需求方面,显得力不从心.... 
 
     但是,节点数太多,对拓扑数据处理的要求又很高,设计目标也很高,实现起来难度颇大... 
 </div>
                                </li>
                                <li><a href="/article/2372.htm"
                                       title="记录一些常用的函数" target="_blank">记录一些常用的函数</a>
                                    <span class="text-muted">dai_lm</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>
public static String convertInputStreamToString(InputStream is) {

	StringBuilder result = new StringBuilder();

	if (is != null)
		try {
			InputStreamReader inputReader = new InputStreamRead</div>
                                </li>
                                <li><a href="/article/2499.htm"
                                       title="Hadoop中小规模集群的并行计算缺陷" target="_blank">Hadoop中小规模集群的并行计算缺陷</a>
                                    <span class="text-muted">datamachine</span>
<a class="tag" taget="_blank" href="/search/mapreduce/1.htm">mapreduce</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97/1.htm">并行计算</a>
                                    <div>注:写这篇文章的初衷是因为Hadoop炒得有点太热,很多用户现有数据规模并不适用于Hadoop,但迫于扩容压力和去IOE(Hadoop的廉价扩展的确非常有吸引力)而尝试。尝试永远是件正确的事儿,但有时候不用太突进,可以调优或调需求,发挥现有系统的最大效用为上策。 
 
-----------------------------------------------------------------</div>
                                </li>
                                <li><a href="/article/2626.htm"
                                       title="小学4年级英语单词背诵第二课" target="_blank">小学4年级英语单词背诵第二课</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/english/1.htm">english</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a>
                                    <div>egg  蛋 
twenty 二十 
any 任何 
well 健康的,好 
  
twelve 十二 
farm 农场 
every 每一个 
back 向后,回 
  
fast 快速的 
whose 谁的 
much 许多 
flower 花 
  
watch 手表 
very 非常,很 
sport 运动 
Chinese 中国的 
  </div>
                                </li>
                                <li><a href="/article/2753.htm"
                                       title="自己实践了github的webhooks, linux上面的权限需要注意" target="_blank">自己实践了github的webhooks, linux上面的权限需要注意</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/github/1.htm">github</a><a class="tag" taget="_blank" href="/search/webhook/1.htm">webhook</a>
                                    <div>环境, 阿里云服务器 
  
1. 本地创建项目, push到github服务器上面 
  
2. 生成www用户的密钥 
sudo -u www ssh-keygen -t rsa -C "xxx@xx.com" 
  
  
3. 将密钥添加到github帐号的SSH_KEYS里面 
  
3. 用www用户执行克隆, 源使</div>
                                </li>
                                <li><a href="/article/2880.htm"
                                       title="Java冒泡排序" target="_blank">Java冒泡排序</a>
                                    <span class="text-muted">蕃薯耀</span>
<a class="tag" taget="_blank" href="/search/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/1.htm">冒泡排序</a><a class="tag" taget="_blank" href="/search/Java%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/1.htm">Java冒泡排序</a><a class="tag" taget="_blank" href="/search/Java%E6%8E%92%E5%BA%8F/1.htm">Java排序</a>
                                    <div>冒泡排序 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
蕃薯耀 2015年6月23日 10:40:14 星期二 
http://fanshuyao.iteye.com/</div>
                                </li>
                                <li><a href="/article/3007.htm"
                                       title="Excle读取数据转换为实体List【基于apache-poi】" target="_blank">Excle读取数据转换为实体List【基于apache-poi】</a>
                                    <span class="text-muted">hanqunfeng</span>
<a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a>
                                    <div>1.依赖apache-poi 
  
2.支持xls和xlsx 
  
3.支持按属性名称绑定数据值 
  
4.支持从指定行、列开始读取 
  
5.支持同时读取多个sheet 
  
6.具体使用方式参见org.cpframework.utils.excelreader.CP_ExcelReaderUtilTest.java 
比如: 
Str</div>
                                </li>
                                <li><a href="/article/3134.htm"
                                       title="3个处于草稿阶段的Javascript API介绍" target="_blank">3个处于草稿阶段的Javascript API介绍</a>
                                    <span class="text-muted">jackyrong</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>原文: 
http://www.sitepoint.com/3-new-javascript-apis-may-want-follow/?utm_source=html5weekly&utm_medium=email 
 
 
  本文中,介绍3个仍然处于草稿阶段,但应该值得关注的Javascript API. 
 
1) Web Alarm API 
  &</div>
                                </li>
                                <li><a href="/article/3261.htm"
                                       title="6个创建Web应用程序的高效PHP框架" target="_blank">6个创建Web应用程序的高效PHP框架</a>
                                    <span class="text-muted">lampcy</span>
<a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a>
                                    <div>以下是创建Web应用程序的PHP框架,有coder bay网站整理推荐: 
1. CakePHP 
CakePHP是一个PHP快速开发框架,它提供了一个用于开发、维护和部署应用程序的可扩展体系。CakePHP使用了众所周知的设计模式,如MVC和ORM,降低了开发成本,并减少了开发人员写代码的工作量。 
2. CodeIgniter 
CodeIgniter是一个非常小且功能强大的PHP框架,适合需</div>
                                </li>
                                <li><a href="/article/3388.htm"
                                       title="评"救市后中国股市新乱象泛起"谣言" target="_blank">评"救市后中国股市新乱象泛起"谣言</a>
                                    <span class="text-muted">nannan408</span>

                                    <div>首先来看百度百家一位易姓作者的新闻: 
 

    三个多星期来股市持续暴跌,跌得投资者及上市公司都处于极度的恐慌和焦虑中,都要寻找自保及规避风险的方式。面对股市之危机,政府突然进入市场救市,希望以此来重建市场信心,以此来扭转股市持续暴跌的预期。而政府进入市场后,由于市场运作方式发生了巨大变化,投资者及上市公司为了自保及为了应对这种变化,中国股市新的乱象也自然产生。

首先,中国股市这两天</div>
                                </li>
                                <li><a href="/article/3515.htm"
                                       title="页面全屏遮罩的实现 方式" target="_blank">页面全屏遮罩的实现 方式</a>
                                    <span class="text-muted">Rainbow702</span>
<a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E9%81%AE%E7%BD%A9/1.htm">遮罩</a><a class="tag" taget="_blank" href="/search/mask/1.htm">mask</a>
                                    <div>之前做了一个页面,在点击了某个按钮之后,要求页面出现一个全屏遮罩,一开始使用了position:absolute来实现的。当时因为画面大小是固定的,不可以resize的,所以,没有发现问题。 
最近用了同样的做法做了一个遮罩,但是画面是可以进行resize的,所以就发现了一个问题,当画面被reisze到浏览器出现了滚动条的时候,就发现,用absolute 的做法是有问题的。后来改成fixed定位就</div>
                                </li>
                                <li><a href="/article/3642.htm"
                                       title="关于angularjs的点滴" target="_blank">关于angularjs的点滴</a>
                                    <span class="text-muted">tntxia</span>
<a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a>
                                    <div>  
angular是一个新兴的JS框架,和以往的框架不同的事,Angularjs更注重于js的建模,管理,同时也提供大量的组件帮助用户组建商业化程序,是一种值得研究的JS框架。 
  
Angularjs使我们可以使用MVC的模式来写JS。Angularjs现在由谷歌来维护。 
  
这里我们来简单的探讨一下它的应用。 
  
首先使用Angularjs我</div>
                                </li>
                                <li><a href="/article/3769.htm"
                                       title="Nutz--->>反复新建ioc容器的后果" target="_blank">Nutz--->>反复新建ioc容器的后果</a>
                                    <span class="text-muted">xiaoxiao1992428</span>
<a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/IOC/1.htm">IOC</a><a class="tag" taget="_blank" href="/search/nutz/1.htm">nutz</a>
                                    <div>问题: 
public class DaoZ { 
  
  public static Dao dao() { // 每当需要使用dao的时候就取一次 
    Ioc ioc = new NutIoc(new JsonLoader("dao.js")); 
    return ioc.get(</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>