CodingMyLife

Cocoa Ruby .NET

发布PhotoInfo v0.6.

126 views
November3

最近喜欢上了摄影,交流的时候发现大家都会把拍摄信息加到照片上,Windows下面用光影魔术手就可以方便的做到,但是Mac下面我没找到可用的(中间尝试了iWatermark,但是不好用)。 索性自己写个算了,实现添加相框和拍摄参数。

用法:

  1. 拖放照片(必须是jpg格式)或者包含照片的文件夹到程序窗口。
  2. 设置好输出路径后点击“开始处理”就好了。

界面截图:

Read the rest of this entry »

posted under PhotoInfo | 3 Comments »

用NSData玩转二进制文件的读写。

73 views
October28

今天看到有同学问如何读写二进制文件,那就顺道讲一下吧。 在Cocoa的世界里,所有与某个物件相关的东西都被该物件实现。好吧,我承认,这句话比较扯…. 还是上例子说明吧。

在通常的编程语言里面(这里指的是C/C++/Java/C#/Ruby/…),以下几个东西是如此关联起来的:

字符串类用来处理字符串存储,查找,替换…等等常规功能。 路径类用来处理所有与文件系统路径相关的事情,比如什么把路径分段,拿到文件扩展名,文件是否存在等等。 目录类则用来看某个路径的目录是否存在,是不是为空,等等。

这里一般会有三个类来处理各自逻辑相关的事情,但是,注意但是,Cocoa里面的构建法则不是这样的,它把所有与字符串相关的功能全部封装到了字符串类里面。 所以,NSString可以做的事情超多,从打开文件读取/写入字符串内容,到判断路径是否存在,等等,所有的事情,它都一手包了。 这样倒是方便程序员了,反正一旦有什么事情和字符串有点关系,找它准没错。

好了,讲了这么一堆,回过头来看这个问题,如何读写二进制文件?我写了各种类型的数据(整形,浮点,字符串)进去,怎么读出来? 这里提到了二进制对吧,也就是数据对吧,那么好了,找NSData就行了。

来看这段小代码,我准备了一个文件路径做演示,还有几个要写进去的数据。 Read the rest of this entry »

posted under Cocoa | No Comments »

Core Image 学习笔记 - 为照片加边框和EXIF信息。

59 views
October20

最近迷上了摄影,拍了很多照片之后就想上传跟大家分享。到色影无忌和几个摄影论坛上一看,发现很多人的照片都有不错的边框、水印和拍摄信息(相机类型、光圈、快门、拍摄日期等等….)。 因为用的是Mac,找了很久,没有发现…(为什么每次写东西都是这个理由?) 好吧,废话少说,先把要做的事情分类。

1.调整图片大小,毕竟放到网上的图片不需要原图那么大。

以下是学习了Core Image之后的一点点实践。

NSImage *image = [[NSImage alloc] initWithContentsOfFile:path];
[image setScalesWhenResized:YES];
[image setSize:NSMakeSize(1000.0, [image size].height * (1000.0/[image size].width))];

这个方法确实可以调整大小了,但是缩小的图片质量非常差。花了很多时间仔细看文档,最后发现,Core Image其实就是对于Quartz 2D的包装,所有的绘图操作其实都值对于当前的NSGraphicsContext起作用,NSGraphicsContext本身有很多属性用来控制当前绘图的各方面。 而如果只是使用默认设置的话,绘图质量默认是最低。这里我们需要手动设置成高质量。 添加以下两行到代码开头:

//质量设置成高
[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
//打开反锯齿
[[NSGraphicsContext currentContext] setShouldAntialias:YES];

Read the rest of this entry »

posted under Cocoa | No Comments »

C语言练习 - 用筛选法算质数。

38 views
September6

这是《C和指针》第六章的习题,用筛选法算质数。因为用到了动态数组,所以需要gcc 3.4 以上版本编译。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void primes(int range)
{
	int width = range / 2; //只计算奇数,空间效率提高一倍。
	char nums[width];
	char *pnums;
	size_t i, j, temp;
 
	for(pnums = nums; pnums < nums + width; pnums++)
	{
		*pnums = TRUE;
	}
 
	for(i = 1; i < width; i++)
	{
		pnums = nums + i;
		if (*pnums)
		{
			temp = i * 2 + 1;
			for(j = i + 1; j < width; j++)
			{
				if (*++pnums)
				{
					if (!((j * 2 + 1) % temp))
						*pnums = FALSE;
				}
			}
		}
	}
 
	printf ("1 2 ");
	for(i = 1; i < width; i++)
	{
		if (nums[i])
			printf("%d ", i * 2 + 1);
	}
 
	printf("\n");
}
posted under C | 3 Comments »

重新开始学习C语言的第一段小程序 - del_substr。

35 views
September2

看的书是《C和指针》,现在回头再看C,有了很多新的体悟,也让我开始觉得脑子抽筋。告别太多年的指针让我死去活来,非常不习惯,好在多年养成的习惯还在,也不需要赶时间,慢慢来吧。相信啃下了指针之后就会顺滑很多了。

下面这段代码是《C和指针》第六章的一个习题,写出来很是花了我一番力气。又一次体会到了那种为写一行代码抓掉n根头发的感觉。。。。。 中间为了调试,又花时间学习了gdb,让我这个被IDE惯坏的人惊艳了很久。好东西啊!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int del_substr(char *str, char const *substr)
{
	char *ptr_substr = (char *)substr;
	char *strP = str;
	char *temp;
	bool fullMatch = TRUE;
 
	for(;*strP != '\0'; strP++)
	{
		if (*strP == *ptr_substr)
			break;
	}
 
	temp = strP;
	if (*temp != '\0') //Match first char.
	{
		while(*ptr_substr)
		{
			if (*temp++ != *ptr_substr++)
			{
				fullMatch = FALSE;
				break;
			}
		}
 
		if (fullMatch)
		{
			while(*temp)
				*strP++ = *temp++;
			*strP = '\0';
			return 1;
		}
	}
 
	return 0;
}
posted under C | No Comments »

我使用的Firefox 3.0扩展。

29 views
June28

看到Shoegazer写了篇关于他使用的Firefox3.0的扩展。参考了他的选择,我也作出了自己的选择。

应用程序: Firefox 3.0 (2008061004) 操作系统: MacOS Leopard 10.5.3

Project Euler - Problem 18

94 views
April14

今天解决了Project Euler第18个问题,记录一下解题思路。

题目如下

从三角型的顶端逐行往下移动,然后路径上数字的和最大是23.

1
2
3
4
   3
  7 5
 2 4 6
8 5 9 3

以上这个例子就是,3+7+4+9=23. 找到以下三角形从顶到底路径的最大和:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                           75
                         95 64
                       17 47 82
                     18 35 87 10
                   20 04 82 47 65
                 19 01 23 75 03 34
               88 02 77 73 07 63 67
             99 65 04 28 06 16 70 92
           41 41 26 56 83 40 80 70 33
         41 48 72 33 47 32 37 16 94 29
       53 71 44 65 25 43 91 52 97 51 14
     70 11 33 28 77 73 17 78 39 68 17 57
   91 71 52 38 17 14 91 43 58 50 27 29 48
 63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

注意:这里只有16384种路径组合,所以可以使用暴力方式得到答案。但是Problem 67,同样的题目,三角形有一百行,不能用暴力方式求解。所以,找到一个聪明的方法才是正道。

Read the rest of this entry »

posted under 算法 | No Comments »

4月3日算法挑战。

75 views
April3

今天的算法挑战题目如下: 输入字符串,比如: “fb,bc,ac,eb,da,ga” 每组2个字母,用逗号分割。 第一个字母是节点,第2个字母是它的父结点。 写个函数处理输入字符串,并输出整个树的结构。

输出结果:

1
2
3
4
5
6
7
c
|-a
|  |-g
|  |- d
|-b
    |- e
    |- f

Read the rest of this entry »

posted under Ruby | No Comments »

Mechanize使用手册(翻译)。

126 views
March29

开始使用 WWW::Mechanize

本教程的目的是帮助你开始使用Mechanize。读完这篇教程之后,你将可以抓取页面,点击链接,填写和提交form,抽取数据和其他一些可能有用的事情。此教程仅仅只是涉及到了非常粗浅的功能,但因该已经足够帮助你起步了。

让我们抓取一个页面

你要做得第一件事情就是在代码里引用mechanize,然后初始化一个新的mechanize实例:

1
2
3
4
require 'rubygems'
require 'mechanize'
 
agent = WWW::Mechanize.new

现在我们将使用刚刚创建的agent来抓取一个页面。就拿Google开刀吧:

1
page = agent.get('http://google.com/')

发生了什么事情?我们让mechanize去抓取Google的主页。Mechanize会自动存贮相关的cookie,甚至会跟踪Google发过来的自动跳转。Agent会帮我们抓回来一个页面,我们可以用来抽取数据,找到并且点击链接或者填写一个form.

Read the rest of this entry »

posted under Ruby | 1 Comment »

使用mechanize+hpricot备份饭否数据。(续)

67 views
March29

测试了一段时间之后用mechanize+hpricot要比用正则方便很多,所以完善了一下上次写得脚本。 功能算是比较完善了,能够自动去拿目标用户的所有消息,不用手工输入留言页数了。 大家感兴趣的话可以点击这里下载。 用法: 1. 解压得到脚本“BackupFanfou.rb”. 2. 用任意文本编辑器打开上述脚本,在末尾加上下面两行:

1
2
b = BackupFanfou.new("你的饭否登录帐号", "密码")
b.backup("需要备份的用户名", "备份保存路径")

例如:

1
2
b = BackupFanfou.new("allengnr@gmail.com", "XXXXX")
b.backup("allendang", "~/Documents/Test.txt")
posted under Ruby | No Comments »
« Older Entries