JSONKit :Illegal \u Unicode escape sequence

When JSON string contains unicodes between u0000 and u001f, JSONKit parser fails to work properly. and throws a error as “Illegal \u Unicode escape sequence”.

This is a known issue(link) but seems like the author thought it’s a fault caused by content provider and didn’t intend to have any fix on this issue.

In this particular case, these services are very clearly “in the wrong”. RFC 4627 is unambiguous that characters < 0x20are verboten. In cases like there, where something is clearly violating the standard, my default response is that “It’s the other persons (web service) problem.” The standard is the standard, and it is Right(tm), even its mistakes.

But in fact there are many JSON encoder may generates JSON string contains invalid characters < 0×20 including Python2.6, <not tested in Python2.7>, pre-rails3. We all love the clean codes but we need make things done first.

SOLUTION:

Edit JSONKit.m file:

 //GOTO Line 1462 or nearby
//      remove this line
//      if(JK_EXPECT_F(currentChar < 0x20UL)) { jk_error(parseState, @"Invalid character < 0x20 found in string: 0x%2.2x.", currentChar); stringState = JSONStringStateError; goto finishedParsing; }
//      add following codes
        if(JK_EXPECT_F(currentChar < 0x20UL) && (parseState->parseOptionFlags & JKParseOptionLooseUnicode) == 0) {
            jk_error(parseState, @"Invalid character < 0x20 found in string: 0x%2.2x.", currentChar); stringState = JSONStringStateError; goto finishedParsing;
        }
        else {
            currentChar = 0xFFFDUL;
        }

ADBlockPro – iPhone广告滤手全能王

ADBlockPro(广告滤手全能王) 是个给iPhone iPad 设计的阻挡软件内的广告条插件,健康安全环保,无毒无害无副作用。

ADBlockPro_广告滤手全能王

主要功能:

  • 安装前:广告。。广告。。广告
  • 安装后:去软件内广告,立竿见影。

支持过滤广告商

  • Google Admob
  • iAD
  • Domob (多盟)
  • GuoHe (果合)
  • …实在太多,写不下了。

支持设备

越狱的设备iOS3.0 + , iPhone4, iPhone4S, iPad, iPod Touch 理论上都支持

下载

  1. 打开Cydia 选择软件源管理
  2. 新建软件源   http://cydia.myrepospace.com/xhan/
  3. 找到 ADBlockPro 安装
  4. 世界清净了。

用户说

H小杰小朋友使用后表示非常好用。

常见问题

  1. 会和其他软件冲突吗?    NO!
  2. 会影响设备耗电吗?       NO!
  3. 怎么还有软件能显广告   (1.白名单过滤了  2.请留言将软件名字发我)

PS

写这个插件的原因 1.学习Cydia软件开发  2.突然发现好像没类似的软件(其他都是去Safari的广告).

PPS

   如果你也对写这方面的软件有兴趣,不妨搜索下这些关键词 MobileSubstrate, theos,  tweak

愚人节计划

30 – 7 – 12 = 11天

12日 未开始

停住的记忆

还剩几个小时就是iPad3的发布会了,微薄上兴奋的讨论着这次苹果给大家带来什么新的革命性进化,我却突然冒出个画面:iPad第一代发布时候老乔在发布会中恶搞的一张上帝拿着个iPad的图。

记不清08年实习时第一次见到iPhone,macbook air|pro 时的感受了。但用手指在屏幕上滑动的快感,以及在笔记本上两个手指滚动网页的奇怪感觉却永无法忘记。那时候devon还有个牛皮袋,就和发布会上的一样。每次来上班他先从袋子中抽出电脑,再放到腿上开始干活,无比的羡慕!而现在,满大街都是各种iPhone,以及其他大屏幕手机。商场中遍布苹果的体验店,macbook air,iMac这类设备大家也习以为常。苹果一年的利润超过了google一年的收入。而微软,除去仍然占据着不错的操作系统份额,越来越少被人提起。

曾经,我们没错过一个苹果的发布会。几天前大家就会开始各种预测,然后直播当日便会挂上skype,同时打开n个图文直播网站,关注着地球另一边的一个发布会和朋友们一同分享喜悦。现在大家都安静了不少,甚至会为苹果辩解这次为什么没出给力的产品:你不懂,整合和生态圈才是苹果的最终目的。。不要小看这次发布的软件,可厉害了!。。。你不懂,这次发布的xx可是革命性的,它。。。。

今天搜索时突然找到了自己的一个老博客,里面有篇我写的一个windows扫雷作弊器的源码。扫了下,发现我已经完全记不得MFC的流程和各种奇怪宏的作用了。也许那时候是死记硬背MFC的流程的,才至于如今看那代码有完全陌生的感觉,否则也太老年痴呆症了。

然后顺着这个博客我慢慢挖掘出了许多大学时代的回忆,这些回忆大部分都和各个网站的一个个ID紧紧的绑着。有我大学论坛的帐号(还记得发了个卡巴斯基破解版,以及h3c vista兼容版骗到的几个精华帖。 还有刚入校后回家组队老乡一同回家的贴纸,幻想着能和单身妹子回家的幸福生活却从未成功=。=), 还有各种游戏论坛的帐号,记得还有个高级别的3dmgame的帐号,登陆后就能进入特别板块,可以下载日本Hgame哈。还有玩过的各种网游的帐号,那些帐号信息基本都已经忘记,和里面尘封着的人物和它们的好友们就一直锁在某处。

然后我想到了我的space.live.com帐号,结果发现已经停止服务。而且连迁移内容的服务也已经关闭。突然有些伤感,大学有段时间玩space玩的非常开心,认识了不少朋友,写了不少文章。而现在我完全记不得里面有什么了,那么多年轻的记忆,就这么丢了。

上周在女友家,忍不住在她电脑上安装了魔兽,非常兴奋的安装了dota对战平台准备找找刺激。结果安静的玩了几局Dota,输赢各半,少了杀了对方角色的快感,也没了太多失败时候的沮丧。满脑子想的是大学时候几个寝室间的大战,甚至后来天天通宵对战的场景。却找不到那种感觉了。

去年买了个xbox游戏机,买回来兴奋了几天后。现在基本已经和几十张买了后就未开封的游戏一起,尘封在公司里。唯一有价值的还是手柄电池,现在它们沦落成了我们的鼠标电池。

那些停留的记忆,慢慢模糊,慢慢尘封,使劲的回忆也没法想起具体的感动。但常常有一天我会突然想起某时候的一个片段,心中戈登一下,有些说不出的感受。

写到这里,突然想到个产品。大概叫 MemoryBook,就是能将你所经历的,所做的都存档起来。以后可以看相册一样浏览某时间的记忆。写到这里时again突然觉得这个产品和我们历史渊源的日记本非常相似,所以我要继续想想。

晚安。

Apple LLVM 4.0 带给ObjC的新语法

下载了Xcode4.4 Preview版本, 里面有段介绍:

Xcode now includes the Apple LLVM Compiler version 4.0, including the following newObjective-C language features:

  • Default @synthesize: automatically synthesizes an @property when unimplemented
  • Objective-C literals: create literals for NSArray, NSDictionary, and NSNumber, just the same as the literals for NSString
  • Objective-C container subscripting: use ‘[]‘ syntax to access containers such asNSArray and NSDictionary

一和三很好理解, 第二条没看懂. 搜索了下立马爽歪了. 这几个新特性真可以加快不少开发速度!

Objective-C literals

NSArray Literals

Previously:

array = [NSArray arrayWithObjects:a, b, c, nil];

Now:

array = @[ a, b, c ];

NSDictionary Literals

Previously:

dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
					forKeys:@[k1, k2, k3]];

Now:

dict = @{ k1 : o1, k2 : o2, k3 : o3 };

NSNumber Literals

Previously:

NSNumber *number;
number = [NSNumber numberWithChar:'X'];
number = [NSNumber numberWithInt:12345];
number = [NSNumber numberWithUnsignedLong:12345ul];
number = [NSNumber numberWithLongLong:12345ll];
number = [NSNumber numberWithFloat:123.45f];
number = [NSNumber numberWithDouble:123.45];
number = [NSNumber numberWithBool:YES];

Now:

NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;

原文Link

OSX下自定义文件类型和QuickLook

研究了几个小时如何自定义文件类型和自定义的QuickLook, 怕以后忘记怎么操作了. 总结下流程和写下简单的教程.

如果
  • 你想让你的程序支持自定义的文件类型
  • 让自定义的文件支持苹果的 Quick Look (大致就是选中文件按下空格后的预览图)
请继续看 –>
测试的例子是 Single Window Application + Custom bundle file type
  1. 不只是文档程序,单窗口程序也能支持响应自定义的文件类型
  2. Bundle 简单的说就是个文件夹, OSX系统可以将bundle识别单独的文件: 比如你的app就是个bundle. bundle在OSX下有许多作用,甚至还能对现有的app提供插件支持.
我们的目标是让 <name>.xxx 文件夹(里面有个叫xxx.jpg的图片)
  • 被识别成bundle
  • 有个独立的图标
  • 能被 app 打开并在窗口显示 xxx.jpg
  • 能提供Preview并显示 xxx.jpg
马上开始,为了节约时间略了些细节和图片描述, 请自行补充,无需100%按部就班

Part I

创建自定义文件:  新建个 name.xxx 的文件夹并丢入一照片命名为 xxx.jpg

Xcode中新建一个App: 在MainMenu里的view中拖入一个ImageView 并绑定到 AppDelegate 的imageView属性.

给App加个ICON: 拖入图标后,在info.plist里的图标选项里补充上名字

App注册自定义文件: 在info.plist 里添加新字段 UTExportedTypeDeclarations (自动补全后应该是array内容) 编辑内容如下:

UTTypeConformsTo 是指我们自定义文件的类型,  identifier和filename-extension是至次自定义文件的标识和后缀.

App注册文档文件: 只有注册指定的UTI(上步骤)为documentType, 才能使用此App打开该类型的文件. plist里添加新key,如图操作

每个key内容就不解释了,自己查阅文档 :D

编译运行App,然后关闭.  你应该可以看到 name.xxx 文件夹已经显示为一个带着你指定图标的文件了. 当然还是可以通过点右键-> Show Package Contents 来查看包内的内容.

Part II

目前双击 name.xxx 已可以成功打开我们的App, 但是有个”无法打开***”的错误提示.

添加app文件打开处理: 在AppDelegate.m 里添加如下代码

- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename
{
    NSString*path = [filename stringByAppendingPathComponent:@"xxx.jpg"];
    NSImage* img = [[NSImage alloc] initWithContentsOfFile:path];
    if (img) {
        _imageview.image = img;
        return YES;
    }else{
        return NO;
    }
}

现在已经可以成功处理打开自定义文件了 Wowowow! (测试中有个问题,返回NO也没出现 出错提示, 看来需要自己判断文件有效性 并弹出错误提示了 )  ,接下来就是非常好玩的 Quick Look 了!!!

Part III

选中 name.xxx , 按下空格后出现的放大的图标. 看起来还不错? NO, 必须得能够显示包内的图片才够完美啊.

PS. 其实让Package 文件支持Preview是非常容易的, 在包内新建 QuickLook 文件夹, 并放入 Preview.jpg 即可. 不过此方法不够灵活,  我就蛋疼的演示下写个自己的 Quick Look 插件.

Quick Look 插件是后缀为 .qlgenerator 的bundle, 有3处地方可以放置此插件

  • /Library/QuickLook       <系统级别的,安装iWork后里面就有个给iWork文档提供preview的插件>
  • ~/Library/QuickLook       <用户级别的>
  • <name>.app/content/Library/QuickLook   <App级别的>
我们这里选择方案3 <App级别> 开始:
App 工程新建Target: 选择 System PlugIns / QuickLook Plug-In
目录中生成了3个文件, 根据提示咱们不要改动main.c 文件, 将其他两个.c文件修改为.m , 由于对于CoreFoundation的函数实在没好感, 修改为.m 后方便继续使用高级别的API进行操作.
给此Target添加framework: cocoa.framework  (选中项目,右边的target, build parses / Linked With Libraries 里添加)
修改 GeneratePreviewForURL.m 里的同名方法如下 :
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
{
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSURL*imgurl = [(NSURL*)url URLByAppendingPathComponent:@"oo.jpg"];
    NSLog(@"!xxx get path %@",imgurl);
    NSImage* img = [[NSImage alloc] initWithContentsOfURL:imgurl];
    if (img) {
        NSSize size = img.size;
        CGContextRef cgContext = QLPreviewRequestCreateContext(preview, *(CGSize *)&size, true, NULL);
        if (cgContext) {
            NSGraphicsContext* context = [NSGraphicsContext graphicsContextWithGraphicsPort:(void *)cgContext flipped:YES];
            if (context) {
                [NSGraphicsContext saveGraphicsState];
                [NSGraphicsContext setCurrentContext:context];
                [img drawAtPoint:NSMakePoint(0, 0)
                        fromRect:NSMakeRect(0, 0, 0, 0)
                       operation:NSCompositeCopy
                        fraction:1];
                [NSGraphicsContext restoreGraphicsState];
                QLPreviewRequestFlushContext(preview, cgContext);
                CFRelease(cgContext);
            }
        }
        [img release];
    }
    [pool release];
    return noErr;
}

贴的代码有点多, 简单说下步骤

  • 根据传过来的url 生成 NSImage
  • 获取到 Preview的上下文, 并转换成 NS* 的上下文
  • 将图片绘制进当前的上下文
  • 然后刷新 Preview 显示内容
注意2点: 由于使用了foundation, 所以需要加入Autorelease pool.  由于plugin不好调试, 可以使用NSLog打入消息, 然后在 console 里 filter 来查看状况.
最后一步, 回到App的项目设置里, 新建一个 copy 的 Build Phases, 设置如下 : 

再次编译运行App后, 测试下是否成功!!!!!

DONE

New Arrivals

借此 糗事百科 app 上线之际, 将Less系列的两款软件稍作修改重新上架Mac App Store审核. 两个软件就 meta data, app description 和苹果审核人员沟通多次后,终于非顺利上线.

LessDJ 开源简约的Mac音乐电台, 和你喜欢的音乐不期而遇.

LyricStream (LessLyrics 的 MAS 版本, 收费! 支持iTunes和LessDJ的歌词显示)

 

截至写此文章时, LessDJ 目前排名 中国(Music 3, Top Free 37)  美国(Music 14) 很期待看到今晚的数据统计.

——- 更新 @Feb8,2012 ——-
昨日下载480个, 中国区总版13, 分类音乐第二. 希望有些参考

 

开源项目 LessDJ – 简约至上的音乐电台DJ

新年快乐, Mac上简约至上的音乐电台DJ软件 LessDJ 现已开源

下载此软件 link

项目地址  https://github.com/xhan/LessDJ

[Mac]终端中快速定位到Finder的当前路径

平时工作会非常频繁的使用到命令行, 常见的场景是需要CD到Finder的当前路径操作, 或是打开命令行当前的路径.  后者通过 open .  即可打开. 而前者的操作就比较繁琐, 我需要先输入 cd[空格] ,然后将文件夹拖入到终端中.

在忍受了无数次拖拽后突然想到通过 AppleScript 来获取路径并传送到终端. 考虑过ruby,需要额外的gem支持.  考虑过用 objc 写个工具, 但随后发现个命令 osascript 能直接运行 AppleScript的代码 ,解脱!

tell application “Finder” to set myname to POSIX path of (target of window 1 as alias)

这段代码能将当前的Finder的路径输出,  可以使用 osascript -e ‘codes’ 来测试结果.

编辑 ~/.profile  (没有就创建一个), 添加如下代码

function cdf() # cd to finder's front's window's path
{
   path="`osascript -e 'tell application "Finder" to set myname to POSIX path of (target of window 1 as alias)' 2>/dev/null`"
   if [ -n "$path" ]; then
      echo "cd to $path"
      cd "$path"
   else
      echo "no finder window finded"
   fi
}

然后source下此文件, 以后只要直接输入 cdf (cd-finder or cd-front 反正很好记) 即能切换到当前路径中.

Xcode4 作战效率提升手册

周一参加了 iOS Tech Talk Bejing 有个session中演示了一招加快debug效率的方式, 觉得非常好. 在此也分享下我常用的技巧方便提升大家的工作效率

基础篇

  • control +command + arrow up / down            切换 当前文件头文件和实现文件
  • control + command + arrow left/right             切换历史上/下一个文件
  • command B/R                                               编译 / 运行
  • command +  left click   on word                      可以在 方法的声明/实现, 变量的定义, 类的定义中跳转
  • option  + left click  on word                            对当前内容做 快速帮助
  • shift + command + Y                                     显示 debug工作区
  • command + f   / option + command + f           搜索/替换  (搜索后 command + G 可以跳到下一个结果)
  • shift + command + F                                      是全局搜索,非常方便
  • (esc)                                                             自动完成菜单

PS. 还有几个OSX系统通用的命令也很有效率

  • option + arrow left / right                以单词为单位移动光标
  • command + arrow left /right             移动光标到行头,行尾 

进阶篇

  • shift + command + o            快速定位文件
  • shift + command + j             在项目导航中显示当前文件 (在大项目中尤其好用,推荐!)
  • option + click 项目导航中的文件      可以在辅助编辑器里打开该文件, 方便同时查看多个源文件 (默认的辅助编辑器功能很弱,这样基本能找回xcode3的 split screen功能了)
  • command  + L                      定为到文件的指定行
  • shift + command +L              跳到光标所在位置 (当然更多时候我比较喜欢点下箭头来定位)
  • control + i                             对选中文字 重新格式化缩进

Debug篇

Xcode4 启用一体化IDE后, 调试程序有时候变得非常讨厌, 有同感的同学请继续往下看吧. (此内容学习至 ios tech talk ! )

  1. 新建一个tab(cmd + t) 双击tab名修改名字为 CONSOLE     #不知道tab可以改名吧! 这弱爆的体验呐
  2. 调整 CONSOLE tab为你喜欢的调试外观, 我喜欢有个大大的log窗口(shift+cmd+c), 左边显示debug栏,不显示右侧栏 , 留一点空间给编辑器, 方便断点时候跟踪 , 最后效果附图
  3. 可以将console tab关闭了 (xcode会自动记忆此tab的设置, 这下应该明白你调试时候经常有时候有log窗口,有时候又需要自己打开的原因了吧 )
  4. 在设置中打开 behavior 这选项
  5. 选择 run start , 只勾选 `show tab CONSOLE` 和 `show navigator Debug`
  6. 把 run complete 里的选项全关了.   # 这样调试结束我们还能继续看log,而不是默认的log也被关闭
  7. 完成, 运行 !  如果你有多个屏幕, 还可将console tab 拖出放置,效果更好!