高质量编码--Excel POI点高德地图展示

Excel文件里记录着POI点信息(包含经纬度),这些记录也可以分类别保存在不同的sheet里。下面介绍如何根据sheet名称,自动把Excel里的点位信息在地图上分组点标记展示,地图展示选用高德地图API。

后台开发使用Python Web框架 Tornado,代码如下:

import pandas as pd
from tornado.options import define,options
import tornado.ioloop
import tornado.web
import os

define('port',default=8000,help='run on the given port',type=int)

class cross_originAllowed_Handler(tornado.web.RequestHandler):
    def initialize(self):
        self.set_header('Access-Control-Allow-Origin','*')
        self.set_header('Access-Control-Allow-Methods','POST,GET')
        self.set_header('Access-Control-Max-Age',1000)
        self.set_header('Access-Control-Allow-Headers','*')
class ApiHandler(cross_originAllowed_Handler):
    def get(self):
        excel=pd.ExcelFile('db.xlsx')
        result={}
        for sheet_name in excel.sheet_names:
            df=pd.read_excel(excel,sheet_name)
            result[sheet_name]=json.loads(df.to_json(orient='records'))    
        self.write(result)
        return 

class mapHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html') 

def make_app():
    return tornado.web.Application(
        [
        (r"/api.json", ApiHandler),
         (r"/", mapHandler),
    ],
        static_path=os.path.join(os.path.curdir,'static'),
        template_path=os.path.join(os.path.curdir,'template'),
        debug=True)

if __name__ == "__main__":
    app = make_app()
    options.parse_command_line()
    app.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

地图展示页面使用高德地图JavaScript API,代码如下:

<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
 <script type="text/javascript" src="https://underscorejs.net/js/jquery-1.11.0.min.js"></script>  
 <script type="text/javascript" src="https://underscorejs.net/js/underscore.js"></script>  

 <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=yourkey"></script> 
 <script type="text/template" id="toggleTemplate">
 <% _.each(layers,(points,name)=> { %>
 <div class="radio-group"><a class="radio-button radio-button-checked" data-layer="<%=name%>" onclick="javascript:void(0);"><span class="radio-button-inner"><%=name%></span></a> </div>
 
 <% }) %>
        <div class="radio-group"><a title="点击切换名称显示" id="toggleLabel" data-label="name" class="radio-button" onclick="javascript:void(0);"><span class="radio-button-inner" >名称</span> </a><a title="点击切换地图风格" id="toggleStyle" class="radio-button" onclick="javascript:void(0);" data-style='normal'><span class="radio-button-inner">标准</span> </a> </div>

 </script>
 
 <script type="text/template" id="infoTemplate">
 <% _.each(row,(value,col)=> { %>
  <%=col %>:<%=value %><br>
 <% }) %>
 </script>
<style>
body.darkblue .amap-marker-label{
background:#000001;
color:white;
border:1px solid white;
}
body.normal .amap-marker-label{
background:white;
color:black;
border: 1px solid  black;
}
#container {width:100%; height: 100%; }  
   #mapgroup .radio-button-wrapper {
            width: 80px;
            padding: 0 !important;
            text-align: center;
            border: 0 !important;
            background: rgba(0, 0, 0, .6) !important;
            color: #fff !important;
            border-radius: 0 !important;
        }

        .mapgroup {
            position: fixed;
            right: 0;
            top: 23%;
            z-index: 999;
            width: 80px;
        }
		
		 .radio-group {
            width: 80px;
            display: grid;
            cursor: pointer;
        }

        .white .radio-button,
        .radio-button {
            background-color: white;
            color: #000;
			user-select: none;
            line-height: 40px;
            text-align: center;

            text-decoration: none;
            border: 1px solid black;
            border-radius: 10px;
            caret-color: transparent;
        }

        .dark .radio-button {
            background-color: black;
            color: #fff;

            line-height: 40px;
            text-align: center;

            text-decoration: none;
            border: 1px solid white;
            border-radius: 10px;
            caret-color: transparent;
        }

        .radio-button-checked,
        .white .radio-button-checked,
        .dark .radio-button-checked {
            background-color: #337ab7;
            color: #fff;
            caret-color: transparent;
        }

</style>
</head>

<body>
<div id="container"></div> 
      <div id="mapgroup" class="mapgroup" contenteditable="false">
        
    </div>

</body>
 
<script type="text/javascript" >
   var map = new AMap.Map('container',{
       zoom: 12,
       center: [113.667116,34.776845]
   });
 
 
 
var infoTemplate=_.template($('#infoTemplate').html());
   var infoWindow = new AMap.InfoWindow({
   });
 var toggleTemplate=_.template($('#toggleTemplate').html());
  $.get('../api.json',function(data){
   

 
 layers=	_.mapObject(data,(table,name)=>{
  var markers=_.map(table,row=>{
  console.log(row);
  var lng=row["经度"];
  var lat=row["纬度"];
  
  console.log(lng,lat);
  var marker = new AMap.Marker({
    position: new AMap.LngLat(parseFloat(lng), parseFloat(lat)),   
    title: row['名称'],
	icon: `../static/imgs/${name}.png`,
});
var row0=_.omit(row,['经度','纬度','名称']);
marker.content = infoTemplate({row:row0});
        marker.on('click', markerClick);
    
    
return marker;

})
 map.add(markers);
   return markers;
})
function markerClick(e) {
        infoWindow.setContent(e.target.content);
        infoWindow.open(map, e.target.getPosition());
    }
  $('#mapgroup').html(toggleTemplate({layers:data}));
  map.setFitView();
  
    })
  
 $('#mapgroup').delegate('#toggleStyle','click',function () {
         var labelType= $(this).data('style');
		 if (labelType == 'normal') {
       var styleName = "amap://styles/darkblue" ;
     $(this).data('style','darkblue').addClass('radio-button-checked').find('span').text('暗夜');
	  $('body').removeClass('normal').addClass('darkblue');
	  }
	  else {
	   var styleName = "amap://styles/normal" ;
	 $(this).data('style','normal').removeClass('radio-button-checked').find('span').text('标准');
	 $('body').removeClass('darkblue').addClass('normal');
	  }
	   map.setMapStyle(styleName);
    })

    $('#mapgroup').delegate('#toggleLabel','click',function () {
        var labelType = $(this).data('label');
         
        if (labelType == 'none') {
            $(this).data('label', 'name');
            $(this).removeClass('radio-button-checked');
			_.each(layers,(markers,name)=>{
			_.each(markers,marker=>{
			marker.setLabel({
        offset: new AMap.Pixel(0, 0), 
        content:'',  
        direction: 'top'  
    });
			})
        })
		}
        else if(labelType == 'name') {
            $(this).data('label', 'none');
            $(this).addClass('radio-button-checked');
		_.each(layers,(markers,name)=>{
		_.each(markers,marker=>{
			marker.setLabel({
        offset: new AMap.Pixel(0, 0), 
        content: marker.getTitle(),  
        direction: 'top'  
    });
			})
			})
        }

    });
	$('#mapgroup').delegate('.radio-group [data-layer]','click',function () {
	var name=$(this).data('layer');
	if($(this).hasClass('radio-button-checked')){
	$(this).removeClass('radio-button-checked');
	_.each(layers[name],marker=>{
			marker.hide();
	})
	}
else{
$(this).addClass('radio-button-checked');
_.each(layers[name],marker=>{
			marker.show();
	})
}

 
})
  
</script>
</html>
本文转载于网络 如有侵权请联系删除

相关文章

  • 陈天奇CMU新课程线上免费听,剖析DL框架底层原理,学完你也能开发mini版PyTorch/TF

    丰色发自凹非寺 量子位|公众号QbitAICMU又一门线下课程要在网上同步开课了。这次,授课老师正好是机器学习领域的著名学者陈天奇。以及CMU的副教授ZicoKolter(兼博世研究院首席人工智能科学家)。课程名叫《深度学习系统(算法和实现)》。这里的“深度学习系统”指的就是像PyTorch或TensorFlow这样的工具。我们知道,深度学习能够迅速推广开来并取得成效少不了这些系统的支持。但大部分人对于它们的态度都是“会用就完了”,对内部结构和底层运作原理并不清楚。Kolter和陈天奇就将在这门课程中带大家深入了解其原理,并教大家实现一个基本的深度学习库,可以和小型版本的PyTorch或TensorFlow相媲美的那种。上完这门课,我们就能在以后的“炼丹”过程中更好地利用这些工具的功能,还能学会在需要时自己上手开发扩展库做一些自定义的东西。一位有着1.9万粉丝的机器学习从业者就表示:如果你想充分利用你最喜欢的框架,强烈推荐。怎么样,心动否?9月13日开课,线上免费注册参与该课程将在下个月13号开课。主要面向高年级本科到博士在读阶段的学生。需要参与者有基本的数学背景,对机器学习有一定的了

  • ArcMap进行线符号制作

    在制图中,需要大量使用到线符号,例如道路、河流、国界、流域界、管线等。线符号制作相对于点符号制作难度稍微增加,因为线符号一般都具有一定的规则,例如一些边界符号,就需要点-杠的规律进行显示;铁路线是黑白相间显示等。如下图。难点在于如果对线符号的规则进行拆解,这一点非常重要,一个线符号能不能制作出来,关键点就在于此。 ArcGIS中的线符号具有以下几种,如下图。一般情况下,大量使用的是简单线符号、制图线符号和标记线符号,其他线符号的制作,限于边幅,不做介绍。 简单线符号,顾名思义就是简单,只提供了几项基本的设置,例如线宽、颜色和几个简单的样式。其优点就是显示速度快,如果没有特殊的要求,只需要显示线宽和颜色的话,推荐使用简单线符号,在这个地图的显示和浏览中,其效果为最优。 虽然简单线符号比较简单,但属于我们最常用的线符号表达方式。基本的设置这里不做介绍,但一些小技巧我们就不能不注意。例如要做一个道路的双线符号,双线符号可以很好的表达道路中心线,让其看起来具备一定的宽度。如下图。这种双线符号看起来比较复杂,其实制作过程很简单。在上一章节点符号制作中,我们已经掌握了符号制作的层概念,那么,这个双

  • NumPy之:多维数组中的线性代数

    简介本文将会以图表的形式为大家讲解怎么在NumPy中进行多维数据的线性代数运算。多维数据的线性代数通常被用在图像处理的图形变换中,本文将会使用一个图像的例子进行说明。图形加载和说明熟悉颜色的朋友应该都知道,一个颜色可以用R,G,B来表示,如果更高级一点,那么还有一个A表示透明度。通常我们用一个四个属性的数组来表示。对于一个二维的图像来说,其分辨率可以看做是一个X*Y的矩阵,矩阵中的每个点的颜色都可以用(R,G,B)来表示。有了上面的知识,我们就可以对图像的颜色进行分解了。首先需要加载一个图像,我们使用imageio.imread方法来加载一个本地图像,如下所示:importimageio img=imageio.imread('img.png') print(type(img))复制上面的代码从本地读取图片到img对象中,使用type可以查看img的类型,从运行结果,我们可以看到img的类型是一个数组。class'imageio.core.util.Array'复制通过img.shape可以得到img是一个(80,170,4)的三维数组,也就是说

  • 干货 | 如何快速完成DLL劫持,实现权限维持,重启上线

    需要用到的工具以及应用 白文件-也就是被劫持的应用程序 AheadLibVS2019AheadLib白文件-需要被劫持的应用 这里以比特精灵为例 双击运行AheadLib.exe,如果选择了dll,但是AheadLib.exe报错就需要运行AheadLib_x64.exe来生成,最后生成修改后的dll也需要生成x64位的点生成就会生成一个.cpp文件 BSOPLib9.cpp的代码内容如下 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //头文件 #include<Windows.h> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////

  • 当我们谈注册中心时谈什么?

    最近工作重心转向了注册中心,于是想来写一篇关于注册中心的文章概念什么是注册中心,以大多数人熟悉的RPC框架来说,通常RPC中有三种角色:provider服务提供者consumer服务消费者,即调用方registry注册中心,让consumer能发现provider的关键注册中心对于服务提供者需要具备服务注册、注销的能力,对于服务消费者需要提供查询服务、感知服务变化的功能。当然还需要解决一些其他问题才能成为一个优秀的注册中心,如高可用、高性能、水平扩展能力、服务探活能力、路由功能、多机房(多活)能力等。特性详解存储可以将注册中心理解为一个存储系统,存储着服务名与服务提供方的映射表。由此可见DNS是目前使用最广泛的注册中心。一般注册中心对存储没有什么要求,甚至你可以基于数据库来实现一个注册中心。高可用在聊高可用前,假定你了解分布式CAP理论,如果不知道可以稍微网上查一下,这里就不赘述。其中对注册中心的高可用要求尤其高,它有如下几层含义,首先肯定是集群部署,无单点问题,其次就算整个集群挂掉了,也不能影响现有服务的调用,只不过现有的调用关系无法及时改变而已。在分布式理论CAP中,注册中心更理想

  • Android pull解析xml的实现方法

    Androidpull解析xml的实现方法资源文件:persons.xml<?xmlversion="1.0"encoding="utf-8"standalone="yes"? <persons <personid="101" <namejame</name <age18</age </person <personid="102" <nameTom</name <age20</age </person <personid="103" <nameJack</name <age16</age </person <personid="104" <nameRose</name <age26</age </person </persons复制activity布局文件activity_main.xml

  • 分享一个关于Cookie做的实验结果

    实验本身是很枯燥的,我尽量把它讲的有趣些。起因去网上搜了下关于Cookie的介绍,看了好几篇都长得很一样,阉割一下内容不外乎说是"不同浏览器限制cookie数不同,大致在30-50这个范围,(前缀)浏览器允许Cookie多达4KB左右,包括名、值、等号"。我还在上学那会儿,包括后面毕业后工作一段时间,我也没有特别去关注过这个话题,基本上如果面试官问到我了,也就把网上知道的这些讲了一下。今年的遭遇给了我思考的时间特别多,最近我又重新去仔细读了下楼上那句话,我发现我读不懂了,第一个,我看的资料并不是特别权威的,也都是网上的博客帖子,对浏览器限制30-50个这个范围产生了一个质疑,是真的吗?第二个是允许多达4KB左右,就很迷糊,到底是一个域名下所有的Cookie加起来的值是4KB左右,还是说单独的Cookie的一个Name所表示的信息它可以是4KB左右,这让我很迷啊。行,那我们接下来就做个关于Cookie的实验,去验证一些东西。因为这只是一个实验,所有这里笔者不会讲Cookie的使用和作用以及其他介绍。大致理一下,我们要验证的一些点如下:单个域名下浏览器Cookie限制个

  • [Notepad++]打造Python开发利器

    原创文章,欢迎转载。转载请注明:转载自祥的博客原文链接:1.问题需求我一般写Python项目都是用PyCharm,这是绝对的利器,不过就是打开慢,吃资源[机壕请无视这条],而一般测试,我则是,用ConsoleEmulator+IPython的运行环境,如下图所示:体验还是不错的,但是就是编写代码不舒服,相当于一个加强版的IDEL,我需要编辑+运行这两个功能。所以瞄上Notepad++2.Notepad++最终效果Ctrl+F5#编译运行Python,调用cmd运行Python,执行当前py文件 Ctrl+F6#运行IPython,调用cmd运行IPython复制3.配置Notepad++3.1.配置快捷键3.1.1.配置快捷键设置运行Python1.按F5(或者运行=>运行)2.在弹出的窗口内输入以下命令:#run_Python[Ctrl+F5] cmd/kcd/d"$(CURRENT_DIRECTORY)"&python"$(FULL_CURRENT_PATH)"&ECHO.&PAUSE&EXIT复制3.然

  • Python logging 较佳实践

    未经允许,禁止转载。本文只是列出来我自己在实践中总结出来的几点,并不一定最佳。当然,我也不认为有统一的最佳。 记录日志是程序中尤其是web服务中的重要一环,恰到好处的日志记录可以帮助我们了解程序运行情况以及 方便排(shuai)错(guo)。logger和handler如果使用logging不多,可能对logger和handler这两个概念不熟,大多数还是直接使用logging.info()来记录日志。Python官方给了一个流程图来说明日志消息(LogRecord)在logger和handler之间的流动情况: 总体来说,我们创建一个logger,通过logger.info()来通知handler,让handler(如在终端输出日志的StreamHandler,完整handler见UsefulHandlers)来执行真正的记录操作。打个比方,logger好比领导,handler好比员工。默认情况下你都用logging.info()来记录日志,相当于CEO直接命令所有员工做事。而有了logger,通常我们会配置模块级的logger(下文会细说),再使用logger.info()来记录

  • NeurIPS 2018 开幕重磅:四篇最佳论文正式揭晓,论文接受全方位数据公开

    大数据文摘出品作者:钱天培、Aileen今年的NeurIPS(原名NIPS)会议开幕了!开幕式上公布了4篇最佳论文,其中一篇最佳论文一作来自华为诺亚方舟实验室,另外几篇最佳论文被来自多伦多、谷歌AI的研究者包揽。本次NeurIPS大会一共有6个Poster部分,3个并行的主方向,历时三整天。在开始销售门票后的短短11分钟28秒后,所有的参会资格就已被抢购一空,一票难求,盛况空前。昨天大会的第一日,阿里巴巴霸气演示全中文demo,以及谷歌联合NeurIPS发布“找新娘图片识别竞赛”也算是为接下来的精彩抛砖引玉。附上大会直播链接:https://www.facebook.com/nipsfoundation/与去年一样,今年也评出了4篇最佳论文奖,当然,还有一篇时间检验奖。四篇最佳论文(BestPapers)四人均来自多伦多大学向量研究所https://arxiv.org/abs/1806.07366摘要:我们介绍了一系列新的深度神经网络模型。我们使用神经网络参数化隐藏状态的导数,而不是指定隐藏层的离散序列。我们使用黑盒微分方程求解器(black-boxdifferentialequati

  • Nginx学习之定时切割日志

    前言Nginx日志默认情况下写入到一个文件中,为了区分各个域下的日志,我们一般会分开存储。即时这样,文件也会变的越来越大,非常不方便查看分析。通常我们是以每日来做统计的,下面来聊聊以日期来分隔Nginx日志。配置编写脚本#!/bin/bash #初始化 LOGS_PATH=/usr/local/nginx/logs YESTERDAY=$(date-d"yesterday"+%Y%m%d) #按天切割日志 mv${LOGS_PATH}/bbs.52itstyle.com.access.log${LOGS_PATH}/bbs.52itstyle.com.access_${YESTERDAY}.log mv${LOGS_PATH}/blog.52itstyle.com.access.log${LOGS_PATH}/blog.52itstyle.com.access_${YESTERDAY}.log #向nginx主进程发送USR1信号,重新打开日志文件,否则会继续往mv后的文件写数据的。原因在于:linux系统中,内核是根据文件描述符来找文件的。如果不这样操作导致日

  • 周末荐影 | 八部电影让你看懂大数据

    1《V客帝国》在大数据的世界里,V并非指“仇杀”(Vendetta),而是著名的3V定律:Velocity速度——以接近实时的速度处理数据产生报告,而不是像过去那样漫长的休假结束后才能看到报告。Volume容量——在不断膨胀的海量数据中依然能发现有价值的信息。Variety多样性——能处理各种数据源(结构化、半结构化、非结构化数据)Value价值——蕴藏着巨大的商业价值。剧情简介:不久的将来,网络黑客尼奥(基奴李维斯饰)对这个看似正常的现实世界产生了怀疑。他结识了黑客崔妮蒂(凯莉·安·摩丝饰),并见到了黑客组织的首领墨菲斯(劳伦斯·菲什伯恩饰)。墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?如何才能打败那些超人一样的特勤?尼奥是不是人类的希望?这是黑客的帝国,程序和代码欢迎大家的到来。2《速度与激情》在未来数据驱动的企业中,任何一项业务计划能否成功都需要依赖飞速的大数据分析,企业间比拼的是大数据跑车的极速性能,如果你能比竞争对手更

  • python关于format的使用

    name="张三" age=23 weight=75.5 student_id=1 #我的名字是张三 print('我的名字是%s'%name) #我的学号是0001 print('我的学号是%04d'%student_id) #%04d:显示4位整数 #我的体重是75.50公斤 print('我的体重是%.2f公斤'%weight) #%.2:小数后显示两位 #我的名字是张三,今年23岁了 print('我的名字是%s,今年%d岁了'%(name,age)) #我的名字是张三,明年24岁了 print('我的名字是%s,明年%d岁了'%(name,age+1)) #我的名字是张三,明年24岁了 print('我的名字是{0},明年{1}岁了'.format(name,age+1)) #我的名字是李思,今年18岁了 print('我的名字是{0},今年{1}岁了'.format("李思",18)

  • 面试突击80:说一下 Spring 中 Bean 的生命周期?

    Java中的公共类称之为Bean或JavaBean,而Spring中的Bean指的是将对象的生命周期,交个SpringIoC容器来管理的对象。所以Spring中的Bean对象在使用时,无需通过new来创建对象,只需要通过DI(依赖注入),从Spring中取出要使用的对象即可。 那么Spring中,Bean的生命周期又有哪些呢?接下来,我们一起来看。 1.Bean生命周期 Spring中Bean的生命周期是指:Bean在Spring(IoC)中从创建到销毁的整个过程。 Spring中Bean的生命周期主要包含以下5部分: 实例化:为Bean分配内存空间; 设置属性:将当前类依赖的Bean属性,进行注入和装配; 初始化: 执行各种通知; 执行初始化的前置方法; 执行初始化方法; 执行初始化的后置方法。 使用Bean:在程序中使用Bean对象; 销毁Bean:将Bean对象进行销毁操作。 以上生命周期中,需要注意的是:“实例化”和“初始化”是两个完全不同的过程,千万不要搞混,实例化只是给Bean分配了内存空间,而初始化则是将程序的执行权,从系统级别转换到用户级别,并开始执行用户添加

  • Native wifi API使用

    写于博客园,自己迁过来: 一.WlanOpenHandle打开一个客户端句柄 DWORDWINAPI WlanOpenHandle( __inDWORDdwClientVersion, __reservedPVOIDpReserved, __outPDWORDpdwNegotiatedVersion, __outPHANDLEphClientHandle );复制 其取值如下: 1:Windows XPSP2 2:Windows VistaandWindowsServer 2008 pReserved:保留值,设为NULL pdwNegotiatedVersion:SpecifiestheversionoftheWLANAPIthatwillbeusedinthissession(out值,返回当前使用的version,比如你在xpsp2下它就返回1)   phClientHandle:Specifiesahandlefortheclienttouseinthissession.Thishandleisusedbyotherf

  • 合肥光源束测系统高可用集群评估的推进

    ​先贴几张图,左右的X、Y、Z的曲线分别为某个束团(图中index编号)的条带和纽扣BPM的测量波形计算后的曲线,横坐标为圈数,取的波形为10ms,含45339圈的信息。 ​​​ ​ ​  由于两个BPM离的很近,虽然是不同类型的BPM,波形信号特征不一样,但是计算得到的X、Y、Z的变化直观看起来很一致。 ​ ​  上图是展开看的局部一段。如果仅仅从500us的波形,很难想象的到10ms更长尺度会看到什么样的效果。 即使10ms的波形展示的某束团3维位置信息,从前几副的曲线振荡看,不同组还是看不到规律,感觉象一个更长周期里的局部,如果能更长的连续时间的观测就更好了。 不过在10GHz采样率下,即使短短的10ms波形,基本上已经达到了现在示波器的极限,采集一组波形的数据量800MB需要100G左右内存才能正常处理,如果更长,100ms,8GB的一组波形,1T的内存,基本已经达到现在的单台服务器资源的极限了。 ​ 上图是仅仅开启重采样功能和没开启时内存消耗的对比,如果开启更多的计算,比如计算每个束团3维信息的频谱并注入PV、SVD提取等功能,需要消耗的内存更多。 10m

  • oracle中查询表,插入字段列,删除表

    oracle中查询某张表中的字段名,字段类型,是否为空,字段长度等信息   --更改某张表的字段类型长度 altertablebill_infomodifyIDCARDVARCHAR2(30);  --注意字段名(idcard)要大写;   --查询某张表中的字段名,字段类型,是否为空,字段长度等信息 SELECTCOLUMN_ID,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH,NULLABLE  FROMALL_TAB_COLUMNS  WHERETABLE_NAME='BILL_INFO'  ORDERBYCOLUMN_ID;   --查询某张表中的字段名,字段类型,是否为空,字段长度等信息 SELECT*FROM ALL_TAB_COLUMNSWHERETABLE_NAME='BILL_INFO';     查询当前用户的表: select  *  from  user_tables  -

  • 分布式体系结构之集中式结构

    集中式结构的概念   由一台或者多台服务器组成中央服务器,多个节点服务器与中央服务器连接。由中央服务器同一进行资源和任务调度。节点服务器之间无需通信和协作,只需要与中央服务器通信协作即可。 集中式结构经典举例 GoogleBorg Kubernetes Mesos 总结对比 菜鸟程序员,博客只做记录,可能问题很多,有问题,还望不吝指出!转载请附上原文地址,谢谢!

  • 小米商品和腾讯招聘多线程爬取

    该博文转载自:https://www.cnblogs.com/LXP-Never/p/11378709.html   目录   小米应用商店抓取(多线程)  腾讯招聘数据抓取(Ajax)   应用场景 1、多进程:CPU密集程序2、多线程:爬虫(网络I/O)、本地磁盘I/O   知识点回顾 队列 #导入模块 fromqueueimportQueue #使用 q=Queue() q.put(url) q.get()#当队列为空时,阻塞 q.empty()#判断队列是否为空,True/False复制   线程模块 #导入模块 fromthreadingimportThread ​ #使用流程 t=Thread(target=函数名)#创建线程对象 t.start()#创建并启动线程 t.join()#阻塞等待回收线程复制   小米应用商店抓取(多线程) 目标 网址:百度搜-小米应用商店,进入官网,应用分类-聊天社交 目标:爬取应用名称和应用链接 实现步骤 1、确认是否为动态加载 1、页面局部刷新 2、右键查看网页源代码,搜索关

  • 值类型的装箱与拆箱浅析

    阅读目录 前言 值类型的装箱 值类型的拆箱 装箱和拆箱实例 结束语  前言         在.Net中值类型向引用类型的转换以及从引用类型到值类型的转换是需要装箱(boxing)和拆箱(unboxing)的,这是因为值类型是比引用类型更轻型的一种类型,因为他们不想对象那样在托管队中分配,不会被GC收集,而且不需要通过指针来引用。但是在许多情况下都需要获取对值类型的一个实例的引用。对于在值类型与引用类型之间的互相转换,我之前一直不慎理解,在看了一些书籍之后,在本文中记录一些心得,希望各位尽量拍砖,多多指出不正确的地方,大家共同交流,共同学习、进步。   值类型的装箱         首先来看一个例子: structPoint{publicintx,y;}publicsealedclassProgram{publicstaticvoidMain(){  ArrayLista=newArrayList();

  • 105)ansible优化

    1.连接优化[openssh] 开启SSH长连接 ssh版本:>5.6 关闭ansible的SSH密钥检测 ansible默认是以ssh来实现远程推送执行的,是基于ssh秘钥检测,会检测远程主机的公钥,并记录在本地中known_host文件中,下次访问主机时,会核对公钥,如果公钥不同,openssh会发出警告,如果相同,会提示输入密码 SSH对主机的public_key的检查等级是根据StrictHostKeyChecking变量来设定的,StrictHostKeyChecking检查级别包括:no(不检查)、ask(询问)、yes(每次都检查)、False(关闭检查)。 vim/etc/ansible/ansible.cfg host_key_checking=False#关闭StrictHostKeyChecking检查 复制 opensshUseDNS 使用OpenSSH服务时,默认服务器端配置文件UseDNS=YES状态,该选项会导致服务器根据客户端的IP地址进行DNSPTR反向解析,得到客户端的主机名,然后根据获取到的主机名进行DNS正向A记录查询,并验

相关推荐

推荐阅读