首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10014篇文章
优秀的个人博客,低调大师

ELK搭建

ELK安装 elasticsearch安装 * 下载elasticsearch-5.0.0.tar.gz,并解压。 通过elasticsearch.yml可设置host和port。 vim config/elasticsearch.yml network.host: 192.168.33.10 http.port: 9200 通过jvm.options可设置jvm相关参数。 vim config/jvm.options 后台方式启动elasticsearch。 ./bin/elasticsearch -d 验证是否安装成功,通过http://192.168.33.10:9200/?pretty返回类似下面的json格式即安装成功。 curl 'http://192.168.33.10:9200/?pretty' { "name" : "Y88DRRb", "cluster_name" : "elasticsearch", "cluster_uuid" : "-WVdXX65Rw6dpo7Ne8WX0A", "version" : { "number" : "5.0.0", "build_hash" : "253032b", "build_date" : "2016-10-26T04:37:51.531Z", "build_snapshot" : false, "lucene_version" : "6.2.0" }, "tagline" : "You Know, for Search" } logstash安装 * 下载logstash-5.0.2.tar.gz并解压。 * 验证是否安装成功,通过./bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}',然后输入hello。返回类似如下信息则安装成功。 { "message" => "hello", "@version" => "1", "@timestamp" => "2016-11-30T02:40:16.043Z", "host" => "hb-localhost" } kibana安装 * 下载kibana-5.0.1-linux-x86_64.tar.gz并解压。 * 通过kibana.yml可设置kibana主机和端口,及elasticsearch服务地址。 vim config/kibana.yml server.port: 5601 server.host: "192.168.33.10" elasticsearch.url: "http://192.168.33.10:9200" 启动kibana。 ./bin/kibana 浏览器输入http://192.168.33.10:5601/即可进入kibana。 应用日志输出格式 为方便logstash处理,尽量让日志以json格式输出,比如下面格式: {"sql":"select * from product","time":"22","exception":"nullpointException","timeConsuming":"1231ms"} 日志文件名可以以天分割,比如db-2016-11-29.log。 logstash处理日志 创建logstash的配置文件logstash.conf,内容如下。input用于声明日志文件位置及处理相关配置。logstash会匹配db-xxx.log日志并从头开始处理,以json格式解析。output用于声明处理后的输出,将以common-sql-%{+YYYY.MM.dd}索引名输出到192.168.33.10:9200的es上。 input { file { path => "/home/vagrant/logstash/db-logs/db-*.log" start_position => "beginning" type => "sql" codec => json { charset => "UTF-8" } } } output { if "_grokparsefailure" in [tags] { }else{ if [type] == "sql"{ elasticsearch { hosts => ["http://192.168.33.10:9200"] index => "common-sql-%{+YYYY.MM.dd}" } } } } kibana展示 logstash处理后输出到es后即有日志了。 浏览器输入http://192.168.33.10:5601/进入主界面。 创建新的索引匹配 : Management -> Index Patterns -> Add New -> 输入common-sql-* -> Create 查看写入到es的日志记录,Discover -> 选择 common-sql-* -> 右上角选择时间 -> 搜索。 创建一个可视化,Visualize -> Line chart -> common-sql-* -> X-Axis -> Aggregation 选择 Terms -> Field 选择 time.keyword -> Apply changes ========广告时间======== 鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。 为什么写《Tomcat内核设计剖析》 =========================

优秀的个人博客,低调大师

Redis简单搭建使用与集群的搭建

一、安装Redis1、将压缩包导入虚拟机redis-3.2.9.tar2、进入解压后的文件夹执行命令make3、在当前的目录src下有一系列的可执行的文件,这是与redis相关的命令,将可执行的命令添加到PATH变量中。 find . -type f -executable 4、开启redis服务:# redis-server5、连接reids数据库:# redis-cli redis 数据库的使用1、string字符串类型 设置键值对 set key value127.0.0.1:6379> set a chinaitsoftOK 获取键值:127.0.0.1:6379> get a"chinaitsoft" 将key中存储的数字加1127.0.0.1:6379> set b 2OK127.0.0.1:6379> I

优秀的个人博客,低调大师

NDK基础之Android.mk基础

Android NDK官方介绍Android Developers NDK 指南 1、 Android.mk介绍 用于向构建系统描述源文件和共享库 1.1 定义 Application.mk; 1.2 构建系统和环境变量所未定义的项目范围设置; 1.3 替换特定模块的项目范围设置。 2、 Android.mk基本写法 2.1 首先定义LOCAL_PATH变量 在这里,构建系统提供的红函数my-dir将范湖当前目录(包含Android.mk所在目录) LOCAL_PATH := $(call my-dir) 2.2 接着声明CLEAR_VARS变量 CLEAR_VARS变量指向特殊GNU Makefile,可为您清除许多LOCAL_XXX变量 注意:它不会清除LOCAL_PATH变量,此变量必须保留其值,因为系统在单一GNU Make执行环境(其中所有变量都是全局变量)解析所有构建控制文件,在描述每个模块之前,必须声明(重新声明)此变量 include $(CLEAR_VARS) 2.3 LOCAL_MODULE变量将存储您要构建的模块名称 XXX代表你要生成的库文件的名称 在生成过程中系统会自动在XXX前面加上lib,形成libXXX.so的形式 应用的每个模块都应该使用一个该变量LOCAL_MODULE := XXX 2.4 枚举源文件,以空格分隔多个文件 变量必须包含要构建到模块中的C或者C++等源文件列表 LOCAL_SRC_FILES := hello.c index.c 2.5 连接系统所有内容 BUILD_SHARED_LIBRARY 变量指向GNU Makefile脚本,用于收集您最近include后在LOCAL_XXX变量中定义的所有信息 GNU Makefile脚本确定要构建的内容及操作方法 include $(BUILD_SHARED_LIBRARY) 2.6 自定义变量,不要与NDK构建系统预留变量冲突如 以LOCAL_开头的名称,如LOCAL_MODULE 以PRIVATE_、NDK_、或APP开头的名称,构建系统在内部使用这些变量 小写名称,例如my-dir 如果为了方便需要自定义变量,建议名称前附件MY_;NDK变量和相关宏定义 Application.mk介绍 该文件实际也是微型GNU Makefile片段,用于定义编译的多个变量。该文件通常位于¥PROJECT/jni/下,与Android.mk同个目录,其中PROJECT指向应用的项目目录,另一种方式是将其放在顶级$NDK/apps/目录的子目录下。例如 $NDK/apps/<myapp>/Application.mk这里的myapp是用于向NDKgo构建系统描述应用的jianch个,他不会实际进入生成的共享库或者最终软件包。 3.1 APP_PROJECT_PATH 此变量用于存储应用项目根目录的绝对路径。 构建系统使用此信息将生成的 JNI 共享库的简缩版放入 APK 生成工具已知的特定位置。如果您将 Application.mk 文件放在 $NDK/apps// 下,则必须定义此变量。 如果将其放在 $PROJECT/jni/ 下,则此变量可选。 3.2 APP_MODULES 如果定义此变量,变量会指示 ndk-build 仅构建相应模块及其依赖的模块。 列出模块名称时必须用空格分隔,与其在 Android.mk 文件 LOCAL_MODULE 定义中的显示方式一样。 如果未定义此变量,ndk-build 会查找所有可安装的顶级模块的列表,即 Android.mk 文件及其直接包括的任何文件所列的模块。 但是,导入的模块不是顶级模块。 可安装的模块是共享库或可执行文件,后者会在 libs/$ABI/ 中生成一个文件。 如果未定义此变量,而且项目中没有可安装的顶级模块,ndk-build 就会改为构建所有顶级静态库及其依赖项。 这些库会放在 obj/ 或 obj-debug/ 下的常用位置。 3.3 APP_OPTIM 请将这个可选变量定义为 release 或 debug。 使用此变量可以在构建应用的模块时变更优化级别。 发布模式为默认模式,可以生成高度优化的二进制文件。 调试模式会生成未经优化的二进制文件,如此更容易调试。 请注意,您可以调试发布或调试二进制文件。 但是,发布二进制文件在调试时提供的信息较少。 例如,构建系统会优化掉一些变量,导致您无法对其进行检查。 此外,代码重新排序可能增大单步调试代码的难度;堆栈轨迹可能不可靠。 在应用清单的 标记中声明 android:debuggable 将导致 此变量默认为 debug 而非 release。 将 APP_OPTIM 设置为 release 可替换此默认值。 3.4 APP_CFLAGS 此变量用于存储一组 C 编译器标记,供构建系统在为任何模块编译任何 C 或 C++ 源代码时传递到编译器。 使用此变量可以根据需要给定模块的应用更改该模块的版本号,而无需修改 Android.mk 文件本身。 使用 APP_CPPFLAGS 只能为 C++ 指定标记。 这些标记中的所有路径都应相对于顶级 NDK 目录。 例如,如果您有以下设置: sources/foo/Android.mk sources/bar/Android.mk 要在 foo/Android.mk 中指定您在编译时要添加指向 bar 源文件的路径,应使用: APP_CFLAGS += -Isources/bar 或者: APP_CFLAGS += -I$(LOCAL_PATH)/../bar -I../bar 无效,因为它相当于 -I$NDK_ROOT/../bar。 3.5 APP_CPPFLAGS 此变量包含一组 C++ 编译器标记,仅供构建系统构建 C++ 源文件时传递到编译器。 使用 APP_CFLAGS 可以为 C 和 C++ 指定标记。 3.6 APP_LDFLAGS 在链接应用时,构建系统传递的一组链接程序标记。 仅当构建系统构建共享库和可执行文件时,此变量才相关。 当构建系统构建静态库时,它会忽略这些标记。 3.7 APP_BUILD_SCRIPT 默认情况下,NDK 构建系统在 jni/ 下查找名为 Android.mk 的文件。 如果您要替换此行为,可以将 APP_BUILD_SCRIPT 定义为指向替代构建脚本。 构建系统始终将非绝对路径解释为相对于 NDK 的顶级目录。 3.8 APP_ABI 默认情况下,NDK 构建系统会为所有非弃用 ABI 生成机器代码。 您可使用 APP_ABI 设置为特定的 ABI 生成机器代码。 表 1 显示不同指令集的 APP_ABI 设置。 3.9 APP_PLATFORM 此变量包含您想支持的最低版本的 Android 平台。 例如,android-15 值指定您的库使用在低于 Android 4.0.3(API 级别 15)的版本中不可用的 API,而且不能在运行低版本平台的设备上使用。 如需平台名称和对应 Android 系统映像的完整列表,请参阅 Android NDK 原生 API。 请勿直接更改此标记,而应设置您模块级 build.gradle 文件中 defaultConfig 或 productFlavors 块的 minSdkVersion 属性。 这样就能确保只有安装在 Android 版本足够高的设备上的应用才能使用您的库。 ndk-build 工具链使用以下逻辑,根据您所构建的 ABI 以及您指定的 minSdkVersion 来为您的库选择最低版本的平台: 如果现有 ABI 平台版本等于 minSdkVersion,则 ndk-build 会使用该版本。否则,如果现有 ABI 平台版本低于 minSdkVersion,则 ndk-build 会使用其中版本最高的平台。 这种选择较为合理,因通常情况下,平台版本缺失意味着自上一个可用版本以来,原生平台 API 未作任何改变。否则,ndk-build 会使用下一个高于 minSdkVersion 的可用平台版本。 3.10 APP_STL NDK 构建系统默认为 STLsystem。 其他选项包括 c++_shared、c++_static 和 none。 请参阅 NDK 运行时和功能。 3.11 APP_SHORT_COMMANDS 相当于 Application.mk 中的 LOCAL_SHORT_COMMANDS,适用于整个项目。 如需了解详细信息,请参阅 Android.mk 中有关此变量的文档。 3.12 APP_THIN_ARCHIVE 在 Android.mk 文件中,为此项目中的所有静态库模块设置 LOCAL_THIN_ARCHIVE 默认值。 如需了解详细信息,请参阅 Android.mk 中有关 LOCAL_THIN_ARCHIVE 的文档

优秀的个人博客,低调大师

JavaNIO基础02-缓存区基础

1.1、什么是缓存区? 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区。 Buffer在IO中很重要。在java.io包中的BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter在其实现中都运用了缓冲区。java.nio包公开了Buffer API,使得Java程序可以直接控制和运用缓冲区。 在Java NIO中,缓冲区主要是跟通道(Channel)打交道,数据总是从缓冲区写入到通道中,或者从通道读取数据到缓冲区。 1.2、缓存区的优点? 1、减少实际的物理读写次数 2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数 1.3、缓存区的存储位置 1、堆内内存 堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理它们的内存。 2、堆外内存 堆外内存就是存在于JVM管控之外的一块内存区域,因此它是堆外内存不受JVM的管控。 1.4 缓存区常用类 缓存区类说明 类名称 说明 ByteBuffer 字节缓存区 HeapByteBuffer 堆内字节缓存区 HeapByteBufferR 堆内字节只读缓存区,以R结尾的类表示只读 MappedByteBuffer 文件映射到虚拟内存,读写性极能 DirectByteBuffer 堆外字节缓存区 - - ByteBufferAsCharBufferB 字节缓存区转字符缓存区,大端序列 ByteBufferAsCharBufferRB 字节缓存区转字符缓存区,只读、大端序列 ByteBufferAsCharBufferL 字节缓存区转字符缓存区,小端序列 ByteBufferAsCharBufferLB 字节缓存区转字符缓存区,只读、小端序列 DirectCharBufferS 堆外字符缓冲期,字节序反转 DirectCharBufferRS 堆外字符缓冲期,只读、字节序反转 DirectCharBufferU 堆外字符缓冲期,字节序非反转 2.1 缓存区4个属性 (1)capacity capacity指的是缓冲区能够容纳元素的最大数量,这个值在缓冲区创建时被设定,而且不能够改变。(2)limit limit指的是缓冲区中第一个不能读写的元素的数组下标索引,也可以认为是缓冲区中实际元素的数量。(3)position position指的是下一个要被读写的元素的数组下标索引,该值会随get()和put()的调用自动更新。(4)mark 一个备忘位置,调用mark()方法的话,mark值将存储当前position的值,等下次调用reset()方法时,会设定position的值为之前的标记值。 2.2 缓存区不变等式 0<=标记<=位置<=限制<=容量 2.3 缓存区操作示例 (1)创建缓存区 ByteBuffer buffer = ByteBuffer.allocate(10); //mark = -1; //position= 0; //limit=10; //capacity=10; 初始化状态 (2)添加数据 buffer.put((byte)1); buffer.put((byte)2); buffer.put((byte)3); buffer.put((byte)4); buffer.put((byte)5); //mark = -1; //position= 5; //limit=10; //capacity=10; 添加数据后 (3) 读取数据 读取缓冲区前,一般调用flip(反转) 方法。 buffer.flip(); //当前状态 //mark = -1; //position= 0; //limit=5; //capacity=10; 读取前翻转 buffer.get(); buffer.get(); //当前状态 //mark = -1; //position= 2; //limit=5; //capacity=10; 执行两次get后 (4)标记缓存区 buffer.mark(); //mark = 2; //position= 2; //limit=5; //capacity=10; 标记后 (5)重置缓存区 buffer.get(); buffer.get(); //mark = 2; //position= 4; //limit=5; //capacity=10; buffer.reset(); //mark = 2; //position= 2; //limit=5; //capacity=10; 重置缓存区 3 缓存常用方法 3.1 反转 flip 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 //flip 方法内部实现 limit = position; position = 0; mark = -1; 3.2 清理 clear 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0 //clear内部实现 position = 0; limit = capacity; mark = -1; 3.3 重绕rewind 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0 position = 0; mark = -1; 3.4 remaining 与 hasRemaining 常用用于判断缓存区可读内容的长度。 return limit - position; 3.5 标记mark()与重置reset()方法 mark 把 mark的值设置成position。 reset 把position设置成mark的值,相当于之前做过一个标记,现在要退回到之前标记的地方 3.6 压缩 compact 把从position到limit中的内容移到0到limit-position的区域内,position和limit的取值也分别变成limit-position、capacity。如果先将positon设置到limit,再compact,那么相当于clear()

优秀的个人博客,低调大师

Docker基础之六: Docker基础命令

容器相关的命令 (对Docker感兴趣的朋友可以加我的微信ghostcloud2016,然后我把你加到我们的一个Docker爱好者群组里面。) 在上例中,我们用3种方式运行了容器,在上节中我们学习了: docker ps : 查看容器列表 docker logs:查看容器的日志 docker stop:停止容器 在本节中,我们将通过事例来熟悉一些其他的docker命令,并学习docker client。 1 Docker Client Docker Client和Docker Daemon实际使用的是同一个二进制程序,通过docker --help命令可以直接查看docker的所有命令及选项: 查看docker可执行程序的路径: root@shev:~# which docker /usr/bin/docker docker命令的帮助信息: root@shev:~# docker --help Usage: docker [OPTIONS] COMMAND [arg...] docker daemon [ --help | ... ] docker [ --help | -v | --version ] A self-sufficient runtime for containers. Options: --config=~/.docker Location of client config files -D, --debug=false Enable debug mode --disable-legacy-registry=false Do not contact legacy registries -H, --host=[] Daemon socket(s) to connect to -h, --help=false Print usage -l, --log-level=info Set the logging level --tls=false Use TLS; implied by --tlsverify --tlscacert=~/.docker/ca.pem Trust certs signed only by this CA --tlscert=~/.docker/cert.pem Path to TLS certificate file --tlskey=~/.docker/key.pem Path to TLS key file --tlsverify=false Use TLS and verify the remote -v, --version=false Print version information and quit Commands: attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on a container or image kill Kill a running container load Load an image from a tar archive or STDIN login Register or log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container network Manage Docker networks pause Pause all processes within a container port List port mappings or a specific mapping for the CONTAINER ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart a container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save an image(s) to a tar archive search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop a running container tag Tag an image into a repository top Display the running processes of a container unpause Unpause all processes within a container version Show the Docker version information volume Manage Docker volumes wait Block until a container stops, then print its exit code Run 'docker COMMAND --help' for more information on a command. 具体的含义,我们在日后再一一讲解。我们先关注头几行: Usage: docker [OPTIONS] COMMAND [arg...] docker daemon [ --help | ... ] docker [ --help | -v | --version ] 剖析: 第一行实际是docker client的语法格式,它接收OPTIONS参数,并跟一个COMMAND,之后紧跟该命令对应的参数 第二行实际是docker daemon的语法格式,有兴趣的朋友可以通过docker daemon –help进行查看 第三行就是docker client的帮助,有需要都可以执行并查看。 一个我们经常用的查看docker版本信息的命令: root@shev:~# docker version Client: Version: 1.9.0 API version: 1.21 Go version: go1.4.2 Git commit: 76d6bc9 Built: Tue Nov 3 17:43:42 UTC 2015 OS/Arch: linux/amd64 Server: Version: 1.9.0 API version: 1.21 Go version: go1.4.2 Git commit: 76d6bc9 Built: Tue Nov 3 17:43:42 UTC 2015 OS/Arch: linux/amd64 这个命令会列出当前docker的client和server的基本信息. 2 通过容器来运行web应用 容器可以运行任何程序,那么一个主要的用途就是运行web应用,并对外提供服务,下面我们就用官方的一个例子来进行演示: 2.1 启动容器 root@shev:~# docker run -d -P training/webapp python app.py Unable to find image 'training/webapp:latest' locally latest: Pulling from training/webapp 2880a3395ede: Pull complete 515565c29c94: Pulling fs layer 98b15185dba7: Pulling fs layer 2ce633e3e9c9: Verifying Checksum 2ee0b8f351f7: Download complete 2505b734adda: Downloading [=====================> ] 8.732 MB/20.71 MB 20dd0c759013: Downloading [> ] 515.2 kB/50.25 MB f95ebd363bf2: Verifying Checksum 1952e3bf3d7e: Download complete abb991a4ed5e: Download complete 7cbae6914197: Pulling fs layer f74dd040041e: Pulling fs layer 54bb4e8718e8: Download complete Pulling repository docker.io/training/webapp 02a8815912ca: Download complete e9e06b06e14c: Download complete a82efea989f9: Download complete 37bea4ee0c81: Download complete 07f8e8c5e660: Download complete 23f0158a1fbe: Download complete 0a4852b23749: Download complete 7d0ff9745632: Download complete 99b0d955e85d: Download complete 33e109f2ff13: Download complete cc06fd877d54: Download complete b1ae241d644a: Download complete b37deb56df95: Download complete Status: Downloaded newer image for training/webapp:latest docker.io/training/webapp: this image was pulled from a legacy registry. Important: This registry version will not be supported in future versions of docker. 7736775bd89f6d0373b7a6c39a91126d156d9b0ce5467c30f0275506e012be4e 我们查看一下程序是否启动: root@shev:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7736775bd89f training/webapp "python app.py" 9 minutes ago Up 9 minutes 0.0.0.0:32768->5000/tcp agitated_poitras e221abf45a0b ghostcloud.cn:5000/gcali:1.2 "/usr/local/ghostclou" About an hour ago Up About an hour gcsagent 剖析: 我们从Docker Hub拉取了training用户下的webapp的最新版本,然后用python执行app.py 我们的启动参数包括:-d 在后台运行,-P导出容器需要导出的端口,由于Docker Hub在国外,因此拉取的时间可能会有点长,但是一旦本地有了镜像,之后就会很快了。 通过ps 命令,我们可以看到主机的32768端口映射到了容器的5000端口 2.2 访问网页 我们通过主机的32768端口进行访问: 2.3 查看容器的端口导出情况 root@shev:~# docker port 7736 5000/tcp -> 0.0.0.0:32768 2.4 查看容器的运行日志 root@shev:~# docker logs -f 7736 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 192.168.0.103 - - [02/Dec/2015 10:03:07] "GET / HTTP/1.1" 200 - 192.168.0.103 - - [02/Dec/2015 10:03:07] "GET /favicon.ico HTTP/1.1" 404 - 192.168.0.103 - - [02/Dec/2015 10:08:11] "GET / HTTP/1.1" 200 - 剖析: -f会一直绑定到容器的标准输出上,不带-f时,运行后命令立刻就会退出 运行完logs –f后,我们访问网页时,就会在命令行里面显示日志 2.5 查看容器中的进程信息 root@shev:~# docker top 7736 UID PID PPID C STIME TTY TIME CMD root 5115 4051 0 17:53 ? 00:00:00 python app.py 2.6 查看容器的详细信息 root@shev:~# docker inspect 7736 [ { "Id": "7736775bd89f6d0373b7a6c39a91126d156d9b0ce5467c30f0275506e012be4e", "Created": "2015-12-02T09:53:41.35592583Z", "Path": "python", "Args": [ "app.py" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 5115, "ExitCode": 0, "Error": "", "StartedAt": "2015-12-02T09:53:41.62798274Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "02a8815912ca800f99b7d912485e8c618260e27c6de8d7a161b356b322d5c121", "ResolvConfPath": "/var/lib/docker/containers/7736775bd89f6d0373b7a6c39a91126d156d9b0ce5467c30f0275506e012be4e/resolv.conf", "HostnamePath": "/var/lib/docker/containers/7736775bd89f6d0373b7a6c39a91126d156d9b0ce5467c30f0275506e012be4e/hostname", "HostsPath": "/var/lib/docker/containers/7736775bd89f6d0373b7a6c39a91126d156d9b0ce5467c30f0275506e012be4e/hosts", "LogPath": "/var/lib/docker/containers/7736775bd89f6d0373b7a6c39a91126d156d9b0ce5467c30f0275506e012be4e/7736775bd89f6d0373b7a6c39a91126d156d9b0ce5467c30f0275506e012be4e-json.log", "Name": "/agitated_poitras", "RestartCount": 0, "Driver": "aufs", "ExecDriver": "native-0.2", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LxcConf": [], "Memory": 0, "MemoryReservation": 0, "MemorySwap": 0, "KernelMemory": 0, "CpuShares": 0, "CpuPeriod": 0, "CpusetCpus": "", "CpusetMems": "", "CpuQuota": 0, "BlkioWeight": 0, "OomKillDisable": false, "MemorySwappiness": -1, "Privileged": false, "PortBindings": {}, "Links": null, "PublishAllPorts": true, "Dns": null, "DnsOptions": null, "DnsSearch": null, "ExtraHosts": null, "VolumesFrom": null, "Devices": [], "NetworkMode": "default", "IpcMode": "", "PidMode": "", "UTSMode": "", "CapAdd": null, "CapDrop": null, "GroupAdd": null, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "SecurityOpt": null, "ReadonlyRootfs": false, "Ulimits": null, "LogConfig": { "Type": "json-file", "Config": {} }, "CgroupParent": "", "ConsoleSize": [ 0, 0 ], "VolumeDriver": "" }, "GraphDriver": { "Name": "aufs", "Data": null }, "Mounts": [], "Config": { "Hostname": "7736775bd89f", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "5000/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "python", "app.py" ], "Image": "training/webapp", "Volumes": null, "WorkingDir": "/opt/webapp", "Entrypoint": null, "OnBuild": null, "Labels": {}, "StopSignal": "SIGTERM" }, "NetworkSettings": { "Bridge": "", "SandboxID": "02c2de9e7171ed418869e53297b0b1956052be67d2c9c4c75f99829fff646fdd", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "5000/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "32768" } ] }, "SandboxKey": "/var/run/docker/netns/02c2de9e7171", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "f623f99d87ec63cc3bfdc024886d24d40bd1cf1771e249951133a7c66424d6e9", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "EndpointID": "f623f99d87ec63cc3bfdc024886d24d40bd1cf1771e249951133a7c66424d6e9", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02" } } } } ] 2.7 停止并重启容器 root@shev:~# docker stop 7736 7736 root@shev:~# root@shev:~# docker start 7736 7736 root@shev:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7736775bd89f training/webapp "python app.py" 25 minutes ago Up 2 seconds 0.0.0.0:32769->5000/tcp agitated_poitras 注意:容器的在主机上的映射端口变成了32769,原因是我们没有指定主机的端口。 2.8 指定主机和容器的端口映射 root@shev:~# docker run -d -p 80:5000 training/webapp python app.py 54132a474d29d44a7fc6431184ae1c1c77b4c8fb31975d477aab73647a008837 root@shev:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 54132a474d29 training/webapp "python app.py" 3 seconds ago Up 2 seconds 0.0.0.0:80->5000/tcp grave_williams 剖析: 通过-p 参数可以指定端口映射,通过-P则是随机分配 由于我们导出主机的80端口,因此我们再次访问网页的时候,可以不需要指定端口: 是不是眼前一亮,是的,我们可以将我们的网页直接运行在容器里面! 想象一下,你拥有一台云主机……

优秀的个人博客,低调大师

搭建jupyter服务

Tips:该文章面向Mac和centos用户,如果是Windows用户,请先安装虚拟机。 概述 Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等。 小试牛刀 如果之前你还不了解jupyter,我建议先在本地来一个全方位的体验! (For Mac) 首先,保证你Mac应该已经安装了python(推荐python3,因为在不久的将来python2将被抛弃!)以及pip命令; 然后,安装jupyter:pip install jupyter (不同环境安装方法参考 安装jupyter ) ; 完成上面的操作就已经安装好了! 最后,启动jupyter:jupyter notebook 启动后会自动打开浏览器,进入首页: 在这里就可以尽情体验jupyter的所有功能了,详情参考 运行jupyter 。 书归正传 上面只是对jupyter的一个简单体验,但是为了方便在何时何地都能使用jupyter,在自己Mac上部署就不能完全满足咱们的需求了。接下来讲述如何在云主机(centos系统)上安装jupyter并通过nginx做代理提供服务。 先展示一下部署成果: 这是我自己的jupyter登录主页!其中,配置了用户认证、HTTPS。 开始部署 建议使用普通用户进行部署! 安装python3及pip yum install -y python36 python36-pip 安装jupyter pip install jupyter 生成jupyter配置文件 jupyter notebook --generate-config 会创建目录 ~/.jupyter 并且该目录下会有一个配置文件 jupyter_notebook_config.py 。 修改配置 c.JupyterApp.config_file = '~/.jupyter/jupyter_notebook_config.py' c.NotebookApp.allow_remote_access = True # 允许远程访问 c.NotebookApp.base_url = '/jupyter' # 设置jupyter的资源主页路径,即[jupyter主页] c.NotebookApp.enable_mathjax = True # 启用mathjax c.NotebookApp.ip = '127.0.0.1' # 设置了访问该jupyter应用的来源机器只能是本机 c.NotebookApp.notebook_dir = '/home/nginx/workspace/js_python' # jupyter工作目录,所有在jupyter创建的文件都会保存到这里 c.NotebookApp.open_browser = False # 禁止启动时自动开启浏览器 c.NotebookApp.password = 'sha1:a937e51de9a1:a567707768cd50d0ac1d40a4fb739510ddb3d8cb' # 用户认证密码 c.NotebookApp.port = 8888 # 监听端口 上面设置了c.NotebookApp.password,通过以下方式获取加密后的密码: In [1]: from notebook.auth import passwd In [2]: passwd() Enter password: Verify password: Out[2]: 'sha1:a937e51de9a1:a567707768cd50d0ac1d40a4fb739510ddb3d8cb' 配置完成后,启动:jupyter notebook 为了方便管理,讲服务加入systemctl管理: # /usr/lib/systemd/system/jupyter.service [Unit] Description=Jupyter Management After=network.target [Service] User=nginx Group=nginx WorkDirectory=/home/nginx/workspace/js_python ExecStart=/usr/local/bin/jupyter notebook Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target 启动: $ systemctl daemon-reload $ systemctl start jupyter $ systemctl enable jupyter 配置nginx代理 nginx的安装过程在此不做赘述,参考 编译安装nginx 。 nginx配置如下: ssl.conf配置: ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; ssl_buffer_size 1400; ssl_session_tickets on; ssl_session_cache shared:SSL:10m; ssl on; ssl_certificate /usr/local/nginx/conf/www.xxxx.cn.crt; ssl_certificate_key /usr/local/nginx/conf/www.xxxx.cn.key; client_max_body_size 10m; charset utf-8; site.conf server { listen 80; server_name www.xxxx.cn; rewrite ^/(.*)$ https://www.xxxx.cn/$1 permanent; } server { listen 443; server_name www.xxxx.cn; include /usr/local/nginx/conf/servers/common/ssl/www_ssl_config.conf; location /jupyter { proxy_pass http://jupyter; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; # websocket support proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_read_timeout 86400; proxy_redirect off; # 白名单 allow 121.xx.xx.xx; deny all; } } upstream jupyter { server 127.0.0.1:8888; } 配置完成后启动nginx,在浏览器访问www.xxxx.cn/jupyter 。 Completed!

优秀的个人博客,低调大师

window zookeeper搭建

下载安装包 https://archive.apache.org/dist/zookeeper/ 下载后解压 初次点击zkServer.cmd启动会报错、闪退现象 如出现闪退无法看到错误日志,用编辑器打开zkServer.cmd文件在最底下添加pause在启动就能看到错误日志 因为没有zoo.cf文件,需要前往conf目录下复制zoo_sample.cfg文件,修改文件名为zoo.cfg 再次启动 点击zkServer.cmd启动,可能还会报错 会出现以下错误,说明找不到JAVA_HOME 通过编辑器打开zkEnv.cmd文件修改 set JAVA_HOME="C:\installs\Java\jdk1.8.0_162" C:\installs\Java\jdk1.8.0_162为自己jdk安装目录 再次启动成功 注意zoo.cf文件几个重要位置: dataDir=./ 临时数据存储的目录(可写相对路径) clientPort=2181 zookeeper的端口号 使用zkCli.cmd测试 ls /:列出zookeeper根下保存的所有节点 create –e /atguigu 123:创建一个atguigu节点,值为123 get /atguigu:获取/atguigu节点的值

优秀的个人博客,低调大师

SSM环境搭建

环境配置 IDEA 下载 版本:2018.1.7 下载地址:https://www.jetbrains.com/idea/download/#section=mac 安装 注册码地址:http://idea.lanyus.com/ 使用前将以下内容复制到hosts文件中: 0.0.0.0 account.jetbrains.com folder中快捷键:command+shift+G /etc/hosts sudo vi /etc/hosts sudo 安装IDEA并输入网页中的注册码 数据库 Mysql 下载安装 MySQL官网网站:https://dev.mysql.com/downloads/mysql/ 环境变量配置 打开terminalvim .bash_profile 使用vim进入.bash_profile文件进行文件配置 进入文件后按字母i进行添加 配置环境变量export PATH=${PATH}:/usr/local/mysql/bin 如果以前没有配置过环境变量,那么这应该是一个空白文档。如果有内容,请在结束符前输入,如果没有内容,请直接输入如下语句: export PATH=${PATH}:/usr/local/mysql/bin 完成后按esc退出,再按:输入wq进行保存,最后关闭终端并退出。 设置root密码 我们先在终端输入 mysql -u root -p 出现问题ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 原因:未设置root密码 或者密码设置格式错误 解决如下: 苹果->系统偏好设置->关闭mysql服务(点击stop mysql server) 进入终端输入:cd /usr/local/mysql/bin/ 回车后 登录管理员权限sudo su 回车后输入以下命令来禁止mysql验证功能./mysqld_safe --skip-grant-tables & 输入命令 ./mysql 回车后,输入命令FLUSH PRIVILEGES; (‘;’回车不能忘记) 回车后,输入命令 ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';(MyNewPass处输入你的密码)// //注意,这里的密码要用包含8位大写+小写+特殊字符+数字的密码 至此修改结束,重启终端后,输入 mysql -u root -p 回车 再键入密码:MyNewPass 就启动成功。 关于解决密码报错的问题 因为现在是新版本8.0了 ,老版本的修改密码的语法已不再适用,mysql 5.7.9以后废弃了password字段和password()函数; 1.mysql>use mysql; 2.mysql>FLUSH PRIVILEGES; 3.mysql>ALTER user ‘root’@‘localhost’ IDENTIFIED BY ‘newpassward’ //注意,这里的密码要用包含8位大写+小写+特殊字符+数字的密码 4.mysql>quit; 退出mysql; 5.mysql -uroot -p 最后直接用mysql -uroot -p 输入刚才设置的密码即可正常登录! Maven 下载安装 Maven官网:http://maven.apache.org/download.cgi Archives 将apache-maven-3.5.0-bin.tar.gz解压到以下目录 /Users/luzihai/Documents/ 配置环境变量 打开终端: vim ~/.bash_profile export M2_HOME=/Users/xxx/Documents/apache-maven-3.6.0 export PATH=$PATH:$M2_HOME/bin 保存并退出,执行以下命令并生效 source ~/.bash_profile 查看配置是否生效,输入 mvn -v Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00) Maven home: /Users/luzihai/Documents/apache-maven-3.6.0 Java version: 11, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home Default locale: zh_CN_#Hans, platform encoding: UTF-8 OS name: "mac os x", version: "10.12.6", arch: "x86_64", family: "mac" 修改配置文件 /Users/luzihai/Documents/apache-maven-3.6.0/conf/settings.xml 修改本地repo地址为 MavenRepository是自己建的文件名 <localRepository>/Users/luzihai/Documents/MavenRepository</localRepository> <mirror> <id>mirrorId</id> <mirrorOf>repositoryId</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://my.repository.com/repo/path</url> </mirror> 修改为阿里云仓库(不改好像也挺快的) <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> Mybatis Config <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"></properties> <settings> <!--缓存--> <setting name="cacheEnabled" value="true"/> <!--<setting name="lazyLoadingEnabled" value="true"/>--> <!--<setting name="multipleResultSetsEnabled" value="true"/>--> <!--<setting name="useColumnLabel" value="true"/>--> <!--<setting name="useGeneratedKeys" value="false"/>--> <!--<setting name="autoMappingBehavior" value="PARTIAL"/>--> <!--<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>--> <!--<setting name="defaultExecutorType" value="SIMPLE"/>--> <!--<setting name="defaultStatementTimeout" value="25"/>--> <!--<setting name="defaultFetchSize" value="100"/>--> <!--<setting name="safeRowBoundsEnabled" value="false"/>--> <!--下划线风格转换为驼峰风格--> <setting name="mapUnderscoreToCamelCase" value="true"></setting> <!--LOG4J日志--> <setting name="logImpl" value="LOG4J"></setting> <!--<setting name="localCacheScope" value="SESSION"/>--> <!--<setting name="jdbcTypeForNull" value="OTHER"/>--> <!--<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>--> </settings> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"></transactionManager> <dataSource type="UNPOOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- Continue going here --> <mappers> <!--单个xml加载--> <!--<mapper resource="com/hz/mapper/GirlMapper.xml"></mapper>--> <!--加载整个包--> <package name="com.hz.mapper"></package> </mappers> </configuration> Mapper <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> db.properties driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis username=root password=123456789 log4j.proerties # Global logging configuration log4j.rootLogger=ERROR, stdout # MyBatis logging configuration... #log4j.logger.org.mybatis.example.BlogMapper=TRACE log4j.logger.com.hz.mapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n Spring 依赖 <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.3.RELEASE</version> </dependency> 配置文件 applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--将对象得创建交给spring 容器 在这个配置文件里去生命要什么对象--> <!--class 写java类的全限定类名--> <bean class="com.hz.pojo.Girl" id="girl"> </bean> </beans> SpringMVC Web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> <!--注册一个前端控制器叫做DispatcherServlet--> <servlet> <!--如果不修改spring配置文件默认的位置 那么springmvc会去web-inf下面找一个springmvc-servlet.xml的文件 --> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--<init-param>--> <!--&lt;!&ndash;xml文件的名字 重命名&ndash;&gt;--> <!--<param-name>namespace</param-name>--> <!--<param-value>mvc1218</param-value>--> <!--</init-param>--> <init-param> <param-name>contextConfigLocation</param-name> <!--classpath也就是resources文件夹下的springmvc 可改名--> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <!--servlet映射配置--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--这里写 / --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> Springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--常用内部资源视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--1 前缀--> <property name="prefix" value="/jsp/"/> <!--2 后缀--> <property name="suffix" value=".jsp"/> </bean> <!--写一个测试案例--> <bean class="com.yimo.controller.HelloController" name="/helloController"></bean> </beans>

优秀的个人博客,低调大师

ThinkPHP搭建博客

博客源码:https://github.com/pleated/blog 源码地址:https://github.com/xialeistudio/thinkphp-inaction/tree/master/blog功能 管理员登陆,修改密码,退出登录 文章分类添加,编辑,删除。 文章添加,编辑,删除。 发表,管理评论 添加,删除,展示友情链接 创建数据表 CREATE TABLE blog_admin (`adminId` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL COMMENT '账号', `password` char(32) NOT NULL COMMENT '密码', `createdAt` int(10) NOT NULL COMMENT '添加时间',`loginAt` int(11) NOT NULL DEFAULT '0' COMMENT '最近登录时间',`loginIp`varchar(15) NOT NULL DEFAULT '' COMMENT '最近登录IP',PRIMARY KEY (`adminId`), KEY `createdAt` (`createdAt`),KEY `account`(`username`,`password`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; INSERT INTO `blog_admin` VALUES ('1', 'admin', '6f1779da8462d85c012588fb73a2efb7', '0', '0', '');//添加管理员账号密码admin和admin CREATE TABLE blog_article (`articleId` int(11) NOT NULL AUTO_INCREMENT,`title` varchar(40) NOT NULL COMMENT '标题', `description` varchar(100) NOT NULL DEFAULT '' COMMENT '简介',`image` varchar(128) NOT NULL DEFAULT '' COMMENT '封面图片',`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击数',`createdAt` int(11) NOT NULL COMMENT '添加时间',`updateAt` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态',`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',`content` text NOT NULL COMMENT '文章内容',`categoryId` int(10) unsigned NOT NULL,PRIMARY KEY (`articleId`),KEY `hit` (`hits`),KEY `createdAt` (`createdAt`),KEY `status` (`status`),KEY `sort` (`sort`),KEY `fk_blog_article_blog_category_idx` (`categoryId`),CONSTRAINT `fk_blog_article_blog_category` FOREIGN KEY (`categoryId`) REFERENCES `blog_category` (`categoryId`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE blog_category (`categoryId` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL COMMENT '分类名称',`isNav` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示在导航栏',`total` int(11) NOT NULL DEFAULT '0' COMMENT '文章总数',`sort` tinyint(4) NOT NULL DEFAULT '0' COMMENT '排序',PRIMARY KEY (`categoryId`),KEY `sort` (`total`),KEY `total` (`total`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE blog_comment (`commentId` int(11) NOT NULL AUTO_INCREMENT,`nickname` varchar(20) NOT NULL COMMENT '昵称',`createdAt` int(11) NOT NULL COMMENT '评论时间',`createdIp` varchar(15) NOT NULL COMMENT 'ip地址',`content` text NOT NULL COMMENT '评论内容',`articleId` int(11) NOT NULL,PRIMARY KEY (`commentId`),KEY `created` (`createdAt`),KEY `fk_blog_comment_blog_article1_idx` (`articleId`),CONSTRAINT `fk_blog_comment_blog_article1` FOREIGN KEY (`articleId`) REFERENCES `blog_article` (`articleId`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE blog_link( `linkId` int(11) NOT NULL AUTO_INCREMENT `name` varchar(20) NOT NULL COMMENT '站点名称',`link` varchar(100) NOT NULL COMMENT '链接地址',`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态',`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',PRIMARY KEY (`linkId`),KEY `sort` (`sort`),KEY `status` (`status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; thinkphp\blog\Application\Admin模块这是后台管理模块,需要管理文章,分类,评论,友情链接等功能。 ①thinkphp\blog\Application\Admin\Controller是这些功能的控制器: ArticleController.class.php 文章控制器 CategoryController.class.php 分类控制器 CommentController.class.php 评论控制器 LinkController.class.php 友情链接控制器 admin模块是受保护的模块,所以这四个控制器许登陆后才能正常访问,在同级目录下创建BaseController.class.php控制器处理登录检测,需要进行权限检测的控制器继承它就行。例如:thinkphp\blog\index.php\admin\index\login调用的是blog\Application\Admin\Controller\IndexController.class.php//U('index/admin/index/login') ②分页处理 数据量不可预测,须在列表页进行分页处理,在需要分页的功能的控制器里面加入分页代码 ③文章分类 文章是分类的,在读取文章列表的时候将分类信息同时查询处理,在这里使用ThinkPHP提供的ViewModel,在thinkphp\blog\Application\Common\Model\ArticleCategoryViewModel.class.php实现 ④文件上传thinkphp\blog\Application\Admin\View\Common\upload.html中定义上传功能,然后在thinkphp\blog\Application\Admin\Controller\IndexController.class.php控制器中添加upload方法,在thinkphp\blog\Application\Admin\View\Article\post.html中使用<include file="Common:upload"/>引用 thinkphp\blog\Application\Common模块 ①分类处理 此模块是公用模块,其他模块公用的功能可以放在该模块下,例如上面提到的③文章分类是公用Model,所以放在Common/Model下。 文章分类时有'isNav'字段,这是用来标识分类是否是导航栏中的分类: status为1:读取属于导航栏的分类 status为0:读取不属于导航栏的分类 读取全部分类 以上需求返回值是一致的,将以上三个需求封装成一个函数,根据传入的status决定返回数据thinkphp\blog\Application\Common\Common\function.php function getCategory($isNav = -1) { $map = array(); if ($isNav > -1) { $map['isNav'] = $isNav; } $model = new \Think\Model('Category'); return $model->where($map)->order('sort DESC')->select(); }//当给定的status>-1时添加一个过滤参数,=-1则不添加。 ②友情链接列表 友情链接是通过函数来定义,前端通过函数调用。thinkphp\blog\Application\Common\Common\function.php ③数据库字段大小写 在使用ThinkPHP的Model进行数据库操作时,返回的数据键名是大写的。 编辑'thinkphp\blog\Application\Common\Conf\db.php',在其中添加 'DB_PARAMS' => array( PDO::ATTR_CASE => PDO::CASE_NATURAL )//控制大小写 Home模块 ①前台布局 此模块用到了ThinkPHP的模板布局功能 在thinkphp\blog\Application\Common\Conf\config.php添加'LAYOUT_ON' => true,开启模板布局,ThinkPHP会默认使用名为“layout”的模板,在thinkphp\blog\Application\Home\View\layout.html文件。(代码就不贴了,github中都有),在此布局文件用到了模板常量,而ThinkPHP自带的模板常量只有_PUBLIC_,所以需在thinkphp\blog\Application\Home\Conf\config.php中单独定义 return array( 'TMPL_PARSE_STRING' => array( '__VENDOR__' => '/thinkphp/blog/public/vendor', '__JS__' => '/thinkphp/blog/public/home/js', '__CSS__' => '/thinkphp/blog/public/home/css', '__IMAGE__' => '/thinkphp/blog/public/home/images' ), 我的项目是部署在localhost/thinkphp中,在定义模板常量的时候需要写全。 公用部分用vendor目录, 导航栏,友情链接等这几个功能都是公用功能,在模板文件使用调用thinkphp\blog\Application\Common\Common\function.php中的getCategory和getLinks函数,不会出现读取不到数据的问题。 ②评论间隔处理 使用缓存来做评论间隔处理thinkphp\blog\Application\Home\Controller\IndexController.class.php里的comment()方法执行此操作。$id是被评论文章的ID,$key = get_client_ip() . '-view-article-' . $id;是使用ID+IP的方式识别当前评论用户,若S函数返回值不为空,则缓存有效期内已经评论过,返回错误信息,若评论成功,则使用当前$key写入缓存 ③Ajax评论 在文章页评论功能的开发中使用Ajax, 在thinkphp\blog\Application\Home\View\Index\article.html中。提交的时候使用$.post方式提交。在回调函数中需要先判断是否出错,如果出错则显示错误信息,否则显示该评论。评论使用的是jQuery的prepend方法。因最新的评论在最前面,须将生成的html添加到最前面。 其他总结 入口index.php文件调用thinkphp\blog\Application\Home\Controller\IndexController.class.php和thinkphp\blog\Application\Common\Model\ArticleCategoryViewModel.class.php。thinkphp\blog\Application\Common\Conf\config.php应用配置文件也就是调用所有模块之前都会首先加载的公共配置文件 thinkphp\blog\Application\Admin\View\..这个文件中index.html是后台的编写各个模块的列表,post.html则是发表页面 前台Home模块用到了ThinkPHP的模块布局功能。编辑thinkphp\blog\Application\Common\Conf\config.php文件,默认调用thinkphp\blog\Application\Home\View下的layout.html文件 该布局用到了常量模块,而ThinkPHP自带的模块常量只有PUBLIC,所以需在thinkphp\blog\Application\Common\Conf\config.php中单独定义,并在thinkphp\blog\Application\Home\Conf\config.php中调用需要的布局。

优秀的个人博客,低调大师

CentOS集群搭建

虚拟机安装linux 1. 启动virtualbox 2. 点击新建,新建名称eshop-cache01, eshop-cache02, eshop-cache03 3. 选择linux,redhat32bit 4. 选择文件目录,下一步创建完成 5. 配置虚拟机网卡设置桥接 6. 点击启动,选择系统 Centos环境配置 1. 配置网络 [root@eshop-cache01~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 Type=Ethernet ONBOOT=yes BOOTPROTO=dbcp [root@eshop-cache01 ~]# service network restart [root@eshop-cache01 ~]# ifconfig [root@eshop-cache01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 Type=Ethernet ONBOOT=yes BOOTPROTO=static IPADDR=192.168.100.xxxx NETMASK=255.255.255.0 GATEWAY=192.168.100.1 [root@eshop-cache01 ~]# service network restart [root@eshop-cache01 ~]# vi /etc/hosts 192.168.100.212 eshop-cache01 2. 防火墙关闭 [root@eshop-cache01 local]# service iptables stop [root@eshop-cache01 local]# service ip6tables stop [root@eshop-cache01 local]# chkconfig iptables off [root@eshop-cache01 local]# chkconfig ip6tables off [root@eshop-cache01 local]# vi /etc/selinux/config SELINUX=disabled 3. 配置yum [root@eshop-cache01 local]# yum clean all [root@eshop-cache01 local]# yum makecache [root@eshop-cache01 local]# yum install -y wget Java环境的安装 1. Jdk的安装 [root@eshop-cache01 local] rpm –ivh jdk-7u65-linux-i586.rpm 2. 环境变量的配置 [root@eshop-cache01 local] vi ~/.bashrc export JAVA_HOME=/usr/java/latest export PATH=PATH:">PATH:PATH:JAVA_HOME/bin //source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。 [root@eshop-cache01 local]# source ~/.bashrc [root@eshop-cache01 local]# java -version java version “1.7.0_65” Java(TM) SE Runtime Environment (build 1.7.0_65-b17) Java HotSpot(TM) Client VM (build 24.65-b04, mixed mode, sharing perl的安装 1. perl的安装(lua依赖) [root@eshop-cache01 local]# wgethttp://www.cpan.org/src/5.0/perl-5.16.1.tar.gz [root@eshop-cache01 local]# tar -zxvf perl-5.16.1.tar.gz [root@eshop-cache01 local]# cd perl-5.16.1/ [root@eshop-cache01 perl-5.16.1]# cd .. [root@eshop-cache01 perl-5.16.1]# yum install –y gcc [root@eshop-cache01 local]# yum install -y build-essential [root@eshop-cache01 perl-5.16.1]# ./Configure -des -Dprefix=/usr/local/perl [root@eshop-cache01 perl-5.16.1]# make && make test && make install [root@eshop-cache01 local]# perl –v 配置集群 1. 再安装3台一模一样的环境的linux环境 2. 在4台机器中hosts文件里,配置hostname和ip的对应关系 192.168.100.212 eshop-cache01 192.168.100.139 eshop-cache02 192.168.100.141 eshop-cache03 192.168.100.142 eshop-cache04 3. 配置4台centos互相免密通信 a. 首先在四台机器上配置对本机的ssh免密码登录 ssh –keygen –t rsa 生成本机的公钥,过程中不断回车,默认在/root/.ssh下 [root@eshop-cache01 ~]# cd /root/.ssh [root@eshop-cache01 .ssh]# cp id_rsa.pub authorized_keys [root@eshop-cache01 .ssh]# ssh eshop-cache01 //免密连接 b. 配置四台Linux互相免密登陆 [root@eshop-cache01 ~]# ssh-copy-id -i eshop-cache02 [root@eshop-cache01 ~]# ssh-copy-id -i eshop-cache03 c.依次类推

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册