Stay hungry, Stay foolish

0%

背景

  • 使用Spring Cloud Gateway做网关,需要确认网关的上下流连接情况——是否持久连接?
  • RemoveHopByHopHeadersFilter会过滤掉KeepAlive,为什么?
阅读全文 »

凡是使用Spring写WEB项目,都会遇到重复读取requestBody的需求。通过一番搜索,会找到下文或与下文类似的解决方案:

拦截器中,request中getReader()和getInputStream()只能调用一次,构建可重复读取inputStream的request

我最开始用的就是这篇文章里的方法,加上后确实可以重复读取requestBody了。

但是没多久,一个application/x-www-form-urlencoded请求的报错就出现了

HttpMessageNotReadableException: Required request body is missing

阅读全文 »

有个合作方的接口要求是通过form表单(application/x-www-form-urlencoded)的形式提交

1
2
3
4
5
6
@FeignClient(name = "partner", url = "${partner.url}")
public interface PartnerClient {

@RequestMapping(value="/comment/submit", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED)
Map<String,Object> submitComment(@RequestBody CommentSubmitParam param);
}

本以为只要加个相应的ContentType就能解决,没想到还是too young too simple

阅读全文 »

从一个fork开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
switch ($pid = pcntl_fork()){
case -1:
die('fork failed');
break;
case 0:
$n = 3;
$msg = "child pid:".getmypid().PHP_EOL;
break;
default:
$n = 5;
$msg = "parent pid:".getmypid()." child pid is: ".$pid. PHP_EOL;
break;
}
for($i = 0; $i < $n; $i++){
echo $msg;
sleep(1);
}
阅读全文 »

此笔记持续更新中……

路由

Laravel的路由是通过配置文件(app/Http/routes.php)来配置的,相对于根据控制器自动路由这种方式,更加灵活

获取当前控制器和方法

1
2
$currentAction = \Route::currentRouteAction();
list($controller, $method) = explode('@', $currentAction);

分组

1
2
3
4
Route::group(['namespace' => 'User', 'prefix' => 'user'], function(){
Route::get('/center',['uses' => 'IndexController@center'])->name('user/center');
Route::get('/join',['uses' => 'IndexController@join'])->name('user/join');
});
阅读全文 »

array_flip比array_unique的效率要高(简直是吊打),但是前者并不是后者的替代品——前者仅限于整形和字符型这样可以被转换成int的类型。其实这两种类型基本能覆盖我们大部分的使用场景了。
阅读全文 »

Zsh

mac下默认的shell比较弱,直接换成zsh吧,兼容bash、更高效、更好的自动实例、可定制性高……

安装

  • 查看mac下是否支持
1
2
✗ more /etc/shells | grep zsh
/bin/zsh
  • 安装oh-my-zsh
1
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
阅读全文 »

话说windows与其他系统相处说会有那么些不和谐的事——乱码与换行(自行百科),下面实例记录一下解决办法.

Office Excel里的一些数据(直接复制过来):

1
2
3
4
5
6
7
8
9
10
曼谷	3049072	泰国	亚洲
清迈 2941909 泰国 亚洲
普吉岛 2914508 泰国 亚洲
首尔 2479881 韩国 亚洲
东京 2144100 日本 亚洲
新加坡 1803367 新加坡 亚洲
大阪 1513988 日本 亚洲
亚庇 1503552 马来西亚 亚洲
济州岛 1235938 韩国 亚洲
马累 1223937 马尔代夫 亚洲

直接另存为csv文件

在Terminal下打开显示乱码

1
Âü¹È;3049072;Ì©¹ú;ÑÇÖÞ^MÇåÂõ;2941909;Ì©¹ú;ÑÇÖÞ^MÆÕ¼ªµº;2914508;Ì©¹ú;ÑÇÖÞ^MÊ׶û;2479881;º«¹ú;ÑÇÖÞ^M¶«¾©;2144100;ÈÕ±¾;ÑÇÖÞ^MмÓÆÂ;1803367;мÓÆÂ;ÑÇÖÞ^M´óÚæ;1513988;ÈÕ±¾;ÑÇÖÞ^MÑDZÓ;1503552;ÂíÀ´Î÷ÑÇ;ÑÇÖÞ^M¼ÃÖݵº;1235938;º«¹ú;ÑÇÖÞ^MÂíÀÛ;1223937;Âí¶û´ú·ò;ÑÇÖÞ

iconv直接一步搞定乱码

1
iconv -f GB18030 -t UTF8 test.csv > test1.csv

再次打开后乱码的问题没有了

1
曼谷;3049072;泰国;亚洲^M清迈;2941909;泰国;亚洲^M普吉岛;2914508;泰国;亚洲^M首尔;2479881;韩国;亚洲^M东京;2144100;日本;亚洲^M新加坡;1803367;新加坡;亚洲^M大阪;1513988;日本;亚洲^M亚庇;1503552;马来西亚;亚洲^M济州岛;1235938;韩国;亚洲^M马累;1223937;马尔代夫;亚洲

等等,为什么变成一行了?还多了一个^M是什么?原来是换行符导致的

这次用VIM的替换命令吧

1
%s/^M/^M/g

第一个^M的输入是依次按下Ctrl+vCtrl+M,第二个^M的输入是依次按下Ctrl+v换行键,

再看一下:

1
2
3
4
5
6
7
8
9
10
曼谷;3049072;泰国;亚洲
清迈;2941909;泰国;亚洲
普吉岛;2914508;泰国;亚洲
首尔;2479881;韩国;亚洲
东京;2144100;日本;亚洲
新加坡;1803367;新加坡;亚洲
大阪;1513988;日本;亚洲
亚庇;1503552;马来西亚;亚洲
济州岛;1235938;韩国;亚洲
马累;1223937;马尔代夫;亚洲

大功告成!

LXC是什么

LXC is the well known set of tools, templates, library and language bindings. It’s pretty
low level, very flexible and covers just about every containment feature supported by the
upstream kernel ——linuxcontainers.org

LXC是Linux Containers的简称,是一种基于容器操作系统级轻量级的虚拟化技术,相对于其他的虚拟化方案(如VMWare、Xen等硬件抽象级的),LXC的虚拟化开销小的多,能更大程度地利(zha)用(gan)宿主服务器的资源,因此得到许多公司的青睐,笔者当前就职公司就是其中之一

另外,当前比较流行的Docker就是基于LXC(Docker被用来管理LXC环境)

关于本文

本文源于14年年初笔者在部门内做的一次分享——《LXC与虚拟化》,重新整理了一下,发上来充个数,欢迎各位看官留言或邮件交流指点

本文不是一篇介绍LXC如何安装与使用的文章,而是介绍LXC背后的一些东西(rootfs、cgroup、namespace)、这些东西在linux系统中的使用以及LXC中如何实现的

阅读全文 »

简介

Hadoop这个名词的火起让不少人恨不得马上安装好环境小试身手一番,虽然Map/Reduce应用程序并不十分复杂,但是仍然需要一些开发经验并且开发效率不高,Pig就是在这样的一种情况下诞生的,作为Hadoop生态环境比较高的一层,其由Pig Latin和运行Pig Latin程序的环境组成,提供易于编程、自动优化、可扩展等特性以提高开发效率,如:Twitter数据分析的80%以上的代码都是由Pig产生

背景

笔者使用Pig也仅仅数月。以移动APP应用的分析统计为例写下这篇入门级的实例,仅为了对阶段性的工作/学习做一个总结。如果能让刚接触Pig的同学从中受益或者能得到高手的指点,则荣幸之至

开胃菜

先以一个简单的程序来开始吧——统计每天的启动次数

1
2
3
4
5
6
7
8
9
start_log = load 'yidong.event_start' USING org.apache.hcatalog.pig.HCatLoader();
day_start_log = filter start_log by dateline == '$date';

day_start_d = foreach day_start_log generate appid,channel,platform,1 as start_num;
start_g = group day_start_d by (appid,channel,platform);
start_gd = foreach start_g generate FLATTEN(group),SUM(day_start_d.start_num) as start_num;
start_save_d = foreach start_gd generate appid,channel,platform,start_num;

STORE start_save_d INTO '/tmp/start_result' using PigStorage('\t');
阅读全文 »