Composer 初试

Composer 不是一个包管理器,默认下它不会全局安装任何包,只是在一个项目的某个目录中进行安装,它只是一个依赖管理工具。 Composer 解决的问题是: 你有一个项目依赖于若干个库 其中一些库依赖于其他库 你声明你依赖的东西 Composer 会找出哪个版本的包需要安装,并安装他们(将他们下载到你的项目中) 安装 curl -sS https://getcomposer.org/installer | php installer是一个PHP脚本,用来下载真正的composer.phar,composer.phar会保存到当前目录中。可以使用 --install-dir指定保存目录。 将composer.phar移动到PATH中 mv composer.phar /usr/local/bin/composer 这样就可以直接使用composer命令 使用 composer help 非常有用 composer install 读取当前目录下的composer.lock文件,下载和安装其中提到的库和依赖。如果composer.lock不存在,则查看composer.json文件。 composer update 读取当前目录中的composer.json文件,更新、删除或者安装所有的依赖。 composer init composer require xx 添加xx依赖到composer.json中,并安装他们 修改composer 全局配置composer config -g repo.packagist composer https://packagist.phpcomposer.com 链接 Composer中文文档 Packagist/Composer中国全量镜像

January 21, 2017

PHP 使用 xdebug 调试之路

PHPStorm中调试利用的是xdebug的remote特性,使用的是 DBGp协议,PHPStorm是一个实现了DBGp协议的客户端 在php.ini中启用xdebug.remote_enable, 配置xdebug.remote_host和xdebug.remote_port, port默认是9000. 通过phpinfo()函数的输出,可以在Loaded Configuration File中看到实际加载的php.ini文件是哪一个。 sudo apt install php-xdebug之后,会自动在/etc/php/7.0/apache2/conf.d中创建一个xdebug的配置文件,可以在这个文件中修改关于xdebug的配置,而不用去改通用的php.ini. client启动之后会监听 port,等待xdebug发送的请求。 要使php解释器在运行的时候activate xdebug,有三种方式: 从命令行运行php脚本时,设置环境变量export XDEBUG_CONFIG="idekey=session_name", 同样也可以在XDEBUG_CONFIG环境变量中设置remote_host,remote_port等属性。 从一个浏览器中启动debugger,需要传递一个XDEBUG_SESSION_START=session_name参数,这个参数可以是GET,POST或者Cookie。可以使用一些浏览器的插件自动传递这个参数。 只要xdebug.remtoe_enable开启了,PHPStorm打开了 Listening for PHP Debug,也就是服务器和客户端都准备好了,然后浏览器发送请求的时候包含一个XDEBUG_SESSION_START参数(?文档中写的是XDEBUG_SESSION_START,而实际上bookmark和插件中设置的cookie都是XDEBUG_SESSION),就可以愉快地调试了。

January 21, 2017

Python 图片处理库: Pillow

Image.open() im.mode, im.size, im.format Image.save() Image.show() 性能很慢, 仅作调试用. Image.convert() 比较常用的函数 Image.crop() Image.paste() Image.split() 将图像分为不同的 band Image.getpixel() Image.putpixel() 很慢 Image.point() 可以接受一个 lookup table, 或者一个函数, 函数接受一个参数, 这个参数可以看做像素点的颜色, 返回值为像素点的新颜色 Image.thumbnail() 生成缩略图, 会直接修改原图, 如果要保留原图需要先用 Image.copy() Image.getbbox() 这个函数好像很好用的样子, 待会儿再尝试 Image.getcolors(maxcolors=256) 获取图片中用到的所有颜色, 返回 [ (count, color),… ] 如果是 RGB 等格式, color 也是一个 tuple, 所以不同的颜色会有很多, 需要传入较大的 maxcolors, 否则会返回 None Image.histogram() 获取图片的直方图, 返回一个list, 如果是灰度图像, 则 list 大小为256, 每个元素表示0-255各个灰度的像素点的个数. 如果是 RGB 图像, 则 list 大小为 256*3.

January 21, 2017

PHP 基础回顾

include/require 如果没有提供路径,则会查找include_path,如果没有找到,则会查找当前脚本所在目录和当前工作目录。如果均失败的话,include 会产生一个 warnning,require会产生一个 fatal error. 当一个文件被 included时,被包含文件中的代码继承了include所在行的变量作用域。任何在include处可见的变量,对于被包含的代码也可见(相当于将被包含的代码复制并替换include命令。)但是,被包含文件中定义的函数和类都拥有全局作用域。 在解析被包含的文件时,解析器会切换为 HTML模式,所以任何没有包含在 php tag中的文本都会当做HTML处理,也就是会被原样 echo 给客户端。 include失败会返回FALSE,并产生一个warning。如果include成功,并且被包含文件中没有return语句,include会返回1。 如果被包含文件中有return语句,那么执行到return语句时,会停止对被包含文件的处理,并返回return提供的值,就像调用一个普通的函数一样。 如果被包含文件中定义了函数,并且被包含了两次,则会造成 fatal error,因为函数已经被声明过了。最好使用 include_once。 安装 sudo apt-add-repository ppa:ondrej/php5 php-xxx都是PHP的扩展包,比如php-gd,php-mysql,php-xdebug需要手动安装 Apache 通过 libapache2-mod-php7.1模块与PHP互动,配置文件为/etc/apache2/mod-enabled/php7.0/中 /usr/bin/php也只是一个alternative,可以使用update-alternative改变当前php命令使用的版本 安装过程中的处理: Setting up php7.1-common (7.1.0-5+deb.sury.org~xenial+1) ... Creating config file /etc/php/7.1/mods-available/calendar.ini with new version Creating config file /etc/php/7.1/mods-available/ctype.ini with new version Creating config file /etc/php/7.1/mods-available/exif.ini with new version Creating config file /etc/php/7.1/mods-available/fileinfo.ini with new version Creating config file /etc/php/7.1/mods-available/ftp.ini with new version Creating config file /etc/php/7....

January 18, 2017

Python logging 基础

一个例子: import logging logger=logging.getLogger(__name__) logger.setLevel(logging.INFO) # 添加handler handler=logging.FileHandler('hello.log') handler.setLevel(logging.INFO) # handler可以有多个,所以用add logger.addHandler(handler) # 设置格式 formatter=logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%H:%M:%S') # formatter只能有一个 logger.setFormatter(formatter) 对于库来说,通常使用 __name__ 来获取 Logger对象,然后只添加一个NullHandler,表示默认不会输出任何log: ...

December 30, 2016

Python 协程基础

基础 定义协程(coroutine)的两种方式:async def或使用generator实现。 基于generator的协程应该使用@asyncio.coroutine修饰,但这并不是严格要求的,基于generator的协程使用yield from语法。 ...

December 25, 2016

Jupyter Notebook 初试

安装 pip3 install jupyter --user Jupyter Notebook的kernel是IPython, 这样Notebook才可以使用Python. 也可以安装kernel, 比如 R, Julia. ...

December 18, 2016

Python 中的时间模块

time time 模块比较简单, 常用的函数只有几个, 但是这个模块中的函数名都很奇怪, 估计是模仿 *inx 的时间函数风格, 也查不到到底是什么的缩写, 那就不管它好了. ...

October 2, 2016

Arrow: better dates and times for Python

Python 中时间处理的库太多, 基本的有time, 复杂的有datetime, 日历处理有Calendar, 各种时区信息的库… 各个库中函数的命名也十分让人崩溃,比如time中的ctime(), asctime(), strftime(), strptime(), localtime()你能记得住这些函数分别接受什么参数, 起什么作用吗? 我觉得挺崩溃的. ...

October 2, 2016

设计模式(三): 适配器模式

Java 回顾 String 内部实现是一个 char 数组 String 可以由char[] ,int[], byte[] 生成, 其中char代表每一个字符, int代表一个code point, byte 需要根据相应的 charset 解码为char 要点 新旧两个接口 实现旧接口的对象无法在支持新接口的设备上使用 新建一个转换器(adapter), 实现新的接口, 内部聚合一个旧接口的对象, 将对新接口的所有调用全部委托到旧的接口上去. 讲课内容 DIP 接口由高层定义, 低层实现 类适配器, 使用继承, 只能适配一个类 对象适配器, 使用聚合

September 29, 2016