首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

人人都可以做深度学习应用:入门

本文由云+社区发表 作者:徐汉彬 一、人工智能和新科技革命 2017年围棋界发生了一件比较重要事,Master(Alphago)以60连胜横扫天下,击败各路世界冠军,人工智能以气势如虹的姿态出现在我们人类的面前。围棋曾经一度被称为“人类智慧的堡垒”,如今,这座堡垒也随之成为过去。从2016年三月份AlphaGo击败李世石开始,AI全面进入我们大众的视野,对于它的讨论变得更为火热起来,整个业界普遍认为,它很可能带来下一次科技革命,并且,在未来可预见的10多年里,深刻得改变我们的生活。 其实,AI除了可以做我们熟知的人脸、语音等识别之外,它可以做蛮多有趣的事情。 例如,让AI学习大量古诗之后写古诗,并且可以写出质量非常不错的古诗。 又或者,将两部设计造型不同的汽车进行融合,形成全新一种设计风格的新汽车造型。 还有,之前大家在朋友圈里可能看过的,将相片转换成对应的艺术风格的画作。 当前,人工智能已经在图像、语音等多个领域的技术上,取得了全面的突破。与此同时,另外一个问题随之而来,如果这一轮的AI浪潮真的将会掀起新的科技革命,那么在可预见的未来,我们整个互联网都将发生翻天覆地的变化,深刻影响我们的生活。那么作为普通业务开发工程师的我,又应该以何种态度和方式应对这场时代洪流的冲击呢? 在回答这个问题之前,我们先一起看看上一轮由计算机信息技术引领的科技革命中,过去30多年中国程序员的角色变化: 通过上图可以简总结:编程技术在不断地发展并且走向普及,从最开始掌握在科学家和专家学者手中的技能,逐渐发展为一门大众技能。换而言之,我们公司内很多资深的工程师,如果带着今天对编程和计算机的理解和理念回到1980年,那么他无疑就是那个时代的计算机专家。 如果这一轮AI浪潮真的会带来新的一轮科技革命,那么我们相信,它也会遵循类似的发展轨迹,逐步发展和走向普及。如果基于这个理解,或许,我们可以通过积极学习,争取成为第一代AI工程师。 二、深度学习技术 这一轮AI的技术突破,主要源于深度学习技术,而关于AI和深度学习的发展历史我们这里不重复讲述,可自行查阅。我用了一个多月的业务时间,去了解和学习了深度学习技术,在这里,我尝试以一名业务开发工程师的视角,以尽量容易让大家理解的方式一起探讨下深度学习的原理,尽管,受限于我个人的技术水平和掌握程度,未必完全准确。 1. 人的智能和神经元 人类智能最重要的部分是大脑,大脑虽然复杂,它的组成单元却是相对简单的,大脑皮层以及整个神经系统,是由神经元细胞组成的。而一个神经元细胞,由树突和轴突组成,它们分别代表输入和输出。连在细胞膜上的分叉结构叫树突,是输入,那根长长的“尾巴”叫轴突,是输出。神经元输出的有电信号和化学信号,最主要的是沿着轴突细胞膜表面传播的一个电脉冲。忽略掉各种细节,神经元,就是一个积累了足够的输入,就产生一次输出(兴奋)的相对简单的装置。 树突和轴突都有大量的分支,轴突的末端通常连接到其他细胞的树突上,连接点上是一个叫“突触”的结构。一个神经元的输出通过突触传递给成千上万个下游的神经元,神经元可以调整突触的结合强度,并且,有的突触是促进下游细胞的兴奋,有的是则是抑制。一个神经元有成千上万个上游神经元,积累它们的输入,产生输出。 人脑有1000亿个神经元,1000万亿个突触,它们组成人脑中庞大的神经网络,最终产生的结果即是人的智能。 2. 人工神经元和神经网络 一个神经元的结构相对来说是比较简单的,于是,科学家们就思考,我们的AI是否可以从中获得借鉴?神经元接受激励,输出一个响应的方式,同计算机中的输入输出非常类似,看起来简直就是量身定做的,刚好可以用一个函数来模拟。 通过借鉴和参考神经元的机制,科学家们模拟出了人工神经元和人工神经网络。当然,通过上述这个抽象的描述和图,比较难让大家理解它的机制和原理。我们以“房屋价格测算”作为例子,一起来看看: 一套房子的价格,会受到很多因素的影响,例如地段、朝向、房龄、面积、银行利率等等,这些因素如果细分,可能会有几十个。一般在深度学习模型里,这些影响结果的因素我们称之为特征。我们先假设一种极端的场景,例如影响价格的特征只有一种,就是房子面积。于是我们收集一批相关的数据,例如,50平米50万、93平米95万等一系列样本数据,如果将这些样本数据放到而为坐标里看,则如下图: 然后,正如我们前面所说的,我们尝试用一个“函数”去拟合这个输入(面积x)和输出(价格y),简而言之,我们就是要通过一条直线或者曲线将这些点“拟合”起来。 假设情况也比较极端,这些点刚好可以用一条“直线”拟合(真实情况通常不会是直线),如下图: 那么我们的函数是一个一次元方程f(x) = ax +b,当然,如果是曲线的话,我们得到的将是多次元方程。我们获得这个f(x) = ax +b的函数之后,接下来就可以做房价“预测”,例如,我们可以计算一个我们从未看见的面积案例81.5平方米,它究竟是多少钱? 这个新的样本案例,可以通过直线找到对应的点(黄色的点),如图下: 粗略的理解,上面就是AI的概括性的运作方式。这一切似乎显得过于简单了?当然不会,因为,我们前面提到,影响房价其实远不止一个特征,而是有几十个,这样问题就比较复杂了,接下来,这里则要继续介绍深度学习模型的训练方式。这部分内容相对复杂一点,我尽量以业务工程师的视角来做一个粗略而简单的阐述。 3. 深度学习模型的训练方式 当有好几十个特征共同影响价格的时候,自然就会涉及权重分配的问题,例如有一些对房价是主要正权重的,例如地段、面积等,也有一些是负权重的,例如房龄等。 (1)初始化权重计算 那么,第一个步其实是给这些特征加一个权重值,但是,最开始我们根本不知道这些权重值是多少?怎么办呢?不管那么多了,先给它们随机赋值吧。随机赋值,最终计算出来的估算房价肯定是不准确的,例如,它可能将价值100万的房子,计算成了10万。 (2)损失函数 因为现在模型的估值和实际估值差距比较大,于是,我们需要引入一个评估“不准确”程度的衡量角色,也就是损失(loss)函数,它是衡量模型估算值和真实值差距的标准,损失函数越小,则模型的估算值和真实值的察觉越小,而我们的根本目的,就是降低这个损失函数。让刚刚的房子特征的模型估算值,逼近100万的估算结果。 (3)模型调整 通过梯度下降和反向传播,计算出朝着降低损失函数的方向调整权重参数。举一个不恰当的比喻,我们给面积增加一些权重,然后给房子朝向减少一些权重(实际计算方式,并非针对单个个例特征的调整),然后损失函数就变小了。 (4)循环迭代 调整了模型的权重之后,就可以又重新取一批新的样本数据,重复前面的步骤,经过几十万次甚至更多的训练次数,最终估算模型的估算值逼近了真实值结果,这个模型的则是我们要的“函数”。 为了让大家更容易理解和直观,采用的例子比较粗略,并且讲述深度学习模型的训练过程,中间省略了比较多的细节。讲完了原理,那么我们就开始讲讲如何学习和搭建demo。 三、深度学习环境搭建 在2个月前,人工智能对我来说,只是一个高大上的概念。但是,经过一个多月的业余时间的认真学习,我发现还是能够学到一些东西,并且跑一些demo和应用出来的。 1. 学习的提前准备 (1)部分数学内容的复习,高中数学、概率、线性代数等部分内容。(累计花费了10个小时,挑了关键的点看了下,其实还是不太够,只能让自己看公式的时候,相对没有那么懵) (2)Python基础语法学习。(花费了3个小时左右,我以前从未写过Python,因为后面Google的TensorFlow框架的使用是基于Python的) (3)Google的TensorFlow深度学习开源框架。(花费了10多个小时去看) 数学基础好或者前期先不关注原理的同学,数学部分不看也可以开始做,全凭个人选择。 2. Google的TensorFlow开源深度学习框架 深度学习框架,我们可以粗略的理解为是一个“数学函数”集合和AI训练学习的执行框架。通过它,我们能够更好的将AI的模型运行和维护起来。 深度学习的框架有各种各样的版本(Caffe、Torch、Theano等等),我只接触了Google的TensorFlow,因此,后面的内容都是基于TensorFlow展开的,它的详细介绍这里不展开讲述,建议直接进入官网查看。非常令人庆幸的是TensorFlow比较早就有中文社区了,尽管里面的内容有一点老,搭建环境方面有一些坑,但是已经属于为数不多的中文文档了,大家且看且珍惜。 TensorFlow 的中文社区 TensorFlow 的英文社区 3. TensorFlow环境搭建 环境搭建本身并不复杂,主要解决相关的依赖。但是,基础库的依赖可以带来很多问题,因此,建议尽量一步到位,会简单很多。 (1)操作系统 我搭建环境使用的机器是腾讯云上的机器,软件环境如下: 操作系统:CentOS 7.2 64位(GCC 4.8.5) 因为这个框架依赖于python2.7和glibc 2.17。比较旧的版本的CentOS一般都是python2.6以及版本比较低的glibc,会产生比较的多基础库依赖问题。而且,glibc作为Linux的底层库,牵一发动全身,直接对它升级是比较复杂,很可能会带来更多的环境异常问题。 (2)软件环境 我目前安装的Python版本是python-2.7.5,建议可以采用yum install python的方式安装相关的原来软件。然后,再安装 python内的组件包管理器pip,安装好pip之后,接下来的其他软件的安装就相对比较简单了。 例如安装TensorFlow,可通过如下一句命令完成(它会自动帮忙解决一些库依赖问题): pip install -U tensorflow 这里需要特别注意的是,不要按照TensorFlow的中文社区的指引去安装,因为它会安装一个非常老的版本(0.5.0),用这个版本跑很多demo都会遇到问题的。而实际上,目前通过上述提供的命令安装,是tensorflow (1.0.0)的版本了。 Python(2.7.5)下的其他需要安装的关键组件: tensorflow (0.12.1),深度学习的核心框架 image (1.5.5),图像处理相关,部分例子会用到 PIL (1.1.7),图像处理相关,部分例子会用到 除此之后,当然还有另外的一些依赖组件,通过pip list命令可以查看我们安装的python组件: appdirs (1.4.0) backports.ssl-match-hostname (3.4.0.2) chardet (2.2.1) configobj (4.7.2) decorator (3.4.0) Django (1.10.4) funcsigs (1.0.2) image (1.5.5) iniparse (0.4) kitchen (1.1.1) langtable (0.0.31) mock (2.0.0) numpy (1.12.0) packaging (16.8) pbr (1.10.0) perf (0.1) PIL (1.1.7) Pillow (3.4.2) pip (9.0.1) protobuf (3.2.0) pycurl (7.19.0) pygobject (3.14.0) pygpgme (0.3) pyliblzma (0.5.3) pyparsing (2.1.10) python-augeas (0.5.0) python-dmidecode (3.10.13) pyudev (0.15) pyxattr (0.5.1) setuptools (34.2.0) six (1.10.0) slip (0.4.0) slip.dbus (0.4.0) tensorflow (1.0.0) urlgrabber (3.10) wheel (0.29.0) yum-langpacks (0.4.2) yum-metadata-parser (1.1.4) 按照上述提供的来搭建系统,可以规避不少的环境问题。 搭建环境的过程中,我遇到不少问题。例如:在跑官方的例子时的某个报错,AttributeError: 'module' object has no attribute 'gfile',就是因为安装的TensorFlow的版本比较老,缺少gfile模块导致的。而且,还有各种各样的。(不要问我是怎么知道的,说多了都是泪啊~) 更详细的安装说明:Installing TensorFlow on Ubuntu (3)TensorFlow环境测试运行 测试是否安装成功,可以采用官方的提供的一个短小的例子,demo生成了一些三维数据, 然后用一个平面拟合它们(官网的例子采用的初始化变量的函数是initialize_all_variables,该函数在新版本里已经被废弃了): #!/usr/bin/python #coding=utf-8 import tensorflow as tf import numpy as np # 使用 NumPy 生成假数据(phony data), 总共 100 个点. x_data = np.float32(np.random.rand(2, 100)) # 随机输入 y_data = np.dot([0.100, 0.200], x_data) + 0.300 # 构造一个线性模型 # b = tf.Variable(tf.zeros([1])) W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0)) y = tf.matmul(W, x_data) + b # 最小化方差 loss = tf.reduce_mean(tf.square(y - y_data)) optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss) # 初始化变量,旧函数(initialize_all_variables)已经被废弃,替换为新函数 init = tf.global_variables_initializer() # 启动图 (graph) sess = tf.Session() sess.run(init) # 拟合平面 for step in xrange(0, 201): sess.run(train) if step % 20 == 0: print step, sess.run(W), sess.run(b) # 得到最佳拟合结果 W: [[0.100 0.200]], b: [0.300] 运行的结果类似如下: 经过200次的训练,模型的参数逐渐逼近最佳拟合的结果(W: [[0.100 0.200]], b: [0.300]),另外,我们也可以从代码的“风格”中,了解到框架样本训练的基本运行方式。虽然,官方的教程后续会涉及越来越多更复杂的例子,但从整体上看,也是类似的模式。 步骤划分 准备数据:获得有标签的样本数据(带标签的训练数据称为有监督学习); 设置模型:先构建好需要使用的训练模型,可供选择的机器学习方法其实也挺多的,换而言之就是一堆数学函数的集合; 损失函数和优化方式:衡量模型计算结果和真实标签值的差距; 真实训练运算:训练之前构造好的模型,让程序通过循环训练和学习,获得最终我们需要的结果“参数”; 验证结果:采用之前模型没有训练过的测试集数据,去验证模型的准确率。 其中,TensorFlow为了基于python实现高效的数学计算,通常会使用到一些基础的函数库,例如Numpy(采用外部底层语言实现),但是,从外部计算切回到python也是存在开销的,尤其是在几万几十万次的训练过程。因此,Tensorflow不单独地运行单一的函数计算,而是先用图描述一系列可交互的计算操作流程,然后全部一次性提交到外部运行(在其他机器学习的库里,也是类似的实现)。 所以,上述流程图中,蓝色部分都只是设置了“计算操作流程”,而绿色部分开始才是真正的提交数据给到底层库进行实际运算,而且,每次训练一般是批量执行一批数据的。 此文已由腾讯云+社区在各渠道发布 获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

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

Java入门项目:学生信息管理系统V2

基于上次的项目进行代码优化重构。 案例功能简介:界面:无(上来还是对用户不友好,哈哈哈)功能: 添加学生信息(学号、姓名、年龄)删除指定学生信息显示所有学生信息 重构主要是对储存方式的改变,由数组储存变为集合储存。 项目跑起来效果 和之前一样,很尴尬,更新的只是储存方式。 一样的结构分层:界面层实现对业务层的调用 业务层 业务层接口 业务层实现:对数据层的调用 数据层 数据层接口 数据层实现 GitHub源代码地址:这里这里 代码文件结构: 学生类: 异常类: 管理接口: 管理实现类: 视图类:

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

Spring Cloud 2.x系列之网关zuul入门(一)

基于Spring的微服务结点在能力上没有高低贵贱之分,但是在角色上会分为边缘服务和内部服务两部分。内部服务是为对内暴露服务的结点,供架构内部来调用;边缘服务是对外部网络暴露的服务结点,也就是对外API接口。 开发人员为了防止服务被黑客攻击,需要编写各种权限机制,这些机制在每个微服务结点都要实现一次。一旦鉴权上有什么bug,又要全部节点上推倒重来,噩梦;运维人员在边缘服务前段都会架一个F5或者Nginx等负载均衡的代理,需要手动维护一份服务列表和服务地址的路由信息,随着结点的扩展或地址调整这份列表要变来变去。 为了解决鉴权重复的问题,使业务结点本身只关心实现自己的业务,将对权限的处理抽离到上层。外部客户先请求到Zuul上,在Zuul服务上对权限进行统一实现和过滤,以实现微服务结点的过滤和验证;为了解决请求路由和安全过滤,Spring Cloud推出了一个API gateway组件:Spring Cloud Zuul。 Zuul对路由的配置有三种方式: 第一种(path-url):如果请求/sina这个地址,将会转发到http://www.sina.com.cn上去 第二种(path-serviceId):如果请求/user-consumer开头的地址,将会转发到eureka上serviceId为sc-user-provider这个服务上去。 第三种(给微服务名指定path):给sc-user-provider这个微服务指定了它的请求地址是/user-service/** (其实这里还隐藏了第四种:什么都不配,默认给注册到eureka上的所有服务以第三种方式进行路由,path就是微服务自己的名字,但是此种方式又是不安全的,相当于将非边缘服务也暴露给外网,一般需要关闭这个默认配置zuul.ignored-services=*,或者至少将受保护的微服务列表维护到zuul.ignored-services中) 今天介绍一下第一种方式 1、新建项目sc-zuul,对应的pom.xml文件如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>spring-cloud</groupId> <artifactId>sc-zuul</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>sc-zuul</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> </dependencies> </project> 2、新建配置文件application.yml server: port: 8070 spring: application: name: sc-zuul zuul: routes: sina: path: /sina/** url:http://www.sina.com.cn baidu: path: /baidu/** url:http://www.baidu.com 3、新建启动类ZuulApplication.java package sc.zuul; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy public classZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } } 4、启动项目 5、验证 访问地址http://127.0.0.1:8070/baidu/跳转到百度 访问地址http://127.0.0.1:8070/sina/跳转到新浪 参考 https://blog.csdn.net/yejingtao703/article/details/77816555/ https://www.cnblogs.com/ityouknow/p/6944096.html 源码: https://gitee.com/hjj520/spring-cloud-2.x/tree/master/sc-zuul 本文作者: java乐园 本文来自云栖社区合作伙伴“JAVA乐园”,了解相关信息可以关注“JAVA乐园”

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

[php入门] 3、WAMP中的集成MySQL相关基础操作

前言:本文以小白视角了解WAMP集成开发环境中的MYSQL,涉及的面广而浅,算是导读性质。 1、启动运行熟悉WAMP中的MySQL 先有库、再有表、数据最终以记录的形式插入表中。其中对数据进行操作使用SQL语句,SQL是结构化的查询语言。 在wamp中已经内置了MySQL数据库,可以通过如下操作进行启动MySQL服务(每次使用数据库时,必须启动MySQL服务器) 2、控制台操作数据库简介 我们可以通过控制台来连接、操作数据库:(其中默认没有密码,直接回车即可以) 在console中常用的有show、create、drop等命令: mysql> show databases; 3、phpMyAdmin可视化操作数据库简介 控制台操作起来不太方便,这里可以用phpMyAdmin可视化MySQL数据库操作图形界面(wamp中) 4、建表及表操作的基础知识 4.1、建表: 创建一张表时要设置名称、引擎、编码和表中的字段信息。 建表时需要指定引擎,不同引擎提供不同的功能; 字段用来指明这张表里用了哪些类型的数据:int、varchar、data(日期)、text(文本,最大65535) 4.2、表操作: insert into 表名(字段列表) value(值列表) select * from 表名 select * from 表名 where delete from 表名 where 条件 update 表名 set 字段1=值1,字段2=值2..... where 条件 5、PHP操作MySQL 5.1、开启MySQL扩展: 总共有3种扩展:①MySQL扩展(老的,基本不用了);②MySQLi扩展; ③PDO扩展; 5.2、以使用MySQL扩展为例,用PHP操作MySQL 其实就是函数调用,当开启扩展之后,就可以调用扩展提供的相应函数对数据库进行连接、读写删等操作。默认情况下用户名为root,密码为空 下面几个数MySQL扩展开放的几个重要的接口: mysql_connect(mysql服务器ip,用户名,密码) mysql_select_db mysql_query mysql_fech_array 1 <?php 2 $conn = mysql_connect("localhost","root",""); 3 mysql_select_db("mysql",$conn); 4 $results = mysql_query("set names utf-8");//设置编码 5 $results = mysql_query("select * from user"); 6 $row = mysql_fetch_array($results);//每次调用显示一条,因此需要循环调用 7 var_dump($row); 8 ?> 本文转自beautifulzzzz博客园博客,原文链接: http://www.cnblogs.com/zjutlitao/p/5648590.html ,如需转载请自行联系原作者

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

JS正则表达式入门,看这篇就够了

前言 在正文开始前,先说说正则表达式是什么,为什么要用正则表达式?正则表达式在我个人看来就是一个浏览器可以识别的规则,有了这个规则,浏览器就可以帮我们判断某些字符是否符合我们的要求。但是,我们为什么要使用正则表达式呢?下面我们就看一下下面这个业务场景。 另外推荐一下正则表达式实例 验证QQ号的合法性 /** *合法qq号规则:1、5-15位;2、全是数字;3、不以0开头 */ //1.在不使用正则表达式的时候,我们可能会这样判断QQ号的合法性 var qq="6666666a6666"; if(qq.length&gt;=5&amp;&amp;qq.length&lt;=15&amp;&amp;!isNaN(qq)&amp;&amp;qq.charCodeAt(0)!=48){ alert("QQ合法"); }else{ alert("QQ不合法") } //2.使用正则表达式 var qq="066336"; var reg=/^[1-9][0-9]{4,14}$/; if(reg.test(qq)){ alert("QQ合法"); }else{ alert("QQ不合法"); } 从上面这个例子可以看出来使用了正则表达式的时候,我们的代码量变少了,而且比较直观。如果遇到非常的复杂的匹配,正则表达式的优势就更加明显了。 使用方法 接着上面,我想先说说JS正则表达式是如何使用的。非常简单,只有两步而已。 第一步:定义一个正则表达式 定义正则表达式有两种方法,第一种通过"/正则表达式/修饰符"这种形式直接写出来,第二种通过“new RegExp('正则表达式','修饰符)'”创建一个RegExp对象。其中修饰符为可选项,有三个取值g:全局匹配;i:不区分大小写;m:多行匹配 //第一种“/正则表达式/” var reg1=/hello \w{3,12}/g; //第二种new RegExp('正则表达式') var reg2=new RegExp("hello \\w{3,12}",'g'); /** *这里需要注意的是,第二种方法中由于字符串转义问题,"\\"代表"\"。 */ 上面这个定义方法,其实还有一个可选参数(修饰符),这里我们先不深入探究,后面我们再细说。 说到RegExp对象,下面要说一下RegExp对象自带的属性,并不复杂,这里我就列一下,不展开说了。 属性 描述 global RegExp 对象是否具有标志 g。 ignoreCase RegExp 对象是否具有标志 i。 lastIndex 一个整数,标示开始下一次匹配的字符位置。 multiline RegExp 对象是否具有标志 m。 source 正则表达式的源文本。 第二步:调用RegExp对象中的方法 RegExp对象给我们提供了三种方法供我们使用,分别是test()、exec()和compile()。下面具体说一下这三个方法的用处。 1.test() 检索字符串中指定的值。返回 true 或 false。这个是我们平时最常用的方法。 var reg=/hello \w{3,12}/; alert(reg.test('hello js'));//false alert(reg.test('hello javascript'));//true 2.exec() 检索字符串中指定的值。匹配成功返回一个数组,匹配失败返回null。 var reg=/hello/; console.log(reg.exec('hellojs'));//['hello'] console.log(reg.exec('javascript'));//null 3.compile() compile() 方法用于改变 RegExp。compile() 既可以改变检索模式,也可以添加或删除第二个参数。 var reg=/hello/; console.log(reg.exec('hellojs'));//['hello'] reg.compile('Hello'); console.log(reg.exec('hellojs'));//null reg.compile('Hello','i'); console.log(reg.exec('hellojs'));//['hello'] 如何写一个正则表达式 第一次接触正则表达式同学们,可能被这个正则表达式的规则弄得迷迷糊糊的,根本无从下手。小编我第一次学这个正则表达式的时候,也是稀里糊涂,什么元字符、量词完全不知道什么东西,云里雾里的。后面小编细细研究了一下,总结一套方法,希望可以帮助大家。 关于正则表达式书写规则,可查看w3school,上面说的很清楚了,我就不贴出来了。我就阐述一下我写正则表达式的思路。 其实正则表达式都可以拆成一个或多个(取值范围+量词)这样的组合。针对每个组合我们根据JS正则表达式的规则翻译一遍,然后将每个组合重新拼接一下就好了。下面我们举个例子来试一下,看看这个方法行不行。 验证QQ号的合法性 合法qq号规则:1、5-15位;2、全是数字;3、不以0开头 第一步:拆成(取值范围+量词)这样的组合 根据QQ号的验证规则,我们可以拆成两个(取值范围+量词)的组合。分别是: 1.(1~9的数字,1个);2.(0~9的数字,4~14个) 第二步:根据正则表达式规则翻译(取值范围+量词) 1.(1~9的数字,1个) =&gt; [1-9]{1}或者[1-9] 2.(0~9的数字,4~14个) =&gt; [0-9]{4,14} 第三步:将翻译好的(取值范围+量词)组合进行拼接 初学者可能在拼接这一步会犯一个错误,可能会组合拼接成这个样子/[1-9]{1}[0-9]{4,14}/或者简写翻译成/[1-9] [0-9]{4,14}/这些都不对的。调用test()方法的时候,你会发现只要一段字符串中有符合正则表达式的字符串片段都会返回true,童鞋们可以试一下。 var reg=/[1-9][0-9]{4,14}/; alert(reg.test('0589563')); //true,虽然有0,但是'589563'片段符合 alert(reg.test('168876726736788999')); //true,这个字符串长度超出15位,达到18位,但是有符合的字符串片段 正确的写法应该是这样的: /^[1-9][0-9]{4,14}$/(用^和$指定起止位置) 下面我们看一个复杂点的例子: 验证国内电话号码 0555-6581752、021-86128488 第一步:拆成(取值范围+量词)这样的组合 这里会拆成两个大组合: 1、(数字0,1个)+(数字0~9,3个)+("-",1个)+(数字1~9,1个)+(数0~9,6个) 2、(数字0,1个)+(数字0~9,2个)+("-",1个)+(数字1~9,1个)+(数0~9,7个) 第二步:根据正则表达式规则翻译(取值范围+量词) 1、([0-0],{1})+([0-9],{3})+"-"+([1,9],{1})+([0,9],{6}) 2、([0-0],{1})+([0-9],{2})+"-"+([1,9],{1})+([0,9],{7}) 第三步:将翻译好的(取值范围+量词)组合进行拼接 这里我们先拼接一个大组合,然后再将大组合拼接起来 1、0[0-9]{3}-[1-9][0-9]{6} 2、0[0-9]{2}-[1-9][0-9]{7} 最后拼接为: /(^0[0-9]{3}-[1-9][0-9]{6}$)|(^0[0-9]{2}-[1-9][0-9]{7}$)/ 正则表达式拓展 除了RegExp对象提供方法之外,String对象也提供了四个方法来使用正则表达式。 1.match() 在字符串内检索指定的值,匹配成功返回存放匹配结果的数组,否则返回null。这里需要注意的一点事,如果没有设置全局匹配g,返回的数组只存第一个成功匹配的值。 var reg1=/javascript/i; var reg2=/javascript/ig; console.log('hello Javascript Javascript Javascript'.match(reg1)); //['Javascript'] console.log('hello Javascript Javascript Javascript'.match(reg2)); //['Javascript','Javascript','Javascript'] 2.search() 在字符串内检索指定的值,匹配成功返回第一个匹配成功的字符串片段开始的位置,否则返回-1。 var reg=/javascript/i; console.log('hello Javascript Javascript Javascript'.search(reg));//6 3.replace() 替换与正则表达式匹配的子串,并返回替换后的字符串。在不设置全局匹配g的时候,只替换第一个匹配成功的字符串片段。 var reg1=/javascript/i; var reg2=/javascript/ig; console.log('hello Javascript Javascript Javascript'.replace(reg1,'js')); //hello js Javascript Javascript console.log('hello Javascript Javascript Javascript'.replace(reg2,'js')); //hello js js js 4.split() 把一个字符串分割成字符串数组。 var reg=/1[2,3]8/; console.log('hello128Javascript138Javascript178Javascript'.split(reg)); //['hello','Javascript','Javascript178Javascript'] 结语 正则表达式并不难,懂了其中的套路之后,一切都变得简单了。在最后我想说点题外话,网上不乏一些文章记录一些常用的正则表达式,然后新手前端在使用正则表达式的时候都会直接拿来就用。在这里我想说一下自己的看法,这些所谓记录常用的正则表达式文章并非完全都是正确的,有不少都是错的。所以同学们在日后使用的过程尽量自己写正则表达式,实在不会了可以去参考一下,但真的不要照搬下来。咱不说这种会影响自己成长的话,咱就说你抄的一定都是对的吗?多思考一下,总没有坏处。 原文地址:https://segmentfault.com/a/1190000009324194

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

【原】PHP从入门到精通2小时【图文并茂】

原创内容,转载请注明。 主要内容: 搭建PHP开发环境 第一个helloworld程序 变量 全局变量 循环结构 函数 数组 面向对象编程 继承 接口 多态 日志 文件的读写 时间格式和时区 创建图形 从远程获取图形 生成二维码 php与数据库mysql的连接 mysql数据库面向对象编程 cookie技术 查看cookie session技术 查看session 文件上传 PHP(Hypertext Preprocessor)PHP超文本预处理程序,是一种嵌入HTML的脚本语言,运行在服务器。 如果有一定的编程基础,1小时之内看完so easy! 搭建PHP开发环境 PHP开发环境主要3部分:服务器Apache,编程语言PHP,数据库MySQL。搭建开发环境,直接使用XAMPP集成安装就可以。 XAMPP=Apache+MySQL+PHP+Perl,X表示的是跨平台。 官网下载安装即可:https://www.apachefriends.org/zh_cn/index.html (安装太简单了,没有什么可说的,不过如果以前安装过tomcat,apache,MySQL等,xampp的部分功能可能不能使用,解决办法网上很多,不再赘言) 第一个helloworld程序 php可以使用note++进行编辑。 helloworld.php <?php echo "hello world!"; ?> 然后运行XAMPP的控制面板,点击Apache的start,绿色就是正常运行了。 然后将helloworld.php文件放在路径:C:\xampp\htdocs 浏览器输入:http://localhost/helloworld.php ok,我们的第一个PHP程序就完成了。 ps:以后我们将php文件放在一个单独的文件夹basic中,便于管理 变量 变量,存储数据的容器,在php中,使用$(美元符号)开头的就是变量,可以给变量赋值,或者输出变量的值。 另外,php语句以;(英文状态半角的分号)结束。 <?php //$定义变量 $text='this is a text'; //输出变量 echo $text; ?> 全局变量 全局变量就是在所有的php文件范围内都可以使用的变量(变量的概念,存储数据的容器) 最常用的全局变量有$_GLOBAL,$_SERVER,$COOKIE,$_SESSION,__FILE__(注意是2个下划线),__LINE__ php文件是嵌入到html、的一种语言,运行在服务器端,可以和html语言混合书写。 这里的.(点号)表示拼接字符串,echo可以输出字符串。 global.php <?php echo '当前执行脚本文件名:'.$_SERVER['PHP_SELF'].'<br/>'; echo '当前执行脚本根目录:'.$_SERVER['DOCUMENT_ROOT'].'<br/>'; //单行注释 echo '当前执行脚本绝对路径:'.$_SERVER['SCRIPT_FILENAME'].'<br/>'; //print_r($_SERVER); //返回当前文件名,行号 echo '当前文件名称:<strong>'.__FILE__.'</strong><br/>'; echo '当前行号:<strong>'.__LINE__.'</strong><br/>'; ?> 打开浏览器,输入:http://localhost/basic/global.php 循环结构 循环主要就是for循环,和while循环,可以重复执行某一个动作,直到满足条件 for(初始化计数值; 满足条件就继续执行 ; 执行后的操作,将计数值+1){ 执行的代码; } while(满足条件就继续执行){ 执行的代码; 将计数值+1 ; } for_while.php <?php //for循环 for($i=0;$i<10;$i++){ echo 'good! '; } echo '<br/>'; //while循环 $j=0; while($j<5){ echo 'do... '; $j++; } ?> 打开浏览器,输入:http://localhost/basic/for_while.php 函数 这是任何一种语言的重点,包括php func.php <?php sum(1,3); //定义求和函数,带2个参数 function sum($a,$b){ echo "$a+$b=".($a+$b);//双引号会输出变量,单引号输出字符串 echo '<br/>'; echo '$a+$b='.($a+$b); } ?> ?> 打开浏览器,输入:http://localhost/basic/func.php 数组 数组分为索引数组,关联数组,使用print_r(数组)来输出数组内容 var_dump(数组)查看详细信息 可以使用foreach(数组 as 键 = > 值){ } 来循环输出数组 array.php <?php //索引数组 $arr=array('小李','25','男','开发工程师'); print_r($arr); //Array ( [0] => 小李 [1] => 25 [2] => 男 [3] => 开发工程师 ) //关联数组 $array=array('姓名'=>'小明','年龄'=>'25','性别'=>'男','职业'=>'开发工程师'); print_r($array); //Array ( [姓名] => 小明 [年龄] => 25 [性别] => 男 [职业] => 开发工程师 ) echo '<br/>'; //输出详细信息 var_dump($arr); /*array(4) { [0]=> string(6) "小李" [1]=> string(2) "25" [2]=> string(3) "男" [3]=> string(15) "开发工程师" }*/ echo '<br/>'; //循环输出数组 foreach($array as $k=>$v){ echo "键值对:$k --> $v".'<br/>'; } /** 键值对:姓名 --> 小明 键值对:年龄 --> 25 键值对:性别 --> 男 键值对:职业 --> 开发工程师 */ ?> 以下内容就是编程技术的分水岭,面向对象编程 面向对象编程 在面向对象编程的思想中,有最重要的2句话: 类用来封装代码 对象用来封装数据 首先来学习怎么样定义一个类: 类名前+class,类中有public的属性,如$name,$sex,$age,还有public的方法say() 在类中,只要new一个对象,就自动会执行__construct构造方法 一个类被销毁,或者程序执行完毕,自动执行__destruct()解构方法 类的属性和方法,通过对象->指针符号调用 $this 表示当前对象。 classMehtod.php <?php //定义一个类 class ren{ public $name; public $sex; public $age; //成员方法 public function say(){ echo '我的名字是'.$this->name.',性别是'.$this->sex.','.$this->age.'岁了<br/>'; } //构造方法,只要new 就会执行 function __construct($name,$sex,$age){ $this->name=$name; $this->sex=$sex; $this->age=$age; echo '构造对象'.$this->name.'<br/>'; } //解构方法,程序结束,对象销毁时执行 function __destruct(){ echo '解构对象'.$this->name.'<br/>'; } } //实例化对象 $xiaoli=new ren('小李','男','25'); $xiaoli->say(); /*输出: 构造对象小李 我的名字是小李,性别是男,25岁了 解构对象小李 */ ?> 继承 面向对象编程思想中,有3个核心概念: 封装 继承 多态 封装其实就是类,定义类就是将代码封装起来了。 其次就是继承! 继承的关键字:extends $this 表示当前对象。 一个B类继承另外一个类A,B会自动拥有A的所有的属性和方法,而不用再书写一遍(继承的思想,程序员懒惰的直接体现,要是程序员也有一个有钱的爹可以继承财富该多好。。。) inherit.php <?php //申明tool类 class tool{ function on(){ echo '<br/>启动<br/>'; } function run(){ echo '<br/>运行<br/>'; } function off(){ echo '<br/>关闭<br/>'; } } //继承inherit class fan extends tool{ function app(){ $this->on(); $this->run(); $this->off(); } } //简化使用 $haierFan=new fan(); $haierFan->app(); ?> 接口 接口是一种更加高级的继承方法 定义接口的关键字:interface 实现(继承)接口的关键字:implements 接口中的所有的方法都是默认public的,而且只要定义,不用实现(在实现类中实现具体方法) interface.php <?php //申明接口 interface tool{ function on(); function run(); function off(); } //实现接口 class fan implements tool{ public $name; function on(){ echo '<br/>'.$this->name.'风扇启动<br/>'; } function run(){ echo '<br/>'.$this->name.'风扇运行<br/>'; } function off(){ echo '<br/>'.$this->name.'风扇关闭<br/>'; } function __construct($name){ $this->name=$name; } } //继承inherit class haierfan extends fan{ function app(){ $this->on(); $this->run(); $this->off(); } } //实例化 $fan=new fan('美的 '); $fan->on(); $fan->run(); $fan->off(); echo '<br/> ------------分割线------------ <br/>'; //实例化 $haierfan=new haierfan('海尔 '); $haierfan->app(); ?> 多态 作为面向对象编程的3大思想之一,多态也是一种高级技能 多态一般都是通过接口来实现的 就是调用同一个方法,执行得到的结果却不同!!! 通过输入参数的不同,执行结果不同,这就是多态 polymorphism.php <?php //申明接口 interface tool{ function on(); function run(); function off(); } //实现接口 class fan implements tool{ public $name; function on(){ echo '<br/>'.$this->name.'风扇启动<br/>'; } function run(){ echo '<br/>'.$this->name.'风扇运行<br/>'; } function off(){ echo '<br/>'.$this->name.'风扇关闭<br/>'; } function __construct($name){ $this->name=$name; } } //实现接口 class engine implements tool{ public $name; function on(){ echo '<br/>'.$this->name.'发动机启动<br/>'; } function run(){ echo '<br/>'.$this->name.'发动机运行<br/>'; } function off(){ echo '<br/>'.$this->name.'发动机关闭<br/>'; } function __construct($name){ $this->name=$name; } } //状态类 class toolStatus{ function ts($tool){ $tool->on(); $tool->run(); $tool->off(); } } //应用多态polymorphism $fan=new fan('海尔 '); $engine=new engine('奥迪 '); $toolStatus=new toolStatus(); $toolStatus->ts($fan); $toolStatus->ts($engine); ?> 这又是一条牛逼的分割线,php基本功能就是以上的内容,下面是一些更加高阶玩法。 日志 log.php <?php /* 1、设置php.ini文件 2、日志分类 3、查看日志 */ //生成运行日志 error_log("FORM ".__FILE__." ERROR LINE:".__LINE__); /*需要设置正确的日志路径,确保路径存在 [15-Sep-2018 09:31:45 Europe/Berlin] 这是来自C:/xampp/htdocs/basic/log.php 的一段自定义的报错日志信息 */ //生成系统日志 openlog('PHP7',LOG_PID,LOG_USER); syslog(LOG_WARNING,'向syslog发送自定义信息'); closelog(); try{ $a=10; if(isset($b)){ echo "程序正常执行"; }else{ throw new Exception(); } }catch(Exception $e){ ERROR_LOG("错误代码所在路径:".$e->getFile()); ERROR_LOG( "错误代码所在行号:".$e->getLine()); } echo "<br/>程序执行完毕<br/>"; /* [15-Sep-2018 09:44:41 Europe/Berlin] 错误代码所在路径:C:\xampp\htdocs\basic\log.php [15-Sep-2018 09:44:41 Europe/Berlin] 错误代码所在行号:26 */ //输出日志 依赖于文件的读写操作,后续将会学习 ?> 查看运行日志 查看系统日志 显示乱码主要是编码字符集的问题,将log.php文件保存为ANSI格式即可看到中文正常显示,解决方法网上很多。 文件的读写 fileIO.php <?php //读取文件 //readfile('./test.txt'); //访问远程文件,需要设置php.ini的 allow_fopen=On $html=file_get_contents('http://www.baidu.com'); //输出html页面 //echo $html; //设置时区 //可以在文件开头位置设置默认配置的时区,也可以在php.ini中进行设置 ini_set('date.timezone','Asia/Shanghai'); //date_default_timezone_set('asia/shanghai'); //向文件中写入内容 /* 1、打开文件 2、写入数据 3、关闭文件 */ //$file=fopen('./test.txt','a+');//追加模式 //$file=fopen('./test.txt','r+');//半覆盖(数据多少覆盖多少) $file=fopen('./test.txt','w+');//全覆盖 if($file){ fwrite($file,'写数据123!\r\n换行了吗?\r\n');//单引号不会换行 fwrite($file,"写数据123!\r\n换行了吗?\r\n");//双引号换行 echo date("Y-m-d H:i:s").'写入数据成功'.date("Ymd His"); fclose($file); } ?> 时间格式和时区 time.php <?php //设置时区 echo '<br/>默认时区时间:'.date("Y-m-d H:i:s").'<br/>'; //可以在文件开头位置设置默认配置的时区 //也可以在php.ini中进行设置date.timezone(所有文件生效) ini_set('date.timezone','Asia/Shanghai'); echo '<br/>上海时区时间:'.date("Y-m-d H:i:s").'<br/>'; //或者直接设置时间格式 date_default_timezone_set('asia/tokyo'); echo '<br/>东京时区时间:'.date("Y-m-d H:i:s").'<br/>'; echo '<br/>格式化时间:'.date("YmdHis").'<br/>'; /* 默认时区时间:2018-09-15 10:44:03 上海时区时间:2018-09-15 16:44:03 东京时区时间:2018-09-15 17:44:03 格式化时间:20180915174403 */ ?> 创建图形 image.php <?php //创建画布 $img=imagecreate(500,500); //设置颜色 //背景色 $white=imagecolorallocate($img,255,255,255); //画笔 $black=imagecolorallocate($img,0,0,0); //矩形 imagerectangle($img,100,100,300,300,$black); //输出图像前清理输出缓冲 ob_clean(); //解决chrome兼容性问题 header("Content-type:image/jpeg"); //输出图像到浏览器 imagejpeg($img) or die("创建图像失败<br/>"); //释放资源 imagedestroy($img); ?> 从远程获取图形 imageUrl.php <?php $img=imagecreatefromjpeg('https://b-ssl.duitang.com/uploads/item/201607/04/20160704052649_WLyfB.jpeg'); ob_clean(); header('Content-type:image/jpeg'); imagejpeg($img) or die('创建图形失败'); imagedestroy($img); ?> 生成二维码 vcode.php <?php vcode(150,100); //生成验证码 function vcode($width,$high){ //创建画布 $img=imagecreate($width,$high); //设置背景色 黑色 $black=imagecolorallocate($img,0,0,0); //设置画笔 白色 $white=imagecolorallocate($img,255,255,255); //产生随机干扰线条 for($i=0;$i<$width/20;$i++){ imageline($img,rand(0,$width),rand(0,$high),rand(0,$width),rand(0,$high),$white); } //产生随机干扰点 for($i=0;$i<$width;$i++){ imagesetpixel($img,rand(0,$width),rand(0,$high),$white); } //产生4个随机字母,数字 $data=''; for($i=0;$i<4;$i++){ switch(rand(1,3)){ case '1':$ch=rand(0,9);break; case '2':$ch=sprintf('%c',rand(65,90));break; case '3':$ch=sprintf('%c',rand(97,122));break; } $data=$data.$ch; } //绘制truetype文字 imagettftext($img,$high/3,rand(1,15),$width*0.1,$high*0.7,$white,'C:/Windows/Fonts/Arial.ttf',$data); //清理缓存 ob_clean(); //解决chrome兼容性问题 header('Content-type:image/jpeg'); //输出到浏览器 imagejpeg($img) or die('创建画布失败'); imagedestroy($img); } ?> php与数据库mysql的连接 mysql.php <?php //连接数据库 $host='localhost'; $username='root'; $password=''; $database='my_db'; $conn=mysqli_connect($host,$username,$password,$database) or die('数据库连接失败!'); //echo '数据库连接成功!'; //操作数据库 $sql='select * from cartoon'; $result=mysqli_query($conn,$sql); //读取返回信息 while($obj=mysqli_fetch_assoc($result)){ echo $obj['name'].'现在'.$obj['age'].'岁了。<br/>'; } //关闭数据库连接 mysqli_close($conn); ?> MySQL数据库面向对象编程 mysql_obj.php <?php // 创建连接 $conn = new mysqli('localhost', 'root', '','my_db')or die("连接失败: " . $conn->connect_error); if($conn){ echo "数据库连接<br/>"; } //操作数据库 $sql = "SELECT * FROM cartoon;"; $result=$conn->query($sql); while($row=$result->fetch_assoc()){ echo "name:".$row['name']."-country:".$row['country']."<br/>"; } /* name:校长-country:中国 name:西门庆-country:中国 name:武大郎-country:中国 name:武松-country:中国 */ //关闭连接 //$conn->close(); //$conn2=new mysqli('localhost','root','','my_db') or die('连接失败:'.$conn2->connect_error); $sql2="SELECT * FROM cartoon;";//sql语句一定要用双引号!!! $result2=$conn->query($sql2); //print_r($conn2->query($sql2)); while($row2=$result2->fetch_assoc()){ echo 'name:'.$row2['name'].',sex:'.$row2['sex'].'<br/>'; } $conn->close(); echo "数据库关闭<br/>"; ?> cookie技术 cookie.php cookie可以用于页面之间传值,没有设置有效时间,那么默认为浏览器关闭失效 这就是会话cookie,保存在内存中(关闭页面不会失效,关闭浏览器才会失效) cookie.php <?php //访问时间 echo '访问时间<br/>'; if(isset($_COOKIE['visittime'])){ echo '您上一次访问本网站是在:'.$_COOKIE['visittime'].'<br/>'; echo '本次访问时间是:'.date('Y-m-d H:i:s').'<br/>'; setcookie('visittime',date('Y-m-d H:i:s')); }else{ setcookie('visittime',date('Y-m-d H:i:s')); echo '这是您第一次访问本网站<br/>'; } //访问次数 echo '访问次数<br/>'; if(isset($_COOKIE['num'])){ setcookie('num',$_COOKIE['num']+1); echo '这是您第'.$_COOKIE['num'].'次访问本网站<br/>'; }else{ setcookie('num',1+1); echo '欢迎您首次访问本网站<br/>'; } /* 访问时间 您上一次访问本网站是在:2018-09-16 05:09:22 本次访问时间是:2018-09-16 05:09:32 访问次数 这是您第2次访问本网站 */ //删除cookie,有效时候为过去时间即可,time()-1 setcookie('num',1,time()-1); echo '$_COOKIE[num]已被注销<br/>'; print_r($_COOKIE);//再一次刷新页面时才会生效!!! ?> 查看cookie testcookie.php <?php //创建cookie $sta=setcookie('testcookiename','testvalue',time()+60*60); if($sta){ echo 'Cookie设置成功!'; } ?> chrome浏览器查看cookie 打开浏览器的设置》高级设置》 隐私设置/内容设置》所有cookie和网站数据 》找到你的网站名,以及cookie的名字,点击打开即可看到保存到cookie的内容。 session技术 session存储在服务器,更安全,没有长度限制而cookie存储在客户机,客户可以禁用cookiesession可以用于跨页面请求,有一个随机生成的唯一的session_id典型的应用就是购物车 session.php <?php /* session技术 session存储在服务器,更安全,没有长度限制 而cookie存储在客户机,客户可以禁用cookie session可以用于跨页面请求,有一个随机生成的唯一的session_id 典型的应用就是购物车 */ //准备工作,设置php.ini的session.save_path="C:\xampp\tmp" //启动会话 session_start(); //设置session $_SESSION['name']='Peter'; $_SESSION['password']='12345'; echo 'Session 创建成功!<br/>'; /*打开服务器的session文件查看 name|s:5:"Peter";password|s:5:"12345"; */ print_r($_SESSION); //清空session,session文件只是清空 $_SESSION=array(); echo '<br/>注销当前回话session<br/>'; print_r($_SESSION); //销毁session文件,session文件会被删掉 session_destroy(); echo '<br/>session已经彻底销毁<br/>'; print_r($_SESSION); ?> 查看session 如果销毁了session 文件上传 file_upload.php <html> <form method='post' enctype='multipart/form-data'> <input type='file' name='upfile' /> <input type='submit' value='上传' /> </form> </html> <?php if(!empty($_FILES)){ print_r($_FILES); $tmpname=$_FILES['upfile']['tmp_name'];//文件临时名 $name=$_FILES['upfile']['name'];//文件原名 //文件会上传到与该页面文件同一个目录 move_uploaded_file($tmpname,$name) or die('文件上传失败,程序退出!'); echo '<br/>文件上传成功!<br/>'; }else{ echo '<br/>没有上传文件<br/>'; } ?> ok,基本上php的内容学到这里,就可以了。

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

vscode 扩展开发从入门到颈椎病康复

笔者从业以来,各路插件开发无算,而 vscode 把插件开发体验做到了极致。其开发体验,如沐春风,如丝般顺滑,经常写完了还想删掉再写一遍! vscode 扩展的内置脚手架细心且精致,一键生成后即可运行。vscode 库类型完美,因此开发者可以仅通过 IDE 提示来猜到 API,省去了很多文档查阅成本。最后,vscode 扩展开发文档丰富、开发体系清晰。 废话少说,让我们进入正题吧。 认识 vscode vscode 由 electron 开发,通过 webview 渲染,编辑器基于 monaco editor 。可以通过切换开发人员工具来验证,如下图: vscode 扩展设计理念 1、extension host vscode 扩展运行进程与 vscode 主进程互相独立,以避免有 bug 的扩展阻塞 vscode 主进程运行。 2

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

C语言入门:正,反两座金字塔

C语言永远不会过时 其实学编程关键是学习其思想,如果你精通了一门,再去学其他的时候也很容易上手。C不会过时的,尤其是在unix、linux操作平台上,学好C是必须的。 C跟C++在很多方面也是兼容的,c是c++的基础。 再者c能从很大的程度上帮你了解计算机的发展史,数据结构等方面的知识,很多软件、甚至操作系统中的很大部分是用c来实现的。 还有一些电器芯片的程序,比如电冰箱内制冷系统……可以说用c可以解决一切可能遇到的问题,关键是你要能精通它。 所以放开手脚去大胆的学吧,c永远不会过时 源代码 #include.h> void main() { int i,j,k,n; printf("请输入金字塔的层数:"); scanf("%d",&n); for (i=1;i<=n;++i) // 控制层数 { for (j=1;j<=n-i;j++) // 控制空格数 printf(" "); for (k=1;k<=2*i-1;k++) // 控制*个数 printf("*"); printf("\n"); // 一层金字塔输出完毕,换行继续输出下一层 } } 小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:870963251!适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程 源代码: #include.h> void main() { int i,j,k,n; printf("请输入倒金字塔的层数:"); scanf("%d",&n); for (i=1;i<=n;++i) // 控制层数 { for (k=0;k<=i-1;k++) // 控制空格数 printf(" "); for (j=2*n-2*i+1;j>0;j--) //控制*个数 printf("*"); printf("\n"); } }

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

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

Sublime Text

Sublime Text

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

用户登录
用户注册