【ES三周年】在Docker环境下部署EFK日志收集系统

一、EFK日志收集系统介绍

1.EFK简介

EFK: 分别表示:Elasticsearch , Fluentd, Kibana , 其中ELasticsearch负责日志保存和搜索,Fluentd负责收集日志,Kibana 负责界面,三者配合起来,形成一个非常完美的解决方案。

2.Elasticsearch简介

Elasticsearch是一个基于Apache Lucene的开源搜索和数据分析引擎引擎,Elasticsearch使用Java进行开发,并使用Lucene作为其核心实现所有索引和搜索的功能。

3.Elasticsearch的特点

  • Elasticsearch是一个实时的,分布式的,可扩展的搜索引擎。
  • Elasticsearch允许进行全文本和结构化搜索以及对日志进行分析。
  • Elasticsearch 是一个搜索引擎,负责存储日志并提供查询接口。
  • Elasticsearch通常用于索引和搜索大量日志数据,也可以用于搜索许多不同种类的文档。

4.、Filebeat与Kibana介绍

  • Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。
  • Kibana是一个开源的分析与可视化平台,被设计用于和Elasticsearch一起使用的。通过kibana可以搜索、查看和交互存放在Elasticsearch中的数据,利用各种不同的图表、表格和地图等,Kibana能够对数据进行分析与可视化。

5.EFK架构图

二、实践环境介绍

计算机名

系统版本

IP地址

Docker版本

jeven

centos 7.6

192.168.3.166

20.10.17

三、检查本地Docker环境

1.检查本地Docker版本

检查当前系统的docker版本

[root@jeven ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:05:12 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:03:33 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.6
  GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
 runc:
  Version:          1.1.2
  GitCommit:        v1.1.2-0-ga916309
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

2.检查Docker服务状态

检查本地Docker状态是否正常

[root@jeven ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2023-01-02 23:06:06 CST; 2 weeks 2 days ago
     Docs: https://docs.docker.com
 Main PID: 100874 (dockerd)
    Tasks: 58
   Memory: 3.6G
   CGroup: /system.slice/docker.service

3.检查docker compose版本

检查本机docker compose版本

[root@jeven efk]# docker compose version
Docker Compose version v2.6.0

四、下载elasticsearch等相关镜像

  • 下载elasticsearch镜像
[root@jeven efk]# docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.5
7.17.5: Pulling from elasticsearch/elasticsearch
5486d18d7ee8: Pull complete 
059ab60189a6: Pull complete 
f68717dc7875: Pull complete 
543411f2e134: Pull complete 
db298b0bce73: Pull complete 
841c800fd413: Pull complete 
9401277c6728: Pull complete 
d677f77adbd8: Pull complete 
f0aaff8ec792: Pull complete 
Digest: sha256:76344d5f89b13147743db0487eb76b03a7f9f0cd55abe8ab887069711f2ee27d
Status: Downloaded newer image for docker.elastic.co/elasticsearch/elasticsearch:7.17.5
docker.elastic.co/elasticsearch/elasticsearch:7.17.5
  • 下载dkibana:7.17.5镜像root@jeven efk# docker pull docker.elastic.co/kibana/kibana:7.17.5 7.17.5: Pulling from kibana/kibana 5486d18d7ee8: Already exists 16dd14f60afd: Pull complete d3f31853b425: Pull complete b189fa69d6ae: Pull complete 84f30eda8712: Pull complete 89732bc75041: Pull complete 2f3ab907567d: Pull complete eee1465a6f1a: Pull complete dee78761106f: Pull complete 77a7057d9e64: Pull complete 4f944b4f8458: Pull complete 0ee7e54154c9: Pull complete 3d21668734f2: Pull complete 2c4f2f7870ad: Pull complete Digest: sha256:07038507d29f21e96f3af081e4ae059661c8e16a4307776ef00d75a692cf99c7 Status: Downloaded newer image for docker.elastic.co/kibana/kibana:7.17.5 docker.elastic.co/kibana/kibana:7.17.5
  • 下载filebeat:7.17.5镜像root@jeven efk# docker pull docker.elastic.co/beats/filebeat:7.17.5 7.17.5: Pulling from beats/filebeat 5486d18d7ee8: Already exists 64e71d8ac435: Pull complete b32f71c16e16: Pull complete ec1697632735: Pull complete 296368aad1f3: Pull complete ed91d5b07939: Pull complete 3c3383e08710: Pull complete 855a09516cb7: Pull complete bf85c6107785: Pull complete f2317aa670f5: Pull complete 14c66766e716: Pull complete Digest: sha256:072f7c62c0d684189e9af8fc632b3235b2aceffa62a4657a1a4e0201c5976310 Status: Downloaded newer image for docker.elastic.co/beats/filebeat:7.17.5 docker.elastic.co/beats/filebeat:7.17.5

五、编辑filebeat.yaml文件

编辑filebeat.yaml配置文件

[root@jeven efk]# cat filebeat.yaml 
[root@jeven efk]# cat filebeat.yaml 
filebeat.inputs:
- type: log
  paths: 
    - '/usr/share/filebeat/logs/*'

processors:
- decode_json_fields:
    fields: ["message"]
    target: ""
    overwrite_keys: true

output.elasticsearch:
  hosts: ["http://192.168.3.166:9200"]
  indices:
    - index: "filebeat-%{+yyyy.MM.dd}"
#    - index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
#  username: '...'
#  password: '...'
setup.kibana:
  host: "http://192.168.3.166:5601"

#output.console:
#  enabled: true
#  codec.json:
#    pretty: true
#    #escape_html: false

logging.json: true
logging.metrics.enabled: false

六、部署EFK系统

1.创建数据目录

创建部署及数据目录

mkdir -p /data/efk/es/data

目录授权

chmod -R 666 /data/efk

2.编辑docker-compose.yaml文件

编辑efk系统的docker-compose.yaml部署文件

[root@jeven efk]# cat docker-compose.yaml 
version: '3.3'

services:

  elasticsearch:
    image: "docker.elastic.co/elasticsearch/elasticsearch:7.17.5"
    container_name: elasticsearch
    restart: always
    environment:
    - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    - "discovery.type=single-node"
    - "cluster.name=myes"
    - "node.name=jeven"
    # - xpack.security.enabled: "false"
    ulimits:
      memlock:
        soft: -1
        hard: -1 
    networks:
      myefk:
        ipv4_address: 172.29.120.10
        aliases:
        - es
        - jeven
    ports:
    - "9200:9200"
    - "9300:9300"
    volumes:
    - /data/efk/es/data/:/usr/share/elasticsearch/data

  kibana:
    image: "docker.elastic.co/kibana/kibana:7.17.5"
    restart: always
    environment:
      ELASTICSEARCH_URL: http://192.168.3.166:9200
      ELASTICSEARCH_HOSTS: '["http:/192.168.3.166:9200"]'
      I18N_LOCALE: zh-CN
    networks:
      myefk:
        ipv4_address: 172.29.120.20
        aliases:
          - kibana
          - kib
    ports:
    - "5601:5601"
    links:
    - "elasticsearch"

  filebeat:
    image: "docker.elastic.co/beats/filebeat:7.17.5"
    restart: always
    networks:
      myefk:
        ipv4_address: 172.29.120.30
        aliases:
          - filebeat
          - fb
    user: root
    command: ["--strict.perms=false"]
    volumes:
    - ./filebeat.yaml:/usr/share/filebeat/filebeat.yml
    - /var/lib/docker:/var/lib/docker:ro
    - /var/run/docker.sock:/var/run/docker.sock
    links:
    - "elasticsearch"
    - "kibana"


networks:
  myefk:
    driver: bridge
    ipam:
      config:
        - subnet: 172.29.120.0/24

3.部署EFK

执行docker compose up -d ,开始部署efk

[root@jeven efk]# docker compose up -d
[+] Running 4/4
 ⠿ Network efk_myefk         Created                                                                                           0.0s
 ⠿ Container elasticsearch   Started                                                                                           0.4s
 ⠿ Container efk-kibana-1    Started                                                                                           0.8s
 ⠿ Container efk-filebeat-1  Started                                                                                           0.8s

4.检查efk相关容器状态

检查efk的相关容器启动状态

[root@jeven efk]# docker compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
efk-filebeat-1      "/usr/bin/tini -- /u…"   filebeat            running             
efk-kibana-1        "/bin/tini -- /usr/l…"   kibana              running             0.0.0.0:5601->5601/tcp, :::5601->5601/tcp
elasticsearch       "/bin/tini -- /usr/l…"   elasticsearch       running             0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9200->9200/tcp, :::9300->9300/tcp

5.查看efk相关容器日志信息

通过docker compose logs 来查看容器运行日志信息。

[root@jeven efk]# docker compose logs |head
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:47+00:00","tags":["info","plugins-service"],"pid":7,"message":"Plugin \"metricsEntities\" is disabled."}
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:47+00:00","tags":["info","http","server","Preboot"],"pid":7,"message":"http server running at http://0.0.0.0:5601"}
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:47+00:00","tags":["warning","config","deprecation"],"pid":7,"message":"Starting in 8.0, the Kibana logging format will be changing. This may affect you if you are doing any special handling of your Kibana logs, such as ingesting logs into Elasticsearch for further analysis. If you are using the new logging configuration, you are already receiving logs in both old and new formats, and the old format will simply be going away. If you are not yet using the new logging configuration, the log format will change upon upgrade to 8.0. Beginning in 8.0, the format of JSON logs will be ECS-compatible JSON, and the default pattern log format will be configurable with our new logging system. Please refer to the documentation for more information about the new logging format."}
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:47+00:00","tags":["warning","config","deprecation"],"pid":7,"message":"The default mechanism for Reporting privileges will work differently in future versions, which will affect the behavior of this cluster. Set \"xpack.reporting.roles.enabled\" to \"false\" to adopt the future behavior before upgrading."}
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:47+00:00","tags":["warning","config","deprecation"],"pid":7,"message":"从 8.0 开始,用户会话将在处于非活动状态 8 小时后自动超时。覆盖此值以更改超时。"}
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:47+00:00","tags":["warning","config","deprecation"],"pid":7,"message":"从 8.0 开始,将在 30 天后自动要求用户重新登录。覆盖此值以更改超时。"}
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:47+00:00","tags":["info","plugins-system","standard"],"pid":7,"message":"Setting up [113] plugins: [translations,licensing,globalSearch,globalSearchProviders,features,licenseApiGuard,code,usageCollection,xpackLegacy,taskManager,telemetryCollectionManager,telemetryCollectionXpack,kibanaUsageCollection,share,embeddable,uiActionsEnhanced,screenshotMode,banners,telemetry,newsfeed,mapsEms,mapsLegacy,kibanaLegacy,fieldFormats,expressions,dataViews,charts,esUiShared,bfetch,data,savedObjects,presentationUtil,expressionShape,expressionRevealImage,expressionRepeatImage,expressionMetric,expressionImage,customIntegrations,home,searchprofiler,painlessLab,grokdebugger,management,watcher,licenseManagement,advancedSettings,spaces,security,savedObjectsTagging,reporting,canvas,lists,ingestPipelines,fileUpload,encryptedSavedObjects,dataEnhanced,cloud,snapshotRestore,eventLog,actions,alerting,triggersActionsUi,transform,stackAlerts,ruleRegistry,visualizations,visTypeXy,visTypeVislib,visTypeVega,visTypeTimelion,visTypeTagcloud,visTypeTable,visTypePie,visTypeMetric,visTypeMarkdown,tileMap,regionMap,expressionTagcloud,expressionMetricVis,console,graph,fleet,indexManagement,remoteClusters,crossClusterReplication,indexLifecycleManagement,dashboard,maps,dashboardMode,dashboardEnhanced,visualize,visTypeTimeseries,rollup,indexPatternFieldEditor,lens,cases,timelines,discover,osquery,observability,discoverEnhanced,dataVisualizer,ml,uptime,securitySolution,infra,upgradeAssistant,monitoring,logstash,enterpriseSearch,apm,savedObjectsManagement,indexPatternManagement]"}
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:47+00:00","tags":["info","plugins","taskManager"],"pid":7,"message":"TaskManager is identified by the Kibana UUID: 5ef7fd18-4086-4ce8-8d43-91e99b733fcb"}
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:48+00:00","tags":["warning","plugins","security","config"],"pid":7,"message":"Generating a random key for xpack.security.encryptionKey. To prevent sessions from being invalidated on restart, please set xpack.security.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command."}
efk-kibana-1  | {"type":"log","@timestamp":"2023-01-20T01:43:48+00:00","tags":["warning","plugins","security","config"],"pid":7,"message":"Session cookies will be transmitted over insecure connections. This is not recommended."}

6.测试访问elasticsearch

测试本地访问elasticsearch

[root@jeven efk]# curl 192.168.3.166:9200
{
  "name" : "jeven",
  "cluster_name" : "myes",
  "cluster_uuid" : "BfacKp5xRBqNKvus7q3tIA",
  "version" : {
    "number" : "7.17.5",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "8d61b4f7ddf931f219e3745f295ed2bbc50c8e84",
    "build_date" : "2022-06-23T21:57:28.736740635Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

七、访问kibana服务

1.访问kibana

浏览器输入:http://192.168.3.166:5601/

2.进入kibana首页

进入kibana首页

八、查看日志信息

1.进入索引管理界面

选择managerment——stack managerment,

选择数据下——索引管理

2.查看filebeat索引信息

选择filebeat索引,查看索引信息。

3.创建索引

进入索引管理界面,选择索引模式——创建索引,

设置索引名称——索引时间戳字段——创建索引。

4.搜索日志信息

在主页,选择discover模块位置,根据字段可搜索日志信息。

5.查看日志文件信息

Observability——日志,点击进入。

本文转载于网络 如有侵权请联系删除

相关文章

  • 【Docker系列】docker-compose一步帮你搞定n个容器

    ‍目录一、docker-compose简介二、docker-compose.yml详解三、docker-compose.yml的demo四、docker-compose常用命令五、总结六、历史文章指路‍一、docker-compose简介docker-compose是docker提供的一个命令行工具,用来定义和运行由多个容器组成的应用。为什么需要docker-compose?一般我们一个完整的应用部署包括几个服务:Web应用、MySQL服务、Redis服务,有的可能用到Kafka服务、Prometheus服务等等。那么如何管理这么多服务呢?我们就需要docker-compose来帮我们实现批量管理容器服务。接下来我们来看看docker-compose是如何批量管理容器服务的?这就说道docker-compose.yml了。docker-compose.yml可以同时管理多个container,包括他们之间的关系、使用已存在的image还是自己build新的镜像、各种网络端口定义、储存空间定义等。然后我们可以用dockercomposeup-d完成应用所有容器的创建和启动。ok,重点来了

  • Python 基础 字符串的索引与切片

    参考链接:如何在Python中索引和切片字符串string字符串是一个字符序列,那么如何访问字符串中的一个或者多个字符呢?在Python中,可以通过索引和切片的操作来完成。 序号体系 正向递增序号,从左往右编号01234hello反向递减序列,从右往左编号-5-4-3-2-1hello 区间访问格式 字符串[头下标:尾下标:步长]头下标表示开始取值的索引。头下标表示结束取值的索引,二者都可以在无的情况下,表示从头、尾取值。而步长则表示隔几个数取值,如1到3则称步长是2;若是步长为负,这说明倒着取值,如3到1步长为-2. #python3str='helloworld!'#获得字符串前5个字符:helloprint(str[:5])#等同于print(str[0:5])#获得字符串[2,5)一共三个字符:lloprint(str[2:5])#获得字符串[6,len(str))之后的字符:world!(一共6个字符)print(str[6:])#下标从最右边以0开始,获得[5,len(str)):hellowprint(str[:-5])#下标从最右边以0开始,获得[5

  • 具有节点邻近性的图池用于分层表示学习(CS AI)

    图神经网络已引起广泛关注,以使得在最近的工作中能够学习图数据的表示形式。作为图卷积运算符的补充,图池对于提取图数据的分层表示至关重要。但是,最新的图形池化方法仍然无法有效利用图形数据的几何形状。在本文中,我们提出了一种新颖的图池化策略,该策略利用节点邻近性来改善图数据的多跳拓扑结构的分层表示学习。通过协调拓扑信息和节点特征的内核表示来获得节点邻近性。拓扑信息的隐式结构感知内核表示允许有效的图池化,而无需图Laplacian的显式本征分解。使用仿射变换和核技巧结合使用高斯RBF函数自适应地评估节点信号的相似性。实验结果表明,所提出的图池化策略能够在一组公共图分类基准数据集上实现最新性能。原文标题:GraphPoolingwithNodeProximityforHierarchicalRepresentationLearning原文:Graphneuralnetworkshaveattractedwideattentionstoenablerepresentationlearningofgraphdatainrecentworks.Incomplementtographconvolutio

  • Python利用random生成一个列表内的随机数

    首先,需要导入random模块:importrandom复制随机取1-33之间的1个随机数,可能重复:random.choice(range(1,34))复制print得到一系列随机数,执行一次得到一个随机数:print(random.choice(range(1,34)))复制随机取1-33之间的6个随机数,可能重复:random.choices(range(1,34),k=6,weights=range(1,34))复制其权重值表示该数或该范围内的数输出概率大,输出结果为列表随机取1-33之间的6个随机数,不重复:random.sample(range(1,34),6)复制得到一个无序列表random.uniform(a,b)生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限random.randint(a,b)生成一个指定范围内的整数。其中参数a是下限,参数b是上限PS:python随机选取列表中的元素使用random模块中的sample函数功能:random.sample(seq,k)实现从序列或集合seq中随机选取k个独立的的元素参数:seq:元组、列表或字符

  • RabbitMQ精讲系列教程高级篇七 消费端限流

    消费端的限流?场景:    假设,我们mq服务器上有上万条未处理的消息,我们随便打开一个消费者客户端,会出现什么样的情况呢?大量的消息瞬间被全部推送给了这个消费者,但是单个消费者是无法消费这么多消息的。会导致系统崩溃,线上故障发生。RabbitMQ提供了一种qos(服务直连保证)功能,即在非自动确认消息的前提下,如果一定数目的消息(通过基于consumer或者是channel设置Qos的值)未被确认前,不进行消费新的消息。这样就保证了大量消息瞬间被推送时候,不至于拖垮服务。方法:VoidBasiceQos(unitprefetchSize,ushortprefetchCount,booleglobal);说明:该方法是在消费端设置的。参数说明:prefetchSize:消息大小限制。如消息多少M。设置为0表示不做限制prefetchCount:一次最多能够处理多少条消息。默认设置1global:限流策略在什么上使用的。Channle级别还是consumer级别。true:channel级别的设置;false:consumer级别的设置。一般设置为false即可。注意:prefetchS

  • 赵本山:我的时代还没有结束 | Python告诉你

    作者|丁彦军来源|恋习Python(ID:sldata2017)【AI科技大本营按】今年春晚的小品好看吗?没有了赵本山的春晚总觉得少了点什么,然而许久不登春晚舞台的本山大叔借着B站的东风证明了「你大爷还是你大爷」。 最近很多人被“改革春风吹满地,中国人民真争气”魔性的旋律所洗脑,实际上这段魔性的旋律来自于鬼畜神曲《念诗之王》,而这段神曲就是根据本山大叔的作品所剪辑的。目前《念诗之王》在B站播放量已经接近3000万!今天我们就来用Python分析下《念诗之王》火起来的原因。1990年本山老师首次登上中央电视台春节联欢晚会舞台,在春晚舞台给我们留下很多深入人心的作品如《相亲》,《我想有个家》,《昨天今天明天》,到2011年最后一次在春晚舞台表演小品,,22个年头陪我们度过了21个大年夜,每次都期待大叔的压轴出场伴随着零点的钟声一起跨年。20年里本山老师的影响力是毋庸置疑的,但是小平不是单口相声更不是独角戏,他的成功也是离不开搭档的配合,大家最熟悉的搭档应该是范伟何高秀敏。三个人作为黄金搭档也是演绎了许多经典作品比如《卖拐》,《买车》,《功夫》等。除了范伟和高秀敏,最令人印象深刻的搭档就是宋

  • 房价数据转换和清洗

    1.下载厦门房价信息源文件下载链接:https://pan.baidu.com/s/16D5hw-XBEQnwtsf4fDJ8xw密码:e1fg2.新建一个ipynb文件下载成功后,在源文件所在的文件夹中下图所标示的位置中输入cmd,确定命令正确后运行。 打开cmd.png 出现的cmd如下图所示 cmd打开后图示.png 在cmd中输入命令jypyternotebook 运行命令成功图示.png新建一个ipynb文件.png对新建的ipynb文件重命名1.png 将ipynb文件重命名为dataProcessing 对新建的ipynb文件重命名2.png3.导入数据并查看数据字段导入数据.png从上图可以看出原有共15列,分别为:标题title、价格price、首付downPayment、户型sizeType、面积size、单价unitPrice、朝向orientation、楼层floor、装修decoration、社区community、区域region、学校school、房屋详情houseDetail、核心卖点keySellingPoint、配套设施equipment。4.

  • Python基础整理操作积累

    Python编程积累列表内容Python基础 for变化量的灵活应用forx,yin[[0,1],[0,2],[1,2]]: dist=euclidean_distances(counts[x],counts[y])复制2.pirnt()同时输出字符串和数字的两种方法:%和{}print('文档{}与文档{}的距离{}'.format(x,y,dist)) #文档0与文档1的距离[[2.44948974]] #%.5f代表输出到小数点后第5位 print('文档%d与文档%.d的距离%.5f'%(x,y,dist)) #文档0与文档1的距离2.44949复制3.使用matlabplot.pyplot的xlim和ylim确定绘制图像的大小plt.xlim(0,image.shape[1]) plt.ylim(image.shape[0],0)复制

  • 微信生成二维码以及小程序码

    生成二维码目录结构-... -pages -index -index.js -index.json -index.wxml -index.wxss -utils -qrcode.js -...复制qrcode.js下载在index.js引用importQRCodefrom'../../utils/qrcode'; ... varthat=this; newQRCode('myQrcode',{ text:that.data.value, width:141,//canvas画布的宽 height:141,//canvas画布的高 padding:0,//生成二维码四周自动留边宽度,不传入默认为0 correctLevel:QRCode.CorrectLevel.L,//二维码可辨识度 callback:(res)=>{ wx.hideLoading() wx.saveImageToPhotosAlbum({//保存到手机相册 filePath:res.path, success(res){ wx.showToast({ title:

  • 理解单链表的反转(java实现)

    理解单链表的反转(java实现) 要求很简单,输入一个链表,反转链表后,输出新链表的表头。   反转链表是有2种方法(递归法,遍历法)实现的,面试官最爱考察的算法无非是斐波那契数列和单链表反转,递归方法实现链表反转比较优雅,但是对于不了解递归的同学来说还是有理解难度的。 递归法 总体来说,递归法是从最后一个Node开始,在弹栈的过程中将指针顺序置换的。 为了方便理解,我们以1->2->3->4这个链表来做演示。输出的效果是4->3->2->1 首先定义Node: publicstaticclassNode{ publicintvalue; publicNodenext; publicNode(intdata){ this.value=data; } } 复制 反转方法如下: publicNodereverse(Nodehead){ if(head==null||head.next==null) returnhead; Nodetemp=head.next; NodenewHead=reverse(head.next); te

  • iOS 11: CORE ML—浅析

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/OWD5UEiVu5JpYArcd2H9ig 作者:liujizhou 导语:在刚刚过去的WWDC上,苹果发布了CoreML这个机器学习框架。现在,开发者可以轻松的使用CoreML把机器学习功能集成到自己的应用里,让应用变得更加智能,给用户更牛逼的体验。 苹果在iOS5里引入了NSLinguisticTagger来分析自然语言。iOS8出了Metal,提供了对设备GPU的底层访问。去年,苹果在Accelerate框架添加了BasicNeuralNetworkSubroutines(BNNS),使开发者可以构建用于推理(不是训练)的神经网络。 今年,苹果给了我们CoreML和Vision,让iOS开发者在人工智能上面更上一步台阶。 CoreML让我们更容易在App中使用训练过的模型。 Vision让我们轻松访问苹果的模型,用于面部检测、面部特征点、文字、矩形、条形码和物体。 你还可以在Vision模型中包装任意的图像分析CoreML

  • Uri各个属性取值测试

    asp.net代码: Urih_uri=newUri("http://hovertree.com/tiku/bjaf/3ntux9r9.htm?hewenqi#hewenqipl?ddd#hovertree"); Response.Write("<br/>Host:"+h_uri.Host); Response.Write("<br/>AbsolutePath:"+h_uri.AbsolutePath); Response.Write("<br/>AbsoluteUri:"+h_uri.AbsoluteUri); Response.Write("<br/>DnsSafeHost:"+h_uri.DnsSafeHost); Response.Write("<br/>Fragment:"+h_uri.Fragment); Response.Write("<br/>HostNameType:"+h_uri.HostNameType); Response.Write("<br/>IsAbsoluteUri:"

  • Java数据类型简单认识

      Java是一种强类型编程语言,因而在声明变量的时候必须声明数据类型,java语言有基本数据类型和引用数据类型这两大数据类型,基本数据类型有8种分别是4种整型、2种浮点类型、1种用于Unicode表示字符单元的字符类型和1种表示真值的布尔类型;引用数据类型有接口(interface)、数组(array)以及类(class),可以使用下图做一个详细的分类:     基本数据类型各个类型关键字、取值范围、占内存大小以及默认如下:    整数型   表示没有小数的部分的数值,也可以表示负数,其有整型(int)占4个字节,字节型(byte)占1个字节,短整型(short)占2个字节,长整型(long)占8个字节,java中常用的是int类型,而对于byte和short类型用于特定的场合,对于int类型的范围与运行的机器无关从而解决了软件的平台移植或者不同操作系统之间带来的不便问题。小知识点在java7中表示二进制数在前面加上0b并且还可以在数字之间加上下划线(”_”),例如:0b1010_0111,下划线只是为了方便阅读在编译的时候会去掉下划线。 浮点型   表示有小数的部分,其有两种形式一

  • APP抓取

    转载自:https://note.youdao.com/share/?id=49c7050093a7b45d64c4a98ac9cc78bc&type=note#/ 需要注意的几点: 1.安装ant,配置环境变量;需要用ant打jar包,再把jar把放到模拟器上; 2.开发工具绑定ant,使用ant进行build;ecplise中是Properties-Builders--新建antbuild--选择build.xml,如果没有,可以复制过去一个; 3.利用Fiddler抓包持久化到本地:       staticfunctionOnBeforeResponse(oSession:Session){       if(m_Hide304s&&oSession.responseCode==304){           oSes

  • [转]Win2003打不开https的问题

    转自:http://ljl-xyf.iteye.com/blog/2269834   碰到客户做问题是能打开https://www.baidu.com 这个网页打不开 https://sha256.alipay.com/SHA256/index.htm支付宝这个网页     解决办法:需要下载安装组件或者是电脑本身已经有了需要升级 https://technet.microsoft.com/en-us/library/security/ms13-095.aspx 微软的地址 可以到这里面下载相应的组件 开启ssl windows200332Byte 直接下载附件安装就可以

  • URL编码和解码工具

    开发中发现需要进行URL的编解码,每次百度出来的还带广告而且比较慢,写了一个本地的工具,比较简单,希望对大家有帮助。   <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- Author:Kang,Leo Date:2015-8-19 Email:kangyi@staff.weibo.com QQ:531155260 --> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/> <styletype="text/css"> textarea{ height:200px; width:100%; margin:5px; } input{ hei

  • uni模板

    <template> <viewclass="content"> </view> </template> <script> exportdefault{ components:{ }, data(){ return{} }, onLoad(){}, onPullDownRefresh(){ console.log('下拉刷新---'); setTimeout(function(){ uni.stopPullDownRefresh(); },1000); }, onReachBottom(){ console.log('上拉加载'); }, methods:{} } </script> <stylelang="scss"scoped> .content{ overflow:hidden; min-height:100vh; } </style> 复制   

  • 消息队列——RabbitMQ学习笔记

    1.写在前面 昨天简单学习了一个消息队列项目——RabbitMQ,今天趁热打铁,将学到的东西记录下来。 学习的资料主要是官网给出的6个基本的消息发送/接收模型,或者称为6种不同的使用场景,本文便是对这6种模型加以叙述。 2.Tutorials 在学习6种模型之前,我们首先需要安装RabbitMQ。RabbitMQ支持多种系统平台,各平台的安装方法可以点此查看。安装好之后,我们使用如下命令启用Web端的管理插件:rabbitmq-pluginsenablerabbitmq_management,然后启动RabbitMQ。接着用浏览器访问http://localhost:15672/,若能看到RabbitMQ相关Web页面,说明启动成功。 2.1HelloWorld 正所谓万事开头难,我们先从最简单的HelloWorld开始。首先当然是新建一个项目,导入RabiitMQ相关jar。我采用Maven来构建项目,因此只需要在pom文件中添加如下依赖:   <dependency>   <groupId>com.rabbitmq<

  • Pro ASP.NET MVC –第四章 语言特性精华

    C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性。因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性。 每个特性我们都只是简要介绍。如果你想深入了解LINQ或C#,你可以去参考Adam的三本书:IntroducingVisualC#,你可以全面地了解C#语言;ProLINQinC#,你深入了解LINQ;Pro.NETParallelProgramminginC#,你可以详细地了解.NET所支持的异步编程。这些书都出自Apress出版社 1创建示例项目 为了更好的演示C#语言特性,我们在本章创建一个名为LanguageFeatures的ASP.NETMVC4WEBAPPLICATION. 首先,我们需要一个简单的控制器,以演示这些语言特性,因为我们在Controllers文件夹下添加HomeController.cs文件,然后添加如下的代码 publicclassHomeController:Controller { publicstringIndex() { return"NavigatetoaURLtoshowanexamp

  • 面向.Net程序员的后端性能优化实战

    最近2个月没做什么新项目完全是对于旧的系统进行性能优化避免超时死锁数据处理能力不够等常见的性能问题 这里不从架构方面出发毕竟动大手脚成本比较高那么我们以实例为前提从细节开始  优化角度 一.业务逻辑优化 二.DB优化 三.数据处理优化 四.锁与性能 五.cpu飙高小结 六.crash现象分析  业务逻辑优化 这一条不具有普遍性不同的业务不同的场景如果归纳起来就是在不影响业务的前提下进行流程精简 1.废弃冗余逻辑  常见于各种基于数据库的检查很多同学在维护别人代码的时候没有深入理解别人的逻辑也许别人在取数据的时候已经在查询条件中已经过滤了相关逻辑而后来维护的同学又来了一次check 当然如果处于数据安全的角度doublecheck无可厚非,但是如果连锁都没有的doublecheck其实不做也罢。 毕竟省一次dbcall可能效果胜于你做的N多优化 2.合并业务请求 出发点和上述一致节省dbcall但是存在一个矛盾的点如果业务包在事务里这条需要慎重考虑事务的设计原则里当然能小则小 DB优化 这个其实是比较核心的点 1.索引优化 这个点比较泛泛但是做好的人不

  • virtualbox安装ubuntu16 LTS及其配置

        如果觉得文章有帮助,请给个赞~让更多有需要的人搜索到~  一、下载安装VirtualBox   1.从官网下载VirtualBox,目前版本:VirtualBox6.0.6forWindowshostsx86/amd64   2.下载好之后安装VirtualBox   3.运行VirtualBox程序,如下图所示:      4.配置VirtualBox。按CTRL+G打开全局设定,然后根据需要可以设定虚拟电脑存储位置和界面语言:   二、安装ubuntu    在本次实验中,选用ubuntu-16.04.5LTS版本进行安装。    2.1创建虚拟机   运行VitualBox程序,点击“新建”按钮,新建一个虚拟机:     虚拟机名称自定义,示例:hadoop-ubuntu,操作系统选择Linux,版本选择ubuntu(64-bit),然后点击下一步:       设定虚拟机的内存,此内存既为虚拟机所占用的系统内存,可以随意修改,但不要超过系统内存的70%,不然会对自己的电脑负载很大。在

相关推荐

推荐阅读