JWang的博客

一点记录,一点想法,一点思考


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

Bitmap原理和应用

发表于 2018-11-08 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 2.3k

问: “有10亿个不重复的无序的数字,如果快速排序?”

原理

面试中经常会问到类似问题,看上去很简单,就是一个排序而已,但是你好好想想大部分排序算法都需要把数据放到内存里面操作,这10亿个数字得占用多少内存?好吧,你可以使用外部排序算法,在磁盘上完成排序!当然这些传统算法肯定是可以解决的,不过这里有一个更好的方案,采用bitmap排序,介绍如下:

bitmap是什么? 大家都知道在计算机中一个字节(byte) = 8位(bit), 这里的bit就是位,数据的最小表示单位,map一般是表示地图或者映射,加一起叫作位图?貌似不太形象

阅读全文 »

科学上网之socks代理转http(s)

发表于 2018-11-03 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 516

从事IT开发行业的总免不了用用Google,看看国外互联网,但是呢有道墙大家都懂的,其中有一种socks5的梯子,一般都是配置浏览器,如何在命令行下也使用呢?有过使用经验的都知道,Linux终端是不走socks代理配置的,除此之外,很多软件或者应用也不支持socks代理设置,但是有一个软件是可以把socks代理转为http代理,这个软件就叫做privoxy,下面简单介绍下这个软件使用:

阅读全文 »

内网穿透之SSH端口转发

发表于 2018-10-03 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 877

1.场景需求:

有些公司喜欢把svn或者git,或者是内部测试服务器放在公司,一般来说,由于NAT的原因,这种访问是单向的,举个例子,我们可以访问百度的服务器,但是百度服务器是没法访问我们电脑的。

由于只能通过公司内网访问,员工回家之后就无法访问了,安全是安全了,但是万一有个需求需要从公司外部访问呢?

对路由器比较熟悉的童鞋会说:“在路由器上作端口映射转发即可”。这个方案确实可以,但是有2个问题,首先,你得能控制路由器并且可以在上面做设置。其次,一般公司的宽带都没有固定ip,这意味着这个公网ip每隔10-20小时就会变动…

阅读全文 »

Mysql主从复制实践

发表于 2018-09-05 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 1.6k

1.安装

很多人都知道可以用apt或者yum安装,但是实际生产环境很少采用这种方式安装,有些会采用源码编译(据说性能高?),有些会从官网下载编译好的二进制安装包!

为什么不直接用命令安装呢?因为命令安装的位置不同发行版不一样,而且其配置文件存放的位置又各有差异,现实中大部分公司都有一个约定的规则,比如说所有的安装都安装在 /data 目录下,如果需要开机自启,需自行编写脚本,不依赖系统服务。

还有一个重要的原因是因为很多时候数据库是安装在单独的数据库服务器,但是一台电脑比如说32核64G内存这样的配置,是需要安装多个Mysql实例的,用不同的端口区分,这些库可能是不同的项目所用到。

阅读全文 »

Qt-运行-cant't-find-lGL

发表于 2018-09-03 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 795

实验问题:运行最简单”hello world!”,出现can’t find -lGL的问题

实验阵地: ubuntu14.04+qt5.2

问题分析: 
出现该类问题的原因有2个: 

(1)没有安装libGL; 

(2)libGL没有正确链接。

阅读全文 »

PHP依赖注入和控制反转

发表于 2018-07-13 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 1.6k

这2个其实都算得上是一种设计模式或者说是一种软件设计思想,目的都是为了增加软件可维护性和扩展性,比如在Java Web框架SpringMVC 和PHP Web框架laravel里面都有应用。

首先得理解什么叫依赖?从宏观上看,得益于开源软件运行的兴起,很多时候我们写项目并不是什么都是从零开始,我们往往会利用很多现成的开源代码进行快速开发,能不重复造轮子最好,所以我们往往依赖很多开源组件。gradle、npm、composer 等工具的部分功能就是解决项目依赖问题。

阅读全文 »

一条Linux命令

发表于 2018-06-08 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 2k
咱今天先从一个命令讲起,先看一个命令: 1ps -ef|grep nginx|awk '{print $2}'|xargs sudo kill -9 上面这条命令使用了管道组合了多个命令,作用是找个所有进程名字包含 nginx 的进程,然后 kill 这些进程。 1.首先是ps这个命令,简单的说是查看当前系统进程。1Usage: ps [OPTION] 在Linux的世界里,一个看似简单的命令,其背后的参数十分丰富,功能十分强大,如果你 man 一下这个命令,其手册打印出来估计有几十页,参数多达几十个,估计能记住的人不多,但是好在平时我们只用到其中几个参数就够用了。所以这 ...
阅读全文 »

变量名存放在哪里?

发表于 2018-06-07 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 2.2k

这是一个有意思且无聊的问题,之前在网上看到有人问道这个问题,比如说在PHP里面我们写下 $name = "名字" 这样的代码语句,在代码运行的时候,$name 在哪里呢? 了解了变量在内存中存储方式的人会知道,一般变量的值在存放在栈内存里面的,但是名字呢?

针对这个问题,咱们先要区分一下编译型语言和解释型语言,这2种语言运行方式完全不一样,C/C++是典型的编译型语言,而且PHP/JS则是典型的解释型语言。

阅读全文 »

PHP匿名函数和闭包

发表于 2018-04-05 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 1.2k

一.什么是闭包?

先看看百度百科的介绍:

闭包包含自由(未绑定到特定对象)变量,这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。
“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。
在PHP、Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Go、Lua、objective c、swift 以及Java(Java8及以上)等语言中都能找到对闭包不同程度的支持。

说实话,这个介绍虽然专业,但是有点僵硬不太容易理解,闭包是一种设计思想,而不是一种语法特性,在PHP语言里面,匿名函数就是闭包的一种实现。

二.匿名函数

这个我相信大家都多多少少用过,看一下代码:

1
2
3
4
5
6
$f = function () {
$a = 1;
$b = 2;
return $a + $b;
};
var_dump($f);

输出结果是:

1
2
class Closure#1 (0) {
}
阅读全文 »

PHP Socket 网络编程

发表于 2018-04-05 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 2.7k

前言

在做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 去组织数据,以符合指定的协议。

阅读全文 »

Git最简单的分支操作教程

发表于 2018-02-15 | 更新于 2025-01-24 | 分类于 Linux
| 字数统计 2k

之前那篇文章,只是简单讲了一下git最基础最简单的用法,但是git还有一个非常重要的功能就是分支,默认情况下只有一个master分支,我们可以直接在master分支开发,完全没问题,
但是当你的项目有十几个甚至几十个人同时在开发的时候,如果都使用master分支,就会非常容易出现冲突、甚至出现代码被覆盖的问题,而且上线也是个问题,你不知道哪些文件可以上,哪些不可以上,很容易把一些未经测试的代码上线,这时候就需要启用分支功能。

阅读全文 »

Git最简单的基础入门教程

发表于 2018-02-10 | 更新于 2025-01-24 | 分类于 Linux
| 字数统计 1.5k

现在很多公司都用git来管理代码,老一些的项目可能还在用svn,git比svn好的地方就在于其便利的分支管理功能,特别适用于多人协作开发,当年祖师爷linus开发git就是为了方便Linux操作系统的开发。

git的基本用法很简单: 拉代码、提交变更、推代码!大部分公司都有自己内部的git服务器,一般都是使用gitlab,主要是安全和省钱,当然也有公司直接使用github的付费服务!不管咋样,你都需要拿到一个项目的git地址, 为了方便演示,我在github上面创建了一个演示的仓库,里面目前只有一个README.md文件:

阅读全文 »

Nginx Log日志统计分析常用命令

发表于 2018-02-03 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 678

(网上抄的,留个记录)

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分组排序求最值问题

发表于 2018-01-05 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 521

首先,先明确一下问题,所谓求分组的最值意思的就是在sql里面使用group by之后,每个分组有多条数据,我们要根据一定条件取其中最大的一条或者多条!

先看一个数据表 blogs 结构,简单说一下,cat_id 就是分类ID,可以看到一个分类有多条记录:

举个非常典型的问题:

1.求某个分类ID下,查看次数最多的3条数据?这个问题很简单,基本上大家都能写出来这样的sql:

阅读全文 »

浅谈PHP前后端传参常见的几种方式

发表于 2017-09-05 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 1k

在Web开发里面,有前后端之分,它们之间的交互主要通过传参的方式,但是这个传参也分几种形式,比如说Form表单提交、Ajax提交…今天我就在这里总结一下开发中常见的几种形式:

1.

这种方式是最原始最常见的方式,提交的时候也有可能是通过js触发,其请求头Content-Type为: application/x-www-form-urlencoded,示例如下:

前端代码

1
2
3
4
5
6
7
8
9
<body>
<form action="backend.php" method="post">
<label for="name">姓名:</label>
<input type="text" id="name" name="name">
<label for="name">年龄:</label>
<input type="text" id="age" name="age">
<input type="submit" value="提交">
</form>
</body>
阅读全文 »

PHP多进程编程应用

发表于 2017-06-09 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 2.6k

在日常开发中,我们经常会遇到需要使用脚本处理一些数据,在数据量比较大的情况下,我们可以采用并行的方式处理,比如说:

1.启动多个实例

这种方式简单实用,推荐,比如说使用下面的shell脚本我们就可以轻松的启动多个进程去处理

1
2
3
4
5
6
7
8
#!/bin/bash

for((i=1;i<=8;i++))
do
/usr/bin/php multiprocessTest.php &
done

wait

但是这种方式依赖外部工具,不够灵活!其实我们也可以采用多进程|多线程的方式

阅读全文 »

PHP优先队列

发表于 2017-06-05 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 1.6k

1.什么是优先队列?

队列大家应该都很熟悉,专业的说队列是一种特殊的线性表,简单的说就是先进先出(FIFO),与队列相反的还有一种数据结构叫作栈,先进后出(FILO),这里的栈和内存里面的栈没啥关系,不要理解错了!

队列在开发的应用挺多的,最广泛的就是消息队列,用来处理一些任务比如下单,抢购,需要按请求的时间排序,先来的先处理,关键是保持一种顺序结构。实际开发中,我们一般很少自己去实现队列,通常都是使用一些现成的服务,比如redis queue,rabbitmq。

优先队列(Priprity Queue),顾名思义,就是带有优先级的队列,也就是说不是按请求的顺序排序,而且根据某一些规则属性。举个例子:有一些12306的刷票软件,花钱买了加速包抢到票的几率更高。这里所谓几率更高换个说法就是优先级更高,如果只有10张票,肯定是先让那些花了钱的先抢到票,没花钱的话排后面。

阅读全文 »

PHP开发中ORM的应用

发表于 2017-05-06 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 3.2k

1.什么是ORM?

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

ORM并不是PHP独有的东西,只要和数据库打交道的语言都可以使用ORM,比如Java Web三大框架里面Hibernate,还有Doctrine(PHP重量级的ORM) ,Eloquent(laravel框架默认ORM,也可以单独使用)。

阅读全文 »

三、Symfony服务容器介绍

发表于 2017-02-05 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 1.1k

此文是本人翻译的来自国外某网站一篇文章 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服务:

阅读全文 »

二、你需要一个依赖注入容器吗?

发表于 2017-02-04 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 1.3k

此文是本人翻译的来自国外某网站一篇文章 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实例,今天我将要谈谈依赖注入容器。

首先,先看看一句大胆的言论:“大多数情况下,你不需要一个依赖注入容器也能受益于依赖注入”

阅读全文 »

一、什么是依赖注入?

发表于 2017-02-01 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 1.5k

此文是本人翻译的来自国外某网站一篇文章 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设计模式之过滤器模式

发表于 2017-01-02 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 810

过滤器模式

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

日常生活中也有过滤器,这个比较容易理解,就是使用设备过滤出自己想要的,去掉那些不符合条件的。但是在编程里面是怎么实现的呢?

举个例子,有一组用户参与抽奖活动,我们需要筛选一部分符合条件的用户抽奖,其它不符合条件的用户咱直接提示未中奖!比如说需要注册时间大于3个月、消费金额大于100元、没有违规行为、活跃度大约500、性别为女。。。等条件!

有人说问为什么不使用数据库筛选,一条sql数据就搞定了啊,实际上有可能是因为这些数据并不是在一个表里面,有些数据可能需要计算得出。

阅读全文 »

PHP设计模式之单例模式

发表于 2016-11-25 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 663

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。


最大好处是减少了内存的开销,尤其是频繁的创建和销毁实例,而且可以避免对一些资源的多重占用,对于PHP Web应用来说,虽然每次请求结束之后所有对象都会被销毁,但是依然有意义。

举个例子,一个请求有好几个操作,必须调用好几个对象的不同方法,刚好在这个几个方法里面都会用到redis,如果不使用单例模式,那么在每个对象里面都会重新实例化一次redis,浪费内存和时间,建立网络连接也耗时,但是如果使用单例,则只需要在第一次调用redis的使用实例化对象。

阅读全文 »

PHP设计模式之装饰器模式

发表于 2016-11-21 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 555

装饰器模式

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活;它允许向一个现有的对象添加新的功能,同时又不改变其结构。

这个模式算是比较容易理解,它主要解决类的功能扩展问题,当我们需要给一个类增加功能时候,我们可以选直接修改当前类,也可以继承当前类然后增加新方法。但是装饰模式更强调的是动态扩展类的功能,而不是直接修改类的功能。

举个例子:大家早餐买煎饼果子的时候,可以选择加鸡蛋、辣条、火腿肠,但是也可以选择什么都不加。

阅读全文 »

Linux常用命令和工具

发表于 2016-11-02 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 640

1.备份命令:

1
tar cvpzf backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/root/backup.tgz --exclude=/mnt --exclude=/sys --exclude=/media  /

2.查看目录大小:

1
2
3
du -sh
du -h --max-depth 1
du -Sh

3.返回上次命令行位置:

1
cd -

4.ssh秘钥免密登录

1
2
3
1.ssh-keygen -t rsa #创建公钥
2.scp /root/.ssh/id_rsa.pub root@45.32.30.198:~/.ssh
3.cat id_rsa.pub >> authorized_keys
阅读全文 »

PHP设计模式之简单工厂模式

发表于 2016-09-05 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 745

这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。


工厂模式其实就是用来创建对象的,对象是什么的,当然是类的实例,在学习设计模式之前,请先回忆一下面向对象编程,牢记面向对象三大特性:封装,继承,多态!
很多语言并不是完全面向对象的,比如PHP,JS等脚本语言,但这并无妨碍我们去学习其设计思想,但是我们必须从面向对象的思路去理解这种设计!

在完全面向对象的世界里面,首先必须有类,然后才有对象,对象有属性和方法,在程序运行的时候我们需要先创建一个类,然后使用 new 去实例化一个类得到一个对象,然后去调用这个类的相关属性活方法。

阅读全文 »

闲谈PHP面向对象编程

发表于 2016-03-09 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 986
关于面向过程和面向对象编程之间的区别这里不多说,简单看了一个例子,如何解决把大象装进冰箱这个问题? 面向过程方案:第一步.打开冰箱 第二步.把大象放进冰箱 第三步,关上冰箱 这个方案看上去没什么毛病,简单明了,当然第二步可以拆分的更细,拆成更多小步骤!用代码简单演示如下: 123456789101112131415161718192021<?php//1.打开冰箱function openFridge($fridge){ echo "打开冰箱:" . $fridge['name'];}// ...
阅读全文 »

PHP数组解析和常见操作

发表于 2016-02-05 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 1.4k

在PHP里面使用最多的数据结构恐怕就是数组了,不过PHP的数组和我们传统意义上的数组区别很大,PHP的数组功能上相当于其它语言里面array+list+map数据结构的集合体,这就是动态语言的强大之处。在PHP里面有2种数组,一种是传统的索引数组,另一种是关联数组,其实就是其它语言里面map数据结构。

底层实现

PHP的数组底层是使用HashTable实现,说到哈希表估计很多人都了解过,PHP数组通过一个映射函数把key映射到对于的value值上面,所以查找起来非常快,时间复杂度是O(1),哈希表都会遇到冲突问题,在PHP里面是通过链表的方式解决的。

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
//Bucket:散列表中存储
typedef struct _Bucket {
zval val; //存储的具体value,这里嵌入了一个zval,而不是一个指针
zend_ulong h; //key根据times 33计算得到的哈希值,或者是数值索引编号
zend_string *key; //存储元素的key
} Bucket;

//HashTable结构
typedef struct _zend_array HashTable;

struct _zend_array {
zend_refcounted_h gc;
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar flags,
zend_uchar nApplyCount,
zend_uchar nIteratorsCount,
zend_uchar reserve)
} v;
uint32_t flags;
} u;
uint32_t nTableMask; //哈希值计算掩码,等于nTableSize的负值(nTableMask = -nTableSize)
Bucket *arData; //存储元素数组,指向第一个Bucket
uint32_t nNumUsed; //已用Bucket数
uint32_t nNumOfElements; //哈希表有效元素数
uint32_t nTableSize; //哈希表总大小,为2的n次方
uint32_t nInternalPointer;
zend_long nNextFreeElement; ////下一个可用的数值索引,如:arr[] = 1;arr["a"] = 2;arr[] = 3;则nNextFreeElement = 2;
dtor_func_t pDestructor;
阅读全文 »

关于Scrapy爬虫数据传递问题

发表于 2016-01-07 | 更新于 2024-12-29 | 分类于 Coding
| 字数统计 695

问题:

这两天研究爬虫掉进一个大坑,爬了好久才爬出去,这里说几句,我写的爬图片的爬虫很简单,从一个图片列表进二级图片详情页,然后爬取二级详情页的所有图片,但是有个需求就是需要以二级详情页的标题为目录分类存放图片!思路很简单,就是在item里面增加一个字段title存放标题:

1
2
3
4
class PicscrapyItem(scrapy.Item):
image_urls = scrapy.Field() # 图片地址
images = scrapy.Field()
title = scrapy.Field() # 图片标题(目录)

然后在pipelines里面获取item里面数据,保存的时候做一下处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class PicscrapyPipeline(ImagesPipeline):
item = []
def get_media_requests(self, item, info):
self.item = item
return [Request(x) for x in item.get(self.images_urls_field, [])]

# 重写函数,修改了下载图片名称的生成规则
def file_path(self, request, response=None, info=None):
if not isinstance(request, Request):
url = request
else:
url = request.url
url = urlparse(url)
img_name = url.path.split('/')[5].split('.')[0]
return self.item['title'] + '/%s.jpg' % img_name

上面的代码看上去没毛病,重写了Scrapy框架ImagesPipeline的方法,根据title字段分目录存放,但是当我跑起来的时候看上去也没毛病,但是查看数据的时候却不对了,目录是出来了,但是牛头不对马嘴!

阅读全文 »

PHP平衡二叉树

发表于 2016-01-05 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 845

平衡二叉树

之前讲过树,二叉树,二叉排序树,现在说说这个平衡二叉树,平衡二叉树是一个平衡的二叉排序树,关键在于平衡,它的意思是其中每一个节点的左子树和右子树的高度差不多都是1。

为什么要平衡呢?还是为了提高查找速度,举个例子有一个数组 [3,2,1,4,5,6,7,10,9,8],如果按照二叉排序树的算法生成之后应该是图1的结果,这样其实对于查找是不利的,举个例子,如果你要找节点8,
你得找7次,但是如果是图2这种结构,则只需要3次。

阅读全文 »

PHP类的自动加载机制

发表于 2016-01-05 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 2.1k

1.手动加载?

首先,咱们先想一个问题,为什么需要加载机制?

理论上讲,你可以把所有PHP代码都写在一个文件里面,早期PHP确实有很多这样的代码,因为那时候还没有面向对象的概念,没有代码分层,一个PHP文件里面一大堆函数,一个功能一个函数这么写就行了。

后来,大家都发现这样写起来太乱,不利于维护和扩展,更重要的是有了面向对象的概念,我们可以把属性和方法封装到类里面,然后需要用到的时候就实例化这个类,这从面向过程转向面向对象。

举个例子,现在在同一个文件夹里面有2个类文件 ClassA.php、ClassB.php,还有一个index.php:

阅读全文 »

PHP数据结构之二叉树

发表于 2015-12-04 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 1.1k

有一点需要说明,一般讲算法是不会用PHP来实现的,而且实际应用中用PHP来实现也木有多大意思,所以这里用PHP实现的意思在于方便大家熟悉,了解其中概念。

如果要讲二叉树,肯定得先讲讲树,这里也不讲了,只讲一点,二叉树是一种特殊的树,这里为什么说是二叉树而不是三叉树呢?看图

这是典型的树结构图:

阅读全文 »

PHP数据结构之双向链表

发表于 2015-12-01 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 1.2k

其实这些都是PHP SPL 标准库里面的东西, SPL是用于解决典型问题(standard problems)的一组接口与类的集合。说白了,这是PHP官方实现的一些数据结构,
印象中Java的标准库就很强大,不要慌,PHP也有。

按顺序来,先讲一下这个双向链表(double link list),数据结构讲的是思想,不分编程语言,所以先回顾一下基本概念吧。

阅读全文 »

Kali系统下WiFi密码破解

发表于 2015-11-01 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 902

在网络渗透中,能够接入被攻击者的网络至关重要,只要黑客接入你的网络,利用DNS欺骗,arp攻击等各种钓鱼技术,基本上就能获取一切信息,WIFI网络的安全性重要性不言而喻!

手机上有很多类似360免费WIFI和WIFI万能钥匙的软件,可以”破解”WIFI密码,实际上这类软件不是”破解”而是”偷”密码,这类软件在安装的时候会自动上传你家的WIFI密码,也有可能是你一不小心分享出去的!分享之后别人使用软件就能连上你家的WIFI了,一般来说,商家WIFI比较多。

阅读全文 »

Linux系统自定义Shell命令

发表于 2015-10-05 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 1.2k

一.应用场景

由于长期使用Ubuntu系统开发和日常生活,每天开机第一件事情就是更新系统,在Ubuntu系统下面更新往往需要好敲好几个命令:

1
2
3
4
5
sudo apt-get update		           #更新源
sudo apt-get upgrade #更新普通软件包
sudo apt-get dist-upgrade #更新系统软件包
sudo apt-get autoremove #卸载无用的软件包
sudo apt-get autoclean #清除软件包缓存

通常情况下,我是一条接着一条敲,虽然看着命令行滚动很过瘾,但是时间长,感觉也没意思了,能不能用一条命令代替上面这些命令呢?
有人说,可以,你只要把这些命令行存起来,以后复制一下就搞定了…

阅读全文 »

Kali-Metasploit制作简易木马

发表于 2015-08-05 | 更新于 2024-12-29 | 分类于 Linux
| 字数统计 1.1k

相信很多人都有这种感觉,觉得那些会做木马病毒的人非常牛逼,当然会自己完全写出来木马病毒的肯定非常牛逼,但是实际上,大部分人都是在前人的基础上修改,很多则是用工具生成,出于兴趣,研究了一段时间”黑”科技,也实践了一下!

总结了几点简单的工具用法,如果你会用这些工具,你会发现也许一个木马没有你像现在那么难做出来!本文是本着研究的精神,所有攻击行为都是测试,请勿用于非法用途!

测试环境:kali linux windows7 windows 10 Android等操作系统

主要工具:metasploit framework

阅读全文 »

PHP实现语音播报

发表于 2015-03-25 | 更新于 2024-12-29 | 分类于 PHP
| 字数统计 997

大家估计都知道现在很多AI音响能够给你播报天气,叫你起床…甚至能够接受语音指令!所谓的人工智能音响,听起来很高大上,都说PHP是最好的编程语言,今天我就带大家来实现一个语音播报功能,写个美女叫你早上起床!
先大体说一个思路,PHP怎么实现语音播报呢?其实就是调个API(接口)的事情,这个就尴尬了。实际上,现在很多AI平台都提供一些成熟的接口供你使用,比如语音转文字,文字转语音,语音唤醒等等,
这里我使用的是百度的语音合成接口,点击查看, 思路就是使用PHP获取当前的时间和天气状况,然后调用接口转换成甜美的妹子语音播放出来。。。你没看错,就是这么简单!

第一步:获取时间信息

举个例子,文字内容可能是这样:“主人,早上好,今天是2017年12月18号上午8点整,星期一”,这样的内容用PHP自带的几个时间函数就能搞定,然后拼接成字符文字!下面是一些简单实例代码:

阅读全文 »

Ubuntu命令行下打造一个音乐闹钟

发表于 2015-03-07 | 更新于 2024-12-29 | 分类于 Linux