分类目录归档:未分类

Hive和JSON_UNESCAPED_UNICODE

这篇记录是为了纪念自己的无知和自以为是。

给数据部门提供了一个json格式的HTTP接口, 直接使用php函数json_encode($data)处理数据,返回的数据中包含中文,结构如下:

echo json_encode($data);

{"code":1000,"msg":"succ","data":{"list":[{"pid":"6","video_keys":"\u90fd\u633a\u597d","type":"1"},{"pid":"5","video_keys":"\u7535\u89c6\u5267\u77e5\u5426\u77e5\u5426\u5e94\u662f\u7eff\u80a5\u7ea2\u7626","type":"1"}],"total":6}}

对方的技术希望返回的数据直接是汉字,我自己请求了一遍接口, 因为Chrome装有json解析插件JSONView,curl请求也使用了json解析插件jq, 都格式化好了,看到的结果如下:
继续阅读

PHP静态变量用法

静态变量,static variable。下面这句话非常重要: 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

具体例子可参考官网。下面给出生产环境的用法:
一、区分项目
在基础目录新增一个Util.php文件

<?php
/**
 * 功能介绍 工具方法
 *
 * @author:   chuanbo7 <salmonl@niliu.me>
 * @date:     2019-04-19
 */

// set app标示
function appFlagSet($flag, $get = false)
{
    static $app_flag = ' ';
    if ($get === true) {
        return $app_flag;
    }
    $app_flag = $flag;
}

// get app标示
function appFlagGet()
{
    return appFlagSet('', true);
}

// the end of the script

用法:
0、在项目入口文件index.php中引入这个文件
1、在项目路由中区分项目,分别调用appFlagSet()写入不同的标示。

$uri = $request->getRequestUri();
if ($uri == 'episode') {
    appFlagSet(EPISODE);
} elseif ($uri == 'variety') {
    appFlagSet(VRRIETY);
}

2、在项目中任何地方调用appFlagGet()获取项目标示。
3、思考:如果是单纯的标示,使用$GLOBALS[‘app_flag’] = EPISODE;也可以达到目的。

二、项目记录Debug和执行时间
0、在基础目录新增一个Util.php文件

<?php
//打时间标记, $flag 为标记名,默认为_default
function flagtime($flag = '_default') {
    static $static_time = array();
    if (!isset($static_time[$flag])) {
        $static_time[$flag] = microtime(true);
    }
    $diff = microtime(true) - $static_time[$flag];
    $static_time[$flag] = microtime(true);

    return substr(($diff * 1000) , 0, 5) . 'ms';
}

//存debug信息
function debugSet($string, $get = false) {
    if (!DEBUG)
    return '';
    static $debug_data = array();
    if ($get === true) {

        return $debug_data;
    }
    if (DEBUG) {
        $d = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
        $file = isset($d[0]['file']) ? basename($d[0]['file']) : 'unknown';
        $line = isset($d[0]['line']) ? $d[0]['line'] : 'unknown';
        $debug_data[] = $file . '(line ' . $line . '): ' . $string;
    }
}
//取debug信息
function debugGet() {

    return debugSet('', true);
}

1、在入口和出口分别调用flagtime(),获取项目执行时间。
2、获取请求url执行时间,在请求前后记录

// 请求前
flagtime(1);
// 请求结束
debugSet('{Curl(' . flagtime(1) . ')}' . $url);
// 输出
debugGet();

梦回河西走廊

19年春节去河洛和开封走了走,穿梭在这片曾经为多朝都城的地方,不仅感概历史不再是教科书上简洁的文字,不再是史书上丰富的故事,历史是脚下实实在在的土地,历史是曾经缓慢流过这里的一段段时光。

在洛阳博物馆再一次看到了丝绸之路的线路图,这次的不同是身临其境这条路上,站在洛阳往西望,长安、玉门关、阳关、罗马依次在眼前浮现。心里安安思忖,有生之年当去走一走。也是在这个时候听说了河西走廊,身未至,梦先行。心向往之的路上,遇到了两部纪录片《河西走廊》、《神秘的西夏》。两部片子看完,久久难忘。

河西走廊

片子共10集,10个主题:使者、通道、驿站、根脉、造像、丝路、敦煌、会盟、苍生、宝藏。非常详尽的讲诉了河西走廊的来龙去脉、及前世今生。而最让人敢兴趣的莫过于河西走廊的打通和走廊存在的意义。


0、河西走廊的打通
开篇讲诉公元前138年,19岁的汉武帝(刘彻)放弃祖辈和亲匈奴的防御政策,派遣27岁的朝廷侍从官张骞去西域寻找军事同盟月氏部落,联手对抗匈奴的情景。之所以说是情景,确实是像演古装剧一般(后来才知道,这就电影化的情景再现手法),真实又有趣,让人忍不住往下看。
当张骞和堂邑父踏上这条黄河以西、形如走廊的狭长平原没多久,就被匈奴抓住了,由于张不合作被匈奴长期软禁。9年后,逃离匈奴的控制后,穿过大漠继续西行最终找到大月氏部落,而定居下来的大月氏不愿意攻打匈奴,张骞用一年的时间熟悉了这个地方后,毅然决然返回长安。不巧路上又被匈奴俘虏,后又逃回长安,前后历时13年。而刘彻也正是凭借张骞带回来的情报,才有了19岁的霍去病驱逐匈奴,封狼居胥;才有了河西四郡【四郡的名字着实有意义: 武威(武功军威之意)、张腋(断匈奴之臂,张汉朝之臂腋)、酒泉(因城下有泉,泉水若酒)、敦煌(盛大辉煌之意)】。

如果你不知道何为人生使命的话,你一定要来看看这个纪录片下再现的张骞。经历漫长而艰辛的岁月,依然不该初心,极具开拓和冒险精神的张骞,让人肃然起敬。可以说是张骞打通了河西走廊,打通了一段通往西方文明的道路,开启了一部波澜壮阔的史诗。

走廊的意义
而后河西走廊即是中原帝国通往西域的驿站,文明从东往西走的通道;又是西方文明进入东方文明的通道,文明从西往东传,魏晋时期,佛教沿着河西走廊,在高僧鸠摩罗什的传播下,开始中国化,影响中原;同时还是文化的避难所,魏晋时期中原打乱之际,河西走廊以其相对安定的政治环境庇佑了迁徙至此的儒家学者,儒家文化自此在河西走廊扎下根脉,并最终东渐反哺中原,成为隋唐文化和制度的重要来源。

分分合合,合合分分,不管是谁的天下谁的王,这条走廊一直是中国历史浓墨重彩的一笔。可以想象,公元609年,隋炀帝西征侵扰河西走廊的吐谷浑并在张掖举行的外交与商贸盟会是多么的超前。之后从长安来到敦煌的工匠将长安艺术带到了这里,他们在当地世家大族的支持下继续开凿敦煌石窟并绘制敦煌壁画,敦煌石窟也成了大唐盛世的缩影。

我所有认识的河西走廊,都是从这一部片子开始的,感谢片子的全部创作人。

神秘的西夏

参考:
维基百科:河西走廊纪录片
维基百科:河西走廊
维基百科:丝绸之路

CSRF跨站请求伪造

上篇文章总结了遇到过的一个XSS漏洞问题,这次顺便写写自己了解的CSRF。

CSRF是Cross-site request forgery的缩写,中文的世界一般说法是跨站请求伪造。简单地说,就是黑客伪造了一个目标网站的地址,欺骗用户去点击用浏览器打开这个地址,如果用户登陆了这个网站,就可以绕过后台用户身份验证,执行一些操作。
继续阅读

压测工具之ab

一、介绍
0、导语
最早接触的压测工具就是ab, ab是ApacheBench的简称,是Apache HTTP服务器基准测试工具,当然也可以测试其他服务器。

1、安装
Linux和Mac系统一般自带Apache, 所以可以直接在终端使用ab命令。Windows系统或其他没有安装的系统,请自行安装。

2、ab参数
ab的具体描述和参数,请参考官网ab, 或者直接man ab查看。
继续阅读

SVN常用命令整理

经常用Git, 偶然碰到SVN管理的项目,往往又需要从头熟悉一遍SVN的命令,特记录下常用的SVN命令。

注:以下记录基于macOs自带svn命令。
一、svn管理项目开发。
0、安装svn colordiff。
工欲善其事必先利其器,命令行下的colordiff是非常有必要的

brew install colordiff
svn diff | colordiff 出现色彩

或者修改配置, 直接使用svn diff

echo 'diff-cmd = colordiff' >> ~/.subversion/config 

当然设置别名也行
继续阅读

awk常用形式整理

这里并不打算介绍awk,也不是简明教程,如果想看教程,推荐耗子的文章《AWK 简明教程》

awk格式如下:

awk '{pattern + action}' {filenames}

以下展示为使用过的场景整理:
0、对齐输出部分列

$ cat 20180928.log
BANG|2018-09-28 20:00:02|||0|not same|topic 中国新说唱|md5 70a33ddbaae24c83d9bf1b18786d17cf|old read 6743582553 | new read 6743903396 | old mention 34576698| new mention 34576697 |read_inc: 320843| menton_inc: -1
BANG|2018-09-28 20:00:02|||0|not same|topic 明日之子|md5 470c7ea352169bc4cf766cc10126e3d9|old read 19442104721 | new read 19442126259 | old mention 87717229| new mention 87979643 |read_inc: 21538| menton_inc: 262414
BANG|2018-09-28 20:00:02|||0|the same|topic 综艺ELEVEN|md5 61eeebb92bc7a9d216633e1e1604a0a3|old read 0 | new read 0 | old mention 0| new mention 0
BANG|2018-09-28 20:00:02|||0|not same|topic 加油好身材|md5 b0e3dcf03ab2c4bdb916f083c3ecd861|old read 90588874 | new read 92111031 | old mention 104225| new mention 104224 |read_inc: 1522157| menton_inc: -1
BANG|2018-09-28 20:00:02|||0|not same|topic 这就是灌篮|md5 d4da257e8be25298e2c4b245e47632b8|old read 2694756739 | new read 2694765957 | old mention 5403696| new mention 5403696 |read_inc: 9218| menton_inc: 0
BANG|2018-09-28 20:00:02|||0|not same|topic 我在大理寺当宠物|md5 ca932540077f8c959187f06c2ecf9131|old read 71751204 | new read 71750514 | old mention 89286| new mention 89285 |read_inc: -690| menton_inc: -1
BANG|2018-09-28 20:00:02|||0|not same|topic 优酷秋集|md5 edca63655c351a1a503c1bd4d90b4505|old read 906746383 | new read 913171740 | old mention 5868201| new mention 5958567 |read_inc: 6425357| menton_inc: 90366
BANG|2018-09-28 20:00:02|||0|not same|topic 凉生,我们可不可以不忧伤|md5 c47f14a0d063e103d3cfbab61ac29231|old read 502732993 | new read 502732992 | old mention 502829| new mention 502829 |read_inc: -1| menton_inc: 0
BANG|2018-09-28 20:00:02|||0|not same|topic 橙红年代|md5 b5bef8afd1e7fa2fd6effd1d7b69947c|old read 859229830 | new read 859229076 | old mention 2828826| new mention 2828826 |read_inc: -754| menton_inc: 0
BANG|2018-09-28 20:00:02|||0|not same|topic 相声有新人|md5 222d028fd017cb630fd58f951d956f8f|old read 346645090 | new read 347368858 | old mention 521064| new mention 521065 |read_inc: 723768| menton_inc: 1

使用awk展示部分列,并对齐输出

$ awk -F '|' '{print $2, $7, $13, $14}' 20180928.log |column -t

1、多个分隔符

$ cat access.log
2017-03-24 15:23:18|x aaa|AA\n
2017-03-24 15:24:15|x bbb|BB\n
2017-03-25 22:18:55|x ccc|CC\n
$ grep '2017-03-24' | awk -F ['=|'] '{print $3}' awk.log
aaa
bbb
ccc

2、按照某一列排序

cat /tmp/debug_vote_log/20190319.log | grep '2118' | grep '2019-03-19 22:00'
debug_vote_log|2019-03-19 22:00:02|10.77.40.52|10.73.14.110|6033294916|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656415
debug_vote_log|2019-03-19 22:00:13|10.85.55.62|10.73.14.110|6033294916|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656415
debug_vote_log|2019-03-19 22:00:18|172.16.143.158|10.73.14.110|6033294916|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656417
debug_vote_log|2019-03-19 22:00:21|10.22.3.50|10.73.14.110|6033294916|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656419
debug_vote_log|2019-03-19 22:00:24|10.131.235.5|10.73.14.110|6033294916|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656419
debug_vote_log|2019-03-19 22:00:26|10.131.227.167|10.73.14.110|6033294916|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656420
debug_vote_log|2019-03-19 22:00:42|172.16.88.211|10.73.14.110|6978645170|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656420
debug_vote_log|2019-03-19 22:00:43|10.41.21.69|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656420
debug_vote_log|2019-03-19 22:00:44|172.16.190.92|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656422
debug_vote_log|2019-03-19 22:00:44|10.41.20.109|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656424
debug_vote_log|2019-03-19 22:00:44|10.41.21.122|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656425
debug_vote_log|2019-03-19 22:00:45|10.85.55.245|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656427
debug_vote_log|2019-03-19 22:00:46|10.22.3.21|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656432
debug_vote_log|2019-03-19 22:00:46|10.131.234.154|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656434
debug_vote_log|2019-03-19 22:00:47|172.16.36.175|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656436
debug_vote_log|2019-03-19 22:00:48|10.131.238.83|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656438
debug_vote_log|2019-03-19 22:00:48|10.85.48.65|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656438
debug_vote_log|2019-03-19 22:00:49|10.85.48.112|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656442
debug_vote_log|2019-03-19 22:00:50|10.41.21.159|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656446
debug_vote_log|2019-03-19 22:00:50|10.22.1.42|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656447
debug_vote_log|2019-03-19 22:00:51|10.22.3.51|10.73.14.110|2520938221|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656449
debug_vote_log|2019-03-19 22:00:52|10.41.25.167|10.73.14.110|6978645170|page_id: 1745| tab_id: 2000| oid: 2118 | count: 656450

按照票数倒序,票数相同的按照时间升序,并打印出time,oid,和count

cat /tmp/debug_vote_log/20190319.log | grep '2118' | grep '2019-03-19 22:00' | awk -F '|' '{print $2, $8, $9}' | sort -t ' ' -k 6 -rn -k 2
2019-03-19 22:00:52  oid: 2118   count: 656450
2019-03-19 22:00:51  oid: 2118   count: 656449
2019-03-19 22:00:50  oid: 2118   count: 656447
2019-03-19 22:00:50  oid: 2118   count: 656446
2019-03-19 22:00:49  oid: 2118   count: 656442
2019-03-19 22:00:48  oid: 2118   count: 656438
2019-03-19 22:00:48  oid: 2118   count: 656438
2019-03-19 22:00:47  oid: 2118   count: 656436
2019-03-19 22:00:46  oid: 2118   count: 656434
2019-03-19 22:00:46  oid: 2118   count: 656432
2019-03-19 22:00:45  oid: 2118   count: 656427
2019-03-19 22:00:44  oid: 2118   count: 656425
2019-03-19 22:00:44  oid: 2118   count: 656424
2019-03-19 22:00:44  oid: 2118   count: 656422
2019-03-19 22:00:43  oid: 2118   count: 656420
2019-03-19 22:00:42  oid: 2118   count: 656420
2019-03-19 22:00:26  oid: 2118   count: 656420
2019-03-19 22:00:24  oid: 2118   count: 656419
2019-03-19 22:00:21  oid: 2118   count: 656419
2019-03-19 22:00:18  oid: 2118   count: 656417
2019-03-19 22:00:13  oid: 2118   count: 656415
2019-03-19 22:00:02  oid: 2118   count: 656415

关于linux sort命令参数:

-f  :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b  :忽略最前面的空格符部分;
-M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n  :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r  :反向排序;
-u  :就是 uniq ,相同的数据中,仅出现一行代表;
-t  :分隔符,默认是用 [tab] 键来分隔;
-k  :以那个区间 (field) 来进行排序的意思, 数字表示列

完整用法参考《linux sort 多列正排序,倒排序》

漫谈获取客户端真实IP

声明:本文是以Nginx和PHP的交互过程来说明具体问题。

以下分两个部分来探讨

客户端参数是如何传递到服务器应用程序中的

一个完整简易的Http请求Request/Response过程:
服务器接收到客户端Http请求,选择CGI script来处理请求, 通过meta-variable来传递请求数据, 将客户端请求转为一个CGI请求,执行script, 把CGI响应转为客户端响应。
继续阅读

Mac Safari调试工具介绍

浏览器调试工具当然首推chrome, 但是有些偶尔使用一下Safari(比如IPv6热点下Chrome访问不了站点),发现Safari调试页面请求真实“难用“,每次发现都不知道怎么用,捣鼓半天,特意记录下。

说明:
MacOS Version: 10.12.5
Safari Version: 10.1.1
继续阅读