Docker 基础 - 3

Web 服务器与应用

Nginx

我的Nginx Docker镜像

## 设置继承自己创建的 sshd 镜像
FROM caseycui/ubuntu-sshd

## 维护者
LABEL maintainer="CaseyCui cuikaidong@foxmail.com"

## 安装 nginx
RUN apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
        nginx \
        geoip-bin \
        fcgiwrap \
        ssl-cert \
    && rm -rf /var/lib/apt/lists/* \
    && chown -R www-data:www-data /var/lib/nginx

## 添加脚本,并设置权限
COPY run-nginx.sh /run-nginx.sh
##RUN chmod 755 /run-nginx.sh

## 定义工作目录
WORKDIR /etc/nginx

## 添加挂载点 /var/www
VOLUME /var/www

## forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
        && ln -sf /dev/stderr /var/log/nginx/error.log

## 定义输出端口
EXPOSE 80
EXPOSE 443

## 定义输出命令
CMD ["/run-nginx.sh"]

run-nginx.sh 脚本:

## nginx 以 daemon off 形式启动
/usr/sbin/nginx -g "daemon off;"

为什么需要 daemon off; ?

想象这样的场景:

如果没有 daemon off, nginx 后台运行, 这时 nginx 并不是 pid 为 1 的程序, 而是执行的其他(如 bash), 这个 bash 执行了 nginx 指令后就结束了, 容器也会随之退出.

或直接修改/etc/nginx/nginx.conf 文件:

echo -e "\ndaemon off;" >> /etc/nginx/nginx.conf

Tomcat

Tomcat 最初是由 Sun 的软件架构师詹姆斯.邓肯.戴维森 开发的, 后来在他的帮助下称为开源项目, 并由 Sun 贡献给 Apache 软件基金会.

Tomcat主要功能: 运行 JSP 页面和 Servlet.

JAVA

企业通常使用 Sun JDK 6 或 Oracle JDK 7+. Dockerfile 如下:

FROM caseycui/ubuntu-sshd

LABEL maintainer="CaseyCui cuikaidong@foxmail.com"

## 创建 /java 目录
RUN mkdir /java

## 解压jdk压缩包到/java目录
ADD jdk-7u80-linux-x64.tar.gz /java

## 1. 删除 src.zip,减少镜像size
## ~~2. 配置JAVA环境变量~~
## ~~3. 使生效~~
## 下面为几种不同的 echo 写法(配置ENV则不需要手动在/etc/profile里添加)
## =======================================================
## echo -e "\nexport JAVA_HOME=/java/jdk1.7.0_80\nexport PATH=/java/jdk1.7.0_80/bin:$PATH\nexport CLASSPATH=.:/java/jdk1.7.0_80/lib/dt.jar:/java/jdk1.7.0_80/lib/tools.jar" >> /etc/profile
## =======================================================
## RUN { \
##                 echo; \
##                 echo 'export JAVA_HOME=/java/jdk1.7.0_80'; \
##                 echo 'export PATH=$JAVA_HOME/bin:$PATH'; \            
##                 echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar'; \
##         } >> /etc/profile \
##     && source /etc/profile \
##     && rm -f /java/jdk1.7.0_80/src.zip
## =======================================================

RUN rm -f /java/jdk1.7.0_80/src.zip

## 配置ENV
## > The environment variables set using `ENV` will persist when a container is run from the resulting image.

ENV JAVA_HOME /java/jdk1.7.0_80
ENV JAVA_VERSION 7u80
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

❗ 备注:

  • JDK的压缩包来自 Oracle Support 网站.

  • JAVA环境变量直接在 ENV 里配置即可, 无需手动写入 /etc/profile 中

  • 如何把多行, 且含有多种特殊字符的字符串写入文件? - 用大括号

Tomcat 8

基于 Oracle JDK 7 的 Tomcat 8.0.X 的Dockerfile如下:

FROM caseycui/jdk7:7u80
 
LABEL maintainer='CaseyCui cuikaidong@foxmail.com'
 
ENV CATALINA_HOME /tomcat
ENV PATH $CATALINA_HOME/bin:$PATH

RUN mkdir -p "$CATALINA_HOME"

WORKDIR $CATALINA_HOME

## let "Tomcat Native" live somewhere isolated 
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR

## runtime dependencies for Tomcat Native Libraries
## Tomcat Native 1.2+ requires a newer version of OpenSSL than debian:jessie has available
## > checking OpenSSL library version >= 1.0.2...
## > configure: error: Your version of OpenSSL is not compatible with this version of tcnative
## see http://tomcat.10.x6.nabble.com/VOTE-Release-Apache-Tomcat-8-0-32-tp5046007p5046024.html (and following discussion)
## and http://github.com/docker-library/tomcat/pull/31

ENV OPENSSL_VERSION 1.0.2g-1ubuntu4.8

## RUN set -ex; \
##         if ! grep -q stretch /etc/apt/sources.list; then \
## # only add stretch if we're not already building from within stretch
##                 { \
##                         echo 'deb http://deb.debian.org/debian stretch main'; \
##                 } > /etc/apt/sources.list.d/stretch.list; \
##                 { \
## # add a negative "Pin-Priority" so that we never ever get packages from stretch unless we explicitly request them
##                         echo 'Package: *'; \
##                         echo 'Pin: release n=stretch'; \
##                         echo 'Pin-Priority: -10'; \
##                         echo; \
## # ... except OpenSSL, which is the reason we're here
##                         echo 'Package: openssl libssl*'; \
##                         echo "Pin: version $OPENSSL_VERSION"; \
##                         echo 'Pin-Priority: 990'; \
##                 } > /etc/apt/preferences.d/stretch-openssl; \
##         fi

RUN apt-get update && apt-get install -y --no-install-recommends \
                libapr1 \
                openssl="$OPENSSL_VERSION" \
        && rm -rf /var/lib/apt/lists/*

## 安装跟 tomcat 用户认证相关的软件
RUN apt-get update && \
    DIBIAN_FRONTEND=noninteractive \
    apt-get install -yq --no-install-recommends \
        wget \
        pwgen \
        ca-certificates && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

## see http://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/KEYS
## see also "update.sh" (http://github.com/docker-library/tomcat/blob/master/update.sh)

ENV GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 713DA88BE50911535FE716F5208B0AB1D63011C7 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23

RUN set -ex; \
        for key in $GPG_KEYS; do \
                gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
        done

## 设置 tomcat 的环境变量
 
ENV TOMCAT_MAJOR 8
ENV TOMCAT_VERSION 8.0.46
ENV TOMCAT_TGZ_URL http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz
ENV TOMCAT_ASC_URL http://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc

## 复制 tomcat 到镜像中

RUN set -x \
        \
        && wget -O tomcat.tar.gz "$TOMCAT_TGZ_URL" \
        && wget -O tomcat.tar.gz.asc "$TOMCAT_ASC_URL" \
        && gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz \
        && tar -xvf tomcat.tar.gz --strip-components=1  \
        && rm bin/*.bat \
        && rm tomcat.tar.gz* \
        \
        && nativeBuildDir="$(mktemp -d)" \
        && tar -xvf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1 \
        && nativeBuildDeps=" \
                dpkg-dev \
                gcc \
                libapr1-dev \
                libssl-dev \
                make \
        " \
        && apt-get update && apt-get install -y --no-install-recommends $nativeBuildDeps && rm -rf /var/lib/apt/lists/* \
        && ( \
                export CATALINA_HOME="$PWD" \
                && cd "$nativeBuildDir/native" \
                && gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \
                && ./configure \
                        --build="$gnuArch" \
                        --libdir="$TOMCAT_NATIVE_LIBDIR" \
                        --prefix="$CATALINA_HOME" \
                        --with-apr="$(which apr-1-config)" \ 
                        --with-java-home="/java/jdk1.7.0_80" \
                        --with-ssl=yes \
                && make -j "$(nproc)" \
                && make install \
        ) \
        && apt-get purge -y --auto-remove $nativeBuildDeps \
        && rm -rf "$nativeBuildDir" \
        && rm bin/tomcat-native.tar.gz

## verify Tomcat Native is working properly
RUN set -e \
        && nativeLines="$(catalina.sh configtest 2>&1)" \
        && nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" \
        && nativeLines="$(echo "$nativeLines" | sort -u)" \
        && if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then \
                echo >&2 "$nativeLines"; \
                exit 1; \
        fi

## 创建 tomcat 用户脚本
COPY create_tomcat_admin_user.sh /create_tomcat_admin_user.sh
 
## 创建 tomcat 运行脚本
COPY run-tomcat.sh /run-tomcat.sh

RUN chmod +x /*.sh && \
    chmod +x /tomcat/bin/*.sh
 
## 挂载点
## 日志文件
VOLUME $CATALINA_HOME/logs

## 程序文件 
VOLUME $CATALINA_HOME/webapps

EXPOSE 8080

CMD ["/run-tomcat.sh"]

创建 Tomcat 用户和密码脚本文件 create_tomcat_admin_user.sh, 内容如下:

##!/bin/bash
 
if [ -f /.tomcat_admin_created ]; then
    echo "Tomcat 'admin' user already created"
    exit 0 
fi

## generate password
PASS=${TOMCAT_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${TOMCAT_PASS} ] && echo "preset" || echo "random")
echo "=> Creating and admin user with a ${_word} password in Tomcat"

##sed -i -r 's/<\/tomcat-user>//' ${CATALINA_HOME}/conf/tomcat-users.xml
## 这句的主要用法就是原本的`tomcat-users.xml`里存在一个空的`<tomcat-users>`到`</tomcat-users>`的字段,直接用sed删除最后一行,即`</tomcat-users>`
## 然后补上我们生成的密码的相关内容,最后再加上`</tomcat-users>`
 
 
sed -i '$d' ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="manager-jmx"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '<role rolename="admin-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo "<user username=\"admin\" password=\"${PASS}\" roles=\"manager-gui, manager-script, manager-jmx, admin-gui, admin-script\"/>" >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo '</tomcat-users>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
echo "=> Done!"
touch /.tomcat_admin_created
echo "======================================================"
echo "You can now configure to this Tomcat server using:"
echo ""
echo "      admin:${PASS}"
echo ""
echo "======================================================"

Tomcat 启动脚本 run-tomcat.sh:

##!/bin/bash
 
if [ ! -f /.tomcat_admin_created ]; then
    /create_tomcat_admin_user.sh
fi

exec ${CATALINA_HOME}/bin/catalina.sh run 

tomcat 密码脚本最后生成的 tomcat-users.xml 文件:

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at
      http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">

<!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary. It is
  strongly recommended that you do NOT use one of the users in the commented out
  section below since they are intended for use with the examples web
  application.
-->

<!--
  NOTE:  The sample user and role entries below are intended for use with the
  examples web application. They are wrapped in a comment and thus are ignored
  when reading this file. If you wish to configure these users for use with the
  examples web application, do not forget to remove the <!.. ..> that surrounds
  them. You will also need to set the passwords to something appropriate.
-->

<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
  <user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
  <user username="role1" password="<must-be-changed>" roles="role1"/>
-->

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="admin" password="vNc8guWjdrBP" roles="manager-gui, manager-script, manager-jmx, admin-gui, admin-script"/>
</tomcat-users>

本章小结

中间件服务器是 Docker 容器应用的最佳实践, 理由如下:

  • 中间件服务器是除数据库服务器外的主要计算节点, 很容易成为性能瓶颈, 所以通常需要大批量部署, 而Docker 对于批量部署有着许多的先天优势
  • 中间件服务器结构清晰, 在剥离了配置文件 日志 代码目录 之后, 容器几乎可以处于零增长状态, 这使得容器的迁移和批量部署更加方便.
  • 中间件服务器很容易实现集群, 在使用硬件的F5, 软件的Nginx 等负载均衡后, 中间件服务器集群变得非常容易

在使用中间件容器的时候, 需要事先规划好容器的用途和可能开放的网络端口等资源.

❗ 对于程序代码 程序的资源目录 日志 数据库文件 等需要实时更新的数据一定要通过 -v 参数映射到宿主主机的目录中来, 使用 Docker 的 AUFS 文件格式, 会产生较大的性能问题.

IBM研究院关于Docker各项性能的测试报告

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

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

相关文章

  • chmod修改权限的用法

    大家好,又见面了,我是你们的朋友全栈君。一、chmod作用:修改文件、目录的权限二、语法:chmod[对谁操作][操作符][赋予的权限]文件名三、操作对象:u用户user,表现文件或目录的所有者g用户组group,表现文件或目录所属的用户组o其他用户othera所有用户all四、操作符:+添加权限–减少权限=直接给定一个权限五:权限:1、r2、w3.x例如:六、八进制数字表示权限rwx二进制代表100010001十进制代表421例:rw-的值为4+2=6rwxr-xr-x的值为755语法:1.chmod755文件或文件夹名字2.chmoda=rwx1.txt=chmod7771.txt发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125260.html原文链接:https://javaforall.cn

  • 第一个使用Tensorflow的程序

    #构建图构建图的第一步,是创建源op(sourceop).源op不需要任何输入,例如常量(Constant).源op的输出被传递给其它op做运算.Python库中,op构造器的返回值代表被构造出的op的输出,这些返回值可以传递给其它op构造器作为输入.TensorFlowPython库有一个默认图(defaultgraph),op构造器可以为其增加节点默认图现在有三个节点,两个constant()op,和一个matmul()op.为了真正进行矩阵相乘运算,并得到矩阵乘法的结果,你必须在会话里启动这个图.#在一个会话中启动图构造阶段完成后,才能启动图.启动图的第一步是创建一个Session对象,如果无任何创建参数,会话构造器将启动默认图.#代码importtensorflowastf #op称为图的节点 #创建一个常量op,产生一个1x2矩阵,这个op被作为一个节点 #加到默认图中 #构造器的返回值代表该常量op的返回值 matrix1=tf.constant([[3.,3.]]) #创建另一个常量op,产生一个2x1矩阵 matrix2=tf.constant([[2.],[2.]

  • CentOS 7.x 修改固定IP地址

    CentOS7.x修改固定IP地址,理论适用所有Linux系统。云主机一般不能修改固定ip1.查找网卡查看当前公网ip的网卡名称ipaddr复制ens33为当前网卡名称2.修改网卡配置vi/etc/sysconfig/network-scripts/ifcfg-ens33 #ens33替换为你网卡名称复制需要修改的地方BOOTPROTO=static#dhcp改为static(修改) ONBOOT=yes#开机启用本配置,一般在最后一行(修改) IPADDR=192.168.31.210#静态IP(增加) GATEWAY=192.168.31.1#默认网关,如果是虚拟机桥接模式,就填路由器的网关即可,一般都是.1 NETMASK=255.255.255.0#子网掩码(增加) DNS1=192.168.31.1#DNS配置,一般和网关相同复制3.重启网卡servicenetworkrestart复制4.测试ipaddr pingbaidu.com复制能联网就表示成功

  • 记一次docker逃逸学习

    本文首发于先知社区:https://xz.aliyun.com/t/9966环境搭建靶场:ubuntu内网ip:192.168.183.10外网ip:192.168.1.6域内主机:win7:192.168.183.129win2008:192.168.183.130需手动开启ubuntu的docker环境,对应的端口服务如下2001struts2 2002tomcat8 2003phpmyadmin4.8.1外网打点端口扫描首先对ubuntu进行端口扫描,发现2001、2002、2003三个特征端口nmap-T4-sC-sV192.168.1.6复制Struts2首先访问2001端口,是一个struts2的框架这里直接使用漏扫工具检测struts2有无漏洞,这里发现存在S2-045、S2-046两个漏洞首先使用S2-045看能不能命令执行,这里发现返回的是html再换一个S2-046漏洞发现能够命令回显这里直接尝试上传一个jsp上去试试,返回了路径这里访问一下,返回了404,这里我尝试了其他几个路径都是返回404,但是S2-046这个漏洞应该是能拿到shell的,这里这个端口就没继续

  • 图像也能做情感迁移?罗切斯特大学团队提出计算机视觉新任务

    机器之心报道编辑:魔王图像风格迁移?语音情感迁移?不,是图像情感迁移。计算机视觉领域中有很多任务,如目标检测、图像转换、风格迁移等,但你听说过「图像情感迁移」吗?罗切斯特大学罗杰波教授团队提出了这项研究任务[1]。与其他计算机视觉任务相比,图像情感迁移更有挑战性,需要对图像中的每个物体进行不同的情感迁移。该研究提出一种灵活有效的物体级图像情感迁移框架和新模型SentiGAN,实验证明该框架可以有效执行物体级图像情感迁移。什么是图像情感迁移?图像情感迁移是一个待探索的新型研究任务。与图像转换、图像风格迁移和面部表情迁移任务相比,图像情感迁移关注更高级更抽象的对图像整体外观和感觉的修改,而不改变其场景内容。如图1a所示,将浑浊的海水变得清澈并给海鸟着色后,原本传递中性或消极情感的图像变得积极温暖,而图像中的内容并未被更改。与图像转换和图像风格迁移相比,该研究认为图像情感迁移更具挑战性。其中一个难点在于对不同类别的物体进行情感迁移时需要使用不同的规则。这有别于风格迁移,后者可以将一种绘画风格统一添加给图像中的所有物体。如图1所示,要让输入图像具备积极情感,应把海水迁移成清澈的蓝色,海鸟迁移成

  • 生动形象的介绍数字证书及CA——保你看后必懂

    ★先说一个通俗的例子  考虑到证书体系的相关知识比较枯燥、晦涩。俺先拿一个通俗的例子来说事儿。◇普通的介绍信  想必大伙儿都听说过介绍信的例子吧?假设A公司的张三先生要到B公司去拜访,但是B公司的所有人都不认识他,他咋办捏?常用的办法是带公司开的一张介绍信,在信中说:兹有张三先生前往贵公司办理业务,请给予接洽......云云。然后在信上敲上A公司的公章。  张三先生到了B公司后,把介绍信递给B公司的前台李四小姐。李小姐一看介绍信上有A公司的公章,而且A公司是经常和B公司有业务往来的,这位李小姐就相信张先生不是歹人了。  说到这,爱抬杠的同学会问了:万一公章是伪造的,咋办捏?在此,俺要先声明,在本例子中,先假设公章是难以伪造的,否则俺的故事没法说下去鸟。◇引入中介机构的介绍信  好,回到刚才的话题。如果和B公司有业务往来的公司很多,每个公司的公章都不同,那前台就要懂得分辨各种公章,非常滴麻烦。所以,有某个中介公司C,发现了这个商机。C公司专门开设了一项“代理公章”的业务。  今后,A公司的业务员去B公司,需要带2个介绍信:  介绍信1  含有C公司的公章及A公司的公章。并且特地注明:C公

  • 「课代表」帮你总结了全网最全的Redis知识点

    你知道的越多,你不知道的越多絮叨本来是没这期的,按道理更新也应该是在周一更新消息队列的幂等,分布式事务相关的文章,但是这篇暖男我实在忍不住了,不是发自己的文章,是帮课代表发一下,她本科是北京交通大学,也是电子科技大学的研究生。她看了我的系列,做了个笔记?,我一看,偶买噶!。这是什么仙女啊,这是我第一次有这种感觉,这笔记有着前所未有的新鲜感,细节的勾勒,让整个笔记更显出奥妙.…有些不太成熟的话语,跟我文章的骚气十分搭配,将Redis的性能衬托的更为出色,这才呈现出完美的课代表笔记。这也是我第一次看到看个渣男的文章都做笔记的,这笔记让我有了初恋的味道,这我以后可得好好写了,不然辜负了课代表这样认真的妹子,到时候到杭州来找我:敖丙你个渣男乱写,害我没拿Offer!我要杀了你!我也不多BB了不影响大家食用了,课代表说了以后我写的其他技术栈的笔记一样会贡献出来,代价就是要嫁给我,呸呸呸,代价就是我以后帮他介绍大厂朋友内推下,看看简历呀,解答下职场问题啊什么的。(根本就是举手之劳啊,我血赚?)我一听我不能忍啊,我气得拍桌子,不行你以后不懂的知识点我包了,我也不懂的咳咳我看完书再包?哈哈开玩笑的,总

  • Linux命令之less简介

    Linux命令之less一less命令简介:less工具是对文件或者其他输出进行分页显示的工具,它的功能十分强大。使用less查看文件时,我们不仅可以使用pagedown和pageup前后翻看文件,还可以使用它的很多搜索功能。语法 less文件名复制常用参数模板-b<缓冲区大小>设置缓冲区的大小-e当文件显示结束后,自动离开-f强迫打开特殊文件,例如外围设备代号、目录和二进制文件-g只标志最后搜索的关键词-i忽略搜索时的大小写-m显示类似more命令的百分比-N显示每行的行号-o<文件名>将less输出的内容在指定文件中保存起来-Q不使用警告音-s显示连续空行为一行-S行过长时间将超出部分舍弃-x<数字>将“tab”键显示为规定的数字空格 u向上翻页,d向下翻页,g跳到首行,G跳到底部。?查找内容表示向上查找、/查找内容表示向下查找、n匹配下一个查找的内容。N匹配上一个查找的内容,v:进入编辑模式,使用配置的编辑器编辑当前文件复制q退出less 二实例less文件名|grep-n查找内容复制上述命令可以将内容过滤,并显示内容所在行号。less-N文

  • 为 VR 优化UE 4渲染器

    首发于游戏蛮牛驿馆背景当我们的团队开始开发《Farlands》,我们花了一些时间来反思我们在这个demo里学到的经验,我们在OculusConnect开发者大会,游戏开发者大会(GDC),国际消费类电子产品展览会(CES)和一些其他的活动。我们使用UE4来创建此次内容,这为我们提供了一个令人难以置信的编辑环境和丰富的先进的渲染功能。 不幸地是,Rift渲染的现实意味着我们只能使用这些功能的一个子集。我们想研究哪些我们最常用的功能,看看我们是否能够设计一个精简的渲染器,能够提供更高性能和强大的视觉效果,同时让团队继续使用UE4的世界编辑器和引擎。然而Oculus虚幻渲染器关注的重点是Oculus应用程序的使用情况,这将改造原有项目(包括《Showdown》和Oculus的《Dreamdeck》这两款游戏),不需要花费太多的工作内容。在这些情况下,它提供了清晰的视觉效果,并释放出足够的GPU空间给一些附加功能或者提高15-30%的分辨率。 高分辨率比较:Oculus虚幻渲染器保持在90fps,默认的虚幻渲染器在60fps以下VR延迟问题虚幻引擎以其先进的渲染功能集和保真度而闻名。所以,我们

  • thymeleaf关于js的一些坑(数组定义)

    js中免不了的要用的数组,一维的二维的三维的,但是当用到thymeleaf作为模版时候会有一些坑,导致数组不能用先来看个异常Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Could notparseasexpression: "  {field:'checkBox',checkbox: true, fixed: true}  ,{field:'username', title: '用户名'} //width支持:数字、百分比和不填写。你还可以通过minWidth参数局部定义当前单元格的最小宽度,layui2.2.1新增  ,{field:'mobile', title: '手机号', sort: true}  ,{field:'nickname', title: '昵称'}  ,{field:'lastLoginTime', title

  • 凭什么?这家叫“喔去”的智能共享出行企业这么自信!

    全天候、24小时有车,自动开到楼下等你,交了押金就一直免费,智能驾驶保障安全,“喔去”看来都做到了。第一次听到“喔去”这家公司的时候,不禁在心里说了声“我去!”没错,很讶异,怎么会有公司叫这个名字?不过,这也激发了镁客君的猎奇心理,势要了解一下这家公司到底是个什么“鬼”。“喔去”是一家专注于智能化共享出行领域的科技创业公司,“缓解城市拥堵、智能共享出行”是他们的使命,“全天候、便捷化”是他们的主打特色。这家公司的掌门人叫邹峰,一个拥有典型北方人性格和典型南方人体型的“山东汉子”。第一次见到邹峰,感觉他一点都不像一个科技公司的CEO。瘦削的身型、很潮的运动装,背着羽毛球装备外加一个小的黑色旅行包,俨然一个正在进行短暂旅行的运动员。 做共享,需要一些独特的认识邹峰是一个连续创业者,喔去是他的第三家公司。“虽然去年我们才正式做喔去智能科技,但其实我早几年就已经有做共享电动车的想法了。” 近几年,随着滴滴、易到、曹操等共享汽车/专车的普及,尤其是2016年共享单车的火爆,共享出行已经不再只是一个概念,而是成为了实实在在的大众出行优选品。但不可否认的是,目前的共享出行工具存在着一些问题,例如汽车

  • ERC20 Token Solidity 0.4.23

    NetkillerBlockchain手札本文作者最近在找工作,有意向致电13113668890Mr.NeoChan,陈景峯(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com> 文档始创于2018-02-10 版权©2018Netkiller(NeoChan).Allrightsreserved.版权声明转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。http://www.netkiller.cnhttp://netkiller.github.iohttp://netkiller.sourceforge.nethttp://www.netkiller.cnhttp://netkiller.github.iohttp://netkiller.sourceforge.net微信订阅号netkiller-ebook(微信扫描二维码)QQ:13721218请注明“读者”QQ群:128659835请注明“读者”微信订阅号netkiller-ebook(微信扫描二维码)QQ:

  • vector的find用法[通俗易懂]

    一. find函数存在于算法中 其头文件为#include<algorithm> 二. 代码示例:#include<vector> #include<algorithm> #include<iostream> usingnamespacestd; intmain() { vector<int>L; L.pushback(1); L.pushback(2); L.pushback(3); vector<int>::iteratorit=find(L.begin(),L.end(),3); if(it==L.end()) cout<<"NO"<<endl; else cout<<"YES"<<endl; }复制版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至举报,一经查实,本站将立刻删除。发布者:全栈程序员

  • 浅谈一致性哈希(My转)

        一致性哈希(Consistenthashing)算法是由MIT的Karger等人与1997年在一篇学术论文(《Consistenthashingandrandomtrees:distributedcachingprotocolsforrelievinghotspotsontheWorldWideWeb》)中提出来的,用于解决分布式缓存数据分布问题。在传统的哈希算法下,每条缓存数据落在那个节点是通过哈希算法和服务器节点数量计算出来的,一旦服务器节点数量发生增加或者介绍,哈希值需要重新计算,此时几乎所有的数据和服务器节点的对应关系也会随之发生变化,进而会造成绝大多数缓存的失效。一致性哈希算法通过环形结构和虚拟节点的概念,确保了在缓存服务器节点数量发生变化时大部分数据保持原地不动,从而大幅提高了缓存的有效性。下面我们通过例子来解释一致性哈希的原理。 ​  比如有n个节点,对于缓存数据(k,v)具体存在哪个节点往往hash(k)%n来计算处理,举一个例子如下表所示,一共有个3个节点,hash函数采用md5。 缓存keyhash(k)%n服务器节点 user_nick

  • 需求改进&amp;系统设计

    1、需求&原型改进: 问题1:双人联机的实现方式?修改1:原本打算通过两方同步进行,但同一画面就过于拥挤,且不方便计分,所以取消联机,增加排行榜。 2、系统设计:   功能需求 项目不仅实现了飞机游戏的基本功能,同时,为了满足玩家听觉上的需求,在游戏中加入了背景音乐和音效,从而使游戏从感官上更加吸引玩家。并在游戏中加入了得分排行榜的模块,使得玩家在一次次的挑战中,获得无穷的乐趣。   游戏主界面功能需求 良好的用户界面,能够在视觉上吸引玩家。为了使界面简洁美观,需要在主界面中添加背景图片来渲染游戏的气氛,同时为了便于玩家的操作,需要设置五个按钮供玩家选择,分别是“开始游戏”、“关于”、“1player”、“排行榜”、“返回”。这样的设置让用户一目了然。具体功能如下: (1)1player,点击跳转到游戏的主界面,开始了紧张而刺激的射击旅程; (2)关于,玩家可以选择是否打开背景音乐和音效; (3)排行榜,玩家可以查看历史排行; (4)返回,点击退出游戏。   背景音效的功能需求 玩家可以自主选择是否开启背景音乐或者游戏过程中的音效,使得玩家玩游戏时候,更加轻松、愉悦。

  • 5个最优秀的微信小程序UI组件库

    开发微信小程序的过程中,选择一款好用的组件库,可以达到事半功倍的效果。自从微信小程序面世以来,不断有一些开源组件库出来,下面5款就是排名比较靠前,用户使用量与关注度比较高的小程序UI组件库。还没用到它们的你,可以关注和了解一下哦! WeUIWXSS WeUIWXSS是腾讯官方UI组件库WeUI的小程序版,提供了跟微信界面风格一致的用户体验。 GitHub地址:https://github.com/Tencent/weui-wxss npm下载:npmiweui-wxss     iViewWeApp iView是TalkingData发布的一款高质量的基于Vue.js组件库,而iViewweapp则是它们的小程序版本。 GitHub地址:https://github.com/TalkingData/iview-weapp npm下载:npmiiview-weapp     ZanUIWeApp ZanUIWeApp是有赞移动WebUI规范ZanUI的小程序实现版本,结合了微信的视觉规范,为用户提供更加统

  • cross-env 作用

    是什么 运行跨平台设置和使用环境变量的脚本 出现原因 当您使用NODE_ENV=production,来设置环境变量时,大多数Windows命令提示将会阻塞(报错)。(异常是Windows上的Bash,它使用本机Bash。)同样,Windows和POSIX命令如何使用环境变量也有区别。使用POSIX,您可以使用:$ENV_VAR和使用%ENV_VAR%的Windows。 windows不支持NODE_ENV=development的设置方式。 解决 cross-env使得您可以使用单个命令,而不必担心为平台正确设置或使用环境变量。只要在POSIX系统上运行就可以设置好,而cross-env将会正确地设置它。 说人话:这个迷你的包(cross-env)能够提供一个设置环境变量的scripts,让你能够以unix方式设置环境变量,然后在windows上也能兼容运行。 安装 npminstall--save-devcross-env 复制 使用 {"scripts":{"build":"cross-envNODE_ENV=productionwebpack--configbuild/webp

  • 字符串必须申请内存空间

    #include"stdafx.h" #include"stdlib.h" int_tmain(intargc,_TCHAR*argv[]) { //输入字符串 char*str; scanf("%s",str); printf("输出输入的字符串*str=%s\n",&str); system("pause"); return0; }复制 代码出现指针问题 原因: 这样使用容易造成内存错误。char*str;声明了一个指针,但没有对其进行初始化,他的值是一个无法预知的值。可能指向一段空的内存,也可能指向其他程序使用的内存地址,也可能不是无用的内存地址。scanf("%s",str);的意思是获取一段字符串,并把字符串放到str所指的内存地址之后的一段空间。但本程序并没有申请内存空间,所指的那段内存空间就是上面三种情况中的一种。所以有可能就将其他程序的内存内容给改变了,其他程序崩溃了。printf("输出输入的字符串*str=%s\n",&str);这个输出语句也存在问题,&str应改为str,这的值是字符串地址的头指针,而不是str这个变量所在的地址。&

  • 3.SQL(查询)

    1.sql简介     结构化查询语言(StructuredQueryLanguage)简称SQL(发音:/ˈɛskjuːˈɛl/"S-Q-L"),结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。 DML(数据库操作语言):其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。 DDL(数据库定义语言):其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREATTABLE或DROPTABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。

  • Github 文件选择性上传

    用过Github的人都知道.gitignore文件的存在,但是实际用起来还是有一些需要注意的地方,尤其是对于新手来说,稍不注意就会出错。 一、Github选择性忽略特定文件的方式1.全局设置一般而言,要将一个工程上传,会在工程根目录下生成一个.git文件夹(由gitinit命令实现),在.git/info/文件夹下有一个exclude文件,里面描述的是不用上传到远端的文件的特征,一般是类正则表达式的表示。exclude文件的语法很容易,不做描述。2.局部设置特定目录下.ignore文件中定义不用上传到远端的文件的特征,该目录及该目录子目录下的所有符合特征的文件不会同步到远端。.ignore文件的写法类似exclude,无需多做介绍。二、需要注意的问题1.缓存问题如果文件已经进入缓存,就不受上面全局设置和局部设置的影响了,这种情况需要执行以下命令gitrm--cache复制 2..gitignore自身的忽略问题 可以同样在.gitignore中把自身忽略掉

  • Bike-Sharing

       Bike-Sharingis agreenermethodoftransportationandprovidesauser-friendlyexperience.Itoffersbothonlineandofflineservices.Operatorsareusuallystronginonlineservices,butlackofofflinebusinessexperiences,whichcausesproblems.Sharingbikesisanemergingtypeofsharingeconomy.Asthegovernmentadvocatestheideaoflow-carbontravel,sharingbicycleshasattractedmoreandmoreattention.    Sharingbicyclessolvestheproblemofthelastmileforcitizenstotravel.Bicycletravelcansaveenergy,reducepo

相关推荐

推荐阅读