技术圈开发者交流群:

Composer 是什么 ?

ComposerPHP的一个依赖管理工具。

项目开发中,难免会用到各种已有的扩展库,各个扩展库的依赖关系可能错综复杂,使用传统的require include的方式会让你困于处理各种依赖问题,而无法专注于自身的业务代码。

这一次,真正了解Composer

PHP 2020年03月19日 1892

PHP -Casbin: 支持 ACL、RBAC、ABAC 多种模型的 PHP 权限管理框架

PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架( https://github.com/php-casbin/php-casbin ),目前在 GitHub 开源。PHP-Casbin 采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等。

1.支持自定义请求的格式,默认的请求格式为{subject, object, action};

PHP 2018年11月01日 73621

利用Flask和ECharts进行数据可视化——我用scrapy写爬虫(四)

前几篇文章,我们对慕课网的课程进行了爬取,本文就对数据进行统计和可视化,让这些数据更直观的展现出来。

Flask 是基于Python的非常流行的框架之一,主要用于web开发,适合开发中小型项目,易于扩展。Flask的官方网站是 http://flask.pocoo.org/

Echartshttp://echarts.baidu.com/ )是百度出品的,基于Canvas的,纯Javascript 的图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。

python 2018年03月12日 67622

scrapy爬取慕课网全部免费课程——我用scrapy写爬虫(三)

前两篇文章中,简单用scrapy写了一个小demo,本篇文章主要目标是完整用scrapy爬取,慕课网所有免费的课程、标题、图片、地址、学习人数、难度、方向、分类、时长、评分、评论数等。

其实,很简单,在上一次的代码中修改调整一下就好。

# -*- coding: utf-8 -*-

import scrapy
import json
from urllib import parse as urlparse
from scrapyDemo.ImoocCourseItem import ImoocCourseItem

# 慕课网爬取
class ImoocSpider(scrapy.Spider):
    # spider的名字定义了Scrapy如何定位(并初始化)spider,所以其必须是唯一的
    name = "imooc"

    # URL列表
    start_urls = ['http://www.imooc.com/course/list']
    #  域名不在列表中的URL不会被爬取。
    allowed_domains = ['www.imooc.com']

    def parse(self, response):
        # 课程类型
        types = response.css('div.course-content .course-nav-row')[2].css(
            '.bd ul li a')
        for key in range(len(types)):
            if key == 0:
                continue
            course_type = types[key].css('::text').extract_first()
            # 类型的url
            type_url = types[key].css('::attr(href)').extract_first()
            # print (item)
            yield scrapy.Request(
                url=urlparse.urljoin(response.url, type_url),
                callback=self.parse_by_type,
                meta={
                    'course_type': course_type
                })

    # 按课程类型爬取
    def parse_by_type(self, response):
        itemBase = response.meta
        item = ImoocCourseItem()
        item['course_type'] = itemBase['course_type']
        # print(item)
        learn_nodes = response.css('a.course-card')
        # 遍历该页上所有课程列表
        for learn_node in learn_nodes:
            course_url = learn_node.css("::attr(href)").extract_first()
            # 拼接课程详情页地址
            course_url = urlparse.urljoin(response.url, course_url)
            # 课程地址
            item['course_url'] = course_url
            # 课程图片
            item['image'] = learn_node.css(
                "img.course-banner::attr(src)").extract_first()
            # 分类
            cate = learn_node.css("div.course-label label::text").extract()
            item['cate'] = ','.join(cate)
            # 进入课程详情页面
            yield scrapy.Request(
                url=course_url, callback=self.parse_learn, meta=item)

        # 下一页地址
        next_page_url = response.css(
            u'div.page a:contains("下一页")::attr(href)').extract_first()
        if next_page_url:
            yield scrapy.Request(
                url=urlparse.urljoin(response.url, next_page_url),
                callback=self.parse_by_type,
                meta={
                    'course_type': item['course_type']
                })

    # 课程详情
    def parse_learn(self, response):
        item = response.meta
        # 课程标题
        item['title'] = response.xpath(
            '//h2[@class="l"]/text()').extract_first()
        # 课程简介
        item['brief'] = response.xpath(
            '//div[@class="course-brief"]/p/text()').extract_first()

        staticItem = response.css(
            'div#main div.statics div.static-item span.meta-value::text'
        ).extract()
        # 难度级别
        item['difficulty_level'] = staticItem[0]
        # 课程时长
        item['duration'] = staticItem[1]
        # 综合评分
        item['overall_rating'] = staticItem[2]
        # 评论数
        item['evaluation_number'] = response.css(
            'a.person-num span.person-num::text').extract_first().replace(
                '人评价', '')
        # 教师id
        item['teacher_id'] = response.css(
            'div.teacher-info a img::attr(data-userid)').extract_first()
        # 学习人数
        ids = response.url.split('/')[-1]
        yield scrapy.Request(
            url=urlparse.urljoin(response.url,
                                 '/course/AjaxCourseMembers?ids=' + ids),
            callback=self.parse_learn_num,
            meta=item)

    # 爬取学习人数
    def parse_learn_num(self, response):
        item = response.meta
        data = json.loads(response.body_as_unicode())
        # 学习人数
        item['learn_num'] = data['data'][0]['numbers']
        # print (item)
        yield item
python 2017年11月29日 65162

快速上手——我用scrapy写爬虫(一)

用python写爬虫的人很多,python的爬虫框架也很多,诸如pyspider 和 scrapy,笔者还是笔记倾向于scrapy,本文就用python写一个小爬虫demo。

本文适用于有一定python基础的,并且对爬虫有一定了解的开发者。

检查环境,python的版本为3.6.2,pip为9.0.1

python 2017年10月17日 1391

如何高效学习PHP?

成功没有捷径,唯有努力和坚持

不知不觉已经coding五年,运维进门,PHP入行,第一份工作却是JAVA,曾经安装Oracle花了3天,PHP出道,thinkphp开窍,laravel走红,Yii顿悟。不一样的曲径,不一样的心路历程。

学习一门技术,首先知道它能干什么,能给你带来什么。市面上流行的语言数不胜数,C/C++,JAVA,python,ruby,go等等,每一种语言都其独特的优势,不是说能不能干,而是适不适合。那么PHP来说,最适合不过的就是web领域的后端快速开发,学习成本低,相对容易上手。

其他 2017年09月27日 30443

LINUX进程管理

程序

保存在硬盘、光盘等介质中的可执行代码和数据

是静态保存的代码

进程

在CPU及内存中运行的程序代码

是动态执行的代码

父、子进程:每个进程可以创建一个或多个进程

 

ps命令

用途:查看静态的进程统计信息

格式:ps aux

      ps -elf

 

使用ps命令工具时,要注意选项前是否有”-“引导符,例如”e“和”-e”选项的含义是有区别的

ps命令结合“aux”选项使用时,将显示系统中所有的进程信息

    PID:该进程在系统中的数字ID号,在当前系统中是唯一的;    %CPU:CPU占用百分比;    %MEM:内存占用百分比

ps命令结合“-elf”选项使用时,将以长格式显示系统中所有的进程信息,包含更丰富的内容(其中PPID列表示进程的父进程的PID号)

 

image.png

定制属性

ps axo pid,comm,%cpu  --sort=%cpu | tail -1

 

进程状态

image.png

 

常见进程状态

image.png

 

进程优先级决定了CPU对进程调度顺序.在Linux中,进程优先级受nice值(-20-19)影响,默认值为0,nice值越小,则进程对cpu的使用权越具有优先性

调整进程优先级的命令:

nice(启动进程时使用)

nice  -n 5  vi

   renice (对于已经启动的进程)

                  renice 9 1236

 

top命令

用途:查看动态的进程排名信息

 

切换到虚拟机环境演示ps(包括ps aux、ps –elf的用法)、top命令的使用,并讲解输出结果中的要点(CPU占用、内存占用等)

从用途上对比ps、top两个命令的不同,可适当介绍top工具的命令按键:P、M、N、h、q

按P键根据CPU占用情况对进程列表进行排序

按M键根据内存占用情况进行排序

按N键根据启动时间进行排序

按h键可以获得top程序的在线帮助信息

按q键可以正常退出top程序

使用空格键可以强制更新进程状态显示

 

pgrep命令

用途:根据特定条件查询进程PID信息

 

[root@localhost ~]# pgrep "init"

1

[root@localhost ~]# pgrep -l "log"

2538 syslogd

2541 klogd

3221 login

[root@localhost ~]# pgrep -l -U teacher -t tty1

27483 bash

27584 vim

 

 

pgrep命令

用途:根据特定条件查询进程PID信息

 

[root@localhost ~]# pstree -aup

init,1

  ├─acpid,2866

  ├─atd,3060

  ├─auditd,2516

     ├─python,2518 /sbin/audispd

     └─{auditd},2517

……

[root@localhost ~]# pstree -ap teacher

bash,27483

  └─vim,27674 myfile.txt

 

手工启动

前台启动:用户输入命令,直接执行程序

后台启动:在命令行尾加入“&”符号

[root@localhost ~]# cp /dev/cdrom mycd.iso &

[1] 28454

 

调度启动

使用at命令,设置一次性计划任务

使用crontab命令,设置周期性计划任务

 

Ctrl+Z 组合键

将当前进程挂起,即调入后台并停止执行

jobs命令

查看处于后台的任务列表

fg命令

将处于后台的进程恢复到前台运行,需指定任务序号

[root@localhost ~]# jobs

[1]-   Stopped                 cp /dev/cdrom mycd.iso

[2]+  Stopped                 top

[root@localhost ~]# fg 1

 

Ctrl+C组合键

中断正在执行的命令

kill、killall命令

kill用于终止指定PID号的进程

killall用于终止指定名称的所有进程

-9 选项用于强制终止

[root@localhost ~]# pgrep -l "portmap"

2869  portmap

[root@localhost ~]# kill  -9  2869

[root@localhost ~]# killall -9 vim

[1]-  已杀死               /usr/bin/vim file1

[2]-  已杀死               /usr/bin/vim file2

 

pkill命令

用途:根据特定条件终止相应的进程

常用命令选项:

 -U:根据进程所属的用户名终止相应进程

 -t:根据进程所在的终端终止相应进程

[root@localhost ~]# pgrep –l -U "hackli"          

3045 bash

[root@localhost ~]# pkill -9 -U "hackli

[root@localhost ~]# pgrep -l U "hackli


Linux 2017年08月30日 37486

史上最全PHP常见开发工具 视频教程 文档资料

[PHP常见开发工具]

php开发工具众多,主要有两类,一类是普通文本编辑器,另一类是集成开发工具(IDE)。

普通文本编辑器:

    1、Sublime Text

    2、微软的跨平台代码编辑器 visual studio code

    3、Atom

    4、还有notepad++,editplus,vi等等不再列举

集成开发工具(IDE)

    1、zend官方的zend studio

    2、JetBrains 公司的PhpStom

    3、netbeans IED for php

    4、eclipse for php

    ……

[流行的MVC]

1、ThinkPHP 国人自己的

2、laravel 以优雅著称

3、Yii 快速、安全、专业 的 PHP 框架

4、zend framework  zend自家的

5、Yaf(Yet Another Framework)  高性能的C语言编写的框架

6、phalcon使用 C 扩展编写、针对高性能优化的 PHP 框架

7、CodeIgniter、CakePHP、Symfony 等等

[视频教程]

    1、慕课网-程序员的梦工厂

            慕课网(IMOOC)是IT技能学习平台。慕课网(IMOOC)提供了丰富的移动端开发、php开发、web前端、android开发以及html5等视频教程资源公开课。并且富有交互性及趣味    性,你还可以和朋友一起编程。

    2、网易云课堂 - 领先的实用技能学习平台

            云课堂是网易公司研发的一款大型在线教育平台服务,该平台面向学习者提供海量免费、优质课程,创新的个性化学习体验, 自由开放的交流互动环境。继网易公开课后,云课堂是网易公司在教育领域的又一重量级产品。

    3、腾讯课堂_专业的在线教育平台

            腾讯课堂-腾讯推出的专业在线教育平台,聚合大量优质教育机构和名师,下设职业培训、公务员考试、托福雅思、考证考级、英语口语、中小学教育等众多在线学习精品课程,打造老师在线上课教学、学生及时互动学习的课堂。腾讯课堂,学习成就梦想!

    4、极客学院IT在线教育平台-中国专业的IT职业在线教育平台

            极客学院作为中国专业IT职业在线教育平台,拥有海量高清IT职业课程,涵盖30+个技术领域,如Android,iOS ,Flash,Java,Python,HTML5,Swift,Cocos2dx等视频教程.根据IT在线学习特点,极客学院推出IT学习知识体系图,IT职业学习实战路径图,帮助IT学习者从零基础起步,结合IT实战案例演练,系统学习,助你快速成为IT优秀技术人才!

    5、优酷学堂

            优质课程、智能问答、趣味实践、随心笔记、教育、优酷公开课、计算机开发、交互视觉设计、Udacity、it、互联网、会计、视频教程、交流互动、免费、名师、实用、培训


PHP 2017年06月10日 49629

Node.js/Express学习笔记_02 快速开始express

一、express介绍

我们知道,php有thinkphp、laravel、yii、yaf等等一系列开源框架,java有spring、structs、Hibernate等,python有Django、webpy等,那么Node.js也有很大框架,比较主流的有express、koa框架,接下来我就选择express来开始学习。

npm 提供了大量的第三方模块,其中不乏许多 Web 框架,我们没有必要重复发明轮子,

因而选择使用 Express 作为开发框架,因为它是目前最稳定、使用最广泛,而且 Node.js

方推荐的唯一一个 Web 开发框架。

Express http://expressjs.com/ ) 除了为  http 模块提供了更高层的接口外,还实现了

许多功能,其中包括:

q  路由控制;

q  模板解析支持;

q  动态视图;

q  用户会话;

q  CSRF 保护;

q  静态文件服务;

q  错误控制器;

q  访问日志;

q  缓存;

q  插件支持。

 

二、安装express

1、运行:npm install -g express

        未命名图片.png

       2、创建项目:express --view ejs blog

          未命名图片2.png

         3、按照提示 cd blog && npm install

          未命名图片3.png

            4、启动项目 SET DEBUG=blog:* & npm start

          未命名图片4.png            

5、打开浏览器http://127.0.0.1:3000/,看到如下页面,表示express项目安装成功

未命名图片5.png


三、express目录结构

        未命名图片6.png

app.js是项目的入口文件

routes是项目的路由文件目录

view是模板目录,根据上面的安装,我们是有模板引擎是ejs,该模板引擎通俗易懂。


Node.js 2017年06月05日 62715

排行

解决方案

网站建设

专业企业官网建设,塑造企业形象,传递企业价值

系统开发

系统软件开发,用心思考,用心设计,用心体验

技术支撑

打破技术瓶颈,让不堪重负的项目起死回生

业务中台

构建全渠道一体化运营能力,实现全链路数字化

文案策划

文案撰写、营销策划,专注品牌全案

新媒体运营

一站式解决企业互联网营销痛点和难题

以技术的力量,改变互联网

联系我们
鄂ICP备19028750号-1 @copyright 2026 tech1024.com