随笔 - 24  文章 - 1  评论 - 72 
  2009年7月7日

  第五期特刊下载:http://www.eoeandroid.com/viewthread.php?tid=1122&extra=page%3D1

Android Applications Localization Helper (Android本地化助手)

By 游利卡

前言:

 

        在看这期任务的时候,就感觉这期任务一定特别困那。但是翻译了第一篇文章以后,居然发现,这个国际化在Android上居然这么简单。简直让人无法想象。

第一篇就是量多了一些,美国人的废话多了一些(启示自己也不少)

 

         第二篇来介绍一下这个Android Application Localization Helper(以下简称AALH)。因为知道国际化很容易了,自然也就觉得这个工具应该也不是太负责。拿到了以后的确,和我想的一样。而且还提供了源码的下载。刚一打开一个sln文件,咦,怎么这么熟悉。剩下的都是cs文件。cs文件,难道~

God!GodGod! ,他居然是用C#写的!他居然是用C#写的!他居然是用C#写的!他居然是用C#写的!他居然是用C#写的!他居然是用C#写的!他居然是用C#写的!

 

我那个感动啊,真是一把鼻涕一把泪。因为我就是从.NET平台出身的。所以C#自然也是非常熟悉了。因为机器在上次恢复了以后没装VS,只能用技术本来打开源码了。都是熟悉的句子啊。特别是刚开始的using 每次的namespace命名空间。当时真恨不得写一个源码分析来了。

 

开始正题;

        大家可以到这里下载AALH,包括源代码。

        http://www.artfulbits.com/Android/Localizer.aspx

 

      看过源码了。因为使用的是C#开发,所以理论上只有Windows用户才有使用这个的机会了,而且一定要保证你的机器上安装了.NET framework。至少2.0版本以上,那是微软的一套库文件。C#就是靠这个来运行的,他相当于Java平台的JRE。如果你想深入了解这个,那就需要到.NET的社区去看了,C#的语法和Java很像。所以转换起来非常方便,不过要晋级开发还需要一些功夫。

     Linux用户我不是很清楚,但是肯定的是wine肯定是不够的,在linux上,微软也放出了linux上的.NET framework叫做mono,两者配合能不能使用这个,只能说大家试试了。

 

C#奉行的是快速开发,提供了非常丰富的组件,因为国际化只涉及xml文件,所以C#的确是不二之选。

 

介绍一下界面。

 

 

      AALH的界面非常简单 最右上角的可以用来导入你的项目文件。下面两个功能一个删除一个退出

 

       而中间大的框框,就是现实相应的文字信息的ID 原始值 本地化后的值

 

如何使用:

       其实Android的国际化工作之需要把所有的文字处理好就可以了。当然其实还有很多其他的工作,只不过文字工作量最大。而且有的时候国际化的时候有一些防止在Value的文件夹的文件并不需要改变。

       而当你导入到了你的项目文件的时候,AALH会自动搜索到你的Value文件夹。如果没有设定国际化内容。在左边第一个框中就不会显示出任何内容。

 

好我们现在来导入上一期的维基词典。

 

     如果你的文件中,全都是默认值,没有任何国际化的内容那么左边的第一个方框就会空,点开下来菜单也不会有东西。

         但是这时,你就可以来添加你的国际化文件夹了。点击那个绿色的加号,然后。

 

    

我们直接添加我们要国际化的字符就可以了。下面还提供了很多的提示,支持的语言,非常方便。这里的中文的zh-CN 可不要直接写上去。因为国庆,所以zh分还多。而第二个代表地区,地区必须加上r的前缀,正确应该是zh-rCN

         好咱们用中文吧

         当添加好了以后AALH会自动把原有的Value文件夹里的文件复制新创建的Value-**

         我们这里是Value-zh-CN

 

 

          我们添加了String字符串。然后他就会把xml文件中所有的项目按照id 还有数值的形式保存下来。

虽然才40K但是他居然可以使用Google的翻译工具。

        看右上角

     可是对于我们博大精深的汉语来说,这个还不是很好用。而且这个Widget还有很多的其他字符,所以当前翻译功能被禁止了。

       咱们只能手动来写了。

 

    其实右边的就是让我们来编辑的了。这里我们可以看到因为xml都格式化好了,所以呢之需要改变数值就可以了,这比直接编辑XML文件要方便不少。好现在咱们开始进行中文化了。

         双击你要本地化的项目。然后就会

            一个对话框,直接在里面编辑就可以了。

现在我们编辑好了。

 

不过在我们实际使用的时候,需要把文件夹中的一个bak文件删掉,不然会报错

 

现在已经变成中文的了

点击进去看看

 

本来Android的国际化就比较简单,有了AALH 更是如鱼得水了。

 

 

 

 

 

 

posted @ 2009-07-07 02:20 游利卡 阅读(357) 评论(0) 编辑
摘要: 本片是篇软文,不喜勿入appWidget调查报告文章的初始地址:http://www.eoeandroid.com/viewthread.php?tid=1029本片将将不以代码为重 ,从另外一个侧面给大家讲述一下Widget的开发。1.开始对于什么是Widget,以及Android的Widget大家通过以前的文章基本上已经了解了。而本次调查哦报告将带大家更好得认识Android的Widget。让...阅读全文
posted @ 2009-07-07 01:34 游利卡 阅读(1676) 评论(0) 编辑
  2009年6月28日

更多Android 学习 请加入 eoeAndroid 社区  http://www.eoeandroid.com/

当一个application 中有多个 Activity的时候,那么每个Activity之前的传值就是一个问题了。所以这里介绍一下相关的方法。

在Android平台传值,主要使用两种方法一个事 PendingIntent  另一个就是广播了

按照大类,我把相关的类进行了划分

1.实体类   Intent  、Context 、  BroadcastReceiver 
2.方法类   PendingIntent   Context.sendBroadcast

传递的方法 也就是方法类中的两种


A Intent 字面意思是意图,其实他的效果和字面意思差不多,高焕堂的很多书中都有详细的介绍。

    他就像一个快递员,而且是个无所不能的快递员,什么都能送,只要你能把信息加到他上面去

    详细的使用方法可以再SDK中找到,如果想要添加你想要的内容 可以用 Intent.set**系列方法。

B Context 这个翻译成环境更好一些

    顾名思义 他就是获取我们当前的环境状态, 比如说我想知道现在用户使用的什么语言,处于什么状态,航班、静音。用户有没有接打电话

    等等,就像我们获取系统时间一样。Context也我们设置了一个容器让我们来获取系统的状况。

    因为这个系统状况很重要,有的时候就是以系统状态为依据,所以Intent 好多方法都要加入这个 都需要 Intent.context

C   BroadcastReceiver  是专门用来接收广播的类

     所以他有一个OnReceive()的方法 而具体的接受 我在下面详述。




α PendingIntent  这个方法就是直接传递 Intent 
    好传出了,怎么才能保证能接收到呢?因为Intent是一个很强大的快递员,他能记录货物需要达到的地点,所以PendingIntent 干吗,他相当于一个Intent的工作场所,他只负责吧Intent送出去
   而Intent 去那里,直接告诉 Intent就可以了
   通过下面这条语句就可以达到显影的效果  intent.setClass(Activity.this//指代Activity, Report.class//指代目标类);

   接收端怎么获取消息呢,这个也简单。因为Intent 已经按照他自己的地址来到了所处的地方,我们直接实例化就行了。
   当然这是在简单的情况下,就是说如果这个公司只有一个货物所以我们之需要一个快递员就可以,接收方目前只有这个货物需要接收,那快递员一到他接收方只要确认一下就知道他来干嘛了。

   但多数情况下,两家公司的业务非常繁忙,所以可能有多个快递员,多个货物,同一个部门可能有多个。那么怎么来做呢。就需要加限定规则
   (1)首先是 在Intent中加限定,可以设定一个 Permission String  就像暗号一样,如果暗号对了肯定错不了 (这个在广播方法中很重要) 
   (2)另一个就是在实例化的时候确定好实例的是那个一个 参数

    具体的请大家参看SDK

β 使用广播来进行数据传递
    如果直接使用PendingIntent 是有目的的传送, 那广播可真算是漫无目的的传送信息了

    其实Broadcast 中传递的内容也是Intent ,但可以传递的范围可是远的多。
    而且系统的很多其他程序也在发送广播,比如说手机的状态,还要说一下航班状态,如果出于航班状态,那么系统就会自动发送广播,而我们只要去接收就好,这样我们就能知道哦,系统现在时在广播状态。

      而在Widget 接受方法使用广播,一方面是因为AppWidget 本来就是继承BroadcastReciever 所以比较纯,不会出问题。另外,这个是我的个人判断,因为Widget还是和普通的app不同,我估计如果直接给 Widget传送 Intent 又会受到限制,就像 handler的一样,当然这是我的猜测,但是感觉还是用 广播靠谱

      广播的载体是Intent,但是他们的标号则是Action。系统内定了很多Action。

      当然我们也可以自己定义Intent 。 之需要 Intent("你自己定义的一个字符串")

      接收方麻烦一些 需要 注册
registerReceiver(intent, commandFilter); 
      第二个参数是Intent的过滤,而且不能为空。

      如果是自己定义的Action 那还需要

String action = intent.getAction();

if (action.equals("自定定义的Action")) { 相应的Intent的实例化 必须在这里进行
}


Σ Widget 使用 PendingIntent 是因为 没有其他的方法了。说实话 AppWidget 就给我们一个 可以使用RemoteViews 的方法,别的都不能用。所以就顺势写了一个SetPeningIntent 当然这个方法也有很多固定的用法 ,启动服务,启动活动 ,发送广播,基本上该有的他都有了 。



3.最后再来说一下 Action  其实一个字符串但是这个字符串 因为很长所以基本上很少有人和其明明重合
   他们就是来定义一些状态,还是航空状态,他的的Action就是 
ACTION_AIRPLANE_MODE_CHANGED

   具体的什么在Intent 搜索一下都能找到

  更多Android 学习  尽情加入 http://www.eoeandroid.com/

posted @ 2009-06-28 02:27 游利卡 阅读(1428) 评论(1) 编辑
  2009年6月16日
Widget到底是什么,其实现在都没有一个标准的翻译。有的翻译成小窗口有的翻译成插件。我个人还是感觉小窗口更加合适一点,但是听起来实在是别扭。

置于他的发展不说了,虽然东西简单,但是一个好的Widget却着实可以提高我们的工作效率,就像RSS,我们完全可以去浏览网页,但是RSS给了我们另一种选择。


1.好了下来说说Android的 Widget

     看过SDK 的人,估计都对Google设计的Widget感觉相当不爽,功能实在是太贫弱了,甚至连点击的监听事件都没有,传值只能用PendingIntent。
     位置还是固定的,不能改变,自带的一些特效更是少的可怜。

2.但是这次 通过eoe社区的地狱怒兽 翻译的那篇文章 

    给了我不少启发,但是后来发现还是不太正确


3.另外 我也顺便关注了一下Ophone的 Widget 
      估计也是被Google给气的,吧Android的Widget做的太差了。所以中国移动直接重新做了Widget,而且这个还可以使用Javascript!

      Javascript 没有听错,就是这个!如果Widget可以使用Javascript 那会有多少数不完的特效啊!

     好了关于Widget,eoeAndroid社区 的eoe特刊 第四期 有特别详细的介绍
  
     这里奉上地址,有喜欢的朋友可以去下载,那里还有我的东西哦!
http://www.eoeandroid.com/viewthread.php?tid=753&extra=page%3D1

posted @ 2009-06-16 01:30 游利卡 阅读(574) 评论(0) 编辑
恩,怎么说呢,即想早点在博客上写点东西,但是有不敢写点东西。

5月份的《程序员》的系列文章,给了我不小的震撼。因为我没想到一切来的那么快,移动领域的发展已经达到了一定的水准,如果自己一年前就开始从事相关的工作,自己现在应该能收获很多东西。不过我还不算晚!
经历了上次惨痛的数据丢失后,重装了系统,在经过数个小时的系统优化以后,第二个工作就应该是装必备的Visual Studio了。
可是从 恢复到现在,安装光盘还挡在CD包里,倒是Eclipse每天都能运行起来。我彻底叛逃了,Android给我太多的诱惑了。

如果说我在.NET上还有什么,估计就剩下 闲暇无事的时候,看看《你必须知道的.NET》
想写东西,因为在Android收获了不少,又不敢写,因为毕竟自己是个地道的.NET程序员。


1.首先我得感谢.NET
     我必须得感谢.NET,作为我第二个启蒙语言(第一个是谭浩强的C)。 在.NET上的学习让我从一个什么都不会的菜鸟,稍微成长了许多。
     首先C#语言是我见过的,语法最易懂,最不容易出错的语言。
     ASP.NET也很轻松就能实现很多功能。虽然这不见得能让你了解其内部的机制,但是在.NET平台上的学习让我用最快的速度掌握了很多IT开发中的内容,特别是MSDN,特别是MSDN的广播,全部免费的视频资源,这些东西都极大地丰富了我的视野。
     设计模式,李建忠老是对底层关注,还有苏鹏、赵劼太多了。
     我不敢写,就是因为才半个月,我对Java 还有很多不太清楚的地方,这样做是不是很傻很天真呢!

     可是随着.NET的发展,让我渐渐感觉到了一些力不从心。.NET太注重商业化发展了,虽然了解了很多,但是我感觉我很难通过.NET平台掌握更加底层的东西,去灵活运用自己的一些想法。
     其次,随着MVC等工具的发布,.NET平台变得越来越大,也就是说,如果单枪匹马是不可能在.NET平台有所作为的。

     所以,可以想象将来的人生,就是去茫茫大海寻找工作。真的不喜欢这样。

2.Android平台给了我不小的希望
     第一次接触Android的时候,说实话自己真的只是抱着尝试的心态。
     后来,从学习Java语言的时候就发现,C#和Java真的是太像了,反过来看Java觉得简直就是亲兄弟一样,所以起初语法的学习对我来说几乎没什么障碍,很快就顺利迁移过去了。而Android平台的搭建也很方便。
     当然,并不是说Android是完美的,Android还有很多很多不足的地方,比如说它的SDK,甚至还有很多错误的地方。当然让年轻的Google 立马赶上有着悠久历史的MSDN也是不太现实的。
     另外,一个人就可以实现一些非常小的功能,做出一些小巧的Android的app,Android极大地满足了我的虚荣心,我不否认这点。

     不过最后留住我的确是另外一些,是社区! eoeAndroid社区  www.eoeandroid.com
     在CSDN看帖子的时候,发现了一个Android群,然后还是尝试的心态加入了。然后也通过社区糊里糊涂找到了eoeAndroid,这个社区还和年轻。但是却十分有活力。很快我就融入了这个群体,因为大家都是刚起步,Android也在发展。所以没有什么压力,也没有什么特别大的级差,当然也有菜鸟,也有老鸟,现在大家都非常融洽地在一起。

      而让我感觉特别兴奋地就是eoe特刊的制作了,每一两个星期,社区都会组织一词翻译活动,我们会把一些与这期主相关的内容翻译然后汇总。
      虽然现在才办了四期,我也只参与了一期,但是感觉相当棒。没有了流程的束缚,一切都得自己来,为了查资料,很多都必须读原版的资料。最后用自己的语言去写下经验,获得印象比以往都深。


3.当然我也不会放弃我的.NET平台的

      毕竟在.NET平台太呆了那么长时间,而且我相信你在带宽和手机终端都发达的一天,手机上的开发也会变得PC开发一样向 web转移,向云计算转移。
      自己的PC里还有很多资料,我也会利用我的其他时间来复习这些东西,C#4.0 的新特性, VS2010也会及时去关注。

      但是现在,我已经属于了Android了。

4.所以不管那么多了,既然选择了,就努力走下去!

  
posted @ 2009-06-16 01:18 游利卡 阅读(199) 评论(3) 编辑
  2009年3月16日

    前两天的时候,就发现自己的风扇有点问题。又一次开机吱呀呀地响得厉害。

 

    已经伴随我一年多了,而且在我高强度的工作下,我觉得它是太累了,而且北方灰尘大。虽然我一直按时除尘,但还是免不了会出点问题。

 

    今天早上去西单附近一家三星的维修中心。结果把笔记本的发票带成了内存的发票。不过当时只是想做个清洗,又得100大洋了。没想到居然检测出来风扇的轴坏掉了。还好去检测了一次,不然等到问题严重的时候,可能就不是这个样子了。

    这个属于硬件的问题了,三星的硬件时保两年的。没打发票反而没什么问题了。

 

    不过他们那里没有现货来更换,只好等待苏州那边发个新的风扇!

    没了电脑,这生活可算是乱套了!

    因为我的什么东西都在里面,还有很多计划,和一些资料。Oh,No!

    也许唯一庆幸的就是,它离开我之前,让我把前几篇东西都弄完了。现在就希望三星的维修中心快点给我送回来了!

 

    就这几天不再,等到拿回来的时候,肯定要大忙一场了!

 

 

    顺便赞一下三星的克服。一直都很令我满意。三星的本本来品质就很好,故障率小,所以维修中心人也少,去的时候都很顺利。

    这两天,忍耐一下吧!

 

   

posted @ 2009-03-16 20:33 游利卡 阅读(336) 评论(5) 编辑
  2009年3月14日
求职:.NET平台程序员

 

终于完成了那个改造的博文了。感觉一身轻松啦,整个寒假都没过好!

我也希望,那些文章能为我加分。顺便这里做一个小小的“简历”,多描述一下自己。特别希望得到更多实战的机会,跳出校园的温床,到职场中磨练自己。

 

我在北京

恩,写这个并不是觉得自己很了不起需要用人单位来找我。

如果我和大家一起去投简历,然后去等。那您的公司用简单的简历过滤直接就可以把我屏蔽掉。所以我就想出了这个馊主意,把自己的简历变得不是那么正规,反而通过一些其他方面来去给自己争取机会。下面的很多东西,都是没法写在正规简历中的。

至于和我联系,恩。在这公布自己的手机号码不是很安全。所以,如果您希望一个肯实干,又不想花大把的时间去筛选简历,那就找我试试吧,反正还在校,我的要求也不高。这样对两方面都有效率。

这就而对没有什么高傲的成分在里面,希望大家明见。

同时感谢Aaron Wu 先生的指点!

 

 

A.平台学习经历

 

08年年初开始学习.NET平台。对微软各种.NET平台的开发工具都有了解和使用。

C#语言和VS开发工具有很好的掌握。

同时熟悉,SQLServer数据库和MySQL数据库。

JavaScript正在恶补中(早些,把JavaScript当成了Java的延支语种,为保持平台统一性,耽搁了对JavaScript的学习)

WPFPowerShell也有一定的了解

 

重点研习了《C#高级编程》。

在博客园和CSDN的论坛混迹多时(在学习初期问了很多idiot的问题,现在反而潜水居多)

MSDN WebCast的关于ASP.NET的讲座看了很多。目前正在跟徐长龙老师的VS2008的教程,以及赵老师的MVC

Live 平台的课程理解最好(自认为)

 

B.实践经历

     

      首先是学习进程中的练习等等,学习道路中经历过的一些练习像水晶报表,等等我觉得都不用在这里提了!重点提一下两个

1.08年暑假,和一位四川的朋友,共同完成了一个票务网站的开发。此时对多层架构的开发有了非常多的了解,对一个网站的建设和软件公司的业务流程都学习了很多。我主要完成了大部分的文稿、还有数据访问层。

使用的技术是ASP.NET2.0 + SQL Server 2000。

其实这是一个失败的项目,因为我们的开发完全是作坊式的,而对方的需求也是很山寨的。所以如果程序化地说明很困难。不过正是因为失败让我有了比做好以后更多的经验。至于这次经历的很多东西,我还想抽点时间再进行总结。

不过我还是给自己留下了不少经验!认识到了交流的重要性,以及对计划的重新理解。而且,经历过暑假那次,我更加认识到,作为项目开一定需要一个正规的团队通力协作。作坊是行不通的。

 

2.09年年初,成功用最完美的方式将微软的Live ID API集成到了康盛创想的DiscuzNT论坛。此次改造,让自己对WebService、云计算平台开发、以及DiscuzNT优秀的架构都有很更加深的认识,对自己技术水平提高有了长足的帮助。

其实指的前面的系列博文了!一些总结前面都有写到,这里不再赘述了!

 

有位朋友说,程序员就和网友中的玩家一样。最重要的就是项目的积累(经验值),现在我的积累还是太少了,如果要承担任务更加艰巨的开发可能还不能驾轻就熟。但是无论,现在能否找到工作的机会,这样的学习永远会持续下去的。

 

 

C.其他技能水平

 

      1.英语六级今年惜败401分。个人认为英语还行。在做那个项目的时候,因为国内用Live ID API的人太少了,不得已和一个荷兰的MVP联系上了,和他的交流让我学了不少东西。

      2.本人的写作能力也很强,其实不想写出来的。因为我怕我到了公司以后,不让我写程序,把所有的文档都给我了。

 

 

D.自我评价

    我觉得太官腔的话不要放在这里了。关于我自己,我觉得独立能力很强,是我的优势。因为从开始接触计算机到现在,所有的东西都是我自己自学的,从小时候小霸王上的Basic,然后到谭浩强的《C语言程序设计》,然后到Live ID API。

    但,同时,我也特别渴望能够融入一个团队。其实上次把Live ID API是我刚开始想在我自己计划的一个网站中做的,结果没想到用了那么长时间。如果之前能有一个朋友能够和我在一起做这些,速度肯定会快很多。

    另外,在现在的大学校园里面。大家可能都知道的,一种很浮躁的风气,有的人只完成老师的任务,有的人成天游戏。我们宿舍就是这样的,真正静下心来学习的就我一个人,这里不是自夸。说我不受影响是不可能的,但是,每天晚上回到宿舍周围全是魔兽世界的画面,这让我非常渴望早一点摆脱这个环境。

 

    而且经过两次的锻炼,我觉得我完全可以胜任一个标准的.NET程序员的工作。人是发展的,我也相信不断进步的我一定能为您的公司带来更多的价值。

 

E.我的优势

 

    恩,首先是年轻吧!还要几个月才过20岁生日。虽然现在还在学校,不过做全职的工作对我来说根本没什么问题。

    另外,在学习的过程中,我也看了很多的文章,关于在工作中的、业界的。在真正开始程序员的学习之前,我对日本的游戏产业有非常深的了解,我在新浪的博客,有一半的点击率来自对电视游戏的文章。这也是我的优势,如果是游戏公司,我能非常好的融入进去。

    此外,我可能还有一些程序员不该有的过高的想象力。我愿意接受一些有挑战性的工作。

    在去年的SD大会上,还有幸和《走出软件作坊》还有《疯狂的程序员》的作者阿朱,还有绝影有幸见面。特别是阿朱先生,还跟他讨教了不少东西。跟前辈的交流中,更让我了解到,进入岗位时,最首要的就是要做好自己的本质工作。《致加西亚的信》一直作为我处理各种问题的参考。

    作为新人,对您我没有特别大的要求。就是一点,恩,payoff at time! 

 

F.最后

    可能您也许还希望得到我的联系方式,还有其他的信息。

    在公共场合,为了保护隐私。我希望您能给我发邮件,我会把我的联系电话和地址,发给您。如果您还需要我的其他的信息,在邮件中提到就可以了。

    关于我的教育背景,我也希望您不要过分关注。因为那些不会为我加分,反而可能会起到反作用。选择这个学校,就是因为他距离北京近,能让我接触最新的业界动态,能有更多的机会。

    当然,如果您执意希望了解,我也会在邮件中提供给您。

 

G.又及

    今年寒假的时候,我意外接到了一位姓于的小姐(是yu,但是不知道是那个yu)的电话。她问我是否愿意去他们公司实习。我当时答应了,但是回到学校之后有很多乱七八糟的事情,之前的博文还没有完成。

    2月23号星期一的时候,还接到一个电话好像是13****03143。当时在上课,所以就没说完。但是后来怎么打都打不同了。如果您是于小姐那个公司的人,抱歉了,如果您还需要我,也请您联系一下我!

 

 

    我的邮件地址:pcudb0189@sina.com

    如果您还想了解更多的我,也可以去我新浪的博客 http://blog.sina.com.cn/eeeeeeee

    我技术的文章都在博客园,以后关于业界的文章会逐步转移到CSDN

 

posted @ 2009-03-14 21:08 游利卡 阅读(317) 评论(8) 编辑

@博文仅供学习研究,所提供的代码希望大家慎用。请大家保护康盛创想公司以及Discuz!NT的知识产权,遵守相关协议。

 

 

     这次改造中用到的Live ID 为  cainiao2010@hotmail.com   密码为 123456

     大家可以进去看看一看我已经申请好的Live ID API

     我这次也没有使用网上的空间,而是使用了花生壳的免费域名

     如果你想实验一下,那么可以 直接下载花生壳 花生壳的 用户名 xiaocainiao2010  密码 aaa123456 它回自己把你本地的网站与这个花生壳的免费域名做绑定。

    

     如果解决了上一篇我遗留的问题。我个人认为,这个完全可以拿来商用了,不过为了不惹上官司,大家还是慎用为妙。 这次改造让我了解了很多东西,这里我也总结一下。

 

    1.收获颇丰

 

这次的改造让我收获了很多东西。因为前期太投入了,所以在考场上败得一塌糊涂。但是我觉得这次的成长比以往都要快。

首先是Live ID ,云计算平台的东西,着实新鲜了一把。而且通过对他的访问,让我了解了更多WebService的内容,了解了他的运行机制。如果今后云计算平台的开发主流了,我也算是有经验了。

其次就是对DiscuzNT的学习了。

 

网上很多朋友对DiscuzNT颇有微词。但是我还是觉得他是跟成功的产品,特别是他的架构,可以兼顾速度、平衡还有丰富多彩的功能。我觉得这样就很了不起了。之前,学习的时候做的练习都太初步了。而通过DiscuzNT我有了更加具体的思考。我就在想,如果要我自己写个论坛,我该怎么写。DiscuzNT是给很好的教材。当然如果是我写,我一定会让他有更多.NET特色。

 

然后,就是对别人代码的改造。虽然我改的Discuz!NT是基本上没有问题的代码。但是他不符合你的需求,那么他其实就是有问题的,假设他就是bug,就是别人留下的bug,你要怎么来处理呢?而且这是问题,并不是赋值粘贴几行代码就可以了。

不然最后,还是报错了。

报错也不可怕,其实根据错误的行,然后找到根源,然后处理到错误就行了。这让我对以后的工作,产生了很多新的认识,原来,我应该这么做。

 

特别是在PageBase问题上。我原想的想法是直接修改父类。但是这样太天真了,别的子类怎么办呢?

原来看书时枯燥的知识,现在感觉都成了我的正面临的问题。晚上我翻回去去看《C#高级编程》发现原来生疏的东西是那么熟悉。

 

用最少的代码做最多的事情。我不敢保证,我的代码绝对有问题。可能在安全上,我还存在很多不足。

刚开始的时候,我多次想放弃使用DiscuzNT,他真的太复杂了。但就像刚才说到的一样,你认为的复杂其实是自己的不了解。如果静下心来认真阅读代码,就能发西安突破口。

之前,我想直接在数据库中添加Live ID字段,现在想象真的是太愚蠢了,我们不需要密码,那直接把user.id写进密码就行了吗!

这样省了不少事情。

 

 

2.我的敏捷开发

恩这个部分,来源于Info论坛提供的迷你书《硝烟中的Scrum和XP》,当时给我很大震撼,因为这和之强想象的那种流程式的开发完全不同。也让我有了很多新的认识。当然,就凭我现在的三脚猫的功夫,还远不足以胜任“敏捷”,但我还是要朝这个方向发展。所以,从自己专注的开发开始。

 

 

其实,我也没有特别去专注于敏捷这个概念的问题上。因为一开始,我只是在想,我要把Live ID 集成进来。然后该怎么办呢?网站好说,如果是个论坛呢,我要做的不仅集成,还有登陆,然后保持原来的功能。

然后就去找论坛。

找好了论坛了以后,从那里下手呢,如果你在Google“把Live ID 集成到论坛”能得到什么呢?

然后先找Live ID 的资料,然后找DiscuzNT的资料。

 

说实话,我一开始很迷茫。这该怎么做啊?但是我就在强制自己,每天都必须找点东西,发现问题,解决问题。

然后有一些成果后,再大体预测一下,安排我下来的步骤。我不可能一天完成所有的东西,然后就这样慢慢来,每天任务目标。

每天都在OneNote上写下我的一些想法和注意的地方,用Outlook来规划明天。

 

虽然最终的代码量很小,但是留下了很多其他的东西。

 

反过来看看,感觉自己的开发真的有点敏捷的味道。我也相信,如果将来我能加入到一个团队中去,这样的方法也会是非常有效的。

 

   3.我是菜鸟不丢人

 

其实我刚开始用的标题是,谁说菜鸟写不出好文,但还是觉得不要那么张狂的好。

不过,我就是个菜鸟,而且接触.NET一年多,能达到什么个水平呢。说实话,也许你有很好的编程语感,但是在IT业,真正的牛人都是靠不断的技术积累成长起来的。特别是看过绝影的《疯狂的程序员》之后,更是有这样的感觉。

作为菜鸟的我们很羡慕那些高手,总觉他们天生就是高手似的。对自己总是自卑。

有的时候,菜鸟们问问题 ,经常有得不到合适的解答的时候。以前在CSDN发帖,就是这样,其实如果简单回答一下就可以解决所有的问题。但是我得到的回复却不是这样的。暑假的时候,跟一个朋友学技术,碰到不懂的问题,我得到的最先就是,“你怎么这样写”。我就心里犯嘀咕了,难道你就没有不会的时候吗?很多菜鸟都怕了,这很影响自己的进步的。

 

    还有这次关于DiscuzNT安装的问题,我真的希望知道手动部署DiscuzNT应该怎么做,但愿有人告诉我了。

 

但是,既便如此我们小菜鸟们不应该自卑,因为这只是个阶段。就像我们现在的社会主义初级阶段一样,我们的经济是没有人家发达,但是我们需要这个过程。

只要我们肯努力,肯去钻研,那么我们就一定能找到问题的根源,只要你有这股劲。而且我相信,勤奋的菜鸟,终有一天会展翅高飞的。

 

 

中午的时候,收到了荷兰那位MVP的邮件,他首先congratulation了一下。关于Live ID 那个先登录后注册的问题,他也表述无奈。不过,令人兴奋的。Live ID API 马上就要放出一些新的功能了!

 It allows you to customize the colours, text and images

也就是说,在注册的时候,可以更多的从Live Server上获取信息了。看来第二期的开发马上就不远了。

 

 

posted @ 2009-03-14 21:06 游利卡 阅读(358) 评论(10) 编辑

@博文仅供学习研究,所提供的代码希望大家慎用。请大家保护康盛创想公司以及Discuz!NT的知识产权,遵守相关协议。

 

 

这一篇,我来具体说一下代码中的细节问题

 

1.如何从live Server上获取信息。

 

我以前对webService 也是不太了解,但是通过这个项目了解了其中的原理。假如说我们的网站的运作非常简单,用户访问我们的页面,然后我们的服务器给用户信息,那么这个过程就是简单的交互的。但是如果一张页面中所有的信息全部从这张页面的对等服务器获取,那么效率会非常地下。而且如果涉及到第三方的信息,也会很麻烦。

所以在用户获取了我们的页面后,如果这个页面有WebService的内容,后台就会自动去其他的服务器端获取信息,然后再传回到用户的页面中去。

            loginCookie = new HttpCookie(LoginCookie);
            WindowsLiveLogin.User user = wll.ProcessLogin(request.Form);
                if (user != null)
                {
                    loginCookie.Value = user.Token;
                    password = user.Id;

这里就是获得user.id的代码

在代码中,就是HttpContext HttpRequest HttpResponse。比如说我们获取那个Live Server给的user.id。那么在用户登陆以后,HttpRequest就会向Live Server要这个数据,对于这个改造,我选择了把东西存在Cookies中去(没办法,只能这么干)。

而对于用户联系人列表的访问也是一样的,如果前者只是传一个简单的值,后者我们则要获取一张大的xml列表。首先也是HttpRequest先得到用户的许可,然后在通过一个地址跑到Live Server那里。

“报告Live 大人,那个叫赖昌星的用户允许我获取他的联系人列表”

然后通过对数据的Xml化,然后我们就得到了这些信息,解析他们就成功了。

 

在我做的过程中,还碰到了很多的问题。比如说 远程服务器 错误 404 400

404 这个就是我们在获取用户的许可的时候除了问题。

 

大家可以看一下代码中的llid 多半是这个值出了问题。

 

400的问题则比较特殊了,下面我再介绍

 

2.为什么要将联系人的 webservice单独放在handler.aspx.cs

 

我们都知道了DiscuzNTaspx页面不是一般的aspx页面。而他的后台也同样不一般。大多数的aspx后台页面都直接继承System.web.UI,但是DiscuzNT则做了一个PageBase的类,来继承System.Web.UI,然后所有的页面都去集成PageBase

 

这样的好处显而易见。因为Discuz!NT有着吓人的各种参数,这样就可以让每个aspx后台文件少很多参数定义。但是他也做了很多的限制。

比如HttpContext,把访问联系人列表的部分放进register.aspx.cs这个里面,死活都不成功,总是显示远程服务器错误400。这个错误是指我们访问地址的错误,最后我实在没有办法了,只能判断是由于DiscuzNT特殊的极致导致了这个问题。

 

handler.aspx.cs只是个中转页面,所以我们不需要集成那么多的参数,那么直接让他继承System.web.UI(我觉得不用继承也没什么大问题)

 

然后放进去以后,没问题了。

 

在开发者页面中提供的代码使用了session,我个人也认为session更好一些,但是无论我怎么设置都DiscuzNT都会告诉我,配置节点错误!所以无奈,还是用了Cookies

 

 

3.为什么在注册前,需要先用Live ID 登陆呢!

 

这个不能怪我!这个完全就是Live ID API他们搞的,我也纳闷了。他们提供了两个接口,但是前者只提供user.id。后这只能访问联系人列表。那么我在注册的时候,两个都需要访问啊,为什么就不能让后者两者都获取呢!

连官方网站上的sample都是先登陆,然后再次访问联系人列表的。索性现在是beta版本,等待正式版的修正吧!

 

4.为什么要将liveid作为用户的密码存入数据库

 

我感觉上面两项 基本上都是对 DiscuzNT的抱怨了

 

其实一开始,我的打算是忽略password,然后在数据库中添加Live ID项目。因为按照当初的目标,就是对代码的更改到最小。以后,或许还可以做成两种身份制并存。但是后来发现,这样反而是种很笨的做法。

 

这样做得对数据库进行更改,然后数据访问层,然后就是实体集。而且重要的,DiscuzNTCookies,他们需要把Password写入到Cookies里面。我们当然也可以更改为将Live ID写入,但是这样不是更乱吗?

 

而且之前我错误地估计了Discuz!NT的密码限制了。因为Live Server给的user.id是个很长的字符串,我总怕写不进去。但是后来试了一下,居然可以。然后重新做了一遍。

发现把user.id写进password是件更加舒服的做法。

 

首先你根本不用修改数据库。

刚才看到了,对数据库的访问层也减少到了最少,实体集基本上不用修改。

唯一比较麻烦的,就是password在写入数据库之前是需要加密的。但是后来发现,也就是一行代码的事。

 

不过我也有担心。

 

5.我们要改掉扔掉IsPost()

观察Discuz!NT的源代码。我们可以发现,Discuz!NT做页面信息的Post的时候,并不是像我们那样,页面上写个控件,然后后台写个函数,而是直接用Html的Submit,然后IsPost就被启动了,至于信息有没有返回回来,是不是,则接下来再处理。

所以在修改Login.cs,和register.cs的时候都要把他们换掉。 

6.其他的注意事项

 

我的改造是代码量最小的了,同时他也还有很多的遗留问题。比如说,我们改造了密码项,

如果用户进入到了修改密码页面呢!如果我们在注册成功的邮件中不发送密码了也可以。但是这里还是比较麻烦,如果想要完善这个改造,还需要去掉所有有关密码的东西,包括“密码找回”等等,其实如果想完善改造,应该对整个User表做些修改。当然,这样带来的问题,就是一旦DiscuzNT升级了,你的改造就得重来。(所以康盛创想把我招了把,以后你们的Live ID 登陆版本,我负责了,哈哈)

 

 

在经过了很长时间的奋战,终于成功了

 

 

 

 

 

我的遗憾

 

当然,做完了这个改造还是有一些遗憾。

1.首先Live ID API的引入,就是让用户感受到没有用户名密码的限制。但是因为现在beta版的缘故,让注册变得有点怪异。有谁听过,先登陆再注册的,很怪异啊。

我就一直在琢磨着,去看windowsLivelogin.cs的源代码然后在使用访问联系人的API的时候,顺便把 user.id给敲下来。

   

2.在注册的时候,还是不能实现更多个性化的注册。比如说访问联系人列表,访问的很有限,如果能把用户更多的信息读取就更好了。我还想着,如果两个用户都是Live ID 的拥有者,他们有都在本站注册了,就直接让他们的好友关系也称为我们站点的好友关系,这样多好。不过实现起来肯定也有点麻烦。

或者是,在注册的时候,提供很多其他信息的填写,也不错。但是目前来说最好的,就是让用户在注册完了以后,自己去修改去。不过反过来想象,其实就是用鼠标点了几下,也算是蛮方便了。

 

3.外观

这里还是忍不住抱怨一下,因为Live ID 的登陆API,那个地址,如果你不用iframe,那么点击以后,就会在页面上显示sigin in /sign out。我就想了你就不能做成中文的了。

虽然现在英语在国内基本上快不成为问题了。但还是感觉不顺眼。

 

另外在DiscuzNT上想做一个好的外观,不是很方便。特别是像这样,对DiscuzNT做了换血的做法后。

我真的不太习惯在原先的aspx页面上写东西。

 

在改register页面的时候,1000多行,好多个if嵌套,让我改了好半天,才改好。

 

 

posted @ 2009-03-14 21:04 游利卡 阅读(577) 评论(0) 编辑

@博文仅供学习研究,所提供的代码希望大家慎用。请大家保护康盛创想公司以及Discuz!NT的知识产权,遵守相关协议。

 

 

感谢团队允许把这篇也放到首页来:)

这一部分,我把我大部分的代码贴出来。

 

1.       对数据库、数据访问层、逻辑层的修改。

 

其实这部分算是简单的。不过刚开始,我选择有点错误。因为我的决定是拿掉password,让password失效,然后在再数据库中写入一个Liveid的列,用来将我们得到的user.id写进去。这里的liveid指的是并不是要把用户的 Live ID号写进去

Live Server 给出的变量名是user.id为了不和原来的项目发生冲突,在项目中,我都用小写的Liveid代替。

刚开始,我也想过将user.id写进password这一项,但是我怕这个字符串会太长,而且怕Discuz!NT会有一些其他的要求。不过就在快做完的时候,发现还是写进password最合适,而且长度刚好合适。

 

这样还可以节省很多代码的工作量,基本上数据库部分可以完全不变。

我在前几篇说过了,集成了Live ID API的网站识别用户的就是通过user.id来识别的,所以我们基本上只用在逻辑层和数据访问层中加上一个   ExistPassword 和  GetUserNameByPassword 就可以了。

 这里是要添加的代码

 

(1)Discuz.Forum  中的users.cs 中添加

 

       /// <summary>

        /// 用户的Live ID是否存在

        /// </summary>

        /// <param name="UserId"></param>

        /// <returns></returns>

        public static bool ExistPassword(string password)

        {

            return DatabaseProvider.GetInstance().ExistPassword(password);

        }

 

         /// <summary>

        /// 根据Password返回用户名

        /// </summary>

        /// <param name="password">Password</param>

        /// <returns></returns>

        public static string GetUserNameByPassword(string password)

        {

            IDataReader reader = DatabaseProvider.GetInstance().GetUserNameByPassword(password );

            string username = "";

            if (reader.Read())

            {

                username = reader[0].ToString();

            }

            reader.Close();

            return username; ;

        }

 Discuz.Data 中   IDataProvider.cs中添加

 

        /// <summary>

        /// 判断这里的“密码”是否存在

        /// </summary>

        /// <param name="password">密码</param>

        /// <returns></returns>

        bool ExistPassword(string password);

 

        /// <summary>

        /// 通过Password返回UserName

        /// </summary>

        /// <param name="password"></param>

        /// <returns></returns>

        IDataReader GetUserNameByPassword(string password);

       

        Discuz.Data.SqlServer 中 UserManage添加

 

        /// <summary>

        /// PassWord 返回UserName

        /// </summary>

        /// <param name="password">密码</param>

        /// <returns></returns>

        public IDataReader GetUserNameByPassword(string password)

        {

            DbParameter[] parms = {

                                        DbHelper.MakeInParam("@password", (DbType)SqlDbType.Char, 32, password)

                                  };

            return DbHelper.ExecuteReader(CommandType.Text, "SELECT TOP 1 [username] FROM [" + BaseConfigs.GetTablePrefix + "users] WHERE [" + BaseConfigs.GetTablePrefix + "users].[password]=@password", parms);

        }

 

 

        /// <summary>

        /// 判断用户的password是否已在本站注册

        /// </summary>

        /// <param name="password">密码</param>

        /// <returns></returns>

        public bool ExistPassword(string password)

        {

            DbParameter[] parms ={

                                        DbHelper.MakeInParam("@password", (DbType)SqlDbType.Char, 32, password)

                                 };

            return Convert.ToInt32(DbHelper.ExecuteScalar(CommandType.Text, string.Format("SELECT COUNT(1) FROM [{0}users] WHERE [password]=@password", BaseConfigs.GetTablePrefix), parms)) >= 1;

        }

 

2.       其次是外观

 

我们总不能让首页那个用户名和密码框就那么显眼的摆在用户面前吧!

其实外观的工作还算是简单了,让人讨厌的就是DiscuzNT的编码方式,如果是普通的aspx页面,效率会快很多的。

 

这里需要改变的其实就是三个页面,forumindex.aspx login.aspx register.aspx

 

Forumindex.aspx就是论坛的主页。这个工作量最少了。

 

Login.aspx 是登陆页面

Register.aspx 因为项目众多,改变最多。

 

所以我直接把这两个文件上传,大家下载下来自己看吧。

(更新下载地址为 Live 的 SkyDrive 下载)

     http://cid-5456d4b8f95608a9.skydrive.live.com/self.aspx/把Live%20ID%20嵌入%20Discuz!NT/intergrated.rar

 

3.       接下来我们来配置一下 Live ID API

 

其实这个是非常好申请的,建议大家去听听刘学老师的课程,那里有详细的介绍。

 

然后我们把其中主要的几项写进web.config中就可以了。

在<configuration>中 添加

   <appSettings>
  <add key="wll_appid" value="000000004C00D443"/>
  <add key="wll_secret" value="ideaidea0725ideaidea"/>
  <add key="wll_securityalgorithm" value="wsignin1.0"/>
    <add key="wll_policyurl" value="http://xiaocainiao2010.gicp.net/discuz/policy.html" />
 </appSettings>

(这个是我用来测试,大家随便用了,但是不要恶意篡改就行了,毕竟别人还想看看呢)

然后我们要新建一个 Discuz.Live 的类库,里面就一个项目,就是 WindowsLiveLogin.cs

如果你嫌麻烦,直接下载我做好的吧!

(更新下载地址为 Live 的 SkyDrive 下载)

http://cid-5456d4b8f95608a9.skydrive.live.com/self.aspx/把Live%20ID%20嵌入%20Discuz!NT/Discuz.Live.rar

     在Discuz.web中引入这个类库

4.       这里我们还是需要加入一个handler.aspx。我觉得这个文件就像是中转站以后,我们首先在申请Live ID API的时候填写的就是这个页面。在用户登陆完成之后,首先转向这里,这里通过一个简单的判断,来帮助用户导向需要的页面。注册好的去登陆页面,没有的拉到注册页面中去。

所以因此我们还需要在web/config目录下的 url.config文件做一下修改,因为在这里需要地址转换的。

   <rewrite name="handler"
     path="/handler-{0}-{1}.aspx"
     pattern = "/handler-(\d+)(-(\d+))?.aspx"
     page="/handler.aspx"
     querystring="forumid=$1^page=$3" />


 

Handler.aspx页面可以为空,后台文件,都在上面的那个inergrated下载中。 

至于里面的具体细节,我在下一篇中详述

5.       最后就是重量级的 login.aspx.cs register.aspx.cs

 

大家可以看到,我的首页只留一个一个登陆的链接,其实我希望后面所有的页面都这样做的。并不是我们只需要登陆就可以完成在站点的注册。相反我们还要二次访问用户的联系人列表。

而且在我的register.aspx.cs页面中,有一个判断的页面。这里其是因为,用户的user.id只能通过login的接口来获得。而当你访问地址本的时候没办法获得。

甚至我现在看到的很多示例代码都是这样写的,我相信还有别的方法的。但是在阅读完了WindowsLivelogin.cs这个原类库后,发现基本上只能这样。

 

这里是一个非常不完善的地方。我暂时这样做了

 

login页面中,我对用户的判断还是给予password,也就是user.id。虽然我们可以在注册完成之后,可以通过用户的联系人列表来得到用户的用户名,再通过用户名来判断。但是大家应该知道Live ID也是允许非微软邮箱注册,你能保证所有的用户名都不同吗?虽然在我实际中发现,其实没个用户名后面,都会加个简单的@**以区分,但是我还是用user.id来作为认证,毕竟这个是唯一的。

 

对于一些具体的细节,我在后面的文章中会详述的。

 

  如果您的公司缺人,并对我感性兴趣,烦请您到第五篇文章的末尾,谢谢

posted @ 2009-03-14 21:02 游利卡 阅读(1093) 评论(0) 编辑