本文转载自果壳 https://www.guokr.com/article/439451/

你一定会对这样的场景十分熟悉:在电影或者电视剧的高潮部分,最终大BOSS手拿武器对准躺在地上满身是血的主角。他/她/它(当然)并没有立即终结主角,而是(如你所想地)侃侃而谈:“想当年,我可是……”这段追忆往昔峥嵘岁月的回忆洋洋洒洒,足以写下一篇八百字作文。等等,只听“砰!”的一声——大BOSS(如你所想地)被主角干掉了。

大BOSS常常在占尽优势的时候对主角“话太多”。在说这段剖析自己内心世界的话时,他们给了主角足够的时间准备“逆袭”,而潜台词就是:“主角你在干啥?我都说的口干舌燥了,还不来干掉我?”于是主角愉快地满足了他们的愿望。嗯,那么现在问题就来了:为什么这些坏人、大BOSS,总是功败垂成,最后死于自己太话痨呢?


嗯,那一定挺疼的……图片来源:mrwgifs.com

剧情要求,主角光环不能始终无敌

首先,在影视作品里很显然这事儿得问编剧跟导演啊!这可都是编剧和导演弄出来的鬼把戏。一方面,作为正面角色,主人公做事儿不能太顺利,主角光环只能在关键时刻用一用,如果全程都是无敌效果,那还有什么看头啊?估计这样的片子只能吸引吸引小学三年级以下的观众了——现在的动画片儿都不太这么演了好嘛。

反过来,坏人也不能太厉害,他可以一直都占据优势、占据主动,但最后必须被主人公给干掉。你要是让坏人一路占尽优势,最后把主人公给干掉了,观众也不答应啊。就算是观众答应了,你不给个正面的光明的结尾,也有些人要跟你急啊。

不过,话说回来,艺术来源于生活。时间是最好的编剧,现实世界才是我们能看到的最伟大的戏剧。在这部漫长而丰饶的现实大戏里,坏人死于话多的情况,真的会出现。

真实的坏人也死于“话太多”

美国联邦调查局(FBI)的科学调查组创始人雷斯勒写过一本很著名的书,叫《FBI心理分析术》,详细记录了自己为FBI工作的过程和细节。他提到,自己曾经跟上世纪70年代纽约一个著名的连环杀手大卫·柏克威兹(David Berkowitz),做过深入的谈话。这个柏克威兹很厉害,他自称“山姆之子”,总是在深夜伏击正在亲热的情侣。而且还很高调地给当地媒体写信,讲述自己的故事。截止到被捕的时候,他一共杀死了6个人,击伤7人。可以说是罪行累累。


“山姆之子”,真名叫作大卫·柏克威兹,他专门狙杀约会中的情侣,往往隐藏在小暗巷中趁情侣们缠绵时从车窗口向女方射击。crimemagazine.com

然而,就是这样一个心狠手辣的杀手,他却告诉雷斯勒一个此前所有心理学家、刑侦专家,估计连大长脸儿夏洛克都没有注意到过的信息:凶手在行凶之后,常常会情不自禁地回到案发现场。很快,心理学方面的一些研究也证实了这一点。这个现象后来被运用到刑侦工作当中,起了很大的作用。现在我们看一些刑侦题材的影视剧作品,也经常会看到这样的桥段:警方在勘查案发现场的时候,在围观的人群中发现了形迹可疑者,这个时候嫌疑人一定会拔腿狂奔,警察则一定会紧紧追赶。而且这一追捕行动一定会失败:不是被嫌疑人跑掉,就是突然暴毙,看一眼进度条就什么都明白了。

美国小说家帕拉尼克在名作《肠子》里也提到过这样的桥段,警探会在谋杀弃尸的现场藏一个麦克风,然后监听这里的情况。因为几乎所有的凶手都会回来跟受害者说话。所有人都有倾诉的需求,而杀人者只能与那个被杀死的,也就是永远都不可能出卖他的人分享自己的罪行。

可是,匪徒为什么要去多这么一嘴呢?他难道不能像个北欧人一样保持沉默吗?如果进入了心理学的范畴,一切都变得好理解了。

为啥坏人总是喋喋不休?

消解认知失调

行凶者面临的第一个问题就是认知失调。认知失调简单来说就是我们所做的事情跟我们的认知发生了冲突。比如我们会有一个基本认识:“杀人是不对的”。行凶者在做这件不对的事情,但又不愿意承认自己犯罪是错误的。所以,他必须要通过将杀人行为“合理化”来实现建立心理防御机制。

行凶者会找各种借口来获取自己犯罪的正当性,最终说服自己放下良心的包袱,告诉自己“他就是该杀”。这种心理防御机制在电影中的最经典表现来自《黑客帝国》。在片中,史密斯要毁灭人类的理由如此充分:“你们人类一直以为你们自己是哺乳动物,其实你们不是。地球上没有哪种哺乳动物像你们这样生存:每到一处,尽力耗尽那里的资源,榨干那里的财富,直至那里一无所有,然后和那块地方一起死掉。你们人类繁衍的唯一方式就是换一块地方,重新掠夺。地球上只有一种生物像你们这样生存——病毒。你们人类是地球的瘟疫和灾难,而我们——电脑——是解药。”


Ouch!《黑客帝国》大BOSS史密斯被干掉。图片来源:voiceofcrazy.com

现在我们可以理解了,坏蛋为什么总在控制大局,只需再动一下手指就能大获全胜的情况下,突然变得喋喋不休。其实,他就是为了消除自己作恶时由于内化的道德和外显的行为不相符而产生的认知失调。通过不停地说给自己和别人听,来达到所谓的“认知失调消解”。

不过,这套理论有一个缺陷,坏蛋要想达成“认知失调消解”,自己在心里默默调节消解不就好了嘛,为什么一定要说出来呢?这里就牵扯到心理学的另一个机制:通过获得外部反馈,而提升自我评价。

提升自我评价

从原理上来说,提升自我评价有两个途径:自我效能感,社会认同感。这两个途径都迫使坏蛋们不停地说话。

自我效能感简单来说就是强调“我有我可以”。比如你面前有一堆砖,你来要搬它,可你怎么知道自己搬得动它呢?根据自我效能感的理论,你以前成功地搬过砖、你看过体力跟你差不多的人成功地搬砖、有别人或者你自己来现场分析一下你能搬动砖的十大原因、开一个搬砖动员大会、把砖放在你熟悉的环境里搬,这些因素都能让你觉得自己离优秀的搬砖工更近了一步。

自我效能感的提升,能让人感觉异常良好。坏人也是人,也有人的优点和缺点,要遵循人类共有的心理规律。把众人眼中威风凛凛的正义化身踩在脚下,恶棍们随心所欲地发表自己的高谈阔论:一边回顾自己“光辉”的历史,一边叙述自己“天才”的计谋;一边夸耀自己超凡的实力,一边肯定自己胜利的必然——自我效能感简直要爆棚了。然而这还不够,独角戏不够精彩,一定要有一个配角,甚至一批观众才能让个体获得最大的心理满足感。

实际上,在人类犯罪史上确实有罪犯真的在用极端的方式获得自我效能感,鼎鼎大名的“黄道十二宫”杀手,就曾炫耀性地主动寄给当地报社一些自己编写的密文,而其中的“340密文”的谜底至今仍未揭晓。

而社会认同感说的是人意识到自己属于特定的群体,并且通过群体成员的身份来获得价值和情感意义。对于影视剧中的大坏蛋,在毕生追求的野心即将实现之际,不把这一系列的阴谋诡计全盘托出以便让世人知道自己才是名符其实的头号恶棍?这无异于锦衣夜行,实在会让人太失落了。而这种自我标榜为头号恶棍的做法,本身也是社会认同感极端化的表现。


虽然在《钢铁侠3》电影中只是一个傀儡,不过满大人的噱头还是搞得很好的。图片来源:wikia.com

有限认知:给坏人的会心一击

以上的心理动机导致了坏人总是陷入话痨综合征而难以自拔。而一种很重要的心理学概念仍然悄悄潜伏在草丛中,随时准备跃出来,给他致命一击。这就是每次都能让主角绝境翻盘,逆袭反杀的最好帮手:人类有限的认知资源。

人的认知资源是非常有限的,当我们专注地做某一件事时,不在我们关注范围内的信息很可能就无法有效地进入我们的认知加工环节,从而导致视而不见、听而不闻的情况。1999年,美国心理学家西蒙斯做过一项实验,在向观众播放视频的时候,让一个合作者扮成大猩猩从人群前面走过。至少有一半人会注意不到大猩猩的出现。可以想见,当坏人专注于向已经被打倒在地动弹不得的主人公倾诉,以获得自我满足的时候,他是无法注意到后者行为、姿态和情绪上的变化细节的。逆袭的线索,就这样被忽视了。

坏人,就这样死于他的喋喋不休。由此可见,言多必失、沉默是金这样的古律,至少在电影当中是有很重要的作用的。

最后,让我们一起重温一位敦厚长者的谆谆教诲:一定要闷声才能发大财啊!(编辑:Jerrusalem

一、一般在代码中的调用,要么通过id找到,要么直接new出来:

①、调用setTextSize(<数值单位>,<值>)

这里的数值单位可以为下列的几种:

TypedValue.COMPLEX_UNIT_PX
TypedValue.COMPLEX_UNIT_DIP
TypedValue.COMPLEX_UNIT_SP

当然还有不常用的,比如

TypedValue.COMPLEX_UNIT_PT

1 .如果直接使用固定的数值,那么该数值的单位则由上述的几种枚举决定,比如:

setTextSize(TypedValue.COMPLEX_UNIT_SP,16);//就是设置为16sp的大小

2 .如果使用资源文件中的数值,那么请注意,数值单位 要设置为 COMPLEX_UNIT_PX,比如:

setTextSize(TypedValue.COMPLEX_UNIT_PX,getResources().getDimensionPixelSize(R.dimen.你的资源);

 原因如下

* 获取dimension的方法有几种,区别不大
* 共同点是都会将dp,sp的单位转为px,px单位的保持不变
*
* getDimension() 返回float
* getDimensionPixelSize 返回int 小数部分四舍五入
* getDimensionPixelOffset 返回int,但是会抹去小数部分

getDimensionPixelSize在要求不高的情况下也可以替换为getDimensionPixelSize或者getDimensionPixelOffset,具体根据业务需求决定

②、调用setTextSize(<Size>):

这个方法不带单位,Doc的描述如下:

Set the default text size to the given value, interpreted as “scaled pixel” units. This size is adjusted based on the current density and user font size preference.

大意就是,Size单位是px且当设置为某个值的时候,最后会乘一个destiny后显示出来

没例子,也不建议用

二、自定义控件中调用:

①、使用paint直接画TextView:

调用paint.setTextSize(<px值>)即可

②、在declare-styleable中定义size,在xml中设置size,代码中通过TypedArray取出来:

这是比较常见的情况,此时通过调用TypedArray的对象调用getDimension,getDimensionPixelSize 或者getDimensionPixelOffset 方法来获取。同样的,返回结果是以px为单位的

然后,同(一)里面的做法,设置大小即可

继续阅读

前几天遇到一个问题,将uint32_t类型的值放到字典里面传递到下一个vc中。就这么个简单的问题,却踩进了坑。

由于之前主攻java,想当然的就将uint32_t转换成NSString然后丢到下一个vc中,然后要使用的时候再转回uint32_t,然后问题就出现了:转回uint32_t后发现数值不正确。

下面是之前的转换方式:

//uint32_t --> NSString
uint32_t a=2373916479;
NSString * aStr=[NSString stringWithFormat:@"%u",a];//这个没毛病,确实变成了字符串
//NSString --> uint32_t
uint32_t b=[aStr intValue];//这句话有问题

通过上面的代码执行后发现a和b的值不一样,惊到我了!

通过查询uint32_t的定义,发现这货就是unsigned int。然后再回来看代码,觉得没问题哇。。。

然后再转念一想,它是无符号的int,直接转数值会有损。于是将最后一句改成:

uint32_t b=[aStr longLongValue];

虽然执行结果正确了,但是xcode提示了一个警告:

Implicit conversion loses integer precision:'long long' to 'uint32_t' (aka 'unsigned int')

虽然能解决问题,但是这个警告实在是看的很不爽,而且实现起来比较暴力。怎样才能更加优雅的解决目前的困扰呢?

搜索了StackOverflow,突然发现可以把uint32_t放到NSNumber中,再放到字典里面,于是:

//uint32_t --> NSNumber
uint32_t a=2373916479;
NSNumber * aNumber=[NSNumber numberWithUnsignedInt:a];//用NSNumber包裹uint32_t,这样就能放到字典中了
//NSNumber --> uint32_t
uint32_t b=[aNumber unsignedIntValue];//结果正确

经过上面的实践之后,总结一下:

  1. 一切都是基础不扎实导致的
  2. uint32_t本质是unsigned int,如果先转化为字符串再用intValue转回来就会有可能出现数据不正确的情况,而且NSString也没有提供unsingedIntValue,所以使用NSString不明智;
  3. NSNumber是一个可以放到字典和数组中的类型。如果需要再字字典或者数组中存放基本数据类型,可以把所需要的基本数据类型转化为NSNumber后再存入

最近有这么个给图片加水印的需求,把网上的方法基本都试了个遍,最后也就发现一个简单的方法比较可靠。改造了一下,变成了下面这样的:

#define UIColorFromHex(s)  [UIColor colorWithRed:(((s & 0xFF0000) >> 16))/255.0 green:(((s &0xFF00) >>8))/255.0 blue:((s &0xFF))/255.0 alpha:1.0]
-(UIImage *)watermarkImage:(UIImage *)img withName:(NSString *)name
{
    NSString* mark = name;
    const NSString * copyRight=@"©2017 测试公司.All rights reserved.";
    int w = img.size.width;
    int h = img.size.height;
    UIGraphicsBeginImageContext(img.size);
    [img drawInRect:CGRectMake(0, 0, w, h)];
    UIFont * font=[UIFont systemFontOfSize:64];
    NSShadow *shadow = [[NSShadow alloc] init];
    shadow.shadowColor = UIColorFromHex(0x666666);
    shadow.shadowBlurRadius = 5;
    shadow.shadowOffset = CGSizeMake(1, 3);
    NSDictionary *attr_mainContent = @{
                           NSFontAttributeName: font,  //设置字体
                           NSForegroundColorAttributeName: [UIColor cyanColor] ,  //设置字体颜色
                           NSShadowAttributeName:shadow,
                           NSVerticalGlyphFormAttributeName:@0
                           };
    NSDictionary *attr_copyRight = @{
                                       NSFontAttributeName: font,  //设置字体
                                       NSForegroundColorAttributeName: [UIColor whiteColor] ,  //设置字体颜色
                                       NSBackgroundColorAttributeName:[UIColor grayColor]
                                       };
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
    CGSize main_Size1 = [name boundingRectWithSize:CGSizeMake(MAXFLOAT, 0.0) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
    CGSize main_Size2 = [name boundingRectWithSize:CGSizeMake(w, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;

    CGSize copyRight_Size1 = [copyRight boundingRectWithSize:CGSizeMake(MAXFLOAT, 0.0) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
    CGSize copyRight_Size2 = [copyRight boundingRectWithSize:CGSizeMake(w, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;

    //=======
    //draw main text
    [mark drawInRect:CGRectMake(20, h - 20 - main_Size2.height - copyRight_Size2.height, main_Size1.width, main_Size2.height) withAttributes:attr_mainContent];//左下角
    //=======
    //draw copy right text
    //copyRight
    [copyRight drawInRect:CGRectMake(0, h - copyRight_Size2.height , copyRight_Size1.width, copyRight_Size2.height) withAttributes:attr_copyRight];//左下角

    UIImage *aimg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return aimg;
}

效果如下:(iPhone 7Plus的大小)

我在这里面加入了两段水印,上面的是要加入的信息,下面是版权信息。

NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
CGSize main_Size1 = [name boundingRectWithSize:CGSizeMake(MAXFLOAT, 0.0) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
CGSize main_Size2 = [name boundingRectWithSize:CGSizeMake(w, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;

这一段代码用来获取要添加的水印字符的宽度和高度。main_Size1的width就是文本的宽度,main_Size2的height就是文本的高度。这里踩过一个坑,之前照抄网上的获取宽度和高度的代码,发现添加上去的水印文字总是显示不全,后来测试了才发现,需要指定一个宽度,假设为x,这样获取到的高度是文本最大宽度为x的情况下对应的高度(汗颜,仔细想想确实应该是这样)。如果将文本的宽度指定为图片的宽度的话,那么基本可以保证文字的正常显示。

[mark drawInRect:CGRectMake(20, h - <height>, <width>, <height>) withAttributes:<Your Attr>];

这一段是最核心的部分,用于将文本绘制到图片上。可以绘制到由UIGraphicsBeginImageContext指定的区域中的任意位置。代码中我设置绘制区域为整个图片,水印设置在左下角。

这里有一个Attributes参数,是一个属性数组。其中可用的属性如下:

  • NSKernAttributeName:设置字符间距,取值为 NSNumber 对象(整数),正值间距加宽,负值间距变窄
  • NSFontAttributeName:设置文本的字体,参数为UIFont对象
  • NSForegroundColorAttributeName:设置文本的颜色,参数为UIColor
  • NSParagraphStyleAttributeName:设置段落格式。参数为NSMutableParagraphStyle或者NSParagraphStyle对象。例如:
    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.alignment = NSTextAlignmentCenter;//居中
  • NSBackgroundColorAttributeName:设置文本的背景颜色,参数为UIColor
  • NSStrokeWidthAttributeName:设置文本的描边宽度。

    这个属性所对应的值是一个 NSNumber 对象(小数)。该值改变描边宽度(相对于字体size 的百分比)。默认为 0,即不改变。正数只改变描边宽度。负数同时改变文字的描边和填充宽度。例如,对于常见的空心字,这个值通常为3.0。

    如果同时设置了空心的两个属性,并且NSStrokeWidthAttributeName属性设置为整数,那么文字前景色就无效果了

  • NSStrokeColorAttributeName:设置文本的描边颜色
  • NSStrikethroughStyleAttributeName:设置删除线。参数为数字。例如:NSStrikethroughStyleAttributeName:@3 表示删除线的宽度为3
  • NSUnderlineStyleAttributeName:添加下划线。参数为枚举类型。可用的类型如下:

    NSUnderlineStyleNone

    NSUnderlineStyleSingle   

    NSUnderlineStyleThick

    NSUnderlineStyleDouble

    设置单下划线:NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle)

  • NSUnderlineColorAttributeName:设置下划线颜色,参数为UIColor
  • NSShadowAttributeName:设置阴影效果,参数为NSShadow对象。注意这个属性必需和这三个属性NSVerticalGlyphFormAttributeName,NSObliquenessAttributeName和NSExpansionAttributeName之一同时使用才能生效,否则将无效。

    关于NSShadow的用法,如下:

    NSShadow *shadow = [[NSShadow alloc] init];//初始化
    shadow.shadowColor = [UIColor grayColor];//设置阴影颜色
    shadow.shadowBlurRadius = 2;//模糊程度,值越大越模糊
    shadow.shadowOffset = CGSizeMake(2, 4);//阴影的位置。如:设置为CGSizeMake(0, 0)则会直接叠加到文本后方;CGSizeMake(0, 4)则是出现在文本的下方
  • NSVerticalGlyphFormAttributeName:该属性所对应的值是一个 NSNumber 对象(整数)。0 表示横排文本。1 表示竖排文本。在 iOS 中,总是使用横排文本,0 以外的值都未定义。
  • NSObliquenessAttributeName:设置字体倾斜,参数为NSNumber 0或1
  • NSExpansionAttributeName:设置文本扁平化(个人感觉很丑,而且还会影响文本的宽度计算),参数为NSNumber 0或1
  • NSTextEffectAttributeName:设置文本特殊效果,取值为 NSString 对象,目前只有图版印刷效果可用
  • NSBaselineOffsetAttributeName:设置基线偏移值,取值为 NSNumber (float),正值上偏,负值下偏
  • NSWritingDirectionAttributeName:设置文字书写方向,从左向右书写或者从右向左书写。以下是API中的说明:

    NSNumbers representing the nested levels of writing direction overrides as defined by Unicode LRE, RLE, LRO, and RLO characters. The control characters can be obtained by masking NSWritingDirection and NSWritingDirectionFormatType values.

    LRE: NSWritingDirectionLeftToRight|NSWritingDirectionEmbedding
    RLE: NSWritingDirectionRightToLeft|NSWritingDirectionEmbedding
    LRO: NSWritingDirectionLeftToRight|NSWritingDirectionOverride
    RLO: NSWritingDirectionRightToLeft|NSWritingDirectionOverride

  • NSLinkAttributeName:设置链接属性,取值为NSURL对象。点击后调用浏览器打开指定URL地址
  • NSAttachmentAttributeName:设置文本附件,取值为NSTextAttachment对象,常用于文字图片混排

基本就以上这些属性

PS:UILabel也是可以设置以上属性,只是代码不一样而已。关于这个可以参考:http://www.jianshu.com/p/6665c088bd01

之前考虑用MMPopupView来实现弹出式对话框,不得不说这个弹出的效果还是很不错的,可惜我发现使用xib来绘图还是有点问题的,所以想了个另类的办法:弹出一个模态的view controller来充当对话框。

成功实现之后,发现无法改变背景透明度,即弹出动画显示的过程中背景是有透明色的,动画过后就变成不透明了。于是在网上搜索到了这样的解决办法:

参考:http://www.jianshu.com/p/4f7a29bb333f

AppDelegate *appdelegate=(AppDelegate*)[[UIApplication sharedApplication] delegate];

UIViewController *vc = [[UIViewController alloc]init];//这里写你要弹出的vc

appdelegate.window.rootViewController.definesPresentationContext = YES;

view.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[appdelegate.window.rootViewController presentViewController:vc animated:YES completion:^{

vc.view.backgroundColor=[UIColor colorWithRed:237/255.0 green:236/255.0 blue:244/255.0 alpha:0.5];//这里写你需要的颜色,或者透明度

}];

这样基本上就可以了。如果要更加完美的话,可以修改弹出动画的背景透明度,和上述的颜色一致,这样就可以让弹出效果更自然

本文原引出处:http://wpchina.org/how-to-change-wordpress-domain-prefectly-1528/

UPDATE wp_options SET option_value = replace(option_value, ‘<你的旧域名>’,'<新域名>’) ;
UPDATE wp_posts SET post_content = replace(post_content, ‘<你的旧域名>’,'<新域名>’) ;
UPDATE wp_comments SET comment_content = replace(comment_content, ‘<你的旧域名>’, ‘<新域名>’) ;
UPDATE wp_comments SET comment_author_url = replace(comment_author_url, ‘<你的旧域名>’, ‘<新域名>’) ;

上文中是基于phpMySql的,其中有几个注意要点:

0.写在前面:数据库要备份要备份要备份!万一操作失误,那损失就大了

1.一定要选中数据库之后,再去点击右侧上方的SQL选项卡

2.UPDATE 后面的是表的名称。如果在安装wordpress时自定义过表名称,这里要修改成实际的表名称

3.替换前最好先看看wp_options(也许叫别的名称)中的home字段是什么,然后用这个字段值去替换例子中的www.mydomain.com

4.为了防止出错,修改好sql语句之后,最好先点击右下角的模拟查询按钮。没有这个按钮?请检查sql语句是否正确,否则请升级phpMyAdmin。如果模拟查询执行后的结果有错误,说明sql语句哪里有问题,需要一个一个排查直至问题解决。确认无误后再点击执行按钮。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

至于文中有人评论说:”二级站点只能访问首页,其他还是转跳到原来的域名地址“,我表示这人maybe是改错了什么地方,允悲

我已经按照这个方法更换过N个域名了,貌似还没出过问题

在做Android开发之后,你会发现随着时间的推移,运行过越来越多的demo,用过越来越多的三方library,c盘空间也越来越少。查看个人用户文件夹,可以发现几个和Android有关的文件夹体积那可是真庞大。下面将会针对各个文件夹给出相应的办法(Windows版)

一、.android文件夹

这个文件夹主要用于保存adb调试用的key和avd模拟器,lldb也要使用这个文件夹

迁移方式1:添加ANDROID_SDK_HOME环境变量,指向你所要保存的地方。

举例:把用户目录下的.android搬到D:\test目录下,ANDROID_SDK_HOME就填写D:\test。最终结果是下次android studio启动后,.android文件夹就会出现在D:\test目录下

缺点:adb调试用的key无法迁移到新目录下,如果用户目录下.android文件夹不存在,每次使用adb命令后会再次生成此文件夹,并重新生成一个adb调试key

迁移方式2:利用符号链接 ,注意这里有两个点符号,一个都不能少,且要链接的地方文件夹必须存在,名称可以随意

mklink /d %USERPROFILE%\.android. <要链接到的地方>

这样就会创建一个符号链接,让android以为这个文件夹还在原来的地方,但其实已经哈哈哈

举例:mklink /d %USERPROFILE%\.android. D:\AndroidFiles

解释:对.android文件夹做一个符号链接到D盘的AndroidFiles文件夹,所有对.android文件夹里面文件的读写其实是在对D盘的AndroidFiles文件夹内容读写

二、.gradle文件夹

这个文件夹很变态,当你使用过某一个版本的gradle后,该版本的gradle就会被下载到这里面。同时使用gradle依赖的三方library也会被下载并保存其中。说穿了它就是一个本地的仓库,这个仓库理论上容量无限大,所以当然要搬走

迁移方式1:新建一个GRADLE_USER_HOME环境变量,指向你想要的位置,然后把.gradle目录剪切过去就ok了

这种迁移方式不会有残留,很干净

迁移方式2:符号链接,在原地留下一个符号链接,不占用c盘空间

三、.AndroidStudioXXXX文件夹

这是android studio的配置文件目录,容量可上G。这个文件夹无法通过改环境变量来达到迁移的目的

迁移方式1:修改android studio的配置,位于安装目录下的bin/idea.properties。感兴趣的可以去改

缺点:不能完全迁移,总有残留,而且每次升级studio后此文件都会被覆盖回去

迁移方式2:还是用符号链接

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

这样看来,符号链接好像是万能的了。。。

但其实不然,符号链接需要被链接的文件或文件夹必须存在,否则将出问题

网上找了一圈没找到特别好的办法。个人比较偏向于插件法,但是插件总有停止维护的一天,不能总是依赖插件

贴一个修改functions.php的办法:

add_filter('upload_mimes''wpdit_filter_mime_types');
functionwpdit_filter_mime_types($mimes)
{
    $mimes['ttf'] = 'font/ttf';
    $mimes['woff'] = 'font/woff';
    $mimes['svg'] = 'font/svg';
    $mimes['eot'] = 'font/eot';
    return$mimes;
}
在wp-include文件夹下面的functions.php文件中添加这个,就能让wordpress支持这些类型的文件上传
注意1:光这样做只是让wordpress认可这些类型,web服务器可能还是不认可,所以需要在ngix或者apache,或者其他的web服务器上添加上对应的mime类型才ok
注意2:每次WordPress升级后,functions.php文件会被覆盖,所以每次升级后都需要手动修改,这是最麻烦的地方