从事IT开发行业的总免不了用用Google,看看国外互联网,但是呢有道墙大家都懂的,其中有一种socks5的梯子,一般都是配置浏览器,如何在命令行下也使用呢?有过使用经验的都知道,Linux终端是不走socks代理配置的,除此之外,很多软件或者应用也不支持socks代理设置,但是有一个软件是可以把socks代理转为http代理,这个软件就叫做privoxy,下面简单介绍下这个软件使用:
内网穿透之SSH端口转发
Mysql主从复制实践
Qt-运行-cant't-find-lGL
实验问题:运行最简单”hello world!”,出现can’t find -lGL的问题
实验阵地: ubuntu14.04+qt5.2
问题分析:
出现该类问题的原因有2个:
(1)没有安装libGL;
(2)libGL没有正确链接。
PHP依赖注入和控制反转
这2个其实都算得上是一种设计模式或者说是一种软件设计思想,目的都是为了增加软件可维护性和扩展性,比如在Java Web框架SpringMVC 和PHP Web框架laravel里面都有应用。
首先得理解什么叫依赖?从宏观上看,得益于开源软件运行的兴起,很多时候我们写项目并不是什么都是从零开始,我们往往会利用很多现成的开源代码进行快速开发,能不重复造轮子最好,所以我们往往依赖很多开源组件。gradle、npm、composer 等工具的部分功能就是解决项目依赖问题。
一条Linux命令
PHP Socket 网络编程
前言
在做PHP开发的过程中,大部分我们都在和http协议打交道,在ISO模型里面,http属于应用层协议,它底层会用到TCP协议。http协议非常简单,它是一个文本协议,一个请求对应一个响应,客户端发起一个请求,服务端响应这个请求。http是一个一问一答的对话,每次请求都得重新建立对话(这里暂不讨论Keep-Alive),如果你想通过一个请求进行多次对话,那就是长连接通信,必须使用TCP或者UDP协议。
互联网运行的基石是建立在一些协议上的,目前而言主要是TCP/IP协议族,大部分协议都是公开开放的,计算机遵循这些协议我们才能通信,当然也有一些私有协议,私有协议只有自己知道如何去解析,相当来说更安全,比如QQ所用的协议就是自己定义的。在ISO模型里面,咱们常用的有http、ftp、ssh、dns等,但是不常用的数不胜数,发明一个协议不难,难的是如何设计的更好用,而且大家都喜欢用。
Socket
Socket并不是一个协议,本质上说Socket是对 TCP/IP 协议的封装,它是一组接口,在设计模式中,Socket 其实就是一个门面(facade)模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。
PHP匿名函数和闭包
一.什么是闭包?
先看看百度百科的介绍:
闭包包含自由(未绑定到特定对象)变量,这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。
“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。
在PHP、Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Go、Lua、objective c、swift 以及Java(Java8及以上)等语言中都能找到对闭包不同程度的支持。
说实话,这个介绍虽然专业,但是有点僵硬不太容易理解,闭包是一种设计思想,而不是一种语法特性,在PHP语言里面,匿名函数就是闭包的一种实现。
二.匿名函数
这个我相信大家都多多少少用过,看一下代码:
1 | $f = function () { |
输出结果是:
1 | class Closure#1 (0) { |
Git最简单的分支操作教程
之前那篇文章,只是简单讲了一下git最基础最简单的用法,但是git还有一个非常重要的功能就是分支,默认情况下只有一个master分支,我们可以直接在master分支开发,完全没问题,
但是当你的项目有十几个甚至几十个人同时在开发的时候,如果都使用master分支,就会非常容易出现冲突、甚至出现代码被覆盖的问题,而且上线也是个问题,你不知道哪些文件可以上,哪些不可以上,很容易把一些未经测试的代码上线,这时候就需要启用分支功能。
Git最简单的基础入门教程
现在很多公司都用git来管理代码,老一些的项目可能还在用svn,git比svn好的地方就在于其便利的分支管理功能,特别适用于多人协作开发,当年祖师爷linus开发git就是为了方便Linux操作系统的开发。
git的基本用法很简单: 拉代码、提交变更、推代码!大部分公司都有自己内部的git服务器,一般都是使用gitlab,主要是安全和省钱,当然也有公司直接使用github的付费服务!不管咋样,你都需要拿到一个项目的git地址, 为了方便演示,我在github上面创建了一个演示的仓库,里面目前只有一个README.md文件:
Nginx Log日志统计分析常用命令
(网上抄的,留个记录)
1.统计IP访问量(独立ip访问数量)
1 | awk '{print $1}' access.log | sort -n | uniq | wc -l |
2.查看某一时间段的IP访问量(4-5点)
1 | grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l |
3.查看访问最频繁的前100个IP
1 | awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100 |
4.查看访问100次以上的IP
1 | awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn |
解决MySQL分组排序求最值问题
首先,先明确一下问题,所谓求分组的最值意思的就是在sql里面使用group by之后,每个分组有多条数据,我们要根据一定条件取其中最大的一条或者多条!
先看一个数据表 blogs 结构,简单说一下,cat_id 就是分类ID,可以看到一个分类有多条记录:
举个非常典型的问题:
1.求某个分类ID下,查看次数最多的3条数据?这个问题很简单,基本上大家都能写出来这样的sql:
浅谈PHP前后端传参常见的几种方式
在Web开发里面,有前后端之分,它们之间的交互主要通过传参的方式,但是这个传参也分几种形式,比如说Form表单提交、Ajax提交…今天我就在这里总结一下开发中常见的几种形式:
1.
这种方式是最原始最常见的方式,提交的时候也有可能是通过js触发,其请求头Content-Type为: application/x-www-form-urlencoded,示例如下:
前端代码
1 | <body> |
PHP多进程编程应用
PHP优先队列
1.什么是优先队列?
队列大家应该都很熟悉,专业的说队列是一种特殊的线性表,简单的说就是先进先出(FIFO),与队列相反的还有一种数据结构叫作栈,先进后出(FILO),这里的栈和内存里面的栈没啥关系,不要理解错了!
队列在开发的应用挺多的,最广泛的就是消息队列,用来处理一些任务比如下单,抢购,需要按请求的时间排序,先来的先处理,关键是保持一种顺序结构。实际开发中,我们一般很少自己去实现队列,通常都是使用一些现成的服务,比如redis queue,rabbitmq。
优先队列(Priprity Queue),顾名思义,就是带有优先级的队列,也就是说不是按请求的顺序排序,而且根据某一些规则属性。举个例子:有一些12306的刷票软件,花钱买了加速包抢到票的几率更高。这里所谓几率更高换个说法就是优先级更高,如果只有10张票,肯定是先让那些花了钱的先抢到票,没花钱的话排后面。
PHP开发中ORM的应用
三、Symfony服务容器介绍
此文是本人翻译的来自国外某网站一篇文章 Do you need a Dependency Injection Container?
这篇文章是一系列关于依赖注入和PHP轻量级容器实现文章中的一部分:
Part 1: What is Dependency Injection?
Part 2: Do you need a Dependency Injection Container?
Part 3: Introduction to the Symfony Service Container
Part 4: Symfony Service Container: Using a Builder to create Services
Part 5: Symfony Service Container: Using XML or YAML to describe Services
Part 6: The Need for Speed
在依赖注入这系列文章里,之前我们已经谈过一些基本思想。前面2篇文章介绍的东西对于更好的理解我们接下来文章要说的非常重要,现在是时候了解Symfony2里面服务容器的实现了。
Symfony里面依赖注入容器是被一个叫sfServiceContainer的类管理的,这是一个非常轻的类,它实现了我们上篇文章里面说到的基本特性。
在Symfony里面,一个服务就是一个被容器管理的对象。在上一篇文章Zend_Mail例子里,我们有2个:mailer服务和mail_transport服务:
二、你需要一个依赖注入容器吗?
此文是本人翻译的来自国外某网站一篇文章 Do you need a Dependency Injection Container?
这篇文章是一系列关于依赖注入和PHP轻量级容器实现文章中的一部分:
Part 1: What is Dependency Injection?
Part 2: Do you need a Dependency Injection Container?
Part 3: Introduction to the Symfony Service Container
Part 4: Symfony Service Container: Using a Builder to create Services
Part 5: Symfony Service Container: Using XML or YAML to describe Services
Part 6: The Need for Speed
在这系列第一篇关于依赖注入的文章里,我尝试给出了一个依赖注入的web实例,今天我将要谈谈依赖注入容器。
首先,先看看一句大胆的言论:“大多数情况下,你不需要一个依赖注入容器也能受益于依赖注入”
一、什么是依赖注入?
此文是本人翻译的来自国外某网站一篇文章 What is Dependency Injection?,第一次翻译,各位见谅
这篇文章是一系列关于依赖注入和PHP轻量级容器实现文章中的一部分:
Part 1: What is Dependency Injection?
Part 2: Do you need a Dependency Injection Container?
Part 3: Introduction to the Symfony Service Container
Part 4: Symfony Service Container: Using a Builder to create Services
Part 5: Symfony Service Container: Using XML or YAML to describe Services
Part 6: The Need for Speed
今天,我一开始不会讲容器,我希望先通过一些具体的实例来介绍一下依赖注入的理念以及其所尝试解决的问题和它能给开发者带来的好处。如果你已经了解依赖注入,你可以跳过这篇文章去看下一篇。
依赖注入可能是我知道的最简单的设计模式之一,很可能你已经使用过,但是同时也是最难解释的,原因可能是大多数介绍依赖注入的文章用的例子都比较无聊。我想了一个比较适合PHP领域的例子,因为PHP主要用在web开发,所以让我们来看一个简单的web实例。
为了解决http协议无状态的问题,web应用需要一种在web请求之间记录用户信息的方法,简单的通过cookie或者session都能解决:
1 | $_SESSION['language'] = 'fr'; |
PHP设计模式之过滤器模式
过滤器模式
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
日常生活中也有过滤器,这个比较容易理解,就是使用设备过滤出自己想要的,去掉那些不符合条件的。但是在编程里面是怎么实现的呢?
举个例子,有一组用户参与抽奖活动,我们需要筛选一部分符合条件的用户抽奖,其它不符合条件的用户咱直接提示未中奖!比如说需要注册时间大于3个月、消费金额大于100元、没有违规行为、活跃度大约500、性别为女。。。等条件!
有人说问为什么不使用数据库筛选,一条sql数据就搞定了啊,实际上有可能是因为这些数据并不是在一个表里面,有些数据可能需要计算得出。
PHP设计模式之单例模式
单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
最大好处是减少了内存的开销,尤其是频繁的创建和销毁实例,而且可以避免对一些资源的多重占用,对于PHP Web应用来说,虽然每次请求结束之后所有对象都会被销毁,但是依然有意义。
举个例子,一个请求有好几个操作,必须调用好几个对象的不同方法,刚好在这个几个方法里面都会用到redis,如果不使用单例模式,那么在每个对象里面都会重新实例化一次redis,浪费内存和时间,建立网络连接也耗时,但是如果使用单例,则只需要在第一次调用redis的使用实例化对象。
PHP设计模式之装饰器模式
Linux常用命令和工具
1.备份命令:
1 | tar cvpzf backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/root/backup.tgz --exclude=/mnt --exclude=/sys --exclude=/media / |
2.查看目录大小:
1 | du -sh |
3.返回上次命令行位置:
1 | cd - |
4.ssh秘钥免密登录
1 | 1.ssh-keygen -t rsa #创建公钥 |
PHP设计模式之简单工厂模式
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式其实就是用来创建对象的,对象是什么的,当然是类的实例,在学习设计模式之前,请先回忆一下面向对象编程,牢记面向对象三大特性:封装,继承,多态!
很多语言并不是完全面向对象的,比如PHP,JS等脚本语言,但这并无妨碍我们去学习其设计思想,但是我们必须从面向对象的思路去理解这种设计!
在完全面向对象的世界里面,首先必须有类,然后才有对象,对象有属性和方法,在程序运行的时候我们需要先创建一个类,然后使用 new 去实例化一个类得到一个对象,然后去调用这个类的相关属性活方法。
闲谈PHP面向对象编程
PHP数组解析和常见操作
在PHP里面使用最多的数据结构恐怕就是数组了,不过PHP的数组和我们传统意义上的数组区别很大,PHP的数组功能上相当于其它语言里面array+list+map数据结构的集合体,这就是动态语言的强大之处。在PHP里面有2种数组,一种是传统的索引数组,另一种是关联数组,其实就是其它语言里面map数据结构。
底层实现
PHP的数组底层是使用HashTable实现,说到哈希表估计很多人都了解过,PHP数组通过一个映射函数把key映射到对于的value值上面,所以查找起来非常快,时间复杂度是O(1),哈希表都会遇到冲突问题,在PHP里面是通过链表的方式解决的。
1 | //Bucket:散列表中存储 |
关于Scrapy爬虫数据传递问题
问题:
这两天研究爬虫掉进一个大坑,爬了好久才爬出去,这里说几句,我写的爬图片的爬虫很简单,从一个图片列表进二级图片详情页,然后爬取二级详情页的所有图片,但是有个需求就是需要以二级详情页的标题为目录分类存放图片!思路很简单,就是在item里面增加一个字段title存放标题:
1 | class PicscrapyItem(scrapy.Item): |
然后在pipelines里面获取item里面数据,保存的时候做一下处理:
1 | class PicscrapyPipeline(ImagesPipeline): |
上面的代码看上去没毛病,重写了Scrapy框架ImagesPipeline的方法,根据title字段分目录存放,但是当我跑起来的时候看上去也没毛病,但是查看数据的时候却不对了,目录是出来了,但是牛头不对马嘴!
PHP类的自动加载机制
PHP数据结构之二叉树
有一点需要说明,一般讲算法是不会用PHP来实现的,而且实际应用中用PHP来实现也木有多大意思,所以这里用PHP实现的意思在于方便大家熟悉,了解其中概念。
如果要讲二叉树,肯定得先讲讲树,这里也不讲了,只讲一点,二叉树是一种特殊的树,这里为什么说是二叉树而不是三叉树呢?看图
这是典型的树结构图:
PHP数据结构之双向链表
其实这些都是PHP SPL 标准库里面的东西, SPL是用于解决典型问题(standard problems)的一组接口与类的集合。说白了,这是PHP官方实现的一些数据结构,
印象中Java的标准库就很强大,不要慌,PHP也有。
按顺序来,先讲一下这个双向链表(double link list),数据结构讲的是思想,不分编程语言,所以先回顾一下基本概念吧。
Kali系统下WiFi密码破解
在网络渗透中,能够接入被攻击者的网络至关重要,只要黑客接入你的网络,利用DNS欺骗,arp攻击等各种钓鱼技术,基本上就能获取一切信息,WIFI网络的安全性重要性不言而喻!
手机上有很多类似360免费WIFI和WIFI万能钥匙的软件,可以”破解”WIFI密码,实际上这类软件不是”破解”而是”偷”密码,这类软件在安装的时候会自动上传你家的WIFI密码,也有可能是你一不小心分享出去的!分享之后别人使用软件就能连上你家的WIFI了,一般来说,商家WIFI比较多。
Linux系统自定义Shell命令
一.应用场景
由于长期使用Ubuntu系统开发和日常生活,每天开机第一件事情就是更新系统,在Ubuntu系统下面更新往往需要好敲好几个命令:
1 | sudo apt-get update #更新源 |
通常情况下,我是一条接着一条敲,虽然看着命令行滚动很过瘾,但是时间长,感觉也没意思了,能不能用一条命令代替上面这些命令呢?
有人说,可以,你只要把这些命令行存起来,以后复制一下就搞定了…
Kali-Metasploit制作简易木马
相信很多人都有这种感觉,觉得那些会做木马病毒的人非常牛逼,当然会自己完全写出来木马病毒的肯定非常牛逼,但是实际上,大部分人都是在前人的基础上修改,很多则是用工具生成,出于兴趣,研究了一段时间”黑”科技,也实践了一下!
总结了几点简单的工具用法,如果你会用这些工具,你会发现也许一个木马没有你像现在那么难做出来!本文是本着研究的精神,所有攻击行为都是测试,请勿用于非法用途!
测试环境:kali linux windows7 windows 10 Android等操作系统
主要工具:metasploit framework
PHP实现语音播报
大家估计都知道现在很多AI音响能够给你播报天气,叫你起床…甚至能够接受语音指令!所谓的人工智能音响,听起来很高大上,都说PHP是最好的编程语言,今天我就带大家来实现一个语音播报功能,写个美女叫你早上起床!
先大体说一个思路,PHP怎么实现语音播报呢?其实就是调个API(接口)的事情,这个就尴尬了。实际上,现在很多AI平台都提供一些成熟的接口供你使用,比如语音转文字,文字转语音,语音唤醒等等,
这里我使用的是百度的语音合成接口,点击查看, 思路就是使用PHP获取当前的时间和天气状况,然后调用接口转换成甜美的妹子语音播放出来。。。你没看错,就是这么简单!
第一步:获取时间信息
举个例子,文字内容可能是这样:“主人,早上好,今天是2017年12月18号上午8点整,星期一”,这样的内容用PHP自带的几个时间函数就能搞定,然后拼接成字符文字!下面是一些简单实例代码: