2016年4月19日星期二

Mac中安装pip等

sudo eash_install pip

安装virtualenv:
sudo easy_install virtualenv
创建虚拟环境:
virtualenv venv
source venv/bin/activate
退回全局python解释器:deactivate

安装flask:
sudo pip install flask

Mac下安装php-cgi

参考:https://gist.github.com/xiangshouding/9359739

$ brew install php55 --with-cgi
如果安装提示没有php55,请用 brew tap homebrew/homebrew-php 后再安装

或者:
mac一般自带php,但由于默认编译不带cgi,所以这部分安装可能会很麻烦。
采用的偷懒的办法,下载 http://fouber.github.io/install-php-cgi/ 中的php-mac版本,解压缩后,将bin/php-cgi直接复制到/usr/bin/下即可完成相应的使用。新版本的mac强化了安全机制,这种方法不建议使用。

IntelliJ IDEA中PHP配置参考:http://www.ifun.cc/blog/2014/02/09/macxia-pei-zhi-shen-qi-phpstromkai-fa-huan-jing/

2016年4月15日星期五

解决vi/vim中粘贴会在行首多很多缩进和空格的问题

参考:http://www.cnblogs.com/end/archive/2012/06/01/2531142.html

secureCRT会将你原来的文本原封不动的按照字符串的样式发送给服务器。所以当你的服务器上的vim设置为autoindent的话,在i模式下,那么它会将secureCRT传输而来的这些字符串再进行一下缩进。若你拷贝的文本中已经有表示缩进的空格或者制表符的话,它们也会被当成字符串,而被缩进。
解决办法:
1. 在拷贝前输入:set paste (这样的话,vim就不会启动自动缩进,而只是纯拷贝粘贴)
2. 拷贝完成之后,输入:set nopaste (关闭paste)

2016年4月14日星期四

Ubuntu安装gcc-4.8和g++-4.8

apt-get update时出了这个问题:
W: Failed to fetch gzip:/var/lib/apt/lists/partial/us.archive.ubuntu.com_ubuntu_dists_precise-backports_multiverse_binary-i386_Packages  Hash Sum mismatch

解决方法:
rm /var/lib/apt/lists/partial/*
apt-get clean
apt-get update

安装gcc-4.8和g++-4.8:
apt-get install python-software-properties
add-apt-repository ppa:ubuntu-toolchain-r/test
apt-get update
apt-get install gcc-4.8
apt-get install g++-4.8
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50

2016年4月9日星期六

Linux常用命令和管道符的使用

显示以a字符为结尾的所有行:
cat filename | grep a$

显示长度小于10的所有行:
cat filename | awk 'length($0) < 10 {print $0}'

可以使用'| more'一页页查看cat的结果

统计出现"NA"的行数:
cat filename | awk 'match($0, "NA") > 0 {print $0}' | wc -l

head:
ls | head -n 1 只显示第一行

取第n行:
cat xxx | head -n | tail -1

sort:
-n 按数字大小排序
-r 倒序
-k 2 按照第二列排序
-u 去重
-k 1,1 去重时从第一个开始,第1个结束
-t , 逗号为分隔符
-g 支持科学计数法排序

保留行号排序:cat result | awk '{print $0 " " NR}' | sort -k 1 -n > sorted_result

uniq:
去重。-c统计个数

sed /xx/d 删除包含xx的所有行
  用\[来表示左方括号,]表示右方括号
sed '/xx/!d' 删除不包含xxx的所有行

awk -F ',' 以逗号分隔
awk '{$1="";print $0}' file 删除第一列
关于sed、awk的使用实例,参考link.

按列求和,假设文件只有一列:
cat filename | awk '{sum+=$1} END {print sum}'

将hdfs中某个文件夹中所有文件(包含子文件夹)拷贝到另外一个文件夹目录(只拷贝所有文件,不拷贝文件目录):
hadoop fs -ls -R $origin_path | awk '$5!=0 {print $8}' | xargs -I {} hadoop fs -cp {} $destination_path
将文件重命名为1、2、3...:
hadoop fs -ls -R $origin_path | awk '$5!=0 {print $8}' | awk '{print "hadoop fs -cp " $1 " " "$destination_path" NR}' | sh

倒序输出
cat filename | tac

查看启动进程的文件
ll /proc/$pid/exe

将文件中所有字符转成大写
tr "[:lower:]" "[:upper:]" < 1.txt > 2.txt

2016年4月6日星期三

MySQL解析JSON数据

参考:https://segmentfault.com/a/1190000003941100

1、数据量不大的情况下可以直接使用linux中管道符提取出对应的字段存为另一个文件,然后load进mysql中。
数据格式如下:{"category":"热销菜品","name":"盐酥菇"}
我只要取name字段:
cat dish_name.info | sed 's/.*"name":"\(.*\)".*/\1\tnot_found/g' > dish_name.temp

2、使用common-schema
下载了common_schema-2.2.sql之后,有两种方法安装:
Within MySQL, issue:
mysql> SOURCE '/path/to/common_schema.sql';

From shell, execute:
bash$ mysql < /path/to/common_schema.sql

mysql --local-infile -u root -p 进入mysql:

mysql> create table temp(a varchar(255));
mysql> load data local infile '/home/dish_name_info' into table temp;
mysql> select common_schema.extract_json_value(temp.a, '/name') from temp;

可以使用该方法取到name中的结果,然后将结果写进新的表中。

2016年4月5日星期二

Hive中使用first_value和max等窗口函数

遇到一个需求,统计不同的phone_device_id最近的event_timestamp的status值出现的次数,原始数据距离(phone_device_id, status, event_timestamp):
a 0 10
a 1 20
b 1 10
c 1 20
b 0 30
c 0 10
需要的结果:
0 1
1 2
因为a最新的状态是1,b最新的状态是0,c最新的状态是1,所以0总共有1个,1总共有2个。

可以使用以下语句实现,主要是max() over()和first_value() over():
select get_json_object(s2.first_value_window_1, '$.status'), count(distinct(phone_device_id)) from (select phone_device_id, max(event_timestamp) over (partition by phone_device_id), first_value(properties) over (partition by phone_device_id order by event_timestamp desc) from watch_upload_info where event_date = '2016-04-04' and get_json_object(properties, '$.action') = 'aw_status' and event = 'click') s2 group by get_json_object(s2.first_value_window_1, '$.status');

还可以使用另外一个方法:
先根据phone_device_id来分组取出event_timestamp最大的那条记录存到一张临时表中,然后和原表进行join得到status字段,然后再分组。