posts - 21,  comments - 271,  trackbacks - 0
  2011年12月31日
摘要: 这篇文章是翻译自stackoverflow上的一个问题, 当然,是个蛋疼却有些意思的问题, ++[[]][+[]]+[+[]]结果是什么,你知道么? 看完文章我们会发现, 问题出现了不要紧, 最重要的其实是我们思考,分析和解决问题的方式, 如何在给定了一个难题利用自己学到的知识融会贯通的解决这个问题才是最重要的. 也希望大家在新的一年更快的成长把!阅读全文
posted @ 2011-12-31 19:41 jujusharp 阅读(1485) 评论(8) 编辑
  2011年8月30日
摘要: 从观望到入手到现在的淡然, 使用WinPhone差不多也近半年了. 也算是对WinPhone有些自己的看法, 数次在CB那种口水遍布的地方看到各种否定->驳"XXX->驳"驳XXX我都是很淡定的, 萝卜青菜,各有所爱, 特别是面对一个基本颠覆了以往的手机用户体验的手机来说, 有反对的声音在所难免,不过今天在看到有园友在园子里对WP吐槽, 觉得这样看来貌似大家对WP的偏见挺深的,就写篇文章来说说我的看法吧, 使用时间, 开发时间时间都有限, 如有不足甚至是错误的地方,还请大家轻拍为好~~阅读全文
posted @ 2011-08-30 23:34 jujusharp 阅读(7447) 评论(67) 编辑
  2011年8月9日

首先,这篇文章基本没什么技术含量,它主要是我对最近业余时间的WinPhone开发工作的一个总结.而且以我以往的学习经验来说,这篇文章很可能对读者中的大部分人都毫无用处,因为所谓学习方法因人而异,这我深有体会,所以这里我贴出自己关于WinPhone开发工作的一个阶段性总结只是希望里面哪怕能有一点点对你有所启示,那应该就算这篇文章的最大成功了.

自从去年工作方向由.NET转向PHP之后,C#基本就只能算我的一个业余爱好了,虽然仍然关注着这个圈子,也喜欢着这门语言,不过毕竟不是工作,没有实践,自己实在是感觉写不出怎样深刻的东西来,不过好在有了微软的WinPhone,纠结了几个月之后终于还是下手了HD7,也开始了自己WinPhone开发者的纯业余生活.到现在,虽然做的东西仍然很简单,但终于有了看得见的东西出来,我的手机号码归属地应用和中国地铁应用总算是成功挂到Market上了, 因此想想还是对这个阶段的开发工作做个总结比较好, 希望能给大家以参考.

额,好像我总是如此啰嗦,还是上正文吧.

1.写一行代码胜于看十页书.
    可能是因为之前已经有一定WPF/SL的经验,因此开发WinPhone应用时,除了微软官方的UI交互指南(因为WinPhone的UI设计理念确实和以前的应用不一样),我并未看一页书.大部分问题都是在遇到的时候才去网上查找资料解决的,当然,这并非说我没有查阅任何资料,实际上,直到现在,我每天仍然都会在WindowsPhoneGeek,MSDN和博客园上逛逛,看到不错的文章或者代码也会动手实践下.
    因此,以我的感受来说,对大部分的有一定的C#开发经验的园友来说,其实WinPhone的应用开发都不会太有难度以至于完全无法动手(当然,如果你做的是超级复杂的东西就另说啦),而且我始终认为从实际写代码中遇到问题->解决问题的过程所收获的经验要比从书本中别人讲解的经验要深刻得多.如果你真的对WinPhone开发有兴趣,那么从现在开始就动手吧,不用纠结于去看哪本书,就我从目前介绍WinPhone开发的书本目录介绍来看,这些书本一定都是第一章和第二章都是毫无意义的(第一章介绍WinPhone的设计理念,第二章介绍VS的WinPhone开发环境部署,对很多人来说,很是浪费纸张).动手不仅能更快发现你应用中存在的设计问题,还能解决实际运行中你永远无法想到的意外.
   当然,我并非反对看书,我的建议是如果你真想学WinPhone开发,那就多动手吧,这样你能更快进去开发的过程.

2.不要一开始就想把应用的功能做得够大够强够完美.
   不要一开始就想着做一个超级复杂,让人能一看就过目不忘的完美应用,这个我在开发过程中确实深有体会.其实我一开始并非想做上面的归属地应用和地铁路线图应用,而是一个斗地主的游戏,并且由于那时候WinPhone还不支持Socket,因此我一开始就计划设计一个足够聪明的AI系统,还为此复习了下很早之前丢掉的AI书籍,但越做下去发现越没信心做好,挫败感也越强.于是在经历了一个星期的空手而归之后,我开始进行反思,发现自己的AI知识实在是太过贫乏,这也不是我的优势所在,而且我的目的是至少前面一个应用是用来练手的,现在所做的工作实在不像,于是在下周开始果断放弃之前的工作,而该从手机归属地应用开始,一个界面简单,而是够实用.这样决定之后后面的工作就顺利了,并且有了第一个实用的工具第二个的思路也有了.这样在经历了一个多月的工作之后,终于还是将两个应用提交了,虽然知道所做仍然还是很浅薄,但看到能有东西挂在market上面的那种感觉确实完全不一样的.

3. 做出应用的特色, 但不一定要复杂.
    好的应用不一定要非常强大,老实说, 归属地应用确实简单,就一个界面,四个按钮,其他没啥了.但我从Nokia3230到Samsung i900再到现在的HD7,我一直都认为这个功能是我们日常生活中一个不可缺的功能.而且有了核心的功能你就可以围绕它做更多的文章了.这样做到后面也许你会发现你一开始很简单的一个东西到后面可能会越来越强大.
    反之,如果一开始想太多,各种扩展,各种架构,那你反而可能一直在徘徊, 在浪费时间,结果到头来一无是处.
    所以,如果你有了想法,并觉得这个想法确实会对别人的使用有很不错的帮助,那就开始动手吧,哪怕它实现起来并无太大技术含量.

4. MVVM? 框架?
   是否使用MVVM框架?这个问题我觉得因人而异,但你更应该看哪种方式你更顺手,我其实蛮喜欢SL的INotifyPropertyChanged,我甚至想要是C# 5中能实现属性自动双向绑定的特性(比如在要双向绑定的属性上加个特性[Bind(Ways.DoubleWay)])那C#该有多好哦.不过我对Command确实不太感冒(~~明显是因为境界不够),因此在实现时我保留了ViewModels,但对于事件还是用自己习惯的Click方式来实现,虽然这让MainPage.cs里的代码看起来太多太乱,不过现阶段来看这更有利于我书写代码的效率,同时修改代码我也更加习惯.因此我的建议是在初期你应该将很快提交能很好工作的应用这个目标放在首位,至于框架,以你自己习惯的方式来进行吧.哪种更有效则更适合你.
   当然,上面的话也并非说我们可以一直这样,每个人都会在阶段性的工作之后对之前的代码进行总结,MVVM确实是SL/WPF一个不错的代码架构方式,同时它在单元测试时也更优异.因此,在总结的时候,你需要对之前的工作做一个权衡,而不是不经思考,一成不变的用最初的思考方式进行下去.

5. 从实例开始
   如果纠结于如何开始编写应用的话,那我建议你不妨从这里(http://create.msdn.com/en-US/education/catalog/)下一个示例代码开始.绝对不要小瞧这些实例代码的,我已经看到Market上面N多人直接把各种实例代码(比如BlackJack)改改就放上去了.这些代码不仅能给你一个比较标准的代码结构,而且能迅速带你进入正常的应用运行流程,这种过程我觉得比你在枯燥的书本上看一章要好得多.你可以看看GameStateManagementSample这样的例子,里面的架子基本上都已经帮你搭好了,菜单有了,主界面有了,唯一缺失的TODO就是player和enemy,这些只需要你按照自己设想的去填充就好了.微软别的不说,在对开发人员的引导方面,确实是做得不错的.

6. 给用户提供做够多的反馈通道
   可能你的应用开始的功能非常简单,但你要相信用户,很多你看不到的东西,他们都能看到和想到,因为用户不像你,你只有一个脑袋,但他们则是千千万万个聪明的脑袋,他们可能遇到你没遇到过的问题,这些都是用户反馈的好处,所以,一定记得在你的应用里面留下至少一个反馈的通道.我的第一个应用并没有留下自己的email链接进行反馈,因此看到的大部分反馈都是来自于review里面的.于是从中国地铁开始,我在关于页面中留下自己的邮箱,并提供了很方便的邮件编写链接.这之后我收到了两个很不错的反馈建议(如果他们有看到,我在这里谢谢所有提供反馈的WinPhoner).虽然最近因为工作的关系没办法马上发布新版本,不过我会尽快提交.

7. 不要一开始就考虑赚钱
   如果你一开始时抱着赚钱的想法来做Win Phone开发的话,那我想你很可能会有两个结果,一是因为失望而热情丧失并最终离开,二是因为需要纠结于怎样才能做出别人愿意花钱的应用而一事无成.当然,你也可能会成功,但对个人开发者来说,我建议大家一开始不要抱有太高期望值,你就把做应用当成一件结交朋友,锻炼能力的事情就够了.看到应用的发布,看到别人给你应用不错的评价,看到能给别人带来实打实的帮助,那种愉悦感也是相当不错的,至少能在以后的生活中给予你自己更多的信心,我个人认为这些东西有时候比那点点钱来得更快.

8. 保护好你自己的核心代码
   老实说,微软在代码保护上做得并不好,虽然没用过,但我曾在论坛上看到已经有人做出工具可以直接下载XAP文件,也看到很多win phone论坛放出了各种付费应用的破解文件.对.net应用来说,得到了XAP文件,如果你一点保护没做,基本就是赤裸裸的了,因此,虽然你永远无法防住那些真正想要偷窃你代码的无德份子,但一些基本的工作你还是得做,特别是如果你的应用基本没有需要与服务器交互的功能的时候. 当然,如果你的大部分核心逻辑都放在服务端这个问题就不用太担心了.
   虽然如此,大家也不必太看重劳动果实偷窃这种事情,这样的人毕竟是少数.所以虽然很不幸,我的两个应用的优势都是本地数据存储, 我一开始有担心自己的劳动成果会被偷走(貌似也确实怀疑有人偷走过,当然我没有证据),也因此降低过热情,但想开了就淡定了.应用这玩意,本来自己的就是免费的,别人要偷也卖不了钱,那就偷去吧.这里我给大家的建议也是如此,你一定要做好最坏的打算,接受它但也不要放弃希望,这世界总有些事我们无法阻挡,但我们还能阻挡大部分的事情,不是么?

好像我其实本来还有更多的体会,没有记东西的习惯,以后记起来再加上吧.下面写些工作总结吧.
1. 生成代码时不要不设置项目的Netual Language,也不要设置成中文,至少目前不要这样设置,不然你在提交应用的时候会得到完全摸不着头脑的错误提示.如下图:


2. Paint.NET是个好工具,http://www.iconfinder.com/是个不错的图标网站
   作为一个程序员,UI设计是个相当大的烦恼,这直接导致我对游戏类应用只能想想,无法动手.不过在设计图标的时候,Paint.NET确实很有帮助,虽然它没有PS那么强大,但对图层之间的操作还是相当方便的,所以我的两个应用的图标基本是先从iconfinder或者网上上面找个相关的图标,然后进行一些文字插入和混合,最终虽然图标仍然不好看,但总算有个东西了.所以你如果没有个设计老婆或者合伙人的话,那么你可以考虑使用下上面的工具凑活凑活吧.下面我给大家展示我自己的拙作(实在毫无艺术细胞,见笑了):

   上面就是我这差不多一个多月的业余工作总结,总体来说,离开.NET有一年多了,这次因为WinPhone而回归. 总体来说, WinPhone对个人开发者来说(工作室我没搞过,没资格谈论),如果你一开始野心并不是太大,从一开始一个小却有用的思路做起,那么这个生态环境其实也蛮适合你的.不需要太多的书籍(很多书籍也都是些重复的初级内容,没什么价值,甚至有些还不如MSDN或者Windows Phone Developer Tools Documentation), 只要你愿意,从现在动手,那么说不定有一天你真能收获意外之喜哦.

    总结下来目前能记起来的东西就这么多,忘掉的太多,技术方面的东西基本没有(有机会的话我会在后面把自己代码中认为稍稍拿得出手的东西跑出来给大家参考下),更多的是自己的一些工作思路的总结,希望能对你们有一点点帮助就行,如果能做到抛砖引玉那就更好啦!

    然后是广告时间啦, 呵呵,两个很简单的应用(Chinese Phone Address Finder/ Chinese Subway),首先,当然是得到你们更多的反馈了, 应用里面有邮箱地址,你们随时可以发邮件给我反馈, 还有就是, 俺最大的愿望就是能攒到明年的年费99刀, 你们要在用这两个应用实在很闲,可以考虑多点几下上面的广告哦,多谢啦,当然,不奢望,大家随意就行! 另外, 我在慢慢熟悉这个环境之后,也会努力做出更多希望能对大家有所帮助的工具来.

     再然后就是给大家一些信息,那就是虽然普及度无法和其他平台相比,但国内的Win Phone用户也是有一定数量的,我的归属地应用发布差不多20天左右,已经有了2k+的下载量(虽然到后期增长很缓慢), 相信那些热门的应用下载量应该会更大, 这多少算个不错的消息.

最后唏嘘下, 从了解园子到现在差不多应该有4-5年了吧(真记不清了)看到园子里的活跃园友每年都不一样,心里总有些感叹.这个圈子陪了我挺多年的,一直都是当看客,没处理,心中确实有愧.真心希望各位园友都能从这里得到成长,成熟.

posted @ 2011-08-09 01:13 jujusharp 阅读(1859) 评论(25) 编辑
  2011年8月4日
摘要: 其实这篇文章早就放在脑子中了,只是一直没时间整理好,正好今天早上看到了园友提到,于是决定趁着晚上睡觉前还是整理下,然后写出来给大家分享分享,也希望能对大家有所帮助。 C#的闭包,相对于java和其他静态语言,算是相当强悍和优雅的一个特性了,因此这篇文章和其他谈论闭包必谈js的文章不同,这篇文章主要从语法和IL的角度来给大家解释C#中闭包的定义,规范以及原理。阅读全文
posted @ 2011-08-04 22:35 jujusharp 阅读(6817) 评论(46) 编辑
  2010年3月9日

集合类的需求总是源源不断,因此,不管是1.0到2.0的泛型,还是3.0到4.0的并行(本文的并行指Concurrent,非Parallel),.NET每个版本总会伴随着一些集合类的增长。由于并行计算现在已经越来越流行,这里我将对.NET 4.0中新增的命名空间System.Collections.Concurrent和它下面的类做一些简单的介绍。

为什么需要Concurrent?

相信不少朋友都有多线程编程的经历吧,不过在.NET 4.0以前,多线程编程下很容易出问题,先看个简单的例子吧。

代码
static void main()
{
myList
= new List<string>();
for (int i = 0; i < 1000; i++)
{
myList.Add(i.ToString());
}
new Thread(T2).Start();
new Thread(T3).Start();
}

static IList<string> myList;
static void T2()
{
Thread.Sleep(
100);
for (int i = 0; i < 50; i++)
{
myList.Remove(i.ToString());
}
}
static void T3()
{
foreach (var a in myList)
{
Console.WriteLine(a);
}
}

 

在这个例子中,我们首先初始化一个长度为1000数组,然后我们开启两个线程,一个进行删除操作,另外个则进行简单的读操作。运行代码的话你会发现程序会抛出InvalidOperationException,因为系统集合在被读的同时被修改了,因此列举操作可能不能执行。

当然在4.0以前我们也有办法避免这种类似的操作,比如我们可以对要操作的对象加锁。即我们可以在对myList集合进行读写操作之前对其添加代码lock (myList)。

然而这种方式毕竟不够简洁,并且在更复杂的情况下它可能会显得非常繁琐。这时候支持并行操作的集合应运而生了。

有哪些Concurrent集合?

在System.Collections.Concurrent公开的类并不多,他们分别在两个不同的dll中存在,其中在System.dll中仅仅一个BlockingCollection<T>和ConcurrentBag<T>,在mscorlib.dll中则稍多一些,他们分别是ConcurrentQueue<T>, ConcurrentStack<T>, ConcurrentDictionary<TKey, TValue>。不过对于日常开发来说,他们基本够用。下面我们来一个个看下这些类的构造吧。

首先看看mscorlib中的几个类,这些类其实我们在.NET 2.0中已经接触过它们的普通版本,因此它们功能基本不变,因此你仍然可以像以前那样使用普通版本的哈希表,队列和堆栈来使用它们。

不过并行类不仅仅简单以前的集合类改造成线程安全的并行类,它同时还提供了一些更丰富的功能,由于Lamda表达式的引入,现在在ConcurrentDictionary<TKey, TValue>你可以通过AddOrUpdate或GetOrAdd添加自己的值生成方案。这使得我们在生成键值对的时候更加方便和简单了。如:

代码
ConcurrentDictionary<int, string> td = new ConcurrentDictionary<int, string>();
Func
<int, string> genVar = (i) => i.ToString();
Task.Factory.StartNew(()
=>
{
for (int i = 0; i < 1000; i++)
{
td.GetOrAdd(i, genVar);
}
});
Task.Factory.StartNew(()
=>
{
Func
<int, string, string> updateVar = (key, oldVar) => oldVar + key;
td.AddOrUpdate(
0, genVar, updateVar);
Console.WriteLine(td[
0]);
}).Wait();

 

我们可以看到,现在我们在取值的时候,如果哈希表中没有该值的话我们可以自己生成,或者我们在添加新的值的时候如果碰到重复键值的时候也可以很方便的解决掉了。相对以前在添加或者查找数据时痛苦的判断,这种方式更加简洁和方便。

其他几个类相对来说函数使用变化不大,唯一区别比较大的也是在Concurrent命名空间中很常见的各种try函数操作。

接着我们来看看在System.dll中的并行集合,这里面的两个类在以前的.NET中是没有的。首先看看ConcurrentBag<T>,顾名思义,这个类提供并行数据包的功能,这个类相对来说构造比较简单,它继承自四个接口:IProducerConsumerCollection<T>, IEnumerable<T>, ICollection, IEnumerable,后面三个集合类常用的接口我们当然很熟悉,而且由于实现了IEnumerable<T>接口,ConcurrentBag<T>也支持LINQ操作。不过这里有个特殊的接口IProducerConsumerCollection<T>我们以前没有见过,虽然是个新的接口,但故名思意,这个接口提供了生产者/消费者的集合操作,它提供了四个基本的方法:CopyTo(T[],int), ToArray(), TryAdd(T), TryTake(out T)。其中我们主要关注后面的两个方法,TryAdd是添加元素操作,而TryTake则是取元素操作。不过在ConcurrentBag中,TryAdd方法被设置为protected,外部对象需要通过Add操作来添加元素。另外,取元素的话,除了TryTake之外,我们还可以通过TryPeek来取集合当前的最后一个元素而不删除它。下面来看看例子:

代码
static void main()
{
ConcurrentBag
<string> bag = new ConcurrentBag<string>();
Task.Factory.StartNew(()
=>
{
for (int i = 0; i < 1000; i++)
{
bag.Add(i.ToString());
}
bag.Add(
"Last");
});

Task.Factory.StartNew(()
=>
{
foreach (string item in bag)
{
Console.WriteLine(item);
}
}).Wait();
}

 

BlockingCollection<T>相对来说,要稍微复杂一些,它实现了四个接口:IEnumerable<T>, ICollection, IEnumerable, IDisposable,因此该集合同样支持LINQ,不仅如此,它也提供了比ConcurrentBag更加丰富的功能。如CompleteAdding和超时设置的TryAdd和TryTake方法等等。

总结

随着多线程和并行编程的要求越来越多,相信在未来,.NET家族新增的这些类将会在我们的日常编程生活中越来越常见,所以掌握它们也显得越来越又必要了。

posted @ 2010-03-09 00:35 jujusharp 阅读(2334) 评论(8) 编辑
  2010年3月7日
摘要: 这篇文件我将继续PHP之旅,并对网上找到的一些PHP中常见的错误进行收集和总结,希望对大家有所帮助。 1. 小错误也能酿大祸你碰到过仅仅因为一个小小的分号而导致程序出现大问题的情况么?在PHP中如果你while循环的条件后面加上了分号的时候会导致PHP陷入死循环,而且这种错误设置都不会被PHP异常处理系统捕获。我们先看看代码吧:[代码]这段代码不会导致系统报告错误,然而却会导致系统进入死循环并且最...阅读全文
posted @ 2010-03-07 15:21 jujusharp 阅读(275) 评论(0) 编辑
  2010年3月4日
摘要: 学习PHP也有一段时间了,有些东西觉得还是需要总结一些,对于.NET程序员来说,PHP中有很多概念都跟以前的理解不一样,这里我们将重点分析下static关键字。static关键字在C#编程中非常常见,它用来修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。声明为static的类、函数...阅读全文
posted @ 2010-03-04 00:42 jujusharp 阅读(274) 评论(0) 编辑
  2010年3月2日
摘要: 最近在学PHP,习惯性的喜欢把它与.NET作些比较,发现其中一个不同就是对其他文件中对象的引用问题。我们知道,java中有包的概念,而.NET中则有更加方便的DLL程序集引用的概念,通过这些以打包形式组合在一起的对象集合,我们可以很方便的在自己的类中引用其他地方定义的类或其他对象,但由于PHP中没有相应的概念,所以在需要引用其他文件中定义的对象时,PHP程序员最常用的两个函数莫过于require_...阅读全文
posted @ 2010-03-02 20:45 jujusharp 阅读(419) 评论(0) 编辑
  2010年3月1日
摘要: 上次写过一些平常开发中总结的小技巧,这次继续补充一部分。1. 多个Using简化书写。我们经常会遇到需要使用多个using对象的时候,这时候我们可能这样写代码:[代码]实际上,我们可以简化书写:[代码]2. 很多时候,我们在判断某字符串是否是某几个指定字符串之一,可能会写出下面的代码:[代码]但3.0以后这里其实有更加简单的写法:[代码]或者如果这种判断很频繁的话,我们还可以使用扩展方法:[代码]...阅读全文
posted @ 2010-03-01 23:20 jujusharp 阅读(124) 评论(0) 编辑
  2010年1月24日
摘要: 原文地址:http://net.tutsplus.com/tutorials/javascript-ajax/jquery-1-4-released-the-15-new-features-you-must-knowjQuery 1.4 最近刚刚发布. 这个版本可不是一个简单的改进,它不仅包含了很多新的特性,还改进了很多功能, 更在性能优化方面下了很大功夫, 本文将对这些新的特性和增强的部分进行讨...阅读全文
posted @ 2010-01-24 02:42 jujusharp 阅读(3418) 评论(17) 编辑