能帮助写一下索末非椭圆轨道的向心加速度模型的matlab源代码吗?

2.4K81 条评论分享收藏感谢收起v3.jiathis.com/code/images/btn/v1/jiathis2.gif 摘 要: 大学生如何能写出一篇符合要求的毕业论文。早检测论文检测平台文章来源:赞同 232 条评论分享收藏感谢收起3.8K527 条评论分享收藏感谢收起ed.com程序):后来,我开始迷上了QBASIC,它可以画图,这是我感兴趣的原因。另一个不经意的时间,画法几何老师办了一期AutoCAD与C语言辅导班,抱着对C语言的神往,我报名了,并从此不可收拾的喜欢上了C。兴趣是最大的老师,我要是一头骡子,前面挂着胡萝卜,就算背负着再重的货物,我也愿意一往无前。C语言真的是太棒了,可以检测到press any key,还可以settextcolor,甚至还可以initgraph哦~~~我对交互型的东西比较感兴趣,一开始模仿各种书籍上的代码,尝试着实现文本编辑器的一些功能(菜单、编辑、存取、光标),再后来直接跪拜在图形编程,熟悉了鼠标编程、中文编程、定时器编程。能体会到在DOS的窗口里出现鼠标箭头光标的欣喜么??能体会到在DOS的窗口里出现大中华的汉字的欣喜么??能体会到在DOS的窗口里拖曳十字架画图的欣喜么(没错!模仿的AutoCAD,因为我是机械专业嘛)??那个时候,我已经是系计算机编程大赛的一名积极分子,有一次获准用系办公室的一台386(用来打印的)调试程序,当天晚上我直接拉上同学Y,一起编程弄了个通宵。。。1997年接触到面向对象编程,当时给自己定了一个任务,就是把原来实现的那一堆GUI组件,封装成自己的Window、Text、Menu。。。也因此熟悉了OOP和Borland C++:1997年那个暑假应该是我连续上机时间最长的时候,这都归功于Y同学买了一台486的电脑,当时Y同学和C同学一起在学校外面租了个房子(我没出去住哦!!我只是因为和Y关系很铁,所以经常去用他的电脑)。然后大家轮流用电脑,Y用电脑看片,接下来我编程,然后是C同学用电脑玩游戏。注意这个顺序“Y同学——我——C同学”,由于C同学经常排在我后面,所以从不热爱学习的他后来都熟悉了Borland C++的修改状态的标志(好像是个类似于*的符号),一旦那个标志消失了,他就觉得我已经保存了,可以轮到他玩游戏了。。。值得一提的是,我写的那一坨GUI代码,后来委托开电脑房的Y同学给我打印出来了,留着自己欣赏。Y同学当时特意给那一坨加了一页封面,打上了一行标题:FakeWindows!至于被模仿的对象,那自然是DOS下的Windows 3.1了:1998年学习了微机原理,写了一些汇编,现在都忘光了~~~然后毕业设计用到了foxpro,然后外调我的C程序:1999年,已经上了研究生,开始用上了vc5.0,后来一直用vc以及mfc很多年:2000 开始接触web编程,开始是写html,后来关注一些动态的技术,除了vbscript和flash,后来我发现了asp以及interdev。为了快速掌握asp,我为自己又定了一个任务,为大学班级做了一个同学录,甚至还做了一个聊天室。那时候有很多免费的服务器空间,但是也不稳定,好好的没准哪天就不提供服务了。后来我直接将同学通讯录放在大学母校的服务器上,一直放了好多年~~~2001年参加工作,开始接触到java和jsp,那个时候没有成形的MVC框架,所以很多类似框架的东东都是自己撸:那个时候javascript控件很少,一般自己撸个树形控件,就很开心了,然后各个项目里都抢着用,满足感倍增!刚参加工作的那几年确实很开心,没事就逛逛水木BBS、一塌糊涂、CSDN。在水木上也找到一些好码友和mm ^_^期间帮好友们做过同乡会网站、蛋糕网站、电子元器件网站、采编发网站,ASP/JSP哪个顺手用哪个!2002年女朋友毕业了,我正式结束了一个人撸代码的时代,每个周末年轻的我们总是流窜在各大购物商场和小商品市场。。。GF负责挑东西买东西,我负责提包陪逛,那个时候的我,我常常说是“行尸走肉”,因为我脑子里经常在想着那堆代码、那些网页、新的idea。。。等晚上一回到我们的那个温馨小家,我马上继续将白天脑子里面的东西序列化成代码。。。2005年左右,发现java也有IDE了!!!中间的5年,以做项目为主。基本是Java Web包打天下,自己撸过MVC、DBCP、ORM以及RPC框架,但都不怎么深入,让小伙伴们顺利用上、少投诉就OK了。后来知道了Spring、jQuery、apache等开源项目,就基本上把那堆轮子扔掉了。。。2014年搞spark转道scala:我想申明的是,我是一个感性的程序员,因此总是难免有点念旧,经常想起DOS时代的:杀毒我们用KV:更多的是这个:依稀记得UCDOS:老求的WPS(我不会告诉你我知道万能密码是^QIUBOJUN)当然还有《仙剑》:C&C:同志们,我想告诉你们,最初我是在电视机上接着操纵杆玩的,你们信么?真的是哦~~~~以及98年左右的OICQ:嗨!看帖的那位,说你呢!见到上古时期就着粗像素看H照片的前辈,咋能不点赞呢?!++++++++++++++++++++++++++++++++++++++++++++Y同学受邀看到我前面写的,说我就知道讲故事,没提这十几年来是个什么体验。那好吧,我表达一下近二十年编程经历之后的体验,各位看官记得鼓掌(点赞):其一呢,现在总感觉某种编程语言没那么重要了,把功能实现了更重要;编程也没那么重要了,事情做成了更重要。很多小白总是吵着哪门语言好,这个确实很奶义务~~~要改!拿起YACC、Antlr,咱自己发明一门语言好不好?再不济,咱们写个XML编码的语言好不好?总之,感觉兴奋多了,一切就那么回事了~~第二呢,觉得编程本身确确实实给我带来了很大的乐趣(反之,如果你觉得编程很无聊,建议就别干这行了)。我总结了一下,编程为什么会给我带来快乐呢?一在于其创造性,编个程序就像构建一个虚拟世界,有点小孩子搭积木的意思,和写作一样,好玩;二在于回报及时,有个新想法,编个程序就看到结果了,能哄妹子,还能赚钱,这点有点像嗑瓜子,嗑了就吃到了(没人全部嗑完了再一起吃吧?),很开心,所以会停不下来。。。第三呢,觉得自己其实挺笨的。原来觉得自己很聪明,班级里编程我玩得最好,后来发现其实都是自己熬夜刻苦练出经验值来的,和天赋无关。。。坐着那练码,打印出来看着码(自我欣赏),陪老婆逛街还是脑子里练着码,到头来写码也不够快,年纪大了,记性不如从前了,连import都靠IDE自动补齐了,往往越简单的功能写得越慢,当然了,写大程序,可能才有点优势;第四,写码之外的世界更精彩。回顾十几年的生活,自己常以工作为重心,而现在回过头来发现收获最大的、最稳定的却是家庭,是老婆孩子;其次的收获是朋友,来自于一堆不写码的人。朋友们估计也注意到了,我在上面不止一次提到Y同学,每个人一生中都有几个最好的朋友,我大学阶段的挚友是Y同学。在我很多的作品(软件、稿件、图书)中,我都提到了他。他是一个比尔盖茨式的人物,之所以这么说,是因为他酷爱电脑,并且中途辍学,一时传为佳话。不同的是结局,比尔发财了,他没有。当时在班上,我是追求上进的优等生,他是常常缺课挂考的混混,但我们常常在一起讨论理想,包括我不懂的无线电,包括他不懂的C语言,以及比尔和艾伦。大二的时候,来自苏北农村的他花了1万元钱买了台486,这台电脑先后陪伴了我的QBASIC、C和C++,当然也包括西木头的《C & C》和大宇的《仙剑》。杨同学是个爱咬文嚼字的人,也是个多情的人。我们那时候很少想到如何去追女生,但是对《仙剑》的爱情演绎能够评论得头头是道。98年毕业的时候,杨同学一次去南京,给我带回来一本老外写的3D游戏设计,其中讲解了一些3D原理以及编程要点,可惜我并没有深入的看下去。这里也给年轻人提个醒,要做热爱生活的人,该找妹子找妹子,该喝酒的喝酒,该耍流氓耍流氓,不要一直泡在实验室。那样会得痔疮的!!!第五条,深深感到计算机科班出身还是很重要的!我不是科班出身的,按专业来说我应该现在是个八级钳工什么的,但我十几年前选择了计算机!编程看起来很容易入门,很容易得到满足,但是很多基础知识前面没学,后面迟早得补上。随着编程的深入,就需要了解到硬盘IO比内存慢的道理,就需要了解SQL解析和执行的流程,就需要了解外部排序的原理,就需要了解分布式协调的理论。你开始越想躲避的,那些知识点就会像怪兽一样越长越大,某一天冷不丁挡在你前面,好吧,咬紧牙关把它干掉再继续吧!先写这么多吧!后面再补~~~快十点了,脑子开始犯困了。。。++++++++++++++++++++++++++++++++大学同学看到我的帖子,说你怎么忘了写当时写稿子的事?是啊,我怎么能忘记了写稿子的事?再重申一遍了,我是感性的程序员,因此我喜欢舞文弄墨,写了二十年的码,也差不多写了二十多年的文字,以下也带着各位看官回忆回忆^_^(赞呢?)上个世纪末,写作的出处主要就是《电脑爱好者》了。第一篇是关于DOS中断的东东,发表于97年,网上居然还能找到PDF:后来连载多期的是98年的《汉字的处理技术》,那会大家正在闹毕业,大家有的钱都花光了,就我很富裕,一期稿费800元,4期拿到了3200元,然后经常拉着几个要好的哥们搓馆子,还借出去了1000元钱。。。后来一发不可收拾,将掌握的鼠标处理技术转换成了人民币(1998年):98年下半年,我开始了研究生阶段,那时候就有了写C++教程的想法,由于那时候普遍都是C语言,因此我的连载系列命名为《轻轻松松C to C++》,注意还是往《电脑爱好者》投的稿(1999年):我也不知道,《电脑爱好者》为何总是将我的文章放在“步步高”这个栏目?是因为我写的东西很有点步步高的意思?呵呵。。。不过,对于学生时代的我,稿费还算是比较地道的!研究生毕业之后,正式进入工作,《电脑爱好者》的Z先生和我成为了QQ好友,后来我又写了几篇稿子,大抵是关于VC++ GUI方面的。再后来由于和水木清华BBS的几个网友一起办了网站,我就直接把那些文章又发表成网上教程,在网上流传了一段时间。上次我在百度里搜索,发现还有一些网页尸体留存在那里的:恩,再靠后,就是和小编接上头了,开始写书。自己的编程水平其实也不高,但按捺不住要表达自己思想的冲动。最后写的东西里面,除了一些代码,经验杂谈的也很多。。。2007年写了《标准C++开发入门与编程实践》,大抵是觉得网上用VC6.0的程序员太多了,他们整天拿着一些过时的语法折腾来折腾去,对boost、STL却毫不知情,实在是被老教材害得够惨。。。翻开蜥蜴的封面,里面还是能找到我感性的文字的:2009年结合VC,写了本《把脉VC++》,初衷也很简单,就是觉得一堆VC程序员看了一本又一本的编程秘籍,却依然不懂怎么开始一个项目。。。在这本书里,感性的我索性先给出了一张VC编程地图:以上两本书的发行量很小,因此早就没有库存了,也因此证明我发这篇帖子更多的是情怀驱动(感性码农嘛)而非推销驱动!请那些自认为自己的书写得很好的、髙谭浩强一个世纪的牛人(这样的人,据我所知,知乎上还是有的)保持风度,不喜勿喷!最后show一下20年程序员的书架的一角:当然,现在更多的书架被育儿经占领了~~~~最后比较遗憾的是,Java Web从2001年一直做到现在,却一直没能写出一本有意思的书来,也许和自己的脑子也不够灵光了有关吧~~~~下一本是啥题材的?大数据方面的?我不知道。同学。。。点赞?赞同 2.2K181 条评论分享收藏感谢收起TP312MA/SXM
TP312MA/SXM
TP312MA/SXM
TP312MA/SXM
TP312MA/SXM
相关链接:&figure&&img src=&https://pic4.zhimg.com/v2-67fd555c2b3e8ae5b1f54ba_b.jpg& data-rawwidth=&686& data-rawheight=&398& class=&origin_image zh-lightbox-thumb& width=&686& data-original=&https://pic4.zhimg.com/v2-67fd555c2b3e8ae5b1f54ba_r.jpg&&&/figure&&blockquote&小编语:本文曾发布于&a href=&http://link.zhihu.com/?target=https%3A//jaq.alibaba.com/community/art/show%3Farticleid%3D315& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里聚安全博客&/a&当中,是一篇非常详细、完整的linux堆管理介绍文章,适合linux初学者。因此发布到知乎的专栏里,希望能给喜欢linux的小伙伴们带来一点帮助。&/blockquote&&h2&&strong&0、前言&/strong&&/h2&&p&近年来,漏洞挖掘越来越火,各种漏洞挖掘、利用的分析文章层出不穷。从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种。国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了。鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点。因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸如基本堆溢出漏洞、基于unlink的堆溢出漏洞利用、double free、use-after-free等等常见的堆溢出漏洞利用技术。&/p&&blockquote&&p&前段时间偶然学习了这篇文章:&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//sploitfun.wordpress.com//understanding-glibc-malloc/comment-page-1/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Understanding glibc malloc&/a&&/p&&/blockquote&&p&该文是我近段时间以来读到的最好文章之一,文章浅显易懂,条例清晰,作为初学者的我从中学到了很多linux堆内存管理相关的知识。但是估计由于篇幅的限制,该文对很多难点一带而过,造成部分知识点理解上的困难。因此我决定以该文为蓝本,结合其他参考资料和自己的理解,写一篇足够详细、完整的linux堆管理介绍文章,希冀能够给其他初学者献上微末之力。&/p&&p&所以就内容来源而言,本文主要由两部分组成:一部分是翻译的上面提及的文章;另一部分是笔者结合其他参考资料和自己的理解添加的补充说明。鉴于笔者知识能力上的不足,如有问题欢迎各位大牛斧正!&/p&&p&同样的,鉴于篇幅过长,我将文章分成了上下两部分,上部分主要介绍堆内存管理中的一些基本概念以及相互关系,同时也着重介绍了堆中chunk分配和释放策略中使用到的隐式链表技术。后半部分主要介绍glibc malloc为了提高堆内存分配和释放的效率,引入的显示链表技术,即binlist的概念和核心原理。&/p&&blockquote&&p&其中使用到的源码在:&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//github.com/sploitfun/lsploits/tree/master/glibc& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&sploitfun/lsploits&/a&&/p&&/blockquote&&h2&&strong&1、堆内存管理简介&/strong&&/h2&&blockquote&&p&当前针对各大平台主要有如下几种堆内存管理机制:&/p&&p&dlmalloc – General purpose allocator&/p&&p&&strong&ptmalloc2 – glibc&/strong&&/p&&p&jemalloc – FreeBSD and Firefox&/p&&p&tcmalloc – Google&/p&&p&libumem – Solaris&/p&&/blockquote&&p&本文主要学习介绍在linux glibc使用的ptmalloc2实现原理。&/p&&p&本来linux默认的是dlmalloc,但是由于其不支持多线程堆管理,所以后来被支持多线程的prmalloc2代替了。&/p&&p&当然在linux平台*malloc本质上都是通过系统调用brk或者mmap实现的。&/p&&blockquote&&p&关于这部分内容,&strong&一定要学习&/strong&这篇文章:&/p&&a href=&http://link.zhihu.com/?target=https%3A//sploitfun.wordpress.com//syscalls-used-by-malloc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Syscalls used by malloc.&/a&&/blockquote&&p&鉴于篇幅,本文就不加以详细说明了,只是为了方便后面对堆内存管理的理解,截取其中函数调用关系图:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-d96a944def3c44b25329e_b.png& data-rawwidth=&700& data-rawheight=&322& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic3.zhimg.com/v2-d96a944def3c44b25329e_r.jpg&&&/figure&&p&图1-1 函数调用关系图&/p&&br&&p&系统内存分布图:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-114e8ea34b150dc28a870_b.png& data-rawwidth=&700& data-rawheight=&611& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic1.zhimg.com/v2-114e8ea34b150dc28a870_r.jpg&&&/figure&&p&图1-2系统内存分布图&/p&&h2&&strong&2、&/strong&&strong&实验演示&/strong&&/h2&&p&试想有如下代码:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&/* Per thread arena example. */
#include &stdio.h&
#include &stdlib.h&
#include &pthread.h&
#include &unistd.h&
#include &sys/types.h&
void* threadFunc(void* arg) {
printf(&Before malloc in thread 1\n&);
getchar();
char* addr = (char*) malloc(1000);
printf(&After malloc and before free in thread 1\n&);
getchar();
free(addr);
printf(&After free in thread 1\n&);
getchar();
int main() {
pthread_t t1;
printf(&Welcome to per thread arena example::%d\n&,getpid());
printf(&Before malloc in main thread\n&);
getchar();
addr = (char*) malloc(1000);
printf(&After malloc and before free in main thread\n&);
getchar();
free(addr);
printf(&After free in main thread\n&);
getchar();
ret = pthread_create(&t1, NULL, threadFunc, NULL);
printf(&Thread creation error\n&);
return -1;
ret = pthread_join(t1, &s);
printf(&Thread join error\n&);
return -1;
&/code&&/pre&&/div&&p&下面我们依次分析其各个阶段的堆内存分布状况。&/p&&p&&strong&1. &/strong&&strong&Before malloc in main thread&/strong&&strong&:&/strong&&/p&&p&在程序调用malloc之前程序进程中是没有heap segment的,并且在创建在创建线程前,也是没有线程堆栈的。&/p&&p&&strong&2. &/strong&&strong&After malloc in main thread&/strong&&strong&:&/strong&&/p&&p&在主线程中调用malloc之后,就会发现系统给程序分配了堆栈,且这个堆栈刚好在数据段之上:&/p&&br&&figure&&img src=&https://pic2.zhimg.com/v2-bc4f386bb09_b.png& data-rawwidth=&700& data-rawheight=&227& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic2.zhimg.com/v2-bc4f386bb09_r.jpg&&&/figure&&p&这就说明它是通过brk系统调用实现的。并且,还可以看出虽然我们只申请了1000字节的数据,但是系统却分配了132KB大小的堆,这是为什么呢?原来这132KB的堆空间叫做arena,此时因为是主线程分配的,所以叫做main arena(每个arena中含有多个chunk,这些chunk以链表的形式加以组织)。由于132KB比1000字节大很多,所以主线程后续再声请堆空间的话,就会先从这132KB的剩余部分中申请,直到用完或不够用的时候,再通过增加program break location的方式来增加main arena的大小。同理,当main arena中有过多空闲内存的时候,也会通过减小program break location的方式来缩小main arena的大小。&/p&&br&&p&&strong&3. &/strong&&strong&After free in main thread&/strong&&strong&:&/strong&&/p&&p&在主线程调用free之后:从内存布局可以看出程序的堆空间并没有被释放掉,原来调用free函数释放已经分配了的空间并非直接“返还”给系统,而是由glibc 的malloc库函数加以管理。它会将释放的chunk添加到main arenas的bin(这是一种用于存储同类型free chunk的双链表数据结构,后问会加以详细介绍)中。在这里,记录空闲空间的freelist数据结构称之为bins。之后当用户再次调用malloc申请堆空间的时候,glibc malloc会先尝试从bins中找到一个满足要求的chunk,如果没有才会向操作系统申请新的堆空间。如下图所示:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-bf8bc0b7500dff5c0bb7_b.png& data-rawwidth=&700& data-rawheight=&261& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic4.zhimg.com/v2-bf8bc0b7500dff5c0bb7_r.jpg&&&/figure&&p&&strong&4. &/strong&&strong&Before malloc in thread1&/strong&&strong&:&/strong&&/p&&p&在thread1调用malloc之前:从输出结果可以看出thread1中并没有heap segment,但是此时thread1自己的栈空间已经分配完毕了:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b16ccca0d3463bed752c_b.png& data-rawwidth=&700& data-rawheight=&321& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic1.zhimg.com/v2-b16ccca0d3463bed752c_r.jpg&&&/figure&&p&&strong&5. &/strong&&strong&After malloc in thread1&/strong&&strong&:&/strong&&/p&&p&在thread1调用malloc之后:从输出结果可以看出thread1的heap segment已经分配完毕了,同时从这个区域的起始地址可以看出,它并不是通过brk分配的,而是通过mmap分配,因为它的区域为b00000共1MB,并不是同程序的data segment相邻。同时,我们还能看出在这1MB中,根据内存属性分为了2部分:0xbxb2KB大小的空间是可读可写属性;后面的是不可读写属性。原来,这里只有可读写的132KB空间才是thread1的堆空间,即thread1 arena。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-4fdb53e5f8b4_b.png& data-rawwidth=&700& data-rawheight=&219& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic1.zhimg.com/v2-4fdb53e5f8b4_r.jpg&&&/figure&&p&&b&6. 在thread1调用free之后:同main thread。&/b&&/p&&br&&h2&&strong&3、Arena&/strong&&strong&介绍&/strong&&/h2&&p&&strong&3.1 Arena&/strong&&strong&数量限制&/strong&&/p&&br&&p&在第2章中我们提到main thread和thread1有自己独立的arena,那么是不是无论有多少个线程,每个线程都有自己独立的arena呢?答案是否定的。事实上,arena的个数是跟系统中处理器核心个数相关的,如下表所示:&/p&&br&&h3&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&For 32 bit systems:
Number of arena = 2 * number of cores + 1.
For 64 bit systems:
Number of arena = 8 * number of cores + 1.
&/code&&/pre&&/div&&/h3&&p&&strong&3.2 &/strong&&strong&多&/strong&&strong&Arena&/strong&&strong&的管理&/strong&&/p&&br&&p&假设有如下情境:一台只含有一个处理器核心的PC机安装有32位操作系统,其上运行了一个多线程应用程序,共含有4个线程——主线程和三个用户线程。显然线程个数大于系统能维护的最大arena个数(2*核心数 + 1= 3),那么此时glibc malloc就需要确保这4个线程能够正确地共享这3个arena,那么它是如何实现的呢?&/p&&br&&p&当主线程首次调用malloc的时候,glibc malloc会直接为它分配一个main arena,而不需要任何附加条件。&/p&&br&&p&当用户线程1和用户线程2首次调用malloc的时候,glibc malloc会分别为每个用户线程创建一个新的thread arena。此时,各个线程与arena是一一对应的。但是,当用户线程3调用malloc的时候,就出现问题了。因为此时glibc malloc能维护的arena个数已经达到上限,无法再为线程3分配新的arena了,那么就需要重复使用已经分配好的3个arena中的一个(main arena, arena 1或者arena 2)。那么该选择哪个arena进行重复利用呢?&/p&&br&&p&1)首先,glibc malloc循环遍历所有可用的arenas,在遍历的过程中,它会尝试lock该arena。如果成功lock(该arena当前对应的线程并未使用堆内存则表示可lock),比如将main arena成功lock住,那么就将main arena返回给用户,即表示该arena被线程3共享使用。&/p&&br&&p&2)而如果没能找到可用的arena,那么就将线程3的malloc操作阻塞,直到有可用的arena为止。&/p&&br&&p&3)现在,如果线程3再次调用malloc的话,glibc malloc就会先尝试使用最近访问的arena(此时为main arena)。如果此时main arena可用的话,就直接使用,否则就将线程3阻塞,直到main arena再次可用为止。&/p&&p&这样线程3与主线程就共享main arena了。至于其他更复杂的情况,以此类推。&/p&&br&&h2&&strong&4、&/strong&&strong&堆管理介绍&/strong&&/h2&&p&&strong&4.1 &/strong&&strong&整体介绍&/strong&&/p&&br&&p&在glibc malloc中针对堆管理,主要涉及到以下3种数据结构:&/p&&br&&p&1. heap_info: 即Heap Header,因为一个&strong&thread arena&/strong&&strong&(注意:不包含&/strong&&strong&main thread&/strong&&strong&)&/strong&可以包含多个heaps,所以为了便于管理,就给每个heap分配一个heap header。那么在什么情况下一个thread arena会包含多个heaps呢?在当前heap不够用的时候,malloc会通过系统调用mmap申请新的堆空间,新的堆空间会被添加到当前thread arena中,便于管理。&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&typedef struct _heap_info
mstate ar_ /* Arena for this heap. */
struct _heap_info * /* Previous heap. */
/* Current size in bytes. */
size_t mprotect_ /* Size in bytes that has been mprotected
PROT_READ|PROT_WRITE.
/* Make sure the following data is properly aligned, particularly
that sizeof (heap_info) + 2 * SIZE_SZ is a multiple of
MALLOC_ALIGNMENT. */
char pad[-6 * SIZE_SZ & MALLOC_ALIGN_MASK];
&/code&&/pre&&/div&&p&2. malloc_state: 即Arena Header,每个thread只含有一个Arena Header。Arena Header包含bins的信息、top chunk以及最后一个remainder chunk等(这些概念会在后文详细介绍):&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&struct malloc_state
/* Serialize access.
/* Flags (formerly in max_fast).
/* Fastbins */
mfastbinptr fastbinsY[NFASTBINS];
/* Base of the topmost chunk -- not otherwise kept in a bin */
/* The remainder from the most recent split of a small request */
mchunkptr last_
/* Normal bins packed as described above */
mchunkptr bins[NBINS * 2 - 2];
/* Bitmap of bins */
unsigned int binmap[BINMAPSIZE];
/* Linked list */
struct malloc_state *
/* Linked list for free arenas.
struct malloc_state *next_
/* Memory allocated from the system in this arena.
INTERNAL_SIZE_T system_
INTERNAL_SIZE_T max_system_
&/code&&/pre&&/div&&p&3. malloc_chunk: 即Chunk Header,一个heap被分为多个chunk,至于每个chunk的大小,这是根据用户的请求决定的,也就是说用户调用malloc(size)传递的size参数“就是”chunk的大小(这里给“就是”加上引号,说明这种表示并不准确,但是为了方便理解就暂时这么描述了,详细说明见后文)。每个chunk都由一个结构体malloc_chunk表示:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&struct malloc_chunk {
/* #define INTERNAL_SIZE_T size_t */
INTERNAL_SIZE_T
/* Size of previous chunk (if free).
INTERNAL_SIZE_T
/* Size in bytes, including overhead. */
struct malloc_chunk*
/* double links -- used only if free. 这两个指针只在free chunk中存在*/
struct malloc_chunk*
/* Only used for large blocks: pointer to next larger size.
struct malloc_chunk* fd_ /* double links -- used only if free. */
struct malloc_chunk* bk_
&/code&&/pre&&/div&&p&可能有很多读者会疑惑:该结构体里面并没有一个类似于data的字段来表示用户申请到的堆内存空间啊?且该结构体明确含有2个size_t类型的成员,4个指针,这不就意味着malloc_chunk的大小是固定的了么?那它又如何能够根据用户的请求分配不同大小的内存呢?要想回答清楚这个问题,需要我们完全理解整个glibc malloc的堆内存管理机制,同时,本文的主要目的之一就是希冀解释清楚这个概念,鉴于这部分内容较多,我将在后文的第5章加以详细介绍。&/p&&br&&p&&b&NOTE:&/b&&/p&&p&1.Main thread不含有多个heaps所以也就不含有heap_info结构体。当需要更多堆空间的时候,就通过扩展sbrk的heap segment来获取更多的空间,直到它碰到内存mapping区域为止。&/p&&p&2.不同于thread arena,main arena的arena header并不是sbrk heap segment的一部分,而是一个全局变量!因此它属于libc.so的data segment。&/p&&br&&p&&strong&4.2 heap segment&/strong&&strong&与&/strong&&strong&arena&/strong&&strong&关系&/strong&&/p&&p&首先,通过内存分布图理清malloc_state与heap_info之间的组织关系。&/p&&p&下图是只有一个heap segment的main arena和thread arena的内存分布图:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cdc4b19aeb0c5bd01dd3b_b.png& data-rawwidth=&700& data-rawheight=&483& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic4.zhimg.com/v2-cdc4b19aeb0c5bd01dd3b_r.jpg&&&/figure&&p&图4-1 只含一个heap segment的main arena与thread arena图&/p&&br&&p&下图是一个thread arena中含有多个heap segments的情况:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d1ef4fde91_b.png& data-rawwidth=&700& data-rawheight=&608& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic2.zhimg.com/v2-d1ef4fde91_r.jpg&&&/figure&&p&图4-2 一个thread arena含有多个heap segments的内存分布图&/p&&p&从上图可以看出,thread arena只含有一个malloc_state(即arena header),却有两个heap_info(即heap header)。由于两个heap segments是通过mmap分配的内存,两者在内存布局上并不相邻而是分属于不同的内存区间,所以为了便于管理,libc malloc将第二个heap_info结构体的prev成员指向了第一个heap_info结构体的起始位置(即ar_ptr成员),而第一个heap_info结构体的ar_ptr成员指向了malloc_state,这样就构成了一个单链表,方便后续管理。&/p&&br&&h2&&strong&5、&/strong&&strong&对&/strong&&strong&chunk&/strong&&strong&的理解&/strong&&/h2&&p&在glibc malloc中将整个堆内存空间分成了连续的、大小不一的chunk,即对于堆内存管理而言chunk就是最小操作单位。Chunk总共分为4类:1) 2) 3) 4)Last remainder chunk。从本质上来说,所有类型的chunk都是内存中一块连续的区域,只是通过该区域中&strong&特定位置的某些标识符&/strong&加以区分。为了简便,我们先将这4类chunk简化为2类:allocated chunk以及free chunk,前者表示已经分配给用户使用的chunk,后者表示未使用的chunk。&/p&&br&&p&众所周知,无论是何种堆内存管理器,其完成的核心目的都是能够高效地分配和回收内存块(chunk)。因此,它需要设计好相关算法以及相应的数据结构,而数据结构往往是根据算法的需要加以改变的。既然是算法,那么算法肯定有一个优化改进的过程,所以本文将根据堆内存管理器的演变历程,逐步介绍在glibc malloc中chunk这种数据结构是如何设计出来的,以及这样设计的优缺点。&/p&&br&&p&PS:鉴于时间和精力有限,后文介绍的演变历程并没有加以严格考证,笔者只是按照一些参考书籍、自己的理解以及便于文章内容安排做出的“善意的捏造”,如有错误,欢迎大家斧正!&/p&&p&&strong&5.1 &/strong&&strong&隐式链表技术&/strong&&/p&&p&前文说过,任何堆内存管理器都是以chunk为单位进行堆内存管理的,而这就需要一些数据结构来标志各个块的边界,以及区分已分配块和空闲块。大多数堆内存管理器都将这些边界信息作为chunk的一部分嵌入到chunk内部,典型的设计如下所示:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-7ebf28e38bcc9_b.png& data-rawwidth=&741& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic2.zhimg.com/v2-7ebf28e38bcc9_r.jpg&&&/figure&&br&&p&图5-1 简单的allocated chunk格式&/p&&figure&&img src=&https://pic4.zhimg.com/v2-f092bde6a9adc97d6de3_b.png& data-rawwidth=&515& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&515& data-original=&https://pic4.zhimg.com/v2-f092bde6a9adc97d6de3_r.jpg&&&/figure&&p&图5-2 简单的free chunk格式&/p&&br&&p&堆内存中要求每个chunk的大小必须为8的整数倍,因此chunk size的后3位是无效的,为了充分利用内存,堆管理器将这3个比特位用作chunk的标志位,典型的就是将第0比特位用于标记该chunk是否已经被分配。这样的设计很巧妙,因为我们只要获取了一个指向chunk size的指针,就能知道该chunk的大小,即确定了此chunk的边界,且利用chunk size的第0比特位还能知道该chunk是否已经分配,这样就成功地将各个chunk区分开来。注意在allocated chunk中padding部分主要是用于地址对齐的(也可用于对付外部碎片),即让整个chunk的大小为8的整数倍。&/p&&br&&p&通过上面的设计,我们就能将整个堆内存组织成一个连续的已分配或未分配chunk序列:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-df2d5bd535e5ac0a900109_b.png& data-rawwidth=&476& data-rawheight=&741& class=&origin_image zh-lightbox-thumb& width=&476& data-original=&https://pic2.zhimg.com/v2-df2d5bd535e5ac0a900109_r.jpg&&&/figure&&p&图5-3 简单的chunk序列&/p&&br&&p&上面的这种结构就叫做隐式链表。该链表隐式地由每个chunk的size字段链接起来,在进行分配操作的时候,堆内存管理器可以通过遍历整个堆内存的chunk,分析每个chunk的size字段,进而找到合适的chunk。&/p&&p&细心的读者可能发现:这种隐式链表效率其实是相当低的,特别是在内存回收方面,它难以进行相邻多个free chunk的合并操作。我们知道,如果只对free chunk进行分割,而不进行合并的话,就会产生大量小的、无法继续使用的内部碎片,直至整个内存消耗殆尽。因此堆内存管理器设计了带边界标记的chunk合并技术。&/p&&br&&p&&strong&1.&/strong&&strong&带边界标记的合并技术&/strong&&/p&&br&&p&试想如下场景:假设我们要释放的chunk为P,它紧邻的前一个chunk为FD,紧邻的后一个chunk为BK,且BK与FD都为free chunk。将P于BK合并在一起是很容易的,因为可以通过P的size字段轻松定位到BK的开始位置,进而获取BK的size等等,但是将P于FD合并却很难,我们必须从头遍历整个堆,找到FD,然后加以合并,这就意味着每次进行chunk释放操作消耗的时间与堆的大小成线性关系。为了解决这个问题,Knuth提出了一种聪明而通用的技术——边界标记。&/p&&br&&p&Knuth在每个chunk的最后添加了一个脚部(Footer),它就是该chunk 头部(header)的一个副本,我们称之为边界标记:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d31eb1dbddd7fd_b.png& data-rawwidth=&741& data-rawheight=&304& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic2.zhimg.com/v2-d31eb1dbddd7fd_r.jpg&&&/figure&&p&图5-4 改进版的chunk格式之Knuth边界标记&/p&&br&&p&显然每个chunk的脚部都在其相邻的下一个chunk的头部的前4个字节处。通过这个脚部,堆内存管理器就可以很容易地得到前一个chunk的起始位置和分配状态,进而加以合并了。&/p&&br&&p&但是,边界标记同时带来了一个问题:它要求每个块都包含一个头部和脚部,如果应用程序频繁地进行小内存的申请和释放操作的话(比如1,2个字节),就会造成很大的性能损耗。同时,考虑到只有在对free chunk进行合并的时候才需要脚部,也就是说对于allocated chunk而言它并不需要脚部,因此我们可以对这个脚部加以优化——将前一个chunk的已分配/空闲标记位存储在当前chunk的size字段的第1,或2比特位上,这样如果我们通过当前chunk的size字段知道了前一个chunk为free chunk,那么就可得出结论:当前chunk地址之前的4个字节为前一个free chunk的脚部,我们可以通过该脚部获取前一个chunk的起始位置;如果当前chunk的size字段的标记位表明前一个chunk是allocated chunk的话,那么就可得出另一个结论:前一个chunk没有脚部,即当前chunk地址之前的4个字节为前一个allocated chunk的payload或padding的最后部分。新的chunk格式图如下:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-0eadd69a889223eafcd866_b.png& data-rawwidth=&741& data-rawheight=&303& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic3.zhimg.com/v2-0eadd69a889223eafcd866_r.jpg&&&/figure&&p&图5-5 改进版的Knuth边界标记allocated chunk格式&/p&&figure&&img src=&https://pic1.zhimg.com/v2-83f58d72c5b960bd77744_b.png& data-rawwidth=&515& data-rawheight=&304& class=&origin_image zh-lightbox-thumb& width=&515& data-original=&https://pic1.zhimg.com/v2-83f58d72c5b960bd77744_r.jpg&&&/figure&&p&图5-6 改进版的Knuth边界标记free chunk格式&/p&&p&&strong&2.&/strong&&strong&再进化&/strong&&strong&——&/strong&&strong&支持多线程&/strong&&/p&&br&&p&随着技术的发展,特别是堆内存管理器添加对多线程的支持,前述的chunk格式已经难以满足需求,比如,我们需要标志位来标记当前chunk是否属于非主线程即thread arena,以及该chunk由mmap得来还是通过brk实现等等。但此时chunk size只剩下一个比特位未使用了,怎么办呢?这需要对chunk格式进行大手术!&/p&&br&&p&首先思考:是否有必要同时保存当前chunk和&strong&前一个&/strong&&strong&chunk&/strong&的已分配/空闲标记位?答案是否定的,因为我们只需要保存前一个chunk的分配标志位就可以了,至于&strong&当前&/strong&&strong&chunk&/strong&的分配标志位,可以通过查询&strong&下一个&/strong&&strong&chunk&/strong&的size字段得到。那么size字段中剩下的两个比特位就可以用于满足多线程的标志需求了:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-9a5a0e9737b5dcb4e14ec4d186d8ddf6_b.png& data-rawwidth=&741& data-rawheight=&303& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic3.zhimg.com/v2-9a5a0e9737b5dcb4e14ec4d186d8ddf6_r.jpg&&&/figure&&p&图5-7 多线程版本Knuth边界标记allocated chunk格式&/p&&figure&&img src=&https://pic1.zhimg.com/v2-59bd19e6dc07a41eab9c_b.png& data-rawwidth=&515& data-rawheight=&304& class=&origin_image zh-lightbox-thumb& width=&515& data-original=&https://pic1.zhimg.com/v2-59bd19e6dc07a41eab9c_r.jpg&&&/figure&&p&图5-8 多线程版本Knuth边界标记free chunk格式&/p&&br&&p&这里的P,M,N的含义如下:&/p&&blockquote&&p&PREV_INUSE(P): 表示前一个chunk是否为allocated。&/p&&p&IS_MMAPPED(M):表示当前chunk是否是通过mmap系统调用产生的。&/p&&p&NON_MAIN_ARENA(N):表示当前chunk是否是thread arena。&/p&&/blockquote&&p&再进一步,发现没必要保存chunk size的副本,也就是说Footer的作用并不大,但是如果前一个chunk是free的话,在合并的时候我们又需要知道前一个chunk的大小,怎么办呢?将Footer从尾部移到首部,同时其不再保存当前chunk的size,而是前一个free chunk的size不就行了。同样的,为了提高内存利用率,如果前一个chunk是allocated chunk的话,这个Footer就作为allocated chunk的payload或padding的一部分,结构图如下:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-42f98a954d6dbfe60b55_b.png& data-rawwidth=&741& data-rawheight=&308& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic2.zhimg.com/v2-42f98a954d6dbfe60b55_r.jpg&&&/figure&&br&&p&图5-9 当前glibc malloc allocated chunk格式&/p&&figure&&img src=&https://pic1.zhimg.com/v2-9dcc9c637c66baed11d568_b.png& data-rawwidth=&515& data-rawheight=&409& class=&origin_image zh-lightbox-thumb& width=&515& data-original=&https://pic1.zhimg.com/v2-9dcc9c637c66baed11d568_r.jpg&&&/figure&&br&&p&图5-10 当前glibc malloc free chunk格式&/p&&br&&p&至此,glibc malloc堆内存管理器中使用的隐式链表技术就介绍完毕了。现在我们再回过头去看malloc_chunk结构体就很好理解了:该结构体通过每个chunk的prev_size和size构成了隐式链表,而后续的fd, bk等指针并不是作用于隐式链表的,而是用于后文会介绍的用于加快内存分配和释放效率的显示链表bin(还记得bin么?用于记录同一类型free chunk的链表),并且这些指针跟prev_size一样只在free chunk中存在。关于显示链表bin的原理比较复杂,让我们带着疑惑,暂时略过这部分信息,等介绍完所有chunk之后再加以详细介绍。&/p&&p&&strong&5.2 Top Chunk&/strong&&/p&&p&当一个chunk处于一个arena的最顶部(即最高内存地址处)的时候,就称之为top chunk。该chunk并&strong&不属于任何&/strong&&strong&bin&/strong&,而是在系统当前的所有free chunk(无论那种bin)都无法满足用户请求的内存大小的时候,将此chunk当做一个应急消防员,分配给用户使用。如果top chunk的大小比用户请求的大小要大的话,就将该top chunk分作两部分:1)用户请求的chunk;2)剩余的部分成为新的top chunk。否则,就需要扩展heap或分配新的heap了——在main arena中通过sbrk扩展heap,而在thread arena中通过mmap分配新的heap。&/p&&p&&strong&5.3 Last Remainder Chunk&/strong&&/p&&p&要想理解此chunk就必须先理解glibc malloc中的bin机制。如果你已经看了第二部分文章,那么下面的原理就很好理解了,否则建议你先阅读第二部分文章。对于Last remainder chunk,我们主要有两个问题:1)它是怎么产生的;2)它的作用是什么?&/p&&br&&p&先回答第一个问题。还记得第二部分文章中对small bin的malloc机制的介绍么?当用户请求的是一个small chunk,且该请求无法被small bin、unsorted bin满足的时候,就通过binmaps遍历bin查找最合适的chunk,如果该chunk有剩余部分的话,就将该剩余部分变成一个新的chunk加入到unsorted bin中,另外,&strong&再将该新的&/strong&&strong&chunk&/strong&&strong&变成新的&/strong&&strong&last remainder chunk&/strong&。&/p&&br&&p&然后回答第二个问题。此类型的chunk用于提高连续malloc(small chunk)的效率,主要是提高内存分配的局部性。那么具体是怎么提高局部性的呢?举例说明。当用户请求一个small chunk,且该请求无法被small bin满足,那么就转而交由unsorted bin处理。同时,假设当前unsorted bin中只有一个chunk的话——就是last remainder chunk,那么就将该chunk分成两部分:前者分配给用户,剩下的部分放到unsorted bin中,并成为新的last remainder chunk。这样就保证了连续malloc(small chunk)中,各个small chunk在内存分布中是相邻的,即提高了内存分配的局部性。&/p&&p&&strong&作者:走位@阿里聚安全,更多阿里的安全技术文章,请持续关注阿里聚安全的安全专栏,或访问&a href=&http://link.zhihu.com/?target=https%3A//jaq.alibaba.com/community/index& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里聚安全博客&/a&&/strong&&/p&
小编语:本文曾发布于当中,是一篇非常详细、完整的linux堆管理介绍文章,适合linux初学者。因此发布到知乎的专栏里,希望能给喜欢linux的小伙伴们带来一点帮助。0、前言近年来,漏洞挖掘越来越火,各种漏洞挖掘、利用的分析文章层出不穷。从…
&figure&&img src=&https://pic4.zhimg.com/v2-82dc98b65_b.jpg& data-rawwidth=&573& data-rawheight=&259& class=&origin_image zh-lightbox-thumb& width=&573& data-original=&https://pic4.zhimg.com/v2-82dc98b65_r.jpg&&&/figure&&p&各位直男朋友们:&/p&&p&&br&&/p&&p&你可曾对着镜子中自己的形象抓耳挠腮,感觉哪里不对却不知道从何改起?&/p&&p&&br&&/p&&p&是不是也关注了一堆公众号,结果买了一堆衣服,到头来穿在身上还是一个大写的丑字?&/p&&p&&br&&/p&&p&是不是一听形象改造就头大,到现在还不知道应该穿什么衣服?&/p&&p&&br&&/p&&p&是不是想有一个清单,一口气从头到脚给你讲清楚应该怎么改造形象?&/p&&p&&br&&/p&&p&恭喜你,你今天来对地方了。&/p&&p&&br&&/p&&p&作为一个典型直男,我深刻知道大部分男生的内心活动:我懒,我不想知道那么多原理,我也不想花那么多时间去挑,能不能直接一次性告诉我所有的注意事项,让我一口气全部读完?&/p&&p&&br&&/p&&p&&b&答案是:可以。&/b&&/p&&p&&br&&/p&&p&新年到来,就在年初,我们一口气给你讲清楚关于男士形象改造的所有注意事项,让你一篇文章读懂所有知识点。&/p&&p&&br&&/p&&p&&b&而且,里面提到的产品,不分年龄,不分体型,不分职业,都能拿上就用!&/b&&/p&&p&&br&&/p&&p&欢迎来到保姆级别的形象改造指南,如果你这辈子只打算看一篇指南,那么看这篇,就够了。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&【护肤篇】&/b&&/p&&p&对于大部分男生来说,能够把一张脸洗干净我就已经谢天谢地了,别再告诉我你的洁面和护肤就是香皂配大宝了。&/p&&p&&br&&/p&&p&有人说我懂!洗脸要洗的干净,我每天都用那种控油的洗面奶可劲的涂,洗完之后感觉整张脸就冰凉,那叫一个爽!&/p&&p&&br&&/p&&p&……怪不得说直男的钱好骗,大部分直男评判一种护肤品又没有用都看“凉不凉”。&/p&&p&&br&&/p&&p&那种主打“高效控油”的洗面奶,90%以上都是皂基洗面奶,至于这是什么玩意儿你不用知道,你只需要知道:&b&它们效果强,但是伤皮肤。&/b&&/p&&p&&br&&/p&&p&所以如何洗的干净还对皮肤好呢?记住——&b&&u&用氨基酸洗面奶,温和清洁不刺激。&/u&&/b&&/p&&p&&br&&/p&&p&在这里给大家安利两种洗面奶,是无数小白的入坑品,便宜大碗又好用:&/p&&p&&br&&/p&&p&&b&1.旁氏米粹洗面奶【单品价格:20~30RMB】&/b&&/p&&figure&&img data-rawheight=&289& src=&https://pic1.zhimg.com/v2-8cfbdbfd906f4e9a63a2_b.jpg& data-size=&normal& data-rawwidth=&289& class=&content_image& width=&289&&&/figure&&p&&br&&/p&&p&&b&2.芙丽芳丝(freeplus)【单品价格:代购100RMB 旗舰店130RMB】&/b&&/p&&figure&&img data-rawheight=&352& src=&https://pic3.zhimg.com/v2-dac6b77d7cb1e63fe00c_b.jpg& data-size=&normal& data-rawwidth=&352& class=&content_image& width=&352&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&Ok,现在你已经把脸洗干净了,接下来我们要上爽肤水。爽肤水的作用是给皮肤保湿控油,让你减少起痘痘的风险。&/p&&p&&br&&/p&&p&对于不是特别干燥地区的男生,能做到用洗面奶洗脸,还涂爽肤水已经是及格甚至是良好了,至于精华面霜还有精油面膜之类的,留着以后用你们未来女朋友剩下的吧(微笑脸)&/p&&p&&br&&/p&&p&爽肤水推荐各位直男选用控油或者补水的品种,想要肤质气色好,无非也就注重三点:&b&&u&控油、保湿、防晒。&/u&&/b&能做完这三步的人,已经秒杀了百分之九十以上的直男。&/p&&p&&br&&/p&&p&老规矩,上推荐,依然白菜价:&/p&&p&&br&&/p&&p&&b&1.&/b& &b&理肤泉清痘净肤爽肤水【单品价格:代购130~150RMB 旗舰店180~220RMB】&/b&&/p&&p&特别清爽控油的一瓶爽肤水,不过用完之后脸上会感到略干,脸上经常容易出油和长痘的 男生一定要考虑入一瓶。&/p&&figure&&img data-rawheight=&380& src=&https://pic2.zhimg.com/v2-f23bb9aad0ef1a361b8fc21406fed662_b.jpg& data-size=&normal& data-rawwidth=&380& class=&content_image& width=&380&&&/figure&&p&&br&&/p&&p&&b&2.&/b& &b&宝拉平衡水【单品价格:代购130~150RMB 旗舰店230~250RMB】&/b&&/p&&p&因为含有烟酰胺成分(&b&&u&这个你依然不需要知道是什么,只需要知道有的人可能用上过敏就够了&/u&&/b&)可以有效的控油,美白和稳定皮肤状况,而且和理肤泉差不多的价位,也是无数新手最喜欢的一款爽肤水。&/p&&figure&&img data-rawheight=&357& src=&https://pic1.zhimg.com/v2-63abd960d0ac4d2a39178_b.jpg& data-size=&normal& data-rawwidth=&357& class=&content_image& width=&357&&&/figure&&p&&br&&/p&&p&对于乳液,其实并没有什么好多说的,因为大部分直男第一次涂乳液时都会有些抗拒——这玩意儿滑滑的还有点黏,不舒服。&/p&&p&&br&&/p&&p&&b&&u&但实际上,在干燥的秋冬季节,你需要一瓶乳液来做到基础的保湿,不然你的脸上就会被冻的起皮甚至开裂,要多难看有多难看。&/u&&/b&&/p&&p&&br&&/p&&p&你说买洗面奶和爽肤水已经花了你很多钱,不想再破费了?莫慌,我知道各位直男朋友都不太愿意在这方面花太多钱,所以我们的乳液专门选择了更加便宜好用的品种。&/p&&p&&br&&/p&&p&&b&1.&/b& &b&标婷维生素E乳【单品价格:9~15RMB/瓶】&/b&&/p&&p&这个价格简直便宜到令人发指了好嘛!&/p&&p&但是千万别觉得这么便宜一定是地摊货,国产货里如果非要推一个最良心的品牌,我首推这个。&/p&&p&&b&&u&首先&/u&&/b& &b&&u&,医院配方,质量有保障;其次,在乳液中属于比较轻薄的一种,所以涂抹到脸上并不会有不习惯;最后的最后,这是一款被无数美妆博主安利过的产品,火到北京随便一家药店便利店都在销售,口碑一级棒。&/u&&/b&&/p&&figure&&img data-rawheight=&397& src=&https://pic1.zhimg.com/v2-e245cf81cea6fcd07aa2ea_b.jpg& data-size=&normal& data-rawwidth=&397& class=&content_image& width=&397&&&/figure&&p&&br&&/p&&p&&b&2.&/b& &b&cerave补水保湿乳液【单品价格:95~110RMB】&/b&&/p&&p&你说我是骗子,说好的乳液选择了更加便宜的品牌呢?&/p&&p&同学,别光看价格,你可知道这一瓶有多少吗?355ml!这是什么概念?&/p&&p&&b&&u&一般来说,100ml的乳液可以用半年左右,按照一天两次的用量......所以,这瓶乳液平均摊到每个月,简直便宜的像白送。&/u&&/b&&/p&&p&但是你放心,这绝对不是黑心小作坊的产品,cerave可是著名的美国药妆品牌,说出去比大宝SOD蜜有面儿多了。至于为什么这么便宜......可能人家做慈善吧。(微笑脸)&/p&&figure&&img data-rawheight=&377& src=&https://pic3.zhimg.com/v2-32a7c6f9fe0c0c59ae697_b.jpg& data-size=&normal& data-rawwidth=&377& class=&content_image& width=&377&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&【发型篇】告别小平头,你该试试这些发型&/b&&/p&&p&&br&&/p&&p&相信所有的直男都有过这样一段回忆:小时候被操碎了心的爸妈连哄带骗的抓进理发店,然后耳边传来熟悉的话语:“师傅,平头。”&/p&&p&&br&&/p&&p&有多少直男对于发型的审美,就毁在了童年时一句句“平头”和“板寸”上。&/p&&p&&br&&/p&&p&哪怕你长大了,家里人还会和你絮叨:我觉得男孩子理个小平头最精神。&/p&&p&&br&&/p&&p&别听他们的,你又不是活在六七十年代,现在你有大把的发型供你选择。&/p&&p&&br&&/p&&p&&b&l&/b& &b&拯救懒癌的The quiff&/b&&/p&&p&对于发型种类都说不清楚的直男来说,要求各位知道 自己的脸型,还要根据脸型匹配不同的发型简直难于上青天。&/p&&p&&br&&/p&&p&&b&&u&既然这样,那么你就记住:和理发小哥说你要一个“The Quiff”,绝对不会出错。&/u&&/b&&/p&&figure&&img data-rawheight=&312& src=&https://pic4.zhimg.com/v2-b652898cada9ede0c1bd66d99e07c24d_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic4.zhimg.com/v2-b652898cada9ede0c1bd66d99e07c24d_r.jpg&&&/figure&&p&&br&&/p&&p&The Quiff的好处有二:&/p&&p&&b&1.&/b& &b&整体偏短,梳理后看起来精神干练&/b&&/p&&p&&b&2.&/b& &b&选择多样,方便打理&/b&&/p&&p&&br&&/p&&p&对于无数直男来说,自己的颜值巅峰就是理完发的一瞬间——第二天没有tony老师打理的头发,就像老母鸡刚下完蛋的鸡窝。&/p&&p&&br&&/p&&p&而The Quiff基本不会出现这种问题——&b&&u&无论你是选择烫发还是简单的往起梳,你都只需要照顾最中间的那一部分,连吹带打发泥,总共不到6分钟就能出来效果。&/u&&/b&&/p&&figure&&img data-rawheight=&499& src=&https://pic1.zhimg.com/v2-689df596bf4ee_b.jpg& data-size=&normal& data-rawwidth=&375& class=&content_image& width=&375&&&/figure&&p&&br&&/p&&p&甚至对于很多懒癌深入骨髓的直男,打理The Quiff只需要记住两件事:&b&&u&吹干头发,拿着发泥把头发往后捋。&/u&&/b&&/p&&p&&br&&/p&&p&即使是这样,顶着The Quiff的你依然光彩照人——这才是直男形象改造的真谛:越简单越好。&/p&&figure&&img data-rawheight=&208& src=&https://pic3.zhimg.com/v2-3081b9acd30a1a8af88b7fce_b.jpg& data-size=&normal& data-rawwidth=&459& class=&origin_image zh-lightbox-thumb& width=&459& data-original=&https://pic3.zhimg.com/v2-3081b9acd30a1a8af88b7fce_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&l&/b& &b&成熟男人的标配——油头&/b&&/p&&p&当路易十五的情人Madame de Pompadour向后挽起高耸的秀发时,她根本想不到——几百年后,这种发型居然会成为无数男人的挚爱。&/p&&figure&&img data-rawheight=&266& src=&https://pic3.zhimg.com/v2-cd3d78e287e99dd7bd628f4dc783bb48_b.jpg& data-size=&normal& data-rawwidth=&274& class=&content_image& width=&274&&&/figure&&p&&br&&/p&&p&高耸精致的油头,让前一秒还像个辛辛苦苦敲代码的程序员秒变CEO——梳着油头的雷布斯,就连那句“Are you OK?”都多了几分国际范。&/p&&figure&&img data-rawheight=&364& src=&https://pic4.zhimg.com/v2-46a2fffc_b.jpg& data-size=&normal& data-rawwidth=&533& class=&origin_image zh-lightbox-thumb& width=&533& data-original=&https://pic4.zhimg.com/v2-46a2fffc_r.jpg&&&/figure&&p&&br&&/p&&p&而将无数直男挡在油头门外的,是它严苛的标准——界限分明,每根发丝都要整整齐齐。&/p&&p&&br&&/p&&p&&b&&u&不过你只需要多一件神器,就能5分钟内打理出一款过关的油头——密齿梳。&/u&&/b&&/p&&p&&br&&/p&&p&油头打理步骤如下:&/p&&figure&&img data-rawheight=&1890& src=&https://pic2.zhimg.com/v2-7ad53ed1e772ffa9fde16_b.jpg& data-size=&normal& data-rawwidth=&388& class=&content_image& width=&388&&&/figure&&p&&br&&/p&&p&&b&&u&打湿头发后,用密齿梳将头发梳出分界线和发线,由于密齿梳密集的梳齿,头发很容易呈现出明显整齐的线条。&/u&&/b&&/p&&p&&br&&/p&&p&&b&&u&然后,再用吹风机配合排骨梳吹高头顶吹干发根,打上发油,一个逼格满满的油头就打理完成了。&/u&&/b&&/p&&p&&br&&/p&&p&相信我,此时的你都会爱上那个镜子中的自己。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&【服装篇】这几件衣服,你可以一直穿到80岁&/b&&/p&&p&并不是标题党,因为我们选择衣服的要求是——宁可不出彩,也要不出错,所以我们推荐的衣服都是经过历史检验后的经典款,所以你可以放心的穿,绝对不会有今年烂大街明年土包子的感觉。&/p&&p&&br&&/p&&p&&b&(上装)&/b&&/p&&p&&br&&/p&&p&&b&l&/b& &b&棒球夹克【单品价格:200~500RMB】&/b&&/p&&figure&&img data-rawheight=&332& src=&https://pic2.zhimg.com/v2-0ea5e7d1edfb082c7113_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic2.zhimg.com/v2-0ea5e7d1edfb082c7113_r.jpg&&&/figure&&p&&br&&/p&&p&棒球夹克上宽下窄的设计能够弥补很多人的缺陷——&b&&u&肩膀不够宽阔挺拔&/u&&/b&,而且休闲的风格可以说是百搭。&/p&&p&&br&&/p&&p&无论你是T恤,衬衫,还是线衫,一件运动风的棒球夹克总能为你带来青春和朝气,再配上牛仔裤,任何人都能瞬间变成在巷口对着漂亮姑娘吹口哨的痞帅小子。&/p&&figure&&img data-rawheight=&414& src=&https://pic2.zhimg.com/v2-73dfe5bd27c673f4216c9_b.jpg& data-size=&normal& data-rawwidth=&553& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic2.zhimg.com/v2-73dfe5bd27c673f4216c9_r.jpg&&&/figure&&p&&br&&/p&&p&近些年大火的横须贺的棒球服融入了东方元素,龙虎刺绣的辉映下,让本来是学生装的棒球夹克不经意中透露出一股霸气——&/p&&p&&br&&/p&&p&&b&“看着我背上的下山虎,允许你丫最后再组织一下语言 。”&/b&&/p&&figure&&img data-rawheight=&477& src=&https://pic3.zhimg.com/v2-dc133a5c70e7b79b5e86_b.jpg& data-size=&normal& data-rawwidth=&358& class=&content_image& width=&358&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&l&/b& &b&Blazer(单西)【单品价格:300~1000 RMB】&/b&&/p&&figure&&img data-rawheight=&353& src=&https://pic3.zhimg.com/v2-28af109bad9_b.jpg& data-size=&normal& data-rawwidth=&353& class=&content_image& width=&353&&&/figure&&p&&br&&/p&&p&每个男人的衣柜里,至少要有一件Blazer。&/p&&p&&br&&/p&&p&很多人只知道这是一件基本款的搭配神器,却往往在淘宝搜索时,看着结果一脸懵逼——这tm不是球鞋吗???&/p&&p&&br&&/p&&p&&b&来吧少年,告诉你Blazer更接地气的名字:单西&/b&&/p&&p&&br&&/p&&p&每天上下班时,站在国贸的高楼上,你就会发现一件事:无论你的行业时是财会,券商,房地产,还是银行,从远处看都一样——&/p&&p&&br&&/p&&p&&b&都像一群卖保险的。&/b&&/p&&p&&br&&/p&&p&而一件介于正装和休闲夹克之间的Blazer可以将你完美的突出出来——&b&&u&它既有着正装的精致考究,也有着休闲装的洒脱随意。&/u&&/b&穿上Blazer,坐在工位上你就是能把实习生迷得死去活来的职场精英,坐在酒吧里你就是风花正茂的花花阔少。&/p&&figure&&img data-rawheight=&614& src=&https://pic1.zhimg.com/v2-3dabd35fe8edafef6a5fe_b.jpg& data-size=&normal& data-rawwidth=&461& class=&origin_image zh-lightbox-thumb& width=&461& data-original=&https://pic1.zhimg.com/v2-3dabd35fe8edafef6a5fe_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&l&/b& &b&牛津纺衬衫【单品价格:100~300 RMB】&/b&&/p&&figure&&img data-rawheight=&356& src=&https://pic2.zhimg.com/v2-e32f454ad09eedbf74a3db9_b.jpg& data-size=&normal& data-rawwidth=&527& class=&origin_image zh-lightbox-thumb& width=&527& data-original=&https://pic2.zhimg.com/v2-e32f454ad09eedbf74a3db9_r.jpg&&&/figure&&p&&br&&/p&&p&第一次穿上牛津纺衬衫时,我就被它有质感的面料和休闲的款式深深的震撼——在这之前,我一直是用正装衬衫搭配牛仔裤的傻小子。&/p&&p&&br&&/p&&p&&b&&u&牛津纺衬衫质感比正装衬衫略显粗糙,但恰恰是这种粗糙衬托了男人的硬汉气质,再加上继承的正装血统,休闲中依旧透露出一股正式感和学院气质。&/u&&/b&&/p&&p&&br&&/p&&p&&b&&u&牛津纺衬衫更狠的是——你把它放在哪里都合适:无论是单穿 ,还是外穿,甚至是套在毛衣和卫衣里,都不违和。&/u&&/b&&/p&&figure&&img data-rawheight=&513& src=&https://pic2.zhimg.com/v2-5feb26de6b81a89a43fae7f56df45d94_b.jpg& data-size=&normal& data-rawwidth=&513& class=&origin_image zh-lightbox-thumb& width=&513& data-original=&https://pic2.zhimg.com/v2-5feb26de6b81a89a43fae7f56df45d94_r.jpg&&&/figure&&p&&br&&/p&&p&扔掉你的秋衣吧,牛津纺衬衫才是你真正的归宿。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&l&/b& &b&牛角扣大衣【单品价格:500~1000 RMB】&/b&&/p&&p&为什么要穿羽绒服?为什么要穿羽绒服?为什么要穿羽绒服?&/p&&p&&br&&/p&&p&每次在冬天,看到街上一个个臃肿的身躯,我都要憋住胸口要吐出来的老血。&/p&&p&&br&&/p&&p&论价位,二者相差无几,论保暖程度,一件厚实的大衣也不输羽绒服。&/p&&p&&br&&/p&&p&可是论起来逼格,大衣甩羽绒服好几条大街。大衣,才是身份和地位的象征——你见过有几个高官富商和黑老大冬天裹个羽绒服的?&/p&&p&&br&&/p&&p&但是大衣之间还有考究,有的大衣必须配正装,有的大衣要求身高,有的大衣挑年龄......我们抛弃了一切即使好看但是要废脑子挑选的款式,直接给你最简单粗暴的答案:&/p&&p&&br&&/p&&p&&b&买牛角扣大衣,就对了。&/b&&/p&&figure&&img data-rawheight=&554& src=&https://pic2.zhimg.com/v2-1ed3a7c9a9edcebf3ff805_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic2.zhimg.com/v2-1ed3a7c9a9edcebf3ff805_r.jpg&&&/figure&&p&&br&&/p&&p&牛角扣大衣诞生于阴冷潮湿的英格兰半岛,由粗毛呢布料制成,诞生的一开始就是为了防潮防寒。大衣的扣子由皮绳和牛角纽扣制成,配有超大口袋,方便穿戴和携带物品。直筒型的款式,厚重的面料和粗犷的外观散发着浓厚的雄性气息,即使冷冽的西北风都刮不走你身上散发的荷尔蒙气息。&/p&&p&&br&&/p&&p&&b&&u&而且牛角扣大衣的一个忌讳恰恰是它最大的优点——直筒型的外衣忌讳紧身款的内搭,巴不得你穿厚点撑起来它的形状。&/u&&/b&&/p&&p&&br&&/p&&p&更重要的是,牛角扣大衣是大衣中最休闲的款式,无论是西装还是毛衣,甚至是卫衣都能和它巧妙搭配,真正做到了一件大衣扛一个冬天。&/p&&figure&&img data-rawheight=&414& src=&https://pic1.zhimg.com/v2-7e6ebf87a224d2d2bb2e_b.jpg& data-size=&normal& data-rawwidth=&553& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic1.zhimg.com/v2-7e6ebf87a224d2d2bb2e_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&(下装)&/b&&/p&&p&&b&l&/b& &b&赤耳丹宁牛仔裤【单品价格:200~400 RMB】&/b&&/p&&p&苍天啊,大地啊,请告诉我还有什么是牛仔裤不能搭配的衣服和鞋子吧。&/p&&p&&br&&/p&&p&如果你有一条牛仔裤,这就意味着你衣柜里所有的衣服和鞋子:无论是T恤,帽衫,衬衫,西装,线衫,还是马丁靴,切尔西靴,运动鞋,休闲鞋,跑鞋......通通有了归宿。&/p&&p&&br&&/p&&p&但是很多人在选择牛仔裤时总会头疼:都说好的牛仔裤版型好看,怎么挑版型好的牛仔裤?我腿粗该怎么掩饰?我腿细该怎么弥补?&/p&&p&&br&&/p&&p&好的,我知道 你们是小白直男,我也知道你们懒得去听我的一堆科普。&b&&u&来,现在打开手机,搜索所有问题的终极答案——赤耳丹宁牛仔裤。&/u&&/b&&/p&&p&&br&&/p&&figure&&img data-rawheight=&401& src=&https://pic3.zhimg.com/v2-452eadcbd1ec0e6be4bc34_b.jpg& data-size=&normal& data-rawwidth=&401& class=&content_image& width=&401&&&/figure&&p&&br&&/p&&p&是的,就是这么牛逼,一条赤耳丹宁牛仔裤,可以hold住以上的一系列问题。&/p&&p&&br&&/p&&p&赤耳丹宁牛仔裤相对于其他牛仔裤,线条更加硬朗,而且裁剪十分立体,能够对腿型起到极好的修饰作用。&/p&&p&&br&&/p&&p&并且经典的直筒裤型基本上可以掩盖你腿型的一切问题——&b&&u&无论高矮胖瘦,所有人搭直筒牛仔都不会出错。&/u&&/b&&/p&&figure&&img data-rawheight=&414& src=&https://pic4.zhimg.com/v2-d06d7e4fbe7e7a6a411a87aaac343616_b.jpg& data-size=&normal& data-rawwidth=&553& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic4.zhimg.com/v2-d06d7e4fbe7e7a6a411a87aaac343616_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&l&/b& &b&束脚裤&/b&&/p&&p&&br&&/p&&p&牛仔裤虽然有型百搭,但是并不适合运动,平时无论健身跑步还是和妹子压马路都不太方便。&/p&&p&&br&&/p&&p&但这并不意味着你可以纵容自己穿一个大裤衩子或者宽松的像面口袋一样的棉质运动裤在大街上晃来晃去,此时的你,需要一条束脚裤。&/p&&figure&&img data-rawheight=&554& src=&https://pic1.zhimg.com/v2-e3fa3e4b10ea49921ad3_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic1.zhimg.com/v2-e3fa3e4b10ea49921ad3_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&束脚裤一般在脚踝处收紧,结合工装裤进行改进,一般有2~4个口袋,在保留了牛仔裤的硬朗有型的基础上省略了卷裤脚的麻烦,轻松露出的脚踝下可以搭配任意型号的战靴。&/p&&p&&br&&/p&&p&而且束脚裤的搭配攻略依旧十分简单——上身穿上卫衣和衬衫,怎么看都不会出错。&/p&&figure&&img data-rawheight=&347& src=&https://pic3.zhimg.com/v2-8b558a71b22becff6a040dbee46552d7_b.jpg& data-size=&normal& data-rawwidth=&470& class=&origin_image zh-lightbox-thumb& width=&470& data-original=&https://pic3.zhimg.com/v2-8b558a71b22becff6a040dbee46552d7_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&l&/b& &b&抽绳短裤&卡其短裤【单品价格:100~150 RMB】&/b&&/p&&p&就像真正检验一个厨子厨艺高低是土豆丝炒的如何一样,真正考验一个人衣品的标准是:如何在夏天这种一身就三四件的季节穿出感觉。&/p&&p&&br&&/p&&p&一到夏天,直男就开始在穿搭上各种作妖,要多花哨有多花哨,完全违背了直男穿衣的黄金准则——少即是多(less is more)。&/p&&p&&br&&/p&&p&炎热的夏季,我们穿衣应该力求清新简约,因此麻烦让那些破洞牛仔短裤,印着碎花的大裤衩子,带着大口袋子的工装短裤滚出你的衣橱。&/p&&p&&br&&/p&&p&&b&你只需要留两种纯色短裤即可——抽绳短裤&卡其短裤。&/b&&/p&&figure&&img data-rawheight=&414& src=&https://pic3.zhimg.com/v2-064eb66ba59d2eb0e0c4_b.jpg& data-size=&normal& data-rawwidth=&553& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic3.zhimg.com/v2-064eb66ba59d2eb0e0c4_r.jpg&&&/figure&&p&&br&&/p&&p&抽绳短裤一般采用棉麻质地,宽松透气且富有运动感,一条抽绳短裤加上纯色T恤和跑鞋打造的阳光形象,让你哪怕去便利店买个水果都能吸引收银小妹的目光。&/p&&p&&br&&/p&&p&而卡其短裤是介于正装短裤和休闲短裤之间的类型,它就是短裤之中的单西——工作场合配衬衫显得商务干练,生活场合配纯色T恤也不会让人觉得呆板和严肃。&/p&&figure&&img data-rawheight=&553& src=&https://pic3.zhimg.com/v2-51fbdaba67aa626c08743_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic3.zhimg.com/v2-51fbdaba67aa626c08743_r.jpg&&&/figure&&p&&br&&/p&&p&顺便说一句,短裤合适的长度是刚好到膝盖——&b&&u&长则邋遢,短则娘炮,千万别穿一个超短紧身的短裤上街,小心被肛。&/u&&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&(鞋子)&/p&&p&&br&&/p&&p&&b&l&/b& &b&马丁靴【单品价格:300~1000 RMB】&/b&&/p&&p&如果说我只能给你推荐一款鞋子,那么我会毫不犹豫的告诉你三个字——马丁靴。&/p&&figure&&img data-rawheight=&396& src=&https://pic2.zhimg.com/v2-2cd5a3fe01cf8a2e0d395_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic2.zhimg.com/v2-2cd5a3fe01cf8a2e0d395_r.jpg&&&/figure&&p&马丁靴可以说是每个型男衣柜里的必备单品,无论是版型还是耐操程度都是鞋类里的扛把子。拥有一双马丁靴,你的所有牛仔裤都有了归宿。&/p&&p&&br&&/p&&p&&b&&u&而且马丁靴自带的增高功能,让你在原来的身高上自带增加至少3cm,分分钟壁咚得妹子小鹿乱撞。&/u&&/b&&/p&&p&&br&&/p&&p&马丁靴一般的穿法都是将裤脚收入靴子内,将你的战靴完全的展示出来,不管你信不信——这样做居然能让你的腿在视觉上自动拉长,比美图秀秀都好使。&/p&&figure&&img data-rawheight=&553& src=&https://pic4.zhimg.com/v2-faa2ab707f3ad_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic4.zhimg.com/v2-faa2ab707f3ad_r.jpg&&&/figure&&p&&br&&/p&&p&l AJ系列&/p&&p&AJ系列有多火?一件事大家就懂了:&b&做AJ假鞋这一行业,养活了莆田和东莞数以万计的小工厂。&/b&&/p&&p&&br&&/p&&p&AJ系列的篮球鞋早就不仅仅是一双运动鞋,它更是潮流的象征,甚至可以说是一种信仰——本来踩在脚上的玩意儿,居然被人当成收藏品一样摆在玻璃柜里,你敢信?&/p&&figure&&img data-rawheight=&541& src=&https://pic1.zhimg.com/v2-4dbf1d422f79cfeb9027_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic1.zhimg.com/v2-4dbf1d422f79cfeb9027_r.jpg&&&/figure&&p&&br&&/p&&p&AJ的火爆离不开它的百搭——芝加哥,大魔王,空军一号......随意一双拉出来,不管是短裤牛仔裤还是束脚裤,都能轻松hold住。&/p&&p&&br&&/p&&p&当然,最经典的搭配还是束脚裤配AJ,在脚踝收紧的裤腿,能够将你脚上那双骚气四溢的战靴完美呈现。&/p&&p&&br&&/p&&p&如果你再来一件卫衣,那就瞬间化身成嘻哈小哥,感觉随时都可以拿着麦克来一段freestyle。&/p&&figure&&img data-rawheight=&738& src=&https://pic4.zhimg.com/v2-958fbf1eb_b.jpg& data-size=&normal& data-rawwidth=&554& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic4.zhimg.com/v2-958fbf1eb_r.jpg&&&/figure&&p&&br&&/p&&p&l 新百伦跑鞋&/p&&p&无论是导演还是投资人都想不到:“春娇志明”系列电影的最大赢家,居然是一双鞋。&/p&&p&&br&&/p&&p&电影里余文乐脚上那双新百伦跑鞋休闲而不失格调,给无数从小穿双星长大的孩子结结实实的上了一课:原来运动鞋也能那么帅。&/p&&figure&&img data-rawheight=&501& src=&https://pic1.zhimg.com/v2-cd0dcd5e17b_b.jpg& data-size=&normal& data-rawwidth=&501& class=&origin_image zh-lightbox-thumb& width=&501& data-original=&https://pic1.zhimg.com/v2-cd0dcd5e17b_r.jpg&&&/figure&&p&&br&&/p&&p&如果说马丁靴和AJ占据了欧美系服装搭配的龙头地位,那么新百伦跑鞋则拿下了日潮和韩潮的堂口——&b&&u&性冷淡配色的服装配上一双小清新的跑鞋,让你在一群油腻的中年人中找到鹤立鸡群的感觉。&/u&&/b&&/p&&figure&&img data-rawheight=&414& src=&https://pic3.zhimg.com/v2-cf6c3beca8726_b.jpg& data-size=&normal& data-rawwidth=&553& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic3.zhimg.com/v2-cf6c3beca8726_r.jpg&&&/figure&&p&&br&&/p&&p&虽然新百伦跑鞋一般没人收藏,但是你也可以趁着大减价多屯几双——&b&&u&毕竟穿起来舒服还百搭的运动鞋,实在是太少太少了。&/u&&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&你可能不敢相信,但事实就是——&b&&u&在这短短几分钟内,你学到的穿衣款式,足够你穿上至少20年。&/u&&/b&&/p&&p&&br&&/p&&p&很复杂吗?不复杂,因为我们不讲什么脸型,体型,色调——我们直接简单粗暴的告诉你:穿这个,准没错。&/p&&p&&br&&/p&&p&我也当过不修边幅的直男,深刻的理解一个道理:&/p&&p&&br&&/p&&p&&b&&u&作为一个刚入门的小白,谁特么有那么多的耐心去研究那么多理论?&/u&&/b&&/p&&p&&br&&/p&&p&所以,这一篇的基础款教程,已经能让你以一个整洁利索,甚至有型的形象出现在妹子身边,如果你身边的男生再犯些错误,你基本上就已经达到了男神级别。&/p&&p&&br&&/p&&p&说实话,形象改造是所有撩妹步骤中最容易最轻松的环节了——&b&&u&它只需要你花几天就能掌握一套正确的思路和方法论,有着固定不会出错的模板可以照搬照抄。&/u&&/b&&/p&&p&&br&&/p&&p&而且它的回报也是最牛的——&b&&u&形象够好,你甚至可以等着妹子来撩你。&/u&&/b&&/p&&p&&br&&/p&&p&因此,新的一年即将到来,请各位直男将这篇保姆级别的全方位指南收藏,时不时的拿出来看看,尽量凑齐里面提到的经典单品。&/p&&p&&br&&/p&&p&等你改造完,看着朋友圈越来越多的点赞数量,看着越来越多探探MarryU上的红心,我相信——&/p&&p&&br&&/p&&p&&b&&u&你会把它推荐给你的朋友,拯救更多直男的。&/u&&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&如果你需要更多知识武装自己,欢迎关注我的公众号: tednec,每天分享一个实用的情感攻略。&/p&&p&回复关键词“约会”,告诉你怎么构建一次完美的约会。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&&u&其他关于情感的高赞回答:&/u&&/b&&/p&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-beb53dfe714295caec4dd9bb266734ce_180x120.jpg& data-image-width=&658& data-image-height=&309& class=&internal&&宏桑:了解这些情感规则,才能在恋爱中掌握主动权。&/a&&br&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic4.zhimg.com/v2-0ef1bc20fbcdef_180x120.jpg& data-image-width=&816& data-image-height=&453& class=&internal&&宏桑:快速拉近关系的36个问题&/a&
各位直男朋友们: 你可曾对着镜子中自己的形象抓耳挠腮,感觉哪里不对却不知道从何改起? 是不是也关注了一堆公众号,结果买了一堆衣服,到头来穿在身上还是一个大写的丑字? 是不是一听形象改造就头大,到现在还不知道应该穿什么衣服? 是不是想有一个清单…
&figure&&img src=&https://pic2.zhimg.com/v2-78c117963bcf2a054a024c4c488c4674_b.jpg& data-rawwidth=&640& data-rawheight=&411& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-78c117963bcf2a054a024c4c488c4674_r.jpg&&&/figure&&p&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f598faff8d9dd455e1dba_b.jpg& data-rawwidth=&586& data-rawheight=&205& class=&origin_image zh-lightbox-thumb& width=&586& data-original=&https://pic3.zhimg.com/v2-f598faff8d9dd455e1dba_r.jpg&&&/figure&&h2&比赛背景&/h2&&p&&b&地址&/b&:&a href=&http://link.zhihu.com/?target=https%3A//www.kaggle.com/c/kkbox-churn-prediction-challenge& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WSDM - KKBox's Churn Prediction Challenge&/a&&/p&&p&&b&关键字&/b&:&b&定义流失用户&/b&、&b&流失预测、挖掘用户记录&/b&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.wsdm-conference.org/2018/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&第十一届ACM网络搜索与数据挖掘国际会议(WSDM)&/a&要求参赛者利用KKBOX数据集建立智能算法来预测&b&订阅用户是否会流失&/b&。对于依赖订阅业务的KKBOX来说,准确预测流失率是业务成功的关键。通过结果分析,以便KKBOX进一步了解用户需求,在保持用户活跃度上进一步采取行动。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-195fdd024a621c9aae4b3d_b.jpg& data-rawwidth=&815& data-rawheight=&271& class=&origin_image zh-lightbox-thumb& width=&815& data-original=&https://pic4.zhimg.com/v2-195fdd024a621c9aae4b3d_r.jpg&&&/figure&&p&&a href=&http://link.zhihu.com/?target=https%3A//www.kkbox.com/tw/tc/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&KKBOX&/a&,是专业的数位音乐资讯服务软体,获得最多家国内与国际知名音乐出版发行公司热情的赞助合作,在台湾音乐占着重要的地位。KKBOX可以看做湾湾版的QQ音乐、酷狗音乐,订阅业务就是开通会员,可以听到更多的收费歌曲。&/p&&p&&br&&/p&&p&&b&比赛阶段&/b&:&/p&&p&日,比赛开始&/p&&p&日,结束队伍合并&/p&&p&日,比赛结束&/p&&p&日,论文提交截止&/p&&p&&br&&/p&&h2&比赛细节&/h2&&p&&b&任务描述&/b&:预测用户在会员到期后的30天内是否会进行新的订阅。&b&提交结果为流失的概率&/b&。例如1代表此用户完全会流失,0.6代表此用户流失的概率为60%。&/p&&p&训练集中,数据由2017年2月服务到期的用户构成,is_churn标签代表用户在2017年3月是否续订了业务。测试集中的数据由2017年3月内将到期的用户构成,&b&需要预测用户是否在到期后的一个月内即2017年4月预定、流失的概率&/b&。&/p&&p&&br&&/p&&p&&b&评价指标&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-802fbe89afe3b38bab4c1a_b.jpg& data-rawwidth=&439& data-rawheight=&73& class=&origin_image zh-lightbox-thumb& width=&439& data-original=&https://pic3.zhimg.com/v2-802fbe89afe3b38bab4c1a_r.jpg&&&/figure&&p&&br&&/p&&p&&b&数据与字段解释&/b&&/p&&p&&br&&/p&&p&&b&train.csv 官方训练集 44.5MB&/b&&/p&&ul&&li&msno:用户id,加密String&/li&&li&is_churn:流失标签 ,仅包含0,1&/li&&/ul&&p&&br&&/p&&p&&b&sample_submission_zero.csv 提交结果&/b&&/p&&ul&&li&msno&/li&&li&is_churn:预测流失概率,[0,1]浮点数&/li&&/ul&&p&&br&&/p&&p&&b&transactions.csv 用户交易流水 1.6GB&/b&&/p&&ul&&li&msno&/li&&li&payment_method_id:支付方式,Int&/li&&li&payment_plan_days:订阅天数,Int&/li&&li&plan_list_price:标价(新台币),Int&/li&&li&actual_amount_paid:实际支付价格,Int&/li&&li&is_auto_renew:是否自动续订,0,1&/li&&li&transaction_date:交易日期&/li&&li&membership_expire_date:到期日期&/li&&li&is_cancel:是否取消业务,0,1&/li&&/ul&&p&&br&&/p&&p&&b&user_logs.csv 用户行为日志 28.4GB&/b&&/p&&ul&&li&msno,date: 日期&/li&&li&num_25: 当天歌曲播放长度小于25%的歌曲数量&/li&&li&num_50: 当天歌曲播放长度小于50%大于25%的歌曲数量&/li&&li&num_75: 当天歌曲播放长度小于70%大于50%的歌曲数量&/li&&li&num_985:当天歌曲播放长度小于98.5%大于75%的歌曲数量&/li&&li&num_100:当天歌曲播放长度大于98.5%的歌曲数量&/li&&li&num_unq: 当天听了多少首不同的歌&/li&&li&total_secs: 播放时间(秒)&/li&&/ul&&p&&br&&/p&&p&&b&members.csv 用户基本信息 352MB&/b&&/p&&ul&&li&msno&/li&&li&city:城市,数值代替,Int&/li&&li&bd: 年龄,有异常值,Int&/li&&li&gender:male,female,String&/li&&li&registered_via: 注册方式,数值代替,Int&/li&&li&registration_init_time: 注册日期 %Y%m%d,String&/li&&li&expiration_date: 会员最后到期日期 %Y%m%d ,String&/li&&/ul&&p&&br&&/p&&h2&相关比赛资料&/h2&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.wsdm-conference.org/2018/call-for-participants.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WSDM CUP 2018 Call-for-Participants&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.optimove.com/learning-center/customer-churn-prediction-and-prevention& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Customer Churn Prediction and Prevention&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//www.kaggle.com/headsortails/should-i-stay-or-should-i-go-kkbox-eda& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kernels :Competition data exploration&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//www.kaggle.com/the1owl/regressing-during-insomnia-0-21496& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kernels :xgb baseline&/a&&/p&&p&&br&&/p&&p&建了个QQ交流群:&b&&/b&,比赛有兴趣的同学可以进群一起交流&/p&&p&交流帖:&a href=&http://link.zhihu.com/?target=https%3A//jizhi.im/community/discuss/-7-11-11-pm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&kaggle用户流失预测比赛交流 - 集智社区&/a&&/p&&p&欢迎关注&a href=&https://zhuanlan.zhihu.com/shuma& class=&internal&&专栏——数与码&/a&与&a href=&https://www.zhihu.com/people/kingdoms/columns& class=&internal&&作者&/a&,后期将继续更新比赛文章~&/p&&p&&b&最后,点一波赞吧~&/b&&/p&
比赛背景地址:关键字:定义流失用户、流失预测、挖掘用户记录要求参赛者利用KKBOX数据集建立智能算法来预测订阅用户是否会流失。对于依赖订阅业务的KKBOX来说,准确…
以前整理过一个《从零开始学编程系列》&a class=& wrap external& href=&//link.zhihu.com/?target=https%3A//github.com/justjavac/Programming-Alpha-To-Omega& target=&_blank& rel=&nofollow noreferrer&&justjavac/Programming-Alpha-To-Omega · GitHub&/a&&br&里面收录了从零开始写编译器、记事本、服务器、操作系统、虚拟机、GC、数据库、……&blockquote&&ul&&li&&a href=&http://zhuanlan.zhihu.com/mosky/& class=&internal&&从零开始写个编译器吧系列&/a&
(知乎专栏)&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//top.jobbole.com/13810/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&从零开始写一个简单的操作系统&/a&
(伯乐在线)&br&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.ituring.com.cn/minibook/770& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&从零开}

我要回帖

更多关于 椭圆轨道的向心加速度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信