android studio 官网支持西班牙语吗

优就业Android教程-高效Android开发者必须知道的4个工具
>   11:47:00 浏览次
移动app开发是一个漫长而费力的过程。然而,现在的企业总是希望能够尽快发布app。幸运的是,我们有很多帮助移动开发人员加快工作步伐的工具。
可用的工具集随着移动平台新版本的出现而不断更新。是的,我们很难紧跟所有创新的脚步。这同样适用于通常不被公布的附加功能,尽管它们在常规作业中真的非常有用。
特别是,在创建移动app的时候,每个开发者必须解决一系列的问题。例如:
在布局运行到设备之前先检查它看上去如何
--运行代码检查工具,如Lint:在编译之前很难发现代码中的错误
--为位图图形的所有显示分辨率和状态(启用,禁用,按压等)提供选择选项,并将它们导出到不同的数字设备
--在调试app构建中的开发阶段检测内存泄漏
有经验的开发人员可以轻松地处理上述任务。然而,快速而高效解决紧迫问题的方法并不是每个人都知道的。下面让我们为大家详细介绍一些高效开发中必知的好工具。
1.Tools Attributes
任务:检查UI元素在开发阶段是什么样的,避免它们在最终构建中出意外。
解决方案:Tools Attributes
Tools Attributes可以使用额外的命名空间来帮助管理Android Studio,这样开发框架就不会传输运行时版本的属性到最终构建。
看似Android开发人员只有一种方法来检查成品布局&&在设备上运行它。但是,你还可以使用内置于开发框架的Tools Attributes,在我们的例子中所使用的框架是Android Studio。
Tools Attributes的两个主要类别:
Lint Attributes
Design Attributes
作为一个静态分析工具,Lint被用于很多编程语言和软件平台。应用Lint Attributes有助于协调Lint工作。
下面是一些具体的Lint Attributes:
tools:ignore
tools:ignore属性允许你建立Lint工具来禁止XML文件中特定属性的警告。例如:
tools:ignore=&ContentDescription&
从根本上说tools:ignore类似于Java的@SupressWarning注解。
tools:targetApi
tools:targetApi和@TargetApi注解的工作方式相同,它显示了app将使用的最低API版本。举个例子,如果你正在应用Android KitKat,并且项目中最低的API版本是21。在这种情况下,你只要在代码中写下tools:targetApi以及适合的版本号即可。这可以避免恼人的Lint警告。
tools:locale
这个属性可以帮助你配置语言,并关闭关于错误拼写的Lint警告。例如,如果你的字符串仅包含西班牙文本,那么你可以设置&西班牙语为默认&:
这样,你就将西班牙语设置为默认语言,并且会检查西班牙语的拼写。
至于Design Attributes,可以大大便利创建开发框架中的XML布局。
Design Attributes包括:
tools:context
tools:context可用来显示开发框架选择什么活动类来实施布局。使用这个属性,Android Studio会自动选择所需的主题用于预览。
tools:showIn
tools:showIn有助于指出想要哪个布局在预览中显示。例如:
tools:showIn=&@layout/activity_main&
用来包括布局。通过这样做,开发人员就告诉了框架在哪个地方inflate什么特定布局。
tools:listitem, listheader, listfooter
你可以轻松地用特定布局调整组件视图,以便于分开list、header和footer的元素。例如:
tools:layout
使用tools:layout属性,可以在运行时屏幕上显示片段标签布局:
tools:layout=&@android:layout/list_content&
因此,Tools Attributes可以帮助开发人员确保他们总是能够远离在最终app构建中显示临时文本的风险。
2.Support Annotations
任务:在编译前检查代码中的可能错误,并且为了防止错误,对代码做一个全面的审查。
解决方案:Android Support Library
Android Support Library Annotations可以帮助Android Studio提升代码。它从Android Studio 1.3.0开始有用。对于之前的版本,你需要单独插入注解。
Android Support Annotations Library允许你在开发下找app中的bug。添加注解到项目,开发人员就可以让保持纯代码的任务变得更容易。
Support Annotations可分为:
Nullness Annotations
@Nullable, @NonNull
Nullness Annotations的目的是检查null。它们可被应用于代码字段,参数和方法。使用这些完全没有注解的注解的主要区别在于,Nullness Annotations只定义变量是否具有&null&值。
Resource Annotations
@StringRes, @DrawableRes, @ColorRes
在编码时,移动开发者经常引用字符串、图像等资源。使用Resource Annotations可以强制输入的文本。例如,通过添加resource annotation @ColorRes,当你试图输入颜色代码,而不是引用resource ID的时候,就会得到框架警告。没有注解,IDE就不反应,因为代码以及resource ID的引用的期望类型为int。
ColorInt Annotations
@ColorInt是@ColorRes的相反注解。在这种情况下,你定义方法不引用resource ID,而是引用具体的颜色。应用@ColorInt Annotations可以让你快速找到错误,如果方法呼吁颜色资源ID的话。
Thread Annotations
@UiThread,@MainThread,@WorkerThread,@BinderThread
这些注解的目的是确定方法和特定类型的线程之间的连接。
Value Constraint Annotations
@Size(min = 5), @IntRange(from = 0, to = 12), @FloatRange(&)
在编码时使用参数的正常值几乎是不可能的。要定义可能的值的范围,你可以添加@IntRange或@FloatRange注解。如果你想限制数据数组、集合或线程中字符串的大小或长度,那么@Size注解将是一个极好的工具。
Permission Annotations
@RequestPremission(Manifest.permission.ACCESS_FINE_LOCATION)
使用Permission Annotations,你可以验证一个权限或一列权限。每当app引用方法时,它会提供确认,并且这列权限对你开放。如果权限不存在,你会在代码中发现错误。
CallSuper Annotations
@CallSuper
当你需要调用方法的super实现时可以使用这个注解。
Enumerated Annotations
IntDef和StringDef
这种类型的注释允许创建用于替换一些枚举常数值的广义定义。例如,你有IceCreamFlavourManager类,它包括3个模式:VANILLA(香草),CHOCOLATE(巧克力)和STRAWBERRY(草莓)。使用@IntDef,你就可以创建一个名为@Flavour的新的注释并定义它的具体数值。
3.Cut&Slice me
任务:接收位图图形所有显示分辨率的选项。
解决办法:Photoshop插件Cut&Slice me
Cut&Slice me仅允许通过按下一个按钮来生成位图图形的切割。它用于实施所有显示分辨率和状态(启用,禁用,按下)。对于Android,resource会被自动传送到不同的文件夹(drawable-xxhdpi, drawable-xhdpi,..),对于iOS,正确的名称前缀会被创建((@2x, @3x)。
我们从2013年开始活跃地使用插件Cut&Slice me。并且它在Android以及iOS开发人员中很受欢迎。
4. LeakCanary
任务:及时检测内存泄漏以防止OutOfMemoryError崩溃,并降低app内存溢出的风险。
解决方案:库LeakCanary
LeakCanary有助于在调试构建运行时检测内存泄漏,并提供舒适的UI用于堆栈跟踪历史。
大多数时候,开发人员必须手动查找内存泄漏。首先,他们要揭开OutOfMemoryError崩溃。然后使用不同的设备,他们尝试重现可导致错误的问题。此外,他们希望能够跟随会导致泄漏的操作的序列。他们创造了内存转储,并详细研究以发现应该垃圾回收的对象。然后,他们制作从对象到垃圾回收的最短引用路径,并且最后,他们得到激起内存泄漏的引用。
LeakCanary允许自动化所有的搜索研究,并能很快找到所有的泄漏。还有一个附加优点涉及到发送有关于泄漏的数据到服务器,并排除反射引用和来自于方法的特定活动。
总之,我们可以说,Android开发者有各种不同的工具可用于促进app开发过程。特别是,对于移动开发人员,还存在着一系列被遗忘或甚至是不知道的解决方案,如Tools Attributes,Support Annotations, Cut&Slice me,LeakCanary,以及bug reporting systems。关于最后那个提到的工具,我们将在以后深入探讨。选择什么工具主要取决于开发人员个人的喜好和具体的项目情况。
如果你愿意告诉我你认为必须拥有的工具,那么非常欢迎在评论中畅所欲言。期待听到不同的声音。
祝大家都能代码整洁,项目成功!
更多知识干货分享,尽在
更多精彩可微信搜索公众号【优就业】。
免责声明:本文来源于码农网,由网友提供或网络搜集,仅供个人研究、交流学习使用,不涉及商业盈利目的。如有版权问题,请联系本站管理员予以更改或删除。会定期发布程序开发相关趋势文章,包括
等领域,敬请关注!
人收藏5&收藏
微信扫一扫
400-650-7353android官方技术文档翻译——工具属性 - 博客频道 - CSDN.NET
貌似掉线的博客
疯狂的键盘
分类:Android笔记Android Studio笔记
本文译自androd官方技术文档《Tools Attributes》:/tech-docs/tools-attributes
本文地址:http://blog.csdn.net/maosidiaoxian/article/details/。转载请注明出处。翻译如有错讹,敬请指正。
Android 有一个专用的XML命名空间,用于使工具可以记录XML文件里的信息,并且在打包程序的进行把信息剥离到不会带来运行时期和下载大小的负面影响的程度。&这个命名空间的 URI 是&/tools,并且它通常被绑定到&tools:&前缀中:
&FrameLayout xmlns:android=&/apk/res/android&
& &&xmlns:tools=&/tools&
& & android:layout_width=&match_parent&
& & android:layout_height=&match_parent& &
这份文档记录了我们当前使用的工具属性。(注: 这些属性可能会随着时间在以后中改变。)
tools:ignore
此属性可以在任何 XML 元素上设置,它是一个逗号分割的lint 问题ID的列表,表示了应该要在此元素或它的任何子元素上递归忽略的lint问题的ID。
&string name=&show_all_apps&&tools:ignore=&MissingTranslation&&All&/string&
tools:targetApi
Java 类中的 @TargetApi 批注解一样: 它允许您指定一个 API 级别,可以是整数或代码名称,表示此元素需要在此级别之上运行。
& & &GridLayout&tools:targetApi=&ICE_CREAM_SANDWICH&&&
使用: Lint
tools:locale
此属性可以设置在资源文件的根元素上,并且应该对应于一种语言或一个地区。这会让工具知道文件的字符串被假定为哪种语言(区域)中的。例如,&values/strings.xml&可以有此根元素:
&resources xmlns:tools=&/tools&&tools:locale=&es&&
现在我们知道默认值文件夹中的字符串用的语言是西班牙语,而不是英语。
Lint, Studio&(以在非英语资源文件中禁用拼写检查)
tools:context
这个属性通常在一个布局XML文件的根元素中设置,记录了这个布局关联到哪一个activity(因为显然一个布局在设计时可以被多个布局使用)(例如它会用于布局编辑器中以推断默认的主题,由于主题定义在Manifest中,并与activity而不是布局相关联。你可以和在manifests中一样使用点前缀,来指定activity类,而不需要使用完整的程序包名作为前缀。
&android.support.v7.widget.GridLayout xmlns:android=&/apk/res/android&&xmlns:tools=&/tools&
& &&tools:context=&.MainActivity&&... &
使用:Studio
和 Eclipse的布局编辑器,Lint
tools:layout
此属性通常设置在一个 &fragment& 标签中,用来记录在设计时你想看到渲染的布局 (在运行时,将由这个标签所列的fragment的类的操作所决定)。
&fragment&android:name=&com.example.master.ItemListFragment&&tools:layout=&@android:layout/list_content&&/&
Studio 和 Eclipse的布局编辑器
tools:listitem&/&listheader&/&listfooter
这些属性可用于在设计时的 &ListView&(或其他 AdapterView 的子类,比如 &GridView&,&ExpandableListView&等) 来指定布局使用的列表项,以及列表头部和列表底部。该工具将填充假的数据,以显示一个有一些类似内容的列表。
& & &ListView
& & & & android:id=&@android:id/list&
& & & & android:layout_width=&match_parent&
& & & & android:layout_height=&match_parent&
& & & &&tools:listitem=&@android:layout/simple_list_item_2&&/&
Studio 和 Eclipse的布局编辑器
tools:showIn
该属性设置于一个被其他布局&include&的布局的根元素上。这让您可以指向包含此布局的其中一个布局,在设计时这个被包含的布局会带着周围的外部布局被渲染。这将允许您“在上下文中”查看和编辑这个布局。需要 Studio 0.5.8 或更高版本。更多信息请参阅。
&TextView xmlns:android=&/apk/res/android&
& & xmlns:tools=&/tools&
& & android:text=&@string/hello_world&
& & android:layout_width=&wrap_content&
& & android:layout_height=&wrap_content&
& &&tools:showIn=&@layout/activity_main&&/&
使用:Studio 的布局编辑器
tools:menu
这个属性在布局的根元素上设置,用于配置在 Action Bar中显示的菜单。Android Studio 通过查看这个布局文件所链接的activity(通过 tools:context)里的onCreateOptionsMenu()方法,尝试找出哪些菜单在 ActionBar 中使用。它允许您重写哪个搜索和显示声明的菜单用于显示。它的值是逗号分隔的
id 列表 (没有 @id/ 或任何这类前缀)。您还可以使用没有.xml 扩展名的菜单xml文件的名称。需要 Studio 0.8.0 或更高版本。
&LinearLayout xmlns:android=&/apk/res/android&
& & xmlns:tools=&/tools&
& & android:orientation=&vertical&
& & android:layout_width=&match_parent&
& & android:layout_height=&match_parent&
& &&tools:menu=&menu1,menu2&&/&
使用:Studio 的布局编辑器
tools:actionBarNavMode
这个属性在布局的根元素上设置,用于配置 Action Bar 使用的&。可能的值包括:“&standard”,“list”和“tabs”。需要
Studio 0.8.0 或更高版本。
&LinearLayout xmlns:android=&/apk/res/android&
& & xmlns:tools=&/tools&
& & android:orientation=&vertical&
& & android:layout_width=&match_parent&
& & android:layout_height=&match_parent&
& &&tools:actionBarNavMode=&tabs&&/&
使用:Studio 的布局编辑器
其他属性: 设计时属性
在布局中,任何其他属性可以是一个内置的
Android 属性别名。例如,这可以让您设置仅设计时的替换文字,用于工具中而不是运行时。详细信息,请参阅。
maosidiaoxian
排名:第1040名
Android高级开发群:
Andriod Studio Tech:
(2)(16)(66)(1)(3)(6)(3)(54)(26)(2)(1)(1)
(121523)30 年的 Hello world - 技术翻译 - 开源中国社区
当前访客身份:游客 [
已有文章 2351 篇
当前位置:
30 年的 Hello world
英文原文:
0人收藏此文章,
推荐于 3年前 (共 26 段, 翻译完成于 07-13) ()
参与翻译(3人):
最近我在7月4日这一天所在的那周休假了。休假期间,我利用大把的时间对我时至今日的职业生涯进行了反思。&意识到我现在写代码都写了快30年了,不免让我有些许震惊。因此我决定,要利用这段美好的休闲时光,写篇博文来怀怀旧,探究一下我在过去30年的工作中所用到的所有编程语言。且谨以此篇文章献给我以编写“Hello, World.”开始而学习各种新语言的30年美好时光。
是我所学习的第一门编程语言。它是由微软专为编写的一种特殊类型的BASIC方言。BASIC是Beginner’s All-purpose Symbolic Instruction Code的缩写,意思是初学者的通用符号指令代码。对于困在家中又无游戏可玩的7岁孩子来说,BASIC是再好不过的一门编程语言了。该语言采用行号来组织多行代码,要想在屏幕上显示点什么就可以象下面这样把要显示的内容“print出来”:
&翻译的不错哦!
1981 – TI BASIC
我花了几个月的时间用这种BASIC编写了一些“choose your own adventure(请你来选择你要扮演的角色来进行游戏)”类型的游戏,甚至花了更多的时间听着用来保存和恢复数据的黑色盒式磁带录音机发出的滋滋、啪啪和嘶嘶声。&我人生中最令我激动和最关键的时刻恐怕是多年后我父母把一台带回家的那个时刻。这个机器随机带有Commodore BASIC,或者叫做PET BASIC,而且可开箱即用。这种BASIC也是由微软编写的,它基于 Microsoft BASIC,也就是微软专为6520系列芯片而编写的BASIC,而苹果的机器那时所采用的也正好是这个系列的芯片。
&翻译的不错哦!
1984 – Commodore BASIC
其中的问号是PRINT命令的简写形式,下面那行中的奇怪字符是RUN命令的一种缩写形式(R SHIFT+U -在Commodore 64的键盘上,SHIFT加字符可以用来输入一些很酷的图形小片段,你可以拿这些图形小片段拼出一些基本看得过去的图片)。
很快我就发现,BASIC语言做不到我想做的所有事情。此时“”正在兴起,很多人都在编写令人叫绝的程序来挑战机器的能力极限。&他们会做一些类似让画一些根本不可能画出来的图形或者把内容或更多数据滚动到屏幕边上“超界”的部分。完成这类壮举需要严格的时间顺序控制,而这种控制除了直接使用机器语言的代码别无它法。因此,我装上了机器监视器(机器监视器是能够让人将机器代码直接输入到内存中的软件的名字),写出了下面这段小程序:
&翻译的不错哦!
1985 – 6502 机器码
这段小程序会将一个索引装载到“Y-加法器”中,然后将始于$C100的内存中的字符一个一个的发送给ROM中的一个子程序,从而将这些字符显示出来。这就是for循环(for y = 0; y &= 0x0d, y++)所对应的机器码。RTS命令会从子程序中返回。为了执行这个程序,你还得使用内建的SYS命令呼叫出内存地址(很不幸,为此你不得不将16进制的$C000转换成10进制的49152,但除此之外其它的运行起来那叫一个顺畅)。我将表示“HELLO, WORLD”的PETSCII字符存储在了内存地址$C100处(是的,Commodore 64有它自己特殊的字符页(character page))。程序运行结果如下:
&翻译的不错哦!
当然,当我从原始的机器码转战到汇编语言时,日子就稍微好过了点。使用汇编语言,我就可以预先规划我的软件,而且还不用死记内存地址了,只需用标签来标记内存地址即可。上面那段机器码对应的完全相同的汇编程序可以如下来编写:
1986 – 6502 汇编语言
* = $C000&&&&&& ;set the initial memory address
CHROUT = $FFD2& ;set the address for the character out subroutine
&&&&&&&& LDY #$00
LOOP&&&& LDA HELLO, Y
&&&&&&&& CMP #$00 &&&&&&&& BEQ END
&&&&&&&& JSR CHROUT
&&&&&&&& INY
&&&&&&&& BNE LOOP
END&&&&& RTS
HELLO&&& ASC 'HELLO, WORLD.' ; PETSCII
HELLOEND DFB 0 ; zero byte to mark the end of the string
大约也就是这个时候,我意识到我是真的喜欢编写软件了。高中时我参加了一些课程,但他们教的不过是一些很愚蠢的小型Pascal语言,设计这种语言就是为了使学习如何编程变得“轻松一些”。真是轻松了吗?经过使用“机器监视器”徒手编写复杂的程序之后,我感觉Pascal实在是太过于轻松了。我还真是不得不承认,用Pascal编写“Hello, World”的语法实在是太简单了。
&翻译的不错哦!
1989 – Pascal
program HelloW
& writeln('Hello, World.');
我想,在这时候,很时尚的小子们都在用C编程序呢。C是一种非常灵活的语言,它感觉就象是汇编语言之上的一些功能性的宏,而不像是一门新语言。因此我额外自学了C,但C我却只用了不长的一段时间。
#include &stdio.h&
& printf("Hello World");
这段小程序包含了一个处理标准输入/输出的库,然后就在屏幕上输出了一段文字。C中的库使得C可以开发跨平台的应用 —— 不管是在Windows还是在Linux中调用的都是同一个函数,但库本身实现了能够运行于目标机的所有底层子程序。上面这段代码也是我多年后在Linux机器上首选摆弄的代码。如果那时你还没有入计算机这个行当,有些情况是我光用语言很难说明白的,那时要是你不弄个Linux自定义安装版,大家就觉得你不是个真正的程序员。我所说的“弄个自定义安装版”,意思是梳理Linux的源代码,将其按照你自己独特的硬件对Linux进行定制。其中最有意思的要数对显卡的处理了,要掌握监视器的“点时钟”情况,其中还需要施展各种奇巧淫技才能让主板很好的配合图形芯片一起工作。好吧,我跑题了。
&翻译的不错哦!
C对我来说学起来真的不算是个挑战,但我很快就搞明白了,耍酷的小子们在做着不同的事情,正在学习一种称为“面向对象编程”的编程范型。机器码和汇编语言可能是和OO距离最远的东西了,从面向过程的编程转向面向对象的编程对我来说是个我乐于接受的挑战。在那时你还无法仅仅通过在线搜索来寻找学习资料(搜是可以搜的,但搜索机制和现在不同而且搜索结果也少之又少),因此我就出去买了一摞C++的书。&C++的确支持“对象”这个概念。它甚至还使用对象来表示流和管道,能够以对象的方式来对它们进行操作。面向对象还引入了命名空间的概念,以此来更好的管理代码的划分。说了这么多,这次“Hello, World”变成这样了:
1992 – C++
#include &iostream&
int main()
& cout && "Hello World";
& return 0;
我一猛子扎进了大学,但令我失望的是,我的大学里并没有开设教授我所感兴趣的象C和C++这样的现代语言的课程。相反,我不得不应付差事的课程却是让我在一个叫做“Cypher”的大型机上用一种叫做Fortran的很有趣的语言来写作业。Fortran这种语言竟然很在意你把代码放到哪一栏中!没错,那时这种语言规定第1栏用来写注释,第1到5栏写语句的标签,第6栏用于续行字符,只有从第7栏你才能开始写真正的代码,我学到了足够多的Fortran,使我认识到我以后再也不想用这种语言编程了。
&翻译的不错哦!
1993 – Fortran
&&&&&& PROGRAM HELLOWORLD
&&&&&& PRINT *, 'Hello, World!'
&&&&&& END
那时我翘了大部分课程,把晚上的大部分时光花在了计算机房。在那里我使用的是我们大学的大型Unix机。在机房里我发现了Internet,学到了安装软件的“老式”的方法:下载软件源代码,build出可执行程序,查看错误,然后进行相应的调整和修复才能得到一个好用的软件。实话说,我还真不知道不学会那时的编程技术,你怎么才能学会使用Unix。那时我不断地探索和学习使用计算机系统的方式。当时我所做的最常见的一件事就是执行一个能够倒出大量信息的命令之后,再使用一些非常“顺手”的命令行工具对这些信息进行解析。那年我学到的最酷的语言之一就是PERL。虽然用“Hello, World.”这样简陋的例子做演示对PERL来说很不公平,但就先将就一下吧:
1993 – PERL
$welcome = "Hello World";
print "$welcome\n";
与此同时我很快发现了大量的World Wide Web(是的,那时我们就是这么称呼Internet的。Internet中运行的就是和这类好玩的程序,World Wide Web只是Internet之上的一写文档而已)。HTML对我来说又是令一个飞跃,它使我第一次接触到了描述性UI。不用装入变量或字面量并使用一些关键字或子程序,我就能够将内容组织到一个页面之中。你可能会惊奇,直到20年后的今天,HTML页面的基本语法实际上根本都没怎么变。
&翻译的不错哦!
1993 – HTML&
&head&&title&Hello, World&/title&&/head&
&body&&h1&Hello, World&/h1&&/body&
对我来说这是一段很有意思的时光。我从个人计算机(TI-99/4A和Commodore 64,还在很短的一段时间中用过)转向的大型机,&忽然之间我的PC真的只是变成了用来连接到Unix大型机的终端而已。我还在PC上运行了一个Linux操作系统,这是因为Linux是连接到Internet和网络的最快最方便的方式 —— Linux内置了TCP/IP协议栈,无需想老版本的Windows那样在操作系统之上再安装这个协议栈了(还有人记得吗?)我的大部分工作是在大型机上完成的。
我真地意识到了,我在间接失去同PC世界的联系。显然那时疯狂的个人计算时代已经结束了,有两种机器渐渐成了接灰的摆设了:一种是对于我们中的大部分人来说的运行Windows的PC,另外一种就是对于设计者而言的Mac机器。PC已经过时了就是我当时的信念。那时我有个室友成天围着Mac转,用Mac来设计各种优惠卷。他有一大堆漂亮的图形设计程序,经常会把一个叫做Quark的软件调出来,然后问我:“你的PC里有这样的软件吗?”我会耸耸肩然后提醒他,我连一个圆或者正方形都不画,我要这样的图形软件有什么用?我喜欢我的PC,因为我懂软件,而且我也会数学,即使我没有画什么图,我肯定能够利用数学在计算机上画出分形图形或者粒子风暴图。当然要做到这些就需要有图形卡,通过TELNET连接到Unix机可干不了这些事,所以我开始学习PC编程了。那时在PC上用来编程的就是Win32和C++了。即使在今天的Visual Studio 2012中,你依然能够运行下面我说的这个例子。我不会用我原先在Win32下编写的有150多行代码的“HELLO.C”程序来烦你的。
&翻译的不错哦!
1994 – Win32 / C++ (这个例子要稍稍新一些)
打开一个命令行窗口然后运行这个程序后会得到这样的结果:
我的粒子流程序和集合程序肯定在找工作方面帮不上什么忙,所以我必须再找另外的办法。令人啼笑皆非的是,我的职业在开始时同计算机竟然没有丝毫的关系。刚开始我为一家保险公司工作,工作内容是处理来自西班牙的电话索赔事务。情况就是这么个情况。在为一个薪水较低的工作接受面试时,我准备安心用这份微薄的薪水来户口,晚上再熬夜搞PC编程,我偶然提到我会说西班牙语。他们叫来他们的双语业务代表来面试我,我通过了测试。就在一周之内我得到了一个薪水更高的职位,因为我在短短的几个电话中学到了比我在整个高中几年里学到的还有多的西班牙语。
&翻译的不错哦!
那时我还年轻,求胜心切。我们的级别是基于每天我们成功完成的索赔总数来计算的。我不想就因为我所使用的软件每隔一段时间就要崩溃而被甩在后面。我们使用的对我来说是一套全新的系统 ——& (现在叫做iSeries) —— 但是我还是想出了办法,学会了在索赔软件每次崩溃之后如何重启它。公司的IT部门很快明白了是怎么回事了,并把我叫到了一边。起初我担心我惹上麻烦了,但是实际上他们向我提供了一个转入IT部门的机会。我又开始了我的第三次转折,工作内容基本上就是维护AS/400系统,为打印保险单和理赔表的大型打印机换打印盒。
在这个工作中,换打印盒的过程占据了整个工作中的大部分时间。这是因为有些表格只用黑墨,而有些别的表格却还需要绿色或红色的墨。那些打印机里只能装一种墨,所以在碰到不同类型的表格时,打印机就会提示我们去换上所需的墨。我认为这种做法太荒谬了,所以我花时间自学了RPG。我编写了一个程序,能够将打印作业同墨的颜色匹配起来,然后对打印作业队列进行排序,把所有的黑色打印作业排到一起,然后是所有的绿色打印作业,等等。这样一来,原先8小时的工作就变成只需2个小时就能完成,我就有更多的时间来学习RPG了。RPG最初的版本 ——&RPG II和RPG III —— &还都非常原始,其最初的设计只是用来简单地模拟卡片打孔系统的方式来产生报表(其名字就是Report Generator的缩写,意思是报表产生器)。RPG和Fortran一样,都是位置性的语言。
&翻译的不错哦!
1995 – RPG
I&&&&&&&&&&&&& 'HELLO, WORLD'&&&&&&& C&&&&&&&& HELO
C&&&&&&&&&& HELO&&&&& DSPLY
C&&&&&&&&&&&&&&&&&&&& SETON&&&&&&&&&&&&&&&&&&&& LR
请注意每行的第一个字符表明的是各行的代码类型(实际上它还应该多占几列,但我故意省略了其中的一些空白处)。第一行定义了一个常量,然后第二号将该常量显示到屏幕上,最后第三行是一个让程序结束执行的指示符。
在开始运维工作后我又干了我的第二件大事。每次月底结算都需要花费大量的时间和精力。原先的系统是在一台Honeywell大型机上读取穿孔卡片。其中有个COBOL程序从一个模拟穿孔卡片的文件中读取数据,然后输出到另外一个文件中,最后再把这个输出文件送入AS/400中进行处理。处理完成后,还需要将各种结算数据对一下。由于舍入错误、不支持事务以及另外的一些问题,数据几乎每次都对不上,所以就需要对整个计算过程进行调查,找出是哪里处理差子,然后再通过更新代码来修复错误。如果我们未能找出问题所在,我们还弄了一个“紧急开关”,在11点按下这个开关,就会读取输出数据然后调整结算数据来让账簿平衡。虽然我并没有大量的COBOL编码经验,但我需要通过阅读Honeywell的COBOL代码来理解透彻它的工作过程,然后我才能够很好的处理掉发生在AS/400 这边的问题。
&翻译的不错哦!
1995 – COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WELCOME-MESSAGE&&&&&&&&&& PIC X(12).
PROCEDURE DIVISION.
PROGRAM-BEGIN.
&&& MOVE "Hello World" TO WELCOME-MESSAGE.
&&& DISPLAY WELCOME-MESSAGE.
PROGRAM-DONE.
&&& STOP RUN.
没过多久,顶尖的RPG专家就来到我们公司,给我们上了3天的课程,这是因为最酷的事情发生在AS/400的世界中。不仅仅是AS/400正在转向64位(大家都知道位数加倍后就会比原先好上一倍,对吧?) ,而且RPG语言也正在得到巨大的改进,版本IV比以为更多了融合了面向过程的特性以及一些面向对象的原则。这得多酷啊?我们扎入培训中后心里乐开了花,因为睁大所有的老式RPG开发者都在为努力学习这种“新的编程风格”而挠头时,我心里的石头终于落地了,终于能够回到我用C和C++时更为熟悉的面向过程的编程风格了,再也无需使用过去的那种刻板而受局限的基于指示符和列的RPG语言了。
&翻译的不错哦!
很多开发者可能会因为某个特性而感到高兴,这些特性也的确让人刮目相看。语言要求指令开始于一个确定的列,输入在指令之前。这里局限性很大,你只有加载少量的常量字符,或者你不得不把它指明为常量或者数据结构,并把它们读入。新语言则把关键字列移动到右边,就有更大的空间给”factor one“。这意味着我们现在可以用几行代码来写“Hello,World” 了。这种语言也是程序化的,所以你可以通过返回而不是在指示器中设置来中止一个程序。(尽管我记得正确的话,在主程序中返回就是设置封装的指示器)
&翻译的不错哦!
1996 – RPG/ILE
C&&&& 'HELLO, WORLD' DSPLY
C&&&&&&&&&&&&&&&&&&& RETURN
AS/400在操作系统中内置了一个叫做数据库。在很长一段时间内,该数据库只支持通过RPG或其它的软件同其直接交互,并不支持SQL语法。后来出了个专门的叫做SQL/400的软件包,但DB2在底层就对SQL提供了支持。为此我还在1998年是发表了我的第一篇文章,写的就是关于如何在AS/400中如何自己接入对SQL的支持()。在SQL中实现“Hello, World”的方法可能会数不胜数,但最简单地要数这个了:
1998 – SQL&
SELECT 'HELLO, WORLD' AS HELLO
我要为打乱时间顺序道歉,但SQL似乎完全可以看作是我“主要的”或者“获得报酬的”工作的一部分。同时我一直都在疯狂玩着游戏,刚开始玩的是(这是第一个给我留下深刻印象的游戏,我竟然还花钱买了这个游戏的完整版),后来借着玩了DOOM II和HEXEN,最后玩得最High的要数了。如果你不熟悉第一人称射击游戏(FPS)的发展史,我还得告诉你,Quake还是一个改变了游戏历史的游戏。这个游戏为玩家提供了史上第一个“真正的”3D游戏环境(之前的那些游戏都是用2D映射表来模拟出3D的地板和具有一定高度的天花板),通过对TCP/IP的支持彻底改变了死亡比赛的模式, 它采用了非常高级的编程技术,从而允许比以往任何时候都多的玩家在同一个地图中同时玩游戏。
&翻译的不错哦!
Quake的可定制化程度也极高。虽然我在美工方面不怎么地,从来没弄明白怎么创建自己的模型或地图,但我直接扎近了编程来对它进行定制。Quake提供了一种基于C的编程语言,名为QuakeC。这种语言能够编译为跨平台的字节码,而这种字节码可以在能够运行Quake的所有目标平台之上。很快我就编写了一些改造性的程序,能够做到让玩家着火、让铁钉从墙上逼真地反弹回来等等类似的事情。在一个聊天室里,有个人说了一个点子让我编程实现一下,后来就因为我编写的这个叫做“MidnightCTF”的功能而为大家所知。其实就是直接在现有的任何地图上将所有的等都关闭,但为每个玩家配备一个手电。Quake是第一个支持真正的3D音效的游戏,这为游戏增添了一种有趣的可玩性。
甚至还有人从我的那些改造性的程序中拿出了一段代码,放到了“编程语言字典”中的之下。下面这段用QuakeC编写的“Hello, World”代码实际上就是将一条广播消息发送给了当前游戏中的所有玩家。
&翻译的不错哦!
1996 – QuakeC
bprint("Hello World\n");
此时我意识到了Internet真地要发展起来了。1993年我还在上大学时发现了这一点,但我非常沮丧,因为根本没有人真正明白我在说什么,但仅仅在几年之后,每个人都在为了抢着进入Internet领域而乱作一团(有些公司,比如AOL和微软的MSN,都想打造属于每个公司自己的互联网。。。但最终都无功而返,接入了我们现在所说的这个大的Internet)。我发现我在大型机上的工作马上就会过时,或者最好的情况下我只能成为一个藏在后面的某个角落中,鼓捣“那些个老系统”的开发人员。我想接触这些新东西。
后来我转到了一个在工作中使用这些新东西的部门 —— 用VB6(COM+)和ASP编写一个应用,把几个不同的系统连接起来,从而可以让所有供应商都能看到其中的数据。
&翻译的不错哦!
1998 – VB6 (COM)和ASP
Public Class HelloWorld
&&& Shared Public Function GetText() As String
&&&&&&& return "Hello World"
&&& End Function
&%@ Page Language="VB" %&
&OBJECT RUNAT=SERVER SCOPE=Session ID=MyGreeting PROGID="MyLibrary.HelloWorld"&
&HEAD&&TITLE&&%= MyGreeting.GetText() %&&/TITLE&&/HEAD&
&BODY&&H1&&%= MyGreeting.GetText() %&&/H1&&/BODY&
那时我有幸能同一位颇具天赋的架构师一起共事,他设计了一个系统,其架构在当时来讲还是非常神奇的。我们的COM+组件都可以接受一个单个的字符串作为参数,这是因为它们收到的信息都是XML格式的。这样一来,我们的组件就能够和接收来自网站的消息一样,轻松地接收来自第三方系统发来的数据。这就是真正的“web service”,我在真正的理解这个词是什么意思之前就干了这有的事。客户端的表单由JavaScript来解析并打包成XML,然后发回服务器, 因此从页面发回的数据同其它服务发过来的数据并无二致。服务也会将XML作为返回数据的格式。这样就能够把这些返回数据同一个UI模版(该模版名为PXML,是Presentation XML的缩写)结合,然后用一个XSLT模版将其转换为可供显示用的格式。这样我们就能够在不改变底层代码的情况下对UI进行微调,有点象是个效率不太高的XAML引擎。这还是在.NET出来之前我们干的活呢。
JavaScript可是个折磨我们的东西,因为那时我们还要找出如何处理不同的浏览器的办法。是啊,一说到JavaScript和跨浏览器的兼容性,就不得不说,这个相同的问题15年前就出现了,直到现在还依然存在。幸运的是,所有的浏览器在向用户弹出对话框时采用的方法还是一致的。
&翻译的不错哦!
1998 – JavaScript
alert('Hello, World.');
很多时间都被我被花在了Microsoft XML DLLs上面 (如果你以前编写过那就会记得注册MSXML解析器)。MSXML3.DLL很快就成了我的朋友,下面是一个将XML通过XSLT转换为HTML的例子。、
1998 – XML/XSLT to HTML
&?xml version="1.0"?&
&hello&Hello, World!&/hello&
&?xml version='1.0'?&
&xsl:stylesheet version="1.0"
&&&&& xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&
&&& &xsl:template match="hello"&
&&&&&&& &html&
&&&&&&&&&&& &head&&title&&xsl:value-of select="."/&&/title&&/head&
&&&&&&&&&&& &body&&h1&&xsl:value-of select="."/&&/h1&&/body&
&&&&&&& &/html&
&&& &/xsl:template&
&/xsl:stylesheet&
Const MSXMLClass = "MSXML2.DOMDocument"
Set XSLT = Server.CreateObject(MSXMLClass)
Set XDoc = Server.CreateObject(MSXMLClass)
XDoc.load(Server.MapPath("hello.xml"))
XSLT.load(Server.MapPath("hello.xsl"))
Response.Clear
Response.Charset = "utf-8"
Response.Write XDoc.transformNode(XSLT)
那个模式上我花了几年时间。那段时间中我个人经历了一些转变,体重减轻了70磅,腰围从44英尺减少到32英尺,由于健康我充满了激情。我兼职开了一家自己的公司,甚至从当时的公司辞职,我在这家专为医院提供翻译服务和拥有一个在线的西班牙语节食程序小公司担任IT理事。我能再次够提高我的西班牙语能力,因为翻译是从英语到西班牙语,反之亦然。我甚至将整个用ASP和内嵌了西班牙语硬编码的SQL语句的程序重写。使其成为了完全数据驱动的、标白的(为了品牌)和本地化的(公司想把他弄成其他像法语之类的分支)。在微软公司的技术栈的那段时间,我还是相当令人兴奋的。但由于工具和服务器的花费,让我在开自己公司的时候接触了开源社区。那时,为了开发我学了所有像LAMP栈..Linux系统,Apache的Http服务器,MySQL数据库和PHP之类的技术。讽刺的是,由于这些经历,当微软试图为了让开源社区拥抱Sliverlight的时候,我成为了其短期质询...但那又是另外一个故事了。
&翻译的不错哦!
2002 – PHP
$hello = 'Hello, World.';
echo "$hello";
在特定的平台工作了许多年后,我终于有机会进入到新公司的另一个软件开发岗位。我是一个当时还不出名的创业公司的第三个职员。如果你曾在Panera或Chick-fil-A吃饭或在Caribou喝过咖啡,那你可能就使用过我参与过编写的,或为了无线热点体验而最近升级过的软件。当我加入这家公司的时候,初始平台是用Java编写的。我在这个语言上,我曾用其做过很多“修补”工作,因此加上C++和微软栈上的技能我很快的就将其重新捡了起来。
&翻译的不错哦!
2004 – Java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World");
在语言当中我对Java并不感冒,但是我们要用到的特殊东西涉及到微软将要放弃的JVM,而且一个定制的服务器并不需要扩展。当把平台迁移到了.Net平台,我很惊讶的发现IIS服务器比其他几个专用的Java服务器能处理更多的请求。我说的“迁移”,其实是重新构建了一个新平台。我们寻求一种把J++代码转换为c#代码,但发现那确实不实用。幸运的是C#与Java非常是接近,大多数团队都能通过现存系统的“规则”轻松的将其翻译成能在Windows运行的系统,且把MySQL迁移到SQL Server 2005。注意Java的"Hello,World"和C#是多么的接近。
&翻译的不错哦!
2005 – C#
public class Hello
public static void Main()
System.Console.WriteLine("Hello, World!");
我们的公司那时之所以非常成功,部分原因在于我们的“控制面板”能够让我们集中在一个地方就可以管理所有的热点和访问点。我们可以在远程对这些热点和访问点进行重启、固件更新并用一心跳信号来对他们进行监控,同时还为诊断问题保存了历史信息。这个软件很快就发展成了一个移动设备管理(MDM,也即Mobile Device Management的缩写)平台,并成为公司现在的旗舰产品。他们在发布产品时重新起了一个新的品牌名,但是由于我们的挑战而得到了一个能够跨平台的HTML的交互性非常强的用户体验(先前的解决方案采用的是微软定制的Java Applet)。我们用AJAX以及HTML成功的构建了一个能够打动人的系统,但我们的团队不得不在如此多的浏览器和平台上进行测试,而我们的系统又是个负责富UI系统,这对我们的是个很大的挑战。虽然为了提高热点登录用户体验我们还需要维护这个系统,但它在管理方面更加灵活了,所以我又对一些其它的提到方案进行研究。
&翻译的不错哦!
当我发现Silverlight时,就对它着迷了,但我还是觉得先让我自己对它进行探索为好。我可以在我们监控面板的概念性产品前面站几个礼拜,发现每个人都很喜欢它,所以决定大家全力投入对它进行开发。我最乐观的估计是,采用Silverlight之后,从产品的概念到发布我们团队所需要花的时间要比采用JavaScript和HTML相关技术少4倍。那时,HTML5还是个空中楼阁。在我离开之前,我们的团队已经用Silverlight实现了很多的功能。直到离开时我们一直都在同Apple在MDM方面进行合作,Apple当然不想让他们的软件同Silverlight有任何瓜葛,但是我还是享受了多年用一种可以通过XAML得到跨浏览器和平台的声明式UI的强大功能的语言编写业务程序,只要我们允许使用插件就没问题了。(我听说这些技术现在再也不流行了)。
&翻译的不错哦!
2008 – Silverlight (C#和XAML)
&UserControl x:Class="SilverlightApplication1.MainPage"&
&Grid x:Name="LayoutRoot" Background="White"&
&TextBlock x:Name="Greeting"&&/TextBlock&
&/UserControl&
public partial class MainPage : UserControl
public MainPage()&&&&
InitializeComponent();&&&&&&&&
Loaded += MainPage_L&&&&
void MainPage_Loaded(object sender, RoutedEventArgs e)&&&&
Greeting.Text = "Hello, World.";&&&&
当然,Silverlight后来就象一只垃圾股一样日薄西山了。那时Silverlight仍然是一个非常有用也很有竞争力的技术,I但一旦人们发现微软不再对这种技术进行投入了,Silverlight马上就行将就木了 —— 虽然人们感觉它过时了,但这和它在那时是不是一个正确的工具没有丝毫的关系。HTML5在宣传自己是“编写一次,到处运行”方面也做得相当不错, 成百上千的公司在能够意识到他们的错误(HTML5的口红“编写一次,到处运行”的实际意思是,“编写一次,到处碰壁,然后为每个平台还得再编写一次”)之前,不顾一切、争先恐后地加入了HTML5的阵营。
然而,我们所喜欢的Silverlight中的那部分特性在Windows 8.1下的XAML和C#中存活了下来。 为了好玩,下面给出采用酷小子们惯常使用的模型-视图-视图模型(MVVM)模式编写的“Hello, World”。
&翻译的不错哦!
2011 – WinRT / C#
public class ViewModel
&&& public string Greeting
&&&&&&& get
&&&&&&&&&&& return "Hello, World";
&Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"&
&&& &Grid.DataContext&
&&&&&&& &local:ViewModel/&
&&& &/Grid.DataContext&
&&& &TextBlock Text="{Binding Greeting}"/&
虽然Windows 8.1已经让我忙于写作和兼职项目有一段时间了,但是对于大部分公司来讲,它还是比较新的,很多公司想要的是基于Web的解决方案。这就意味着要使用HTML和JavaScript,而我在大部分时间中就是忙于这方面的工作。没错,一旦我发现我离开了这套技术,它们总是能够又把我拉回来。在对我用HTML和JavaScript进行Web开发时所痛恨的地方进行一番深思熟虑之后,我觉得其中必有更好的方式来实现它们。我们的团队拧成一股绳,对各种可能的解决方案进行了调查研究,最好找到了一个非常酷的解决方案。最近有一种新发布的语言,叫做TypeScript,它是JavaScript的一个超集。它没有试图要改变语法,因此所有有效的JavaScript代码同样也是有效的TypeScript代码。然而,这个语言提供了一些开发时特性,比如,有助于形成API调用的接口,丰富的发现机制(它们甚至都不会出现在编译所产生的代码中)以及支持继承的类、强类型变量、静态修饰符等,而所有这些最终都会编译成非常有效的、跨浏览器的JavaScript代码。
采用TypeScript是个轻松的决定。尽管它还处于beta测试阶段,但它产生的代码100%可以直接用在产品中,所以如果我们发现它产生的代码有什么问题的话,我们完全可以跳过TypeScript,直接在JavaScript中进行修补。最后证明,TypeScript可用性相当高 —— 我们的团队中有几个人对JavaScript有纯正癖,痛恨对“修改JavaScript这种语言”的所有企图都恨之入骨,即使他们几个人刚开始持有怀疑的态度,最后也一致认为,TypeScript为我们提供了更高一层的控制力度,用它还能够进行重构,它也支持并行开发,对我们能够发布高质量的基于Web的代码有着极大的促进作用。
&翻译的不错哦!
2012 – TypeScript
class Greeter {
&&& public static greeting: string = "Hello, World";
&&& public setGreeting(element: HTMLElement): void {
&&&&&&& element.innerText = Greeter.
var greeter: Greeter = new Greeter();
var div: HTMLElement = document.createElement("div");
greeter.setGreeting(div);
document.body.appendChild(div);
TypeScript不是我所在的唯一的改变。我们还想消除在为对象设置数据绑定时的繁文琐节。当时我们所采用的Knockout也是一个非常不错的框架,但它所需要的工作还是比我们所想的要多。我们团队中诱人对一些替代方案进行了调查研究,最后选定了AngularJS。刚开始我对它还是有所怀疑的,但很快发现,这个方案真的同用于Web的XAML方案非常类似。采用它我们可以在使用声明式UI的情况下,还能解决另外一个问题,就是我们还可以将命令逻辑从中隔离出来。到现在为止已经有几个月了,我们的团队在使用TypeScript和AngularJS这些相关技术时一直都很愉快,并且相当的爱用这套技术。&我现在正在参加WintellectNOW的一个课程,因为我决定这事关重大。然而,要说30年的经验教会了我什么的话,那就是:今天还存在,明天就消失。我不是一个C#开发人员,也不是一个JavaScript开发者,更不是一个AngularJS奇才。绝不是!我只是一个编程人员,一个程序员,纯正的、朴素的、简单的程序员。各种编程语言只不过是个工具,我只是碰巧学会了很多编程语言而已。好吧,再来一次&“Hello, World”。我希望你能喜欢这段旅程。。。一段直到现在的旅程。
2013 – AngularJS
&div ng-app&
&&& &div ng-init="greeting = 'Hello, World'"&
&&&&&&& {{greeting}}
&&& &/div&
“再见了,读者朋友。”
&翻译的不错哦!
Hello World!~}

我要回帖

更多关于 android西班牙语 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信