2015年7月22日星期三

如何调戏NSString - 坏了的攻城狮

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
如何调戏NSString - 坏了的攻城狮  阅读原文»

给出一个字符串@"I am a boy,I like playing computer games",然后我们尽我们所能的调戏它.

NSString *string=@"I am a boy,I like playing computer games";

NSMutableString*mStr=[[NSMutableString alloc]initWithString:string];

首先,我们要了解一下这个字符串到底有多少个单词.

NSCharacterSet *characterSet1 = [NSCharacterSet characterSetWithCharactersInString:@", "]; // 将判断符"空格"和"逗号"存在NScharacSet中, 它会将我们在后面的字符串中的所有字符作为分隔符包括空格逗号等等..

NSArray *arr=[mStr componentsSeparatedByCharactersInSet:characterSet1]; //我们将这个字符串进行分割.

NSLog(@"%lu",(unsigned long)arr.count);

我们得到了 我们第一个需要的信息,这个字符串一个有9个英文单词. 在上面这个方法中,如果我们的分割符号只有一个"空格"的话, 那我们就不需要使用NSCharacterSet中的方法. 我们可以直接使用[mStr componentsSeparatedByString:(@" ")];也是可以达到我们分割的目的.

恩,是时候对这个逗号,做点什么了,总觉着它很碍事,因为他得出现,不利于我们的游戏,现在我们要找到它,然后用空格来代替逗号的位置.

NSLog(@"%lu", (unsigned long)[mStr rangeOfString:@","].location);

我们通过调用方法,找到这个逗号在这个字符串的位置是10,我们任性的先给它删掉.

[mStr deleteCharactersInRange:NSMakeRange(10, 1)];

然后,我们在给它加上

[mStr insertString:@"," atIndex:10];

我们在给它换成空格

[mStr replaceCharactersInRange:NSMakeRange(10, 1) withString:@" "];

ok,我们调戏逗号的过程其实就是对这个NSString做了一个简单地"增,删,改,查".

那么现在我们要将 我们改过的这个字符串里面的单词进行逆序输出了,在上面的代码中,我们已经把里面的每一个单词都取了出来放入了一个数组arr中,在接下来我们要在新初始化另一个可变数组arr1,我们要将arr这个数组做一个逆序遍历,然后将arr中的每一个元素都逆序的存入arr1中,这样操作之后,我们就已经完成了这个数组的逆序排列. 然后我们重新将这个数组通过调用 componentsJoinedBySring这个方法重新组成一个新的字符串,用"-"来分割没一个单词.

NSMutableArray * arr1=[[NSMutableArray alloc]init];

NSEnumerator *enume=[arr reverseObjectEnumerator];

NSString*obj;

while (obj=[enume nextObject]) {

[arr1 addObject:obj];

}

NSString*str1=[arr1 componentsJoinedByString:@"-"];

现在的这句话已经变成了: games-computer-playing-like-I-boy-a-am-I

这样可以了么?不不不,还不够彻底

我要将它的每个字符都打印出来,然后用空格作为间隔符号在重新组成一个字符串.

NSMutableArray*arr2=[[NSMutableArray alloc]init];

NSUInteger len = [str1 length];

for(NSUInteger i=0; i<len; i++)

{

[arr2 addObject:[NSNumber numberWithChar:[str1 characterAtIndex:i]]];

}

arr2中就是我们所有的每个字符,但是arr2保存的是我们的ASC码形式的字符串,我们还要将他们转换成我们的字母

NSMutableArray*arr3=[[NSMutableArray alloc]init];

for (int i = 0; i < arr2.count; i++) {

int intSting=[[arr2 objectAtIndex:i] intValue];

NSString *stringInt = [NSString stringWithFormat:@"%c",intSting];

[arr3 addObject:stringInt];

现在这个arr3中存得就是这个字符串中的每一个字符了,然后我们将他们组合起来

NSString*str3=[arr3 componentsJoinedByString:@""];

games-computer-playing-like-I-boy-a-am-I

NSlog("Are you ok,my string?");

调戏完毕!


本文链接:如何调戏NSString,转载请注明。

MD中bitmap源代码分析--SYNC IO和RAID5的补充 - fangpei  阅读原文»

  最近在做bwraid的R6的设计工作,需要调研一下bitmap下刷磁盘的IO属性(是否为SYNC IO),还有raid5中bitmap的存储和工作方式。

1、bitmap刷磁盘是否为 SYNC IO?

  这样分为两种情况进行分析。前面写过的博客中提到过:bitmap可以有两种存储方式,一种是internal,一种是external。internal bitmap是存放在raid设备的成员盘的superblock附近(可以在之前也可以在之后),而external是单独指定一个文件用来存放bitmap。

  当bitmap以internal方式存放时,盘整中每个成员盘都会存放一份bitmap,这种情况的bitmap下刷为SYNC IO,此时下刷bitmap的bio属性BIO_RW_SYNCIO和BIO_RW_UNPLUG均有;

  当bitmap以external方式存放是,整个盘阵的bitmap只有一份(很有可能存储在盘阵设备之外),这种情况的bitmap下刷不是SYNC IO。
  SYNC IO意味着bio下发之后,不会停留在写缓存设备之后就认为已写入并返回,而会要直到IO落入真正的物理设备之后才会认为写入并返回。
2、bitmap在RAID5中如何存储和工作?
  
  R5的bitmap与R1相比较总体上的工作方式一致,这里我们仅分析internal方式存储的bitmap,这种情况bitmap会存储在每个成员盘上(包括数据盘和校验盘)。
  同样数据不一致则置1,一致则置0;“批量置1,延迟清0”的原则仍然适用;bitmap的刷磁盘的写IO为sync io(其实从磁盘读bitmap到内存中时的读IO也为sync io)。
  要注意bitmap是针对R5设备而言,而非针对各个成员盘。也就是说bitmap的1个bit代表的是R5地址空间中的一个chunk的数据是否一致。内存中存储有唯一的一份bitmap,并且会在写请求下发之前将其固化到每个成员盘(包括数据盘和校验盘)。每个成员盘有一份bitmap,每份bitmap都相同,成员盘中存储的数据是否对称对其没有影响。
  1) 假设场景是一块成员盘坏掉,换上新的盘,则需要做全盘恢复,与bitmap无关;
  2) 假设场景是拔掉了一块盘,之后又将其插上,则根据bitmap来进行精准恢复(读取该成员盘之外的其他成员盘数据,算校验/数据并写入该成员盘),此时没有掉电根据的bitmap为内存中的那份bitmap;
  注:根据rdev->saved_raid_disk的值来判断是否为这种情况。
  3) 假设场景是整个盘阵掉电,然后上电重启,则从一个可以工作的成员盘上读取bitmap到内存,然后进行精准恢复。
  注:3.1) 重启之后,用户使用命令发送Assemble给mdadm;
  3.2) mdadm处理这个命令,会调用start_array,而start_array会下发RUN_ARRAY的ioctl给md;
  3.3) md接收到该ioctl之后函数,读取成员盘上的bitmap到内存的调用路径:
md_ioctl -> do_md_run -> bitmap_create -> bitmap_init_from_disk -> read_sb_page -> sync_page_io

本文链接:MD中bitmap源代码分析--SYNC IO和RAID5的补充,转载请注明。

阅读更多内容

没有评论:

发表评论