记一次 php curl CURLOPT_FOLLOWLOCATION 的使用。。。

因为需求,需要爬虫跟随重定向,设置了 CURLOPT_FOLLOWLOCAT = true; 用 http://baidu.com 测试的。。百度不乖,没有跟随重定向。。在网上找到了两种方法,来查看 response header

$content = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
//$header = substr($content, 0, $header_size); 第一种
list($header, $body) = explode("\r\n\r\n", $content, 2); //第二种

发现没有 Location 字段。。加上 CURLOPT_USERAGENT 后,百度乖乖的奉上了 Location 。 终于可以一起愉快玩耍了。

我是有参考资料的人
php-curl-retrieving-response-headers-and-body-in-a-single-request

angular2 重构 wordnet-lite 总结

参照着angular.io上的 heros demo 重构的. 部分小特性没有加进来,视图重新渲染也有点小bug..后续再填坑

开始看了好几天angularjs.org 然后找了本angular2看, 用的typescript, 敲完一个demo, 想着怎么搞成纯js的, 无意中发现 一个是angularjs 一个是 angular2 … 彻底被自己打败了.. 最近不怎么在状态…压力有点大..

大约用了三天,开发环境以及gulp工作流都是参照官网的, 没怎么修改..惭愧..
第一天 环境配置以及shim.js zone.js等文件没有加载, 只加载了一个bundle.js…还没有设置base href属性, 浪费了小半天
第二天 粗心大意, 写模板的时候, *ngFor 语法写错了, 又浪费了半天. 仔细,要仔细
才发现gulp流中加入uglify不会拖慢再次bundle, 反而加快了浏览器jit的时间… 这又浪费了一些时间…
第三天 在服务中添加localStorage缓存, promise返回值问题, 又浪费了半天. 当初是在课上看的promise, 没怎么实践, 这就吃亏了

由于watchify没有显示tisfy编译错误, 导致gulp默认任务跑半天也没个结果…果断ctrl+c结束, 然后再开个panel tsc 直接显示错误, 修改完再执行gulp就可以了..
angular.io上的demo在组建构造函数中注入的时候, 没有加注解, 不知道怎么运行过去的… 找这个原因也浪费了点时间… 是我配置有问题么,求大神指点
export class component 的时候, 不注意拼写错了, 然后再另外一个文件 import 出错… 这个错误犯过几次..
在新建数据结构的时候, 异想天开搞了个嵌套另外一个自定义结构, 也是自己把自己作的.. 文件增多了, 也增加了歧义的几率…
模板绑定数据的时候, 想着修改下数据, 原来是直接取json内容, 然后array.join(‘, ‘) , 结果发现难度不小.. 不过直接在模板中输出数组, 自动添加了join(‘,’)…
模板在一个tag中写两个指令会报错, 可以在ng-container标记中写一个指令, 在这个元素中写另外一个指令

一定要吸取教训, 不要重蹈覆辙…

mysql 笔记

在这里先介绍下sqlite 超轻量级的关系数据库管理系统,以下大部分语句可以在其中执行。不过,最好还是自己装个mysql或者mariadb。
html5中有websql,它用的就是sqlite。so,准备了一个页面,可以直接在里面执行语句,由于sqlite的局限性,不支持存储过程。一些查询,视图,触发器,还是可以的。

#登陆
mysql -uroot -p

#列出所有数据库
show databases;

#创建数据库
create database databaseName;

#删除数据库
drop database databaseName;

#切换数据库
use databaseName;

#列出当前数据库内所有表
show tables;

#新建表
create table person (id int auto_increment primary key,LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255), year int);
/*
常用数据类型

数字类型	int float decimal
字符串类型	char varchar enum
日期类型	timestamp
*/
#显示表结构
desc tableName;

#清空表
delete from tableName;
truncate tableName;

#删除表
drop table person;

#修改表名
alter table person rename persons;

#添加新列
alter table persons add birthday date;

#删除列
alter table persons drop column birthday;

#修改列名
alter table persons change City 城市 varchat(255);

#查询数据
select 列名 from 表名 where 条件;
#连表查询 子查询 //以后再fake数据填坑。。。。

#插入数据
insert into tableName (filed,filed,filed) values (value,value,value)
insert into tableName values (value,value,value) /*必须按照表结构插入*/

#更新数据
update tableName set filedName = newValue where filedName = oldValue

#删除数据
delete from tableName where filedName = value;
#索引 视图 存储过程 触发器 //待填坑

wordnet-lite 开发小结

需求很简单,解决很暴力。
前端很大一部分是纯javascript,没有第三方依赖的库,框架。嗯,借鉴了jQuery的 $ 选择元素。。。

css写在了index里,减少了个http请求

所有js都在一个立即执行的匿名函数里,虽然不符合jslint,但是完全封闭,安全些。

动态加载html用的大部分是dom函数,虽然有点乱,但比直接写清晰些html。

所有click事件统一处理,彻底解决了不要在循环里定义函数。。。

关于#!这个问题,用的很正常的url,js判断location.pathname,然后处理路由。很暴力,完全无视seo。

分页,因为get的数据不大,全部存到localStorage中,直接slice

异常处理,基本都是日常调试的时候加的。不能说测试。。没有测试文件。。。

国际化也很暴力,字段存到对象里,根据navigator.language判断,如果不支持用户的语言,直接默认英文

很好的利用了localStorage,减少了很多不必要的请求。所以速度也飞快。

请求ajax时加了个mask遮罩层,想加动画来着,不过,估计动画比整个程序都大,算了

页面很长的时候,虽然没加goTOP,但是对用户体验还是有很大的提升。不信找个百度百科页面,把页面拉到下面,然后打字试试。
还是看代码吧

document.addEventListener("scroll", function () {
    if (window.scrollY !== 0) {
        $("input.word").blur();
    } else {
        $("input.word").focus();
    }
});

后端php负责api,http服务器负责伪静态重定向。。。

后端还处理了很重要的东西,base标签的值
没有它,ajax还有history全部瘫痪。。有了它,不用到处去配置url

<base href="/<?=APP_HOME?>/">

遗憾的是没能折腾个简单的前端模板。嗯,api也是完全暴露的,没有任何认证过滤限制机制,数据量很小,而且后端做的不错。。。等把算法学精了再加吧

记一次备份 重装 恢复

备份

$ mysqldump --all-databases --lock-all-tables -uroot -p > data.sql
$ tar cf html.tar /var/www/

重装

$ vi /etc/apt/sources.list
$ wget https://www.dotdeb.org/dotdeb.gpg
$ apt-key add dotdeb.gpg
$ apt-get update
$ apt-get install nginx php5 mysql-server php5-mysql php5-mcrypt php5-curl  varnish php5-memcache memcached python-pip fish zsh htop dnsutils curl
$ php -v
$ service apache2 restart
$ passwd
$ pip install shadowsocks
$ apt-get upgrade

恢复
安装mysql-server后,直接恢复整个数据库,成功.
执行 /usr/bin/mysql_secure_installation后,删除了一些账户.添加/etc/mysql/debian.cnf中的账户,并添加权限.
如果启动mysql服务出现”Cannot load from mysql.proc. The table is probably corrupted。”需要对数据库数据进行升级,mysql_upgrade -uroot -p 请提前删除/var/mysql/performance_schema/.

scp上传文件如果意外中断了,rsync -P 后面参数一样,可以续传.以防万一,最好sha256sum校验下.
安装包,如果强制中断了,可以执行dpkg -P packgae_name,再重新安装

隐藏apache版本
/etc/apache2/apache2.conf
ServerTokens ProductOnly
ServerSignature Off
隐藏php版本
/etc/php5/apache/php.ini
expose_php Off