首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

Centos搭建开发环境,PHP7+ Nginx1.12+ Mysql5.7

1.更新yum源 yum -yupdate 2.安装 epel-release yum install epel-release-y 检测安装成功:yum search nginx 结果含有:nginx.x86_64 : A high performance webserver andreverse proxyserver 表示成功 CentOS 系列的服务器系统有一个毛病,就是官方自带的源的软件比较古老,并且很多的软件都没有。因为他们的首要任务是保证服务器的稳定,而不是追求最新。但是太过于保守了,一般来说,我们会给服务器添加一个 epel-release 这个源。这个源里包含了例如 nginx 之类的我们需要的软件,使用起来比较方便。 3.安装服务器常用软件 yum -y install vim* Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器 yum install wget wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议 下载,并可以使用 HTTP 代理。 yum -y install lrzsz lrzsz是一款在linux里可代替ftp上传和下载的程序。 yum install zip unzip 作用:zip压缩、unzip解压缩 4.安装Nginx nginx 依赖的一些 lib 库: yum install gcc-c++ yum install pcre pcre-devel yum install zlib zlib-devel yum install openssl openssl--devel 安装 Nginx cd /usr/local 打开 usr 下的 local 文件夹 yum install nginx -y 安装Nginx,此安装的包已经是更新过的源 systemctl start nginx 启动 nginx systemctl enable nginx 将 nginx 设置为开机启动 完成安装在浏览器访问主机 ip ,看看是否能打开。 5.安装PHP7 rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm 安装php7的rpm包 yum search php7 查询下自己的php7是哪个版本以及扩展库,例如:php70w、php71w、php72w、php70w-fpm等 yum install php70w 以自己的包为准 yum install php70w-openssl php70w-commonphp70w-fpm php70w-mysql php70w-mysqld php70w-pdo 安装PHP7的扩展库的版本号和PHP7的版本对应,也就是 php70w 的版本对应同版本的扩展库 php70w-fpm等。 6.安装Mysql wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 下载mysql源安装包 rpm -ivh mysql57-community-release-el7-8.noarch.rpm 安装mysql源 yum -y install mysql-server 安装mysql service mysqld start 或 systemctl start mysqld 启动mysql服务器 systemctl status mysqld 查看mysql状态 systemctl enable mysqld systemctl daemon-reload 开机启动 grep 'temporary password' /var/log/mysqld.log mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过上面的方式找到root默认密码( :后面为密码),然后登录mysql进行修改 mysql -uroot -p 按回车,输入刚才的临时密码,进入mysql来修改密码 set global validate_password_policy=0; mysql5.7默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示ERROR报错。 此处代码用来修改密码强度:0 or LOW(密码任意,但长度在 8 位或以上)。 set global validate_password_length=4; 设置的密码少于8位,请执行上述命令(最少是4) set password for 'root'@'localhost'=password('新密码'); 执行此代码修改mysql登陆密码 GRANT ALL PRIVILEGES ON *.* TO 'yourname'@'%' IDENTIFIED BY 'YourPassword@123' WITH GRANT OPTION; 添加远程登录用户,默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须修改root允许远程连接,执行上述代码。 7.配置php、nginx 配置php vim /etc/php.ini 修改 php.ini 把 cgi.fix_pathinfo 的值改为0 ,前面有 ;的话去掉,大约在763行,进入文件后 输入 :763 定位过去。 vim/etc/php-fpm.d/www.conf 修改 www.cong 修改两处 listen.owner = nobody listen.group = nobody 这两行前面的 ;去掉 user = apache group = apache 将apache 更换成 nginx ,保存后退出( :wq ) systemctl start php-fpm systemctl enable php-fpm 启动PHP,并将它设置为开机启动。 配置nginx vim /etc/nginx/nginx.conf 打开配置文件 server { listen 80; server_name 127.0.0.1:9000; root /www/; index index.php index.html index.htm # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name; include fastcgi_params; } location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } 依照这个格式改,listen 监听端口,server_name 项目网址(默认设置127.0.0.1:9000),root 项目路径;index 服务器按顺序找首页文件,前面的没有往后找,玩php就可以把 index.php放前面。 localtion 中把fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 中的 $document_root 改为 项目地址。 在项目文件路径下写个 info.php <?php echo phpinfo() ?> 保存退出后,在浏览器输入主机外网 ip/info.php ,查看下是否成功。

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

Android开发实践:自定义带消息循环(Looper)的工作线程

1. 首先,我们完成一个简单的线程框架。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 public class LooperThread{ private volatile boolean mIsLooperQuit= false ; private ThreadmThread; public void start(){ if (mThread!= null ){ return ; } mIsLooperQuit= false ; mThread= new Thread(mLooperRunnable); mThread.start(); } public void stop(){ if (mThread== null ){ return ; } mIsLooperQuit= true ; mThread= null ; } protected RunnablemLooperRunnable= new Runnable(){ @Override public void run(){ while (!mIsLooperQuit){ } } }; } 如上述代码所示,mLooperRunnable.run()循环执行线程任务,mIsLooperQuit则是线程退出循环的条件。下面,我们将添加消息的发送和处理代码。 2. 添加线程循环的消息发送和处理代码 (1) 定义消息结构体,创建消息队列 1 2 3 4 5 6 7 8 public class LooperThread{ private Queue<Message>mMessageQueue= new LinkedList<Message>(); public static class Message{ int what; } } (2) 创建互斥锁和条件变量 1 2 3 4 5 public class LooperThread{ private LockmLock= new ReentrantLock(); private ConditionmCondition=mLock.newCondition(); } (3) 创建发送消息的函数 1 2 3 4 5 6 7 8 9 10 //发送消息,由外部其他模块调用,发送消息给线程 public void sendMessage(Messagemessage){ if (mThread== null ){ return ; } mLock.lock(); mMessageQueue.add(message); //添加消息到消息队列 mCondition.signal(); //通知线程循环,有消息来了,请立即处理 mLock.unlock(); } (4) 创建处理消息的函数 1 2 3 4 //处理消息,由线程内部调用 public void handleMessage(Messagemessage){ //这里可以通过一个Callback来回调监听者 } (5) 在mLooperRunnable.run()循环中解析消息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 protected RunnablemLooperRunnable= new Runnable(){ @Override public void run(){ while (!mIsLooperQuit){ mLock.lock(); Messagemessage= null ; try { while (!mIsLooperQuit&&mMessageQueue.isEmpty()){ mCondition.await(); //没有消息到来则休眠 } message=mMessageQueue.poll(); } catch (InterruptedExceptione){ e.printStackTrace(); } finally { mLock.unlock(); } handleMessage(message); } }; } (6) 修改线程的Stop()函数,唤醒休眠的消息循环 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public void stop(){ if (mThread== null ){ return ; } mIsLooperQuit= true ; mLock.lock(); mCondition.signal(); mLock.unlock(); mMessageQueue.clear(); mThread= null ; } 到这里,一个基本的带有消息循环的线程类封装就完成了,相信大家应该从编写这段代码的过程中,理解了系统是如何实现消息循环的。 本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1565272,如需转载请自行联系原作者

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

开发一个完整iOS直播app——GPUImage渲染底层实现-opengl

一、前言 本篇主要讲解GPUImage底层是如何渲染的,GPUImage底层使用的是OPENGL,操控GPU来实现屏幕展示 由于网上OpenGL实战资料特别少,官方文档对一些方法也是解释不清楚,避免广大同学再次爬坑,本篇讲解了不少OpenGL的知识,并且还讲解了花了大量时间解决bug的注意点,曾经因为对glDrawArrays这个方法不熟悉,遇上Bug,晚上熬到凌晨四点都没解决,还是第二天中午解决的。 如果喜欢我的文章,可以关注我微博:袁峥Seemygo,也可以来小码哥,了解下我们的iOS培训课程。后续还会更新更多内容,有任何问题,欢迎关注微,信号“小码哥订阅号”。 二、GPUImageVideoCamera 可以捕获采集的视频数据 关键是捕获到一帧一帧视频数据如何展示? 通过这个方法可以获取采集的视频数据 采集视频注意点:要设置采集竖屏,否则获取的数据是横屏 通过AVCaptureConnection就可以设置 三、自定义OpenGLView渲染视频 暴露一个接口,获取采集到的帧数据,然后把帧数据传递给渲染View,展示出来 四、利用OpenGL渲染帧数据并显示 导入头文件#import <GLKit/GLKit.h>,GLKit.h底层使用了OpenGLES,导入它,相当于自动导入了OpenGLES 步骤 01-自定义图层类型 02-初始化CAEAGLLayer图层属性 03-创建EAGLContext 04-创建渲染缓冲区 05-创建帧缓冲区 06-创建着色器 07-创建着色器程序 08-创建纹理对象 09-YUV转RGB绘制纹理 10-渲染缓冲区到屏幕 11-清理内存 01-自定义图层类型 为什么要自定义图层类型CAEAGLLayer? CAEAGLLayer是OpenGL专门用来渲染的图层,使用OpenGL必须使用这个图层 02-初始化CAEAGLLayer图层属性 1.不透明度(opaque)=YES,CALayer默认是透明的,透明性能不好,最好设置为不透明. 2.设置绘图属性 kEAGLDrawablePropertyRetainedBacking :NO (告诉CoreAnimation不要试图保留任何以前绘制的图像留作以后重用) kEAGLDrawablePropertyColorFormat :kEAGLColorFormatRGBA8 (告诉CoreAnimation用8位来保存RGBA的值) 其实设置不设置都无所谓,默认也是这个值,只不过GPUImage设置了 03-创建EAGLContext 需要将它设置为当前context,所有的OpenGL ES渲染默认渲染到当前上下文 EAGLContext管理所有使用OpenGL ES进行描绘的状态,命令以及资源信息,要绘制东西,必须要有上下文,跟图形上下文类似。 当你创建一个EAGLContext,你要声明你要用哪个version的API。这里,我们选择OpenGL ES 2.0 04-创建渲染缓冲区 有了上下文,openGL还需要在一块buffer进行描绘,这块buffer就是RenderBuffer OpenGLES 总共有三大不同用途的color buffer,depth buffer 和 stencil buffer. 最基本的是color buffer,创建它就好了 函数glGenRenderbuffers 它是为renderbuffer(渲染缓存)申请一个id(名字),创建渲染缓存 参数n表示申请生成renderbuffer的个数 参数renderbuffers返回分配给renderbuffer(渲染缓存)的id 。 注意:返回的id不会为0,id 0 是OpenGL ES保留的,我们也不能使用id 为0的renderbuffer(渲染缓存)。 函数glBindRenderbuffer 告诉OpenGL:我在后面引用GL_RENDERBUFFER的地方,其实是引用_colorRenderBuffer 参数target必须为GL_RENDERBUFFER 参数renderbuffer就是使用glGenRenderbuffers生成的id 。 当指定id的renderbuffer第一次被设置为当前renderbuffer时,会初始化该 renderbuffer对象,其初始值为: 函数renderbufferStorage 把渲染缓存(renderbuffer)绑定到渲染图层(CAEAGLLayer)上,并为它分配一个共享内存。 参数target,为哪个renderbuffer分配存储空间 参数drawable,绑定在哪个渲染图层,会根据渲染图层里的绘图属性生成共享内存。 实战代码 05-创建帧缓冲区 它相当于buffer(color, depth, stencil)的管理者,三大buffer可以附加到一个framebuffer上 本质是把framebuffer内容渲染到屏幕 函数glFramebufferRenderbuffer 该函数是将相关buffer()三大buffer之一)attach到framebuffer上,就会自动把渲染缓存的内容填充到帧缓存,在由帧缓存渲染到屏幕 参数target,哪个帧缓存 参数attachment是指定renderbuffer被装配到那个装配点上,其值是GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT中的一个,分别对应 color,depth和 stencil三大buffer。 renderbuffertarget:哪个渲染缓存 renderbuffer渲染缓存id 06-创建着色器 着色器 什么是着色器? 通常用来处理纹理对象,并且把处理好的纹理对象渲染到帧缓存上,从而显示到屏幕上。 提取纹理信息,可以处理顶点坐标空间转换,纹理色彩度调整(滤镜效果)等操作。 着色器分为顶点着色器,片段着色器 顶点着色器用来确定图形形状 片段着色器用来确定图形渲染颜色 步骤: 1.编辑着色器代码 2.创建着色器 3.编译着色器 只要创建一次,可以在一开始的时候创建 着色器代码 实战代码 07-创建着色器程序 步骤: 1.创建程序 2.贴上顶点和片段着色器 3.绑定attribute属性 4.连接程序 5.绑定uniform属性 6.运行程序 注意点:第3步和第5步,绑定属性,必须有顺序,否则绑定不成功,造成黑屏 08-创建纹理对象 纹理 采集的是一张一张的图片,可以把图片转换为OpenGL中的纹理, 然后再把纹理画到OpenGL的上下文中 什么是纹理?一个纹理其实就是一幅图像。 纹理映射,我们可以把这幅图像的整体或部分贴到我们先前用顶点勾画出的物体上去. 比如绘制一面砖墙,就可以用一幅真实的砖墙图像或照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,则墙上的每一块砖都必须作为一个独立的多边形来画。另外,纹理映射能够保证在变换多边形时,多边形上的纹理图案也随之变化。 纹理映射是一个相当复杂的过程,基本步骤如下: 1)激活纹理单元、2)创建纹理 、3)绑定纹理 、4)设置滤波 注意:纹理映射只能在RGBA方式下执行 函数glTexParameter 控制滤波,滤波就是去除没用的信息,保留有用的信息 一般来说,纹理图像为正方形或长方形。但当它映射到一个多边形或曲面上并变换到屏幕坐标时,纹理的单个纹素很少对应于屏幕图像上的像素。根据所用变换和所用纹理映射,屏幕上单个象素可以对应于一个纹素的一小部分(即放大)或一大批纹素(即缩小) 固定写法 函数glPixelStorei 设置像素存储方式 pname:像素存储方式名 一种是GL_PACK_ALIGNMENT用于将像素数据打包,一般用于压缩。 另一种是GL_UNPACK_ALIGNMENT,用于将像素数据解包,一般生成纹理对象,就需要用到解包. param:用于指定存储器中每个像素行有多少个字节对齐。这个数值一般是1、2、4或8, 一般填1,一个像素对应一个字节; 函数CVOpenGLESTextureCacheCreateTextureFromImage 根据图片生成纹理 参数allocator kCFAllocatorDefault,默认分配内存 参数textureCache 纹理缓存 参数sourceImage 图片 参数textureAttributes NULL 参数target , GL_TEXTURE_2D(创建2维纹理对象) 参数internalFormat GL_LUMINANCE,亮度格式 参数width 图片宽 参数height 图片高 参数format GL_LUMINANCE 亮度格式 参数type 图片类型 GL_UNSIGNED_BYTE 参数planeIndex 0,切面角标,表示第0个切面 参数textureOut 输出的纹理对象 实战代码 09-YUV转RGB绘制纹理 纹理映射只能在RGBA方式下执行 而采集的是YUV,所以需要把YUV 转换 为 RGBA, 本质其实就是改下矩阵结构 注意点(熬夜凌晨的bug):glDrawArrays如果要绘制着色器上的点和片段,必须和着色器赋值代码放在一个代码块中,否则找不到绘制的信息,就绘制不上去,造成屏幕黑屏 之前是把glDrawArrays和YUV转RGB方法分开,就一直黑屏. 函数glUniform1i 指定着色器中亮度纹理对应哪一层纹理单元 参数location:着色器中纹理坐标 参数x:指定那一层纹理 函数glEnableVertexAttribArray 开启顶点属性数组,只有开启顶点属性,才能给顶点属性信息赋值 函数glVertexAttribPointer 设置顶点着色器属性,描述属性的基本信息 参数indx:属性ID,给哪个属性描述信息 参数size:顶点属性由几个值组成,这个值必须位1,2,3或4; 参数type:表示属性的数据类型 参数normalized:GL_FALSE表示不要将数据类型标准化 参数stride 表示数组中每个元素的长度; 参数ptr 表示数组的首地址 函数glBindAttribLocation 给属性绑定ID,通过ID获取属性,方便以后使用 参数program 程序 参数index 属性ID 参数name 属性名称 函数glDrawArrays 作用:使用当前激活的顶点着色器的顶点数据和片段着色器数据来绘制基本图形 mode:绘制方式 一般使用GL_TRIANGLE_STRIP,三角形绘制法 first:从数组中哪个顶点开始绘制,一般为0 count:数组中顶点数量,在定义顶点着色器的时候,就定义过了,比如vec4,表示4个顶点 注意点,如果要绘制着色器上的点和片段,必须和着色器赋值代码放在一个代码块中,否则找不到绘制的信息,就绘制不上去,造成屏幕黑屏。 实战代码 请点击此处输入图片描述请点击此处输入图片描述 10-渲染缓冲区到屏幕 注意点:必须设置窗口尺寸glViewport 注意点:渲染代码必须调用[EAGLContext setCurrentContext:_context] 原因:因为是多线程,每一个线程都有一个上下文,只要在一个上下文绘制就好,设置线程的上下文为我们自己的上下文,就能绘制在一起了,否则会黑屏. 注意点:每次创建纹理前,先把之前的纹理引用清空[self cleanUpTextures],否则卡顿 函数glViewport 设置OpenGL渲染窗口的尺寸大小,一般跟图层尺寸一样. 注意:在我们绘制之前还有一件重要的事情要做,我们必须告诉OpenGL渲染窗口的尺寸大小 方法presentRenderbuffer 是将指定renderbuffer呈现在屏幕上 实战代码 11-清理内存 注意:只要有Ref结尾的,都需要自己手动管理,清空 函数glClearColor 设置一个RGB颜色和透明度,接下来会用这个颜色涂满全屏. 函数glClear 用来指定要用清屏颜色来清除由mask指定的buffer,mask可以是 GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT的自由组合。 在这里我们只使用到 color buffer,所以清除的就是 clolor buffer。 GPUImage工作原理 GPUImage最关键在于GPUImageFramebuffer这个类,这个类会保存当前处理好的图片信息。 GPUImage是通过一个链条处理图片,每个链条通过target连接,每个target处理完图片后,会生成一个GPUImageFramebuffer对象,并且把图片信息保存到GPUImageFramebuffer。 这样比如targetA处理好,要处理targetB,就会先取出targetA的图片,然后targetB在targetA的图片基础上在进行处理. 本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1921654 ,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

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等操作系统。

用户登录
用户注册