毕业典礼

如果说之前说的毕业都是说说, 那么这回确实是真的毕业了, 彻彻底底地毕业了.

发了毕业证, 学位证和派遣证的, 还有一个毕业纪念品, 毕业照那张很长的照片总是有人告诉我是PS过的, 不过我也不知道是谁被修改了. 这两天去年那个竞赛的奖金和奖状也发了, 真是不容易, 竟然拖到现在, 不过还好, 赶在毕业发了下来, 要不就不知道去哪了以后.

晚上全班同学吃了另外一次散伙饭, 这其实才是真正的散伙饭, 去的大卫美食城. 里面除了我们班, 还有好多其他系其他班的人. 到了最后, 看到了要不就是几个人抱着不走, 要不就是几个人痛哭流涕泣不成声, 才恍然大悟这就是最后一天了. 回去简单收拾了一下必须要带走的东西, 我和这个学校, 这个宿舍就拜拜了. 不过还好, 我还有一个宿舍, 一个床.

毕业

在图书馆, 本来以为我还真可以拿着电脑在这看会儿Ruby, 结果发现还是看不下去. 终于就这样毕业了, 昨天上午论文答辩, 下午一起照相, 晚上一块儿吃饭, 到半夜在KTV吐的七扭八歪, 其实我印象还是有一点的, 但是我确实没有感觉到丝毫的所谓的伤感. 我也不知道为什么会这样, 按说这样一个季节是应该会那样的, 但是至少昨天丝毫都没有, 言外之意是现在有点? 我也不知道.

不管怎么样, 事实就是, 我毕业了. 虽然6月份才开毕业典礼, 虽然明天晚上系里还会有欢送会什么的, 虽然我论文还得继续改, 因为一不小心竟然被搞成了优秀毕业论文… 我都莫名其妙的. 不过, 这一个月, 似乎也会像往常的一个月一样, 很快的过去, 然后下礼拜就得回公司继续上班.

图书馆还真是安静.

今天还真是闷热, 而且还阴天, 不知道过后的天气是不是都是这样子的了. 幸好是昨天照的毕业照, 发挥的还比较完美, 要是今天照的话, 那就指不定什么样的了.

班里貌似已经有人准备要开始回家了. 嗯, 回吧, 早晚得走不是么.




终结了3月

上篇博客是在2月底, 现在俨然已经到了4月初了. 时间过的简直是太TMD快. 北京外面下了小雨, 我还是不喜欢下雨我发现, 弄的满身很湿很难受, 不过听别人说南方的夏天貌似只要在外面就是湿的, 我就在想, 那得是一种什么状态啊… 还好我暂时在北方.

最近发现iOS上的网络应用程序的架构越来越清晰了, 也是这几天经常半夜想代码想出来的, 再加上高人指点, 于是这个整体的异步下载层架构就被我这么想明白了, 而且程序走的流程很清晰, 不会像原来搞的那么乱, NSNotification还是要善用的, 虽然用多了会产生一些恶心的结果. 最终还是把Model变成了很胖, Controller却轻松了不少. 原来可能1000+行的Controller现在也就不过300行. 不过今天着实被NSPredicate的语法恶心了一样, 虽说很久不用SQL语句了, 但是在Core Data中使用这种每个类库语法都不一样的查询语句着实是很麻烦, 而且我看官方文档上明确写着, SQL是不可能转换成NSPredicate的, 至少官方不提供这种方法. 我前些日子在Github上发现了一个Core Data + ActiveRecords的东西, 甚是好用, 虽说作者说是灵感来自Ruby, 不过我记得我很久之前写.NET的时候也见过类似的类库.

最近每个周六都要加班, 但是明天算是正常上班, 我终于迎来了一个小长假了… 我这些日子的感觉就是, 我快被逼死了, 我快崩溃了, 不过还好, 就这么就过来了. 最近貌似所有人的心情都不是很好, 估计也就这些日子, 这个波折的3月, 终将终结这一堆浮云的事情.

我想

我想开学
我想去上自习
我想去图书馆
我想去湖边坐着
我想吃大饼鸡排
我想去食堂, 东院西院A座心园宿舍都行
我想去上课
我想学习
我想住宿舍
我想搞竞赛
我想背单词
我想骑单车去上课
我想期末考试
我想复习
我想刚开学就想着赶紧寒暑假的时候
我想一没课我就往家跑的时候

How to Make a Very Fast TableView on Mac with Variant Cell Height

I recently started my project to build my own Sina Weibo (a Chinese Twitter clone) app for the Mac. I started with NSTableView just like how I usually deal with UITableView on iOS programming, but I finally found that NSTableView is very complex and it’s completely different with UITableView, especially for custom cells and variant cell height. I have to use NSCell subclass instead of NSView subclass in NSTableView. Luckily, I then found an article Making Cocoa List Views Really Fast which talks about the performance issue about NSTableView. The author of the article wrote his own implementation of NSTableView, just like a UITableViewPXListView.

The benefit of using PXListView is that I can finally use NSViews as my cell instead of NSCells, so that you can construct your cells very easily just like how you make a custom UITableViewCell on iOS. However, I still have many issues when using this framework. Here is the thing:

My app is a Twitter-like app, so I need to show the Tweet and the Retweet in one cell, and the height of my cell is some paddings + Tweet NSTextView height + Retweet NSTextView height, which is based on the width of my PXListView, that is, when I changed the width of my PXListView, the height of each cell will be changed.

I then found the NS(Attributed)String+Geometrics category by Sheep Systems, which solved some of my problems. But it is way too slow because I have to calculate the height of NSTextView twice – in PXListView delegate listView:heightOfRow and my custom cell’s drawRect method.

After I looked closely through the category by Sheep Systems, I found that it used NSTextContainer, NSTextStorage, NSLayoutManager to calculate the height of the NSTextView with a fixed width. Every time the method was called, I have to alloc, init, and finally release them. It was just a waste of memory and time. I then suddenly found that all the three necessary classes to calculate the text height are just right in an NSTextView instance. So I rewrote the category to this:

@implementation NSTextView (Geometrics)

- (CGFloat)heightForWidth {

    if ([[self textStorage] length] > 0) {

		// Checking for empty string is necessary since Layout Manager will give the nominal
		// height of one line if length is 0.  Our API specifies 0.0 for an empty string.

		// NSLayoutManager is lazy, so we need the following kludge to force layout:
		[self.layoutManager glyphRangeForTextContainer:self.textContainer];

		return [self.layoutManager usedRectForTextContainer:self.textContainer].size.height;
	}

	return 0;
}

@end

It’s very clean now and have a great performance. Another thing is that I still have to call it 2 times when the cell is scrolling. To solve this, I wrote a TextViewHeightCache, which will cache the height of the given text with a fixed width. Next time PXListView asked for the height, the TextViewHeightCache first checked wether or not the height of the provided width is available in the cache. If we found it, just return the corresponding height, otherwise, recalculate it.

#import "NSTextView+Geometrics.h"

@implementation SNTextViewHeightCache

- (id)init {

	if ((self = [super init])) {
		textView = [[NSTextView alloc] init];
		textViewSizes = [[NSMutableDictionary alloc] init];
	}

	return self;
}

- (CGFloat)heightForText:(NSAttributedString *)text withWidth:(CGFloat)width {

	NSValue *sizeValue = [textViewSizes objectForKey:text];
	if (sizeValue) {
		NSSize size = [sizeValue sizeValue];
		if (size.width == width) {
			return size.height;
		}
	}

	[[textView textStorage] setAttributedString:text];
	[textView setFrameSize:CGSizeMake(width, 0)];

	CGFloat height = [textView heightForWidth];

	[textViewSizes setObject:[NSValue valueWithSize:CGSizeMake(width, height)] forKey:text];

	return height;
}

- (void)dealloc {

	[textView release];
	[textViewSizes release];

	[super dealloc];
}

@end

Now we have a very fast table view with variant cell height, completely without any knowledge of NSTableView.

Hey you.

话说, 上个礼拜我回到北京就遇到了倒了血霉的事情, 我开完窗户, 就蹲下看那个牛奶有没有过期, 结果我一站起来, 惨剧就发生了, 头直接撞倒了窗户底下的牙子, 于是鲜血直流, 真是一点也不夸张啊, 我去拿纸的时候都直接流地上了. 结果过了一个礼拜, 现在我还没事头晕乎乎的, 也不知道什么时候才能彻底好. 还有那个眼睛, 医生说是鼻炎的问题, 我了个去的, 鼻炎竟然会眼睛疼.

前天天津下了一整天的雪, 而且有几个小时下的很大很大, 我也是第一次在天津看见下雪, 于是拍了一张照片.

然后昨天是那个情人节神马的, 啥也没干, 想去吃个饭, 结果饭馆各种人满为患, NND, 最后落脚到一家什么桂林餐厅, 吃完我就觉得, 那货真难吃. 还听说最近可能北京在禁止出租隔断间, 我靠, 这事要是真的, 我岂不是在北京混不下去了…

其实在北京的感觉就是, 总想回家.

小学同学聚会

=。=!说了好久要更新博客, 结果就一直给忘了! 我想找回我那个老博客的风格!!

前些日子就一直盼着春节的假期, 结果到了春节吧, 发现我没啥好做的, 结果就晃晃荡荡的到了现在. 我就纳了闷儿了, 我这眼睛怎么就又出毛病了, 我记得我11月份的时候因为感冒的原因眼睛就疼过一阵子, 结果好了后来, 现在又给我开始了. 这不能够啊, 我眼睛必须得赶紧好, 于是我三十儿和初一那两天早上都去了医院, 结果最后第二个医院说第一个医院的诊断是浮云, NND, 我也不知道信谁的, 于是这几天就是各种滴眼药, 眼药水换了三瓶, 可是… 到现在还是有点疼, 所以, 明儿还得去医院.

要说聚会, 也是奇了怪了, 没有初中聚会, 没有高中聚会, 却冒出来个小学聚会, 不过今天过的真不错啊, 看见了各种人, 虽说一开始都有点不老认识, 不过后来熟了一点之后也还觉得不错竟然, 感觉这次聚会还挺成功, 唯一的遗憾是没有个照片什么的, 竟然也没人拍最后, 真是的. 还有我想称赞一下那个Hellen’s餐厅, 很不错, 在天津还能找到这样的地方真不容易.

话说我最近觉得Cocoa编程有的地方比Cocoa touch要简单很多, 可是有的地方却很复杂, 比如那个挨千刀的NSCell, 简直不知道是什么玩意儿, 在Cocoa touch里根本木有NSCell那个东西, 所有的控件东西都是继承自UIView. 简单的东西吧, 就是那个Cocoa Bindings, 简直太方便了, 这俩平台应该互相改进一下, 就完美了. 还有一个问题就是讨论Cocoa的太少了, 一般都是讨论Cocoa touch的, 感觉iOS的用户貌似应该比Mac的用户要高都… 真是奇怪.

Working in Peking

真的是好久不写博客了, 这回不是懒得写, 真的是没有时间写. 天天从早上一睁眼, 就一直忙到晚上睡觉, 中间能和同学聊几句QQ就已经算是奢侈. 来北京快1个月了, 却除了南站外, 没离开过村里一步, 除了那天公司聚餐出去吃饭, 也不是我走出去的. 本来想出去转转, 可是也因为礼拜五要回家, 礼拜一早上再来而一直搁浅.

工作还是蛮有意思, 可是有时候也会很烦. 木有办法, 只好忍住, 把这个繁忙的季节过去, 明年就一切都好了吧. 转眼间大四的第一学期就已经结束. 记得还差5, 6个礼拜结束的时候我还在网上说没几个了礼拜了, 现在是真的没了.  下学期没有课, 只剩下毕业设计和论文了. 目前也是处于懒得写的状态, 问题是我连期末考试都不能保证了, 毕设和论文还是边儿呆着去吧.

今天是圣诞夜哈, 明儿就是圣诞节, 可是还要加班, 一样木有办法.

2011就快来了, 我这博客, 又要多一年了…

该发生的早晚还是会发生, 即使现在不发生, 以后也会发生, 虽不知道是早发生好还是晚发生好, 但是现在的结果就是, 已经发生了. 很久不写博客, 确实也找不到写的感觉, 更找不到高中时, 大一大二时写博客时的激情, 甚至说是一种精神放纵, 特喜欢那时候的抱怨, 虽说是不抱怨的世界, 但是当时的抱怨现在感觉是那么舒服, 令我的确非常羡慕现在的大一新生, 大四的感觉, 真是一点都不好, 这谁都知道.

下个周末, 就要去北京了, 也就是一周至少5天都要在北京. 租房子的问题还弄得一头雾水没有进展, 现在也只好拖着等到时候再说, 其实我觉得, 已经有点晚了现在, 到时候不要露宿街头就好. 在网上看了一下房子的大概情况, 一个15平米左右的房子一个月是要1200左右, 实在是好贵, 才觉得原来财大的宿舍真是便宜啊. 东西不想准备太多, 差不多就行, 和我上大学时一样, 一个小小的行李箱足矣, 想当时, 还是我自己把行李拖到859上, 然后坐车直接到了财大, 结果还下错站了, 跑到了后门才下车, 于是又折回正门去. 公司现在要让我做的东西, 其实我也不太在行, 希望到时候不会出问题吧.

从上个礼拜日在家洗了个澡到学校后就感冒开始, 到现在还没好, 最近眼睛总是很不舒服, 右眼, 总是不想睁开, 也不知道怎么搞的, 赶紧好了吧. 最近生病的还真是不少, 看来不只是我一个人遭罪, 虽说是心里平衡一下, 但还是希望大家都好.

想想这个学期, 9月份的时候, 虽然天气很热, 几乎每节课都去上, 没事看着大一的军训, 和朋友没事出去溜溜, 玩玩, 心里还挺美的. 10月份的时候, 天气不错, 秋高气爽, 接到竞赛的任务, 于是开始天天泡在二教实验室里, 就那么泡了一个月. 然后我就习惯了在那个小角落里泡着了, 感觉真好. 10月还有各种招聘的笔试, 都去了, 却都没有后续的消息, 虽然我心里不是很舒服, 不过也就那意思, 好说. 11月, 天气有点冷, 但也还算好, 我依旧泡在那个角落里, 每天看着PHP, 闲了就去投几份简历, 还没事去团购各种吃的, 去参加学校里的各种大公司宣讲会, 看了点什么高雅艺术进天财, 也去看了大一新生的迎新晚会. 结果终于到了这个月的18号, 我去了北京, 就那么轻松的找着了工作, 于是我就应下来了. 然后说我可以先回到天津工作, 就这么我在那小角落里写了一个星期代码, 结果就被告知12月初必须要回到公司里去, 没有办法, 只好准备走人. 其实, 我要去那, 至今都没几个人知道, 知道的, 也都是至交了. 12月还没到, 不过我能想象出来, 周一到周五, 白天我在公司里敲着代码, 晚上在北京的某个小房间里, 一个人对电脑发呆. 周六周日回来看看, 再回到机房呆呆, 去图书馆看看他们学习考研, 然后打听打听期末考试的事情, 一起吃吃饭, 回家看看, 然后再回到公司工作. 大概就是这样吧.

本来是不想写那么多有的没的, 可是还是不知不觉写了不少, 我是很少写长篇, 不过这个看似真的不少字. 就这样吧.

随便写点

给BLOG加了一个防SPAM的插件, 终于再也收不到那些垃圾评论了, 邮箱感觉也清净了很多, 因为收到邮件看到是垃圾的话会令人很烦躁. 貌似离上次已经过了10天, 本来想等到过一刻天的时候再来写点什么, 可是捡到了这么一个快熄灯又什么都不想干的时间, 于是就来随便写点.

那天有新华社的什么玩意儿来给照毕业照, 就是毕业证上的毕业照那种东西, 我发现是个人类穿上西服都能人五人六的在那晃悠, 其实我是说我… 我总觉得我穿那个特别别扭… 不过照相的过程实在是很令人不爽, 竟然不到3秒就完事了, 我还想着像照身份证那样得重来好几次了.

才发现虽然电脑电源接上插座了, 可是插座一直是关着的, 估计今天晚上熄灯之后电脑不会活的太久就会没电, 不过已经两年了, 感觉电池还就算是比较强力. 不过我原来越懒得用这个本, 不知道为什么. 虽然我知道不可能换新的了.

昨天回家我就震惊了, 竟然楼道里的整面整面的墙上全是被盖上的修水管子的印章, 估计除了重新刷浆没有其他办法能搞定了, 这都什么年头了, 这么还有这么恶心人的事情出现, 真是令人费解. 不过昨天回家的过程也是异常漫长和艰辛的… 简直就是 =。。=! 对 就这个表情.

我总感觉用微博后, BLOG上就不知道写点什么了, 感觉平常都把改写的东西写到那上面去了.