写代码可能是成为软件工程师最容易的部分_IT新闻_博客园

mikel阅读(1183)

来源: 写代码可能是成为软件工程师最容易的部分_IT新闻_博客园

写代码可能是成为软件工程师最容易的部分

英文原文:Coding is probably the easiest part of being a software engineer

当然,写代码是超级重要的,但是我认为它只是整个过程中的一小部分,且不一定是最难学的。

学习如何写代码要花些时间,但是只要有足够的训练(每天写代码,坚持数年),你就能真正擅长它。

你知道的,我相信在某种程度上,每个软件开发人员几乎能给任何软件写代码。(当然有时候这要用更长的时间,但是你不再感到害怕,肯定能按照你的方式来运行。)

我和自己的同事都看到了这种现象。我今天的一部分工作是把项目分配给开发人员,我的团队有一些成员,常常能够适应任何项目。这些家伙就是我说的能够给任何软件写代码的人。

基本上,我不得不改变我过去用于衡量他们做为工程师的标准。他们已经都是非常优秀的程序员了。

不仅仅是要成为优秀的写代码的人

这些家伙都擅长让计算机做他们想做的事情。但是这个行业里任何有经验的人将要对你说,还有更多的能力。

其中较大的一部分,是你通过看书、然后经过一周训练还无法准备好的。像大部分其它工作一样,经验在软件工程职业里发挥着巨大作用,没有其它捷径可走。

我花了一些时间,尽量思考我在软件工程里最看重的所有方面(和写代码有关),下面是我想到的,不分顺序:

  • 编码的能力(当然,这是既定事实。)
  • 编写正确的程序的能力。
  • 使用正确的方式编码的能力。
  • 快速编码的能力。
  • 证明你的代码运行的能力。
  • 和其他人编码的能力。
  • 为其他人写代码的能力。(更多详情
  • 讨论你的代码的能力。
  • 为将来编码的能力。
  • 从你的代码学到经验的能力。

除了写代码的能力,列表中的其它方面对于靠软件谋生的任何人而言,都是相当重要的。而且,我敢肯定,所有这些对于优秀的职业生涯都是同等重要的。它们每一项都难以学习,不能速成,需要数年经验才能掌握。

(当然,写代码的能力就像把其它所有东西粘在一起的胶水。没有这种能力,一切无从谈起。)

不过,它是最容易的吗?

我给本文的标题为“写代码可能是成为软件工程师最容易的部分”,因为我深信,成为优秀的开发人员,比成为优秀的工程师要用更少的时间。

达到“优秀的开发人员”的状态,对于任何软件工程师而言,是一个不可逾越的阶段:首先你需要学习弹钢琴,然后你才能开始音乐创作。你具备了写代码的一流能力,才能打造你的软件工程师职业生涯。此后你拓展能力,开始增加和夯实越来越多的技能。

但是,所有一切能力的基础是掌握写代码的能力。

没有绝对

我认识一些杰出的开发人员,他们能够用 C++ 编译器做出牛逼的东西。我从来达不到这种境界。我认识的大部分优秀的软件工程师也将不可能达到这种境界。这些家伙是用他们的生命积累了海量的编程技能,十分不易。

我还认识一些优秀的软件工程师,他们从来不是好的开发人员。他们选择了一条不同的道路,才成为他们今天的样子,这条路适合他们。

对于我,以及我认识的大部分人来说,他们从写代码开始,并以此为基础。写代码是最容易的部分。其它部分要花时间,大量的时间。


译文: 《写代码可能是成为软件工程师最容易的部分 》 腊八粥

难题就是机会

mikel阅读(1558)

开发中面对种种难题,每每问题百出的时候,也就是考验人的时候,不觉得有什么的问题,往往成为压倒骆驼的那根稻草,万万没想到的地方往往都是重点,然后很多人做开发中遇到问题的时候总是挠头焦虑的时候,如何解决?

机会总是伴随着麻烦来的,没有无缘无故的机会给你,只有自己付出了努力才能解决的问题,也就成了增长经验的机会,没有平白无故的经验给你,同样没有问题也就没有机会。

 

19条ANDROID平台设计规范平台设计规范 - Wicrecend - 博客园

mikel阅读(1175)

来源: 19条ANDROID平台设计规范平台设计规范 – Wicrecend – 博客园

1、尺寸以及分辨率:

Android的界面尺寸比较流行的有:480*800、720*1280、1080*1920,我们在做设计图的 时候建议是以 480*800的尺寸为标准;

2、界面基本组成元素:

界面基本组成元素包括:状态栏+导航栏+主菜单栏+内容区域;以480*800的尺寸为标准下的 各个元素的高度(其实导航栏和菜单栏每一个应用都或许不一样,Android对于尺寸没有太明确的 数据规范)如下:

3、字体:

Android 系统中,Droid Sans 是默认字体,与微软雅黑很像;

4、操作栏:

1、”操作栏”对于 Android 应用来说是最重要的设计元素,它通常在应用运行的所有时间都呆 在屏幕顶部;

2、 操作栏的基本布局:

1 向上+2 Spinner视图控制+3 重要操作按钮+4 更多操作:其中,向上按钮,点击后是去到 当前界面的上一个层级,非第一层级界面有此按钮,第一层级界面则无向上按钮;Spinner 是 用于展示内容的下拉菜单,其内容包括视图的快速切换和显示相关内容的完整信息;更多操作 (action overflow)是集合操作栏中不常用的和非重要操作的地方。

5、多面板布局:

多面板布局更多的是针对平板电脑,把手机端的目录视图和详情视图两个层级的界面,甚至更 多的页面,复合展示在同一个界面中,有效地利用平板电脑的屏幕空间,扁平化层级结构,简 化导航。这点在iPad上已经运用得相当娴熟了。

6、选择:

Android4.0 中的长按与Android2.3及更早期的版本有很大的不同。早期版本长按操作后,是 出现情境菜单的浮出层。在Android4.0中,长按后在操作栏的位置会覆盖一个临时的情境操 作栏,不再弹出情境菜单浮出层。在临时情境操作栏的环境下,当前界面的内容项允许被单个 处理,也允许被批量处理。

7、返回和向上:

返回按键用在手机全局的虚拟导航栏中,基于用户最近查看的界面历史,采用时间倒序的方式, 连接界面间的关系。向上按钮用在操作栏的左侧,基于层级结构,点击后是去到当前界面的上一 个层级,若当前界面已经是最高一级,则没有向上按钮。

8、主题样式:

推出三套默认主题:Holo浅色主题、Holo深色主题、Holo浅色底+深色操作栏主题。主推app在 这三套默认主题的基础上做设计,以加快app研发效率,但只是建议使用,并没有完全强制。

9、触摸与反馈:

用户触摸应用中的可操作区域,应当在视觉上有响应,微小的反馈会给用户带来很好地效果;

10、按钮:

1、按钮的3种表现形式如下图:

2、对于仅包括图标的按钮,不需要使用背景色;

11、滑块:

滑块的几种表现形式如下图:

12、进度条:

如果某个操作需要花费很长的时间,就需要用进度条的指示和旋转圈的形式来表示:

1、如果你可以知道当前任务完成的比例,那么使用进度条,让用户了解大约还需要多久才能完成;

2、当使用旋转圆圈时,不要配以文字标签。旋转的圆圈已经表明了正在进行后台操作。

13、开关:

用户通过开关作出选择,包括3种形式:复选框+单选按钮+开关;

1、复选框:用户可以在一个集合中作出多个选择:

2、单选按钮:单选按钮允许用户在一个集合中做一次选择;

3、开关:开关控制单个选项的状态;

14、对话框:

应用通过对话框让用户作出决定或者填写一些信息,

1、对话框的左边一般情况下是取消按钮,右边是确定按钮;

2、警告对话框:对于执行下一步操作前请求用户确认或者提示用户当前的状态。内容不 同,布局也会不同;

A:没有标题栏的警告对话框:内容区应当包括一个问句或与操作有明显相关的陈述句:

B:有标题栏的警告对话框:仅在有可能引起数据丢失、连接断开、收费等高风险的操作 时才使用。并且标题应当是一个明确的问题,内容区提供一些解释。

3、弹出对话框:一般情况下用户通过触摸来作出选择;

4、toast提示:toast提供了轻量级的反馈,显示几秒钟之后会自动消失;

15、选择器:

选择器提供了一种简单的方式,让用户在多个值中选择一个;除了可以通过点击向上/向下 按钮调整值以外,也可以通过键盘或者手势。

16、通知:

1、基本布局:主要包括的形式结构图如下如:

2、扩展布局:可通过扩展布局显示信息的前几行或者图片的预览,来让用户了解更多的信息;

3、操作:将重要的操作按钮图标在通知栏目展现出来,这样可以加快用户的操作;

4、合并通知:如果正在等待处理的通知是同等类型,则就可以合并通知,合并的通知提供了 综合信息的描述,并告诉用户有多少条未处理的信息;

5、你可以使用扩展布局为合并的通知提供更多信息,这样用户可以知道被合并的消息细节, 并选择在应用中阅读通知内容;

17、写作风格:

1、简短:只告知用户最必要的信息,避免冗余的描述,尽可能缩短文本长度;

2、简明:使用短词语、主动词和简单名词;仅说明必要的信息,不要费力解释,用户不会care的;

3、友好:使用缩写;使用第二人称和用户对话(您或你);保持随意,轻松的腔调;

4、标点符号:

A:句号:如果toast、标签或通知消息等控件中只包含一句话,无需使用句号作为结尾。 如果包含两句或更多,则每一句都需以句号结尾;

B:省略号:省略号常用于未完成的状态, 例如表示操作进行中 (“下载中…”) 或是表示文 本未能完全显示。

18、强调纯粹的Android应用设计:

在Android4.0 app设计准则中,特别强调为Android设计纯粹的Android app,切勿使用其 他平台特定元素的注意事项,有以下5个方面:

A:强调视觉元素的样式要符合android系统;

B:不用其它平台特有的图标;

C:区分向上和返回,不在操作栏上使用返回样式的按钮;

D:不在界面的下方使用选项卡tabs;

E:不在内容列表里使用向右箭头。

19、其他细节:

增加许多新的交互细节、信息展示和视觉样式等规范:

1、新增了横滑移除内容的交互手势。在部分模块中,支持向左或向右横滑移除内容的操作,如 最近任务和消息通知抽屉;

2、视觉的平面化用的越来越普遍了。

在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目 - 冠军 - 博客园

mikel阅读(895)

来源: 在Mac OS X Yosemite 10.10.3 中搭建第一个 ASP.NET 5 Web 项目 – 冠军 – 博客园

终于有时间在 Mac 上安装一下 ASP.NET 5,网上有许多教程,但是多数的时间比较早了,版本不是最新,搭着 Build 2015 的春风,我也实践一下 Mac OS X 上的 ASP.NET 5。

经常使用 Windows 8.1,对 Mac 并不太熟悉,也一并把安装中的问题趟一遍。

前几天刚刚更新了 Mac 的操作系统,操作系统版本 Mac OS X Yosemite 10.10.3。

1. 在 Mac OS X 上安装 ASP.NET 5

ASP.NET 5 运行在 DNX 之上,DNX 是 .NET 运行环境 ( .NET Execution Environment ) 的简写,它支持多种平台,当然包括我们今天的 OS X 了,在 OS X 上,使用 Homebrew 可以很容易安装 DNX。

1.1 安装 Hoembrew

什么是 Homebrew? 我们先看看它。

Homebrew 是用来在 Mac OS X 安装 Linux 工具包最简单和灵活的方式。官方网址:http://brew.sh

打开 Mac OS 的终端,输入 ruby 命令

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

就可以了。安装之后可以检查是否安装成功。

brew –v
Homebrew 0.9.5

我现在的版本是 0.9.5

1.2 安装 DNVM

又一个新的缩写词 DNVM,英文的原文是 .NET Version Manager,就是 .NET 版本管理器,包含更新和配置 .NET 运行环境 ( KRE ) 所使用的一系列工具,是 ASP.NET 5 项目的一个子项目。DNVM 的网址:https://github.com/aspnet/dnvm/

 

一旦成功安装了 Homebrew,就可以使用 brew 命令来安装这个 DNVM。

brew 自己有默认的仓库,使用 tap 可以添加第三方的仓库,我们的 DNVM 就需要设置一下所在的仓库。

在终端窗口中,使用下面的命令来设置这个第三方的仓库。

brew tap aspnet/dnx

如果你想更新一下这个仓库,可以使用下面的命令先删除原来的,再重新安装,实现更新的目的。

brew untap aspnet/dnx
brew tap aspnet/dnx

 

更新之后,才可以安装我们真正需要的 DNVM。现在,可以安装 .NET 版本管理器了。

在终端中输入下面的命令,安装 DNVM。注意大小写,命令中可是小写的。这将会自动从 https://www.nuget.org/api/v2 安装最新的 DNX 包。

brew install dnvm

终端中的输出如下所示。

成功安装之后,可以在终端窗口中执行 dnvm 命令来检查一下。

dnvm

应该看到如下的输出。

复制代码
    ___  _  ___   ____  ___
   / _ \/ |/ / | / /  |/  /
  / // /    /| |/ / /|_/ / 
 /____/_/|_/ |___/_/  /_/  

.NET Version Manager - Version 1.0.0-beta5-10374
By Microsoft Open Technologies, Inc.

DNVM can be used to download versions of the .NET Execution Environment and manage which version you are using.
You can control the URL of the stable and unstable channel by setting the DNX_FEED and DNX_UNSTABLE_FEED variables.

Current feed settings:
Default Stable: https://www.nuget.org/api/v2
Default Unstable: https://www.myget.org/F/aspnetvnext/api/v2
Current Stable Override: <none>
Current Unstable Override: <none>

Use dnvm [help|-h|-help|--help]  to display help text.
复制代码

如果你看到的是

-bash: dnvm: command not found

也没有关系,这是因为没有找到 dnvm 这个命令而已,将 dnvm.sh 加入搜索路径就可以,这可以通过下面的命令来实现。

source dnvm.sh

如果需要更新 DNX,那么,可以使用 upgrade 命令。

dnvm upgrade

现在,你的 DNX 就已经成功安装了。使用 dnvm list 可以查看所有的版本。

Active Version              Runtime Arch Location             Alias
------ -------              ------- ---- --------             -----
       1.0.0-beta5-11682    coreclr x64  ~/.dnx/runtimes      
  *    1.0.0-beta4          mono         ~/.dnx/runtimes      default
       1.0.0-beta5-11682    mono         ~/.dnx/runtimes

可以切换当前使用的 .NET 版本。

localhost:helloClr $ dnvm alias default 1.0.0-beta5-11682
Updating alias 'default' to 'dnx-mono.1.0.0-beta5-11682'

重新显示一下当前的版本。

复制代码
ocalhost:helloClr $ dnvm list

Active Version              Runtime Arch Location             Alias
------ -------              ------- ---- --------             -----
       1.0.0-beta5-11682    coreclr x64  ~/.dnx/runtimes      
  *    1.0.0-beta4          mono         ~/.dnx/runtimes      
       1.0.0-beta5-11682    mono         ~/.dnx/runtimes      default
复制代码

1.3 保存路径

当关闭现在的终端窗口之后,重新打开终端窗口就会发现 dnx 不好用了。这是因为我们使用 source 设置的路径只能在当前的终端窗口中才能使用,如果希望能够保存下来,需要修改配置文件了。

查找一下 dnvm.sh 所在的文件夹。

localhost:~ $ mdfind -name dnvm.sh
/usr/local/Cellar/dnvm/1.0.0-dev/libexec/dnvm.sh

 

2. 创建控制台程序

环境创建之后,我们一般都会创建一个控制台的 Hello, world 程序来爽一把,程序就不用说了,主要是环境。

在桌面上创建了一个测试使用的文件夹 helloClr。在这里面创建下面的两个文件。

使用你喜欢的编辑器写一个 helloworld.cs 程序,其实与 Windows 下当然是一摸一样了。

using System;
public class Program {
public static void Main() {
        Console.WriteLine("Hello from DNX!");
    }
}

不一样的是需要为我们这个简单的项目,创建一个项目文件,文件名必须是 project.json,是 json 格式呀,不要写错了。在与 helloworld.cs 相同的文件夹下,创建这个 project.json 文件。内容如下。

复制代码
{
  "dependencies": {
  },
  "frameworks": {
    "dnx451": {},
    "dnxcore50": {
      "dependencies": {
        "System.Console": "4.0.0-beta-22605"
        }
      }
   } 
}
复制代码

现在已经一切都准备好了,注意当前目录需要在这个文件夹下,在终端窗口中,输入运行的命令就可以了。

dnx . run

没有问题的话,就应该看到输出的 Hello from DNX! 了。

在 Mac OS X 下面,还可以设置一个环境变量 DNX_TRACE 来看看详细的输出。

export DNX_TRACE=1

现在的输出丰富多了。

复制代码
Information: [DefaultHost]: Project path: /Users/haogj/Desktop/helloClr
Information: [DefaultHost]: Project root: /Users/haogj/Desktop/helloClr
Information: [DefaultHost]: Packages path: /Users/haogj/.dnx/packages
Information: [Breadcrumbs] Breadcrumbs for servicing will not be written because the breadcrumbs folder () does not exist.
Information: [DependencyWalker]: Walking dependency graph for 'helloClr DNX,Version=v4.5.1'.
Information: [WalkContext]: Graph walk stage 1 took in 9ms
Information: [DependencyWalker]: Graph walk took 17ms.
Information: [WalkContext]: Populate took 7ms
Information: [DependencyWalker]: Resolved dependencies for helloClr in 26ms
Information: [LoaderContainer]: Load name=helloClr
Information: [ProjectLibraryExportProvider]: GetLibraryExport(helloClr, DNX,Version=v4.5.1, Debug, )
Information: [Microsoft.Framework.Runtime.Roslyn.RoslynProjectReferenceProvider]: GetProjectReference(helloClr, DNX,Version=v4.5.1, Debug, )
Information: [ProjectExportProviderHelper]: Resolving references for 'helloClr' 
Information: [ProjectExportProviderHelper]: Resolved 4 references for 'helloClr' in 6ms
Information: [RoslynCompiler]: Compiling 'helloClr'
Information: [LoaderContainer]: Load name=System.Security.Cryptography.Hashing
Information: [LoaderContainer]: Load name=System.Security.Cryptography.Hashing.Algorithms
Information: [RoslynCompiler]: Compiled 'helloClr' in 373ms
Information: [CompilationContext]: Generating resources for helloClr
Information: [CompilationContext]: Generated resources for helloClr in 3ms
Information: [RoslynProjectReference]: Emitting assembly for helloClr
Warning: PDB generation is not supported on this platform
Information: [RoslynProjectReference]: Emitted helloClr in 827ms
Information: [ProjectAssemblyLoader]: Loaded name=helloClr in 1240ms
Hello from DNX!
复制代码

查看一下当前目录,可以看到我们熟悉的 helloworld.exe 文件,当然了,它必须使用 dnx 才能执行,可以这样直接执行程序。

dnx helloworld.exe

3. 创建网站程序

激动人心的时刻快到了,但是,我们还需要做一些准备工作。

先确认一下你的 .NET 版本。还记得下面的命令吗?检查默认的版本。

dnvm list

Yeoman 是一个创建项目框架的应用,使用它我们可以创建出网站项目的基本框架。

默认的网站需要很多文件组成,包括样式、脚本、配置等等,在 Mac 下面可没有强大的 Visual Studio,这里需要通过 Yeoman 来搭建基本的网站框架。

yeoman 需要通过 npm 来安装,如果你已经安装过 nodejs ,就已经安装过它了,如果没有,就先安装 nodejs 吧。

由于 npm 服务器在国外,国内使用起来问题较多,淘宝提供了一个国内镜像,保障了安装网络环境的稳定,和源地址10分钟同步一次,没有被收录的包会自动切换到npm官方下载,并添加进镜像库。说明链接地址:http://ju.outofmemory.cn/entry/118659

临时使用淘宝 npm 库,可以使用如下命令

npm --registry https://registry.npm.taobao.org info underscore

安装了 npm 之后,就可以使用 install 命令来安装 yeoman 了。

sudo npm install -g yo

安装的输出如下。

复制代码
/usr/local/bin/yo -> /usr/local/lib/node_modules/yo/lib/cli.js

> yo@1.4.6 postinstall /usr/local/lib/node_modules/yo
> yodoctor


Yeoman Doctor
Running sanity checks on your system

✔ Global configuration file is valid
✔ NODE_PATH matches the npm root
✔ No .bowerrc file in home directory
✔ No .yo-rc.json file in home directory

Everything looks all right!
yo@1.4.6 /usr/local/lib/node_modules/yo
├── array-uniq@1.0.2
├── figures@1.3.5
├── titleize@1.0.0
├── user-home@1.1.1
├── opn@1.0.2
├── humanize-string@1.0.1 (decamelize@1.0.0)
├── sort-on@1.2.0 (dot-prop@2.0.0)
├── yeoman-character@1.0.1 (supports-color@1.3.1)
├── async@0.9.0
├── string-length@1.0.0 (strip-ansi@2.0.1)
├── root-check@1.0.0 (sudo-block@1.2.0, downgrade-root@1.1.0)
├── cross-spawn@0.2.9 (lru-cache@2.6.2)
├── chalk@1.0.0 (escape-string-regexp@1.0.3, ansi-styles@2.0.1, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
├── findup@0.1.5 (commander@2.1.0, colors@0.6.2)
├── yosay@1.0.3 (ansi-regex@1.1.1, ansi-styles@2.0.1, word-wrap@1.0.3, strip-ansi@2.0.1, pad-component@0.0.1, taketalk@1.0.0, minimist@1.1.1)
├── meow@3.1.0 (object-assign@2.0.0, camelcase-keys@1.0.0, minimist@1.1.1, indent-string@1.2.1)
├── package-json@1.1.0 (registry-url@3.0.3)
├── npm-keyword@1.1.1 (registry-url@3.0.3)
├── update-notifier@0.3.2 (is-npm@1.0.0, latest-version@1.0.0, semver-diff@2.0.0)
├── got@2.9.2 (lowercase-keys@1.0.0, is-stream@1.0.1, timed-out@2.0.0, object-assign@2.0.0, prepend-http@1.0.1, nested-error-stacks@1.0.0, statuses@1.2.1, infinity-agent@2.0.3, duplexify@3.3.0, read-all-stream@2.1.2)
├── fullname@1.1.0 (npmconf@2.1.1)
├── yeoman-environment@1.2.5 (escape-string-regexp@1.0.3, untildify@2.0.0, log-symbols@1.0.2, diff@1.4.0, text-table@0.2.0, debug@2.2.0, mem-fs@1.1.0, globby@1.2.0, grouped-queue@0.3.0)
├── configstore@0.3.2 (object-assign@2.0.0, xdg-basedir@1.0.1, osenv@0.1.0, graceful-fs@3.0.6, uuid@2.0.1, mkdirp@0.5.0, js-yaml@3.3.0)
├── insight@0.5.3 (object-assign@2.0.0, lodash.debounce@3.0.3, os-name@1.0.3, tough-cookie@0.12.1, request@2.55.0)
├── lodash@3.8.0
├── yeoman-doctor@1.3.2 (object-values@1.0.0, log-symbols@1.0.2, each-async@1.1.1, twig@0.7.2)
└── inquirer@0.8.3 (ansi-regex@1.1.1, cli-width@1.0.1, through@2.3.7, readline2@0.1.1, rx@2.5.2)
复制代码

安装 yeoman 之后,还需要安装 aspnet 的模版库。使用下面的命令

sudo npm install -g yo generator-aspnet

输出如下内容。

复制代码
/usr/local/bin/yo -> /usr/local/lib/node_modules/yo/lib/cli.js

> yo@1.4.6 postinstall /usr/local/lib/node_modules/yo
> yodoctor


Yeoman Doctor
Running sanity checks on your system

✔ Global configuration file is valid
✔ NODE_PATH matches the npm root
✔ No .bowerrc file in home directory
✔ No .yo-rc.json file in home directory

Everything looks all right!
yo@1.4.6 /usr/local/lib/node_modules/yo
├── titleize@1.0.0
├── array-uniq@1.0.2
├── figures@1.3.5
├── user-home@1.1.1
├── opn@1.0.2
├── humanize-string@1.0.1 (decamelize@1.0.0)
├── sort-on@1.2.0 (dot-prop@2.0.0)
├── yeoman-character@1.0.1 (supports-color@1.3.1)
├── async@0.9.0
├── string-length@1.0.0 (strip-ansi@2.0.1)
├── cross-spawn@0.2.9 (lru-cache@2.6.2)
├── chalk@1.0.0 (escape-string-regexp@1.0.3, ansi-styles@2.0.1, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
├── root-check@1.0.0 (sudo-block@1.2.0, downgrade-root@1.1.0)
├── findup@0.1.5 (commander@2.1.0, colors@0.6.2)
├── yosay@1.0.3 (ansi-regex@1.1.1, ansi-styles@2.0.1, word-wrap@1.0.3, strip-ansi@2.0.1, pad-component@0.0.1, taketalk@1.0.0, minimist@1.1.1)
├── meow@3.1.0 (object-assign@2.0.0, camelcase-keys@1.0.0, minimist@1.1.1, indent-string@1.2.1)
├── npm-keyword@1.1.1 (registry-url@3.0.3)
├── package-json@1.1.0 (registry-url@3.0.3)
├── update-notifier@0.3.2 (is-npm@1.0.0, latest-version@1.0.0, semver-diff@2.0.0)
├── got@2.9.2 (lowercase-keys@1.0.0, is-stream@1.0.1, timed-out@2.0.0, object-assign@2.0.0, prepend-http@1.0.1, nested-error-stacks@1.0.0, statuses@1.2.1, infinity-agent@2.0.3, read-all-stream@2.1.2, duplexify@3.3.0)
├── fullname@1.1.0 (npmconf@2.1.1)
├── configstore@0.3.2 (object-assign@2.0.0, xdg-basedir@1.0.1, osenv@0.1.0, graceful-fs@3.0.6, uuid@2.0.1, mkdirp@0.5.0, js-yaml@3.3.0)
├── yeoman-environment@1.2.5 (untildify@2.0.0, log-symbols@1.0.2, escape-string-regexp@1.0.3, diff@1.4.0, text-table@0.2.0, debug@2.2.0, mem-fs@1.1.0, globby@1.2.0, grouped-queue@0.3.0)
├── insight@0.5.3 (object-assign@2.0.0, lodash.debounce@3.0.3, os-name@1.0.3, tough-cookie@0.12.1, request@2.55.0)
├── lodash@3.8.0
├── yeoman-doctor@1.3.2 (object-values@1.0.0, log-symbols@1.0.2, each-async@1.1.1, twig@0.7.2)
└── inquirer@0.8.3 (ansi-regex@1.1.1, cli-width@1.0.1, through@2.3.7, readline2@0.1.1, rx@2.5.2)

generator-aspnet@0.0.34 /usr/local/lib/node_modules/generator-aspnet
├── uuid@2.0.1
├── chalk@1.0.0 (escape-string-regexp@1.0.3, ansi-styles@2.0.1, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
├── yosay@1.0.3 (string-length@1.0.0, word-wrap@1.0.3, strip-ansi@2.0.1, ansi-regex@1.1.1, ansi-styles@2.0.1, pad-component@0.0.1, taketalk@1.0.0, minimist@1.1.1)
├── chai@1.10.0 (assertion-error@1.0.0, deep-eql@0.1.3)
└── yeoman-generator@0.19.2 (read-chunk@1.0.1, detect-conflict@1.0.0, dargs@4.0.0, yeoman-welcome@1.0.1, xdg-basedir@1.0.1, user-home@1.1.1, diff@1.4.0, text-table@0.2.0, mime@1.3.4, async@0.9.0, istextorbinary@1.0.2, nopt@3.0.1, debug@2.2.0, run-async@0.1.0, cross-spawn@0.2.9, mem-fs-editor@1.2.3, mkdirp@0.5.0, shelljs@0.4.0, through2@0.6.5, cli-table@0.3.1, pretty-bytes@1.0.4, dateformat@1.0.11, underscore.string@3.0.3, glob@5.0.5, github-username@1.1.1, findup-sync@0.2.1, rimraf@2.3.3, class-extend@0.1.1, yeoman-assert@1.0.0, html-wiring@1.1.0, yeoman-environment@1.2.5, sinon@1.14.1, gruntfile-editor@1.0.0, lodash@3.8.0, download@4.1.2, inquirer@0.8.3)
复制代码

安装好生成器之后,我们终于可以创建一个网站项目了。直接在命令行输入 yo 或者直接输入 yo aspnet 就可以了。有向导的呀。

复制代码
? 'Allo OpenXLive! What would you like to do? Aspnet

Make sure you are in the directory you want to scaffold into.
This generator can also be run with: yo aspnet


     _-----_
    |       |    .--------------------------.
    |--(o)--|    |      Welcome to the      |
   `---------´   |   marvellous ASP.NET 5   |
    ( _´U`_ )    |        generator!        |
    /___A___\    '--------------------------'
     |  ~  |     
   __'.___.'__   
 ´   `  |° ´ Y ` 

? What type of application do you want to create? Web Application
? What's the name of your ASP.NET application? WebApplication
   create WebApplication/.gitgnore
   create WebApplication/Startup.cs
   create WebApplication/bower.json
   create WebApplication/config.json
   create WebApplication/MessageService.cs
   create WebApplication/project.json
   create WebApplication/package.json
   create WebApplication/gruntfile.js
   create WebApplication/Models/AccountViewModels.cs
   create WebApplication/Models/IdentityModels.cs
   create WebApplication/Models/ManageViewModels.cs
   create WebApplication/Controllers/AccountController.cs
   create WebApplication/Controllers/HomeController.cs
   create WebApplication/Controllers/ManageController.cs
   create WebApplication/Compiler/Preprocess/RazorPreCompilation.cs
   create WebApplication/Migrations/000000000000000_CreateIdentitySchema.cs
   create WebApplication/Migrations/ApplicationDbContextModelSnapshot.cs
   create WebApplication/Properties/AppSettings.cs
   create WebApplication/Views/Account/ConfirmEmail.cshtml
   create WebApplication/Views/Account/ExternalLoginConfirmation.cshtml
   create WebApplication/Views/Account/ExternalLoginFailure.cshtml
   create WebApplication/Views/Account/ForgotPassword.cshtml
   create WebApplication/Views/Account/ForgotPasswordConfirmation.cshtml
   create WebApplication/Views/Account/Login.cshtml
   create WebApplication/Views/Account/Register.cshtml
   create WebApplication/Views/Account/ResetPassword.cshtml
   create WebApplication/Views/Account/ResetPasswordConfirmation.cshtml
   create WebApplication/Views/Account/SendCode.cshtml
   create WebApplication/Views/Account/VerifyCode.cshtml
   create WebApplication/Views/Home/Contact.cshtml
   create WebApplication/Views/Home/About.cshtml
   create WebApplication/Views/Home/Index.cshtml
   create WebApplication/Views/Manage/AddPhoneNumber.cshtml
   create WebApplication/Views/Manage/ChangePassword.cshtml
   create WebApplication/Views/Manage/Index.cshtml
   create WebApplication/Views/Manage/ManageLogins.cshtml
   create WebApplication/Views/Manage/RemoveLogin.cshtml
   create WebApplication/Views/Manage/SetPassword.cshtml
   create WebApplication/Views/Manage/VerifyPhoneNumber.cshtml
   create WebApplication/Views/Shared/Error.cshtml
   create WebApplication/Views/Shared/_Layout.cshtml
   create WebApplication/Views/Shared/_LoginPartial.cshtml
   create WebApplication/Views/Shared/_ValidationScriptsPartial.cshtml
   create WebApplication/Views/_GlobalImport.cshtml
   create WebApplication/Views/_ViewStart.cshtml
   create WebApplication/wwwroot/_references.js
   create WebApplication/wwwroot/css/site.css
   create WebApplication/wwwroot/favicon.ico
   create WebApplication/wwwroot/images/ASP-NET-Banners-01.png
   create WebApplication/wwwroot/images/ASP-NET-Banners-02.png
   create WebApplication/wwwroot/images/Banner-01-Azure.png
   create WebApplication/wwwroot/images/Banner-02-VS.png
   create WebApplication/wwwroot/lib/bootstrap-touch-carousel/css/bootstrap-touch-carousel.css
   create WebApplication/wwwroot/lib/bootstrap-touch-carousel/js/bootstrap-touch-carousel.js
   create WebApplication/wwwroot/lib/bootstrap/css/bootstrap-theme.css
   create WebApplication/wwwroot/lib/bootstrap/css/bootstrap-theme.min.css
   create WebApplication/wwwroot/lib/bootstrap/css/bootstrap.css
   create WebApplication/wwwroot/lib/bootstrap/css/bootstrap.min.css
   create WebApplication/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.eot
   create WebApplication/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.svg
   create WebApplication/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf
   create WebApplication/wwwroot/lib/bootstrap/fonts/glyphicons-halflings-regular.woff
   create WebApplication/wwwroot/lib/bootstrap/js/bootstrap.js
   create WebApplication/wwwroot/lib/bootstrap/js/bootstrap.min.js
   create WebApplication/wwwroot/lib/hammer.js/hammer.js
   create WebApplication/wwwroot/lib/hammer.js/hammer.min.js
   create WebApplication/wwwroot/lib/hammer.js/hammer.min.map
   create WebApplication/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
   create WebApplication/wwwroot/lib/jquery-validation/jquery.validate.js
   create WebApplication/wwwroot/lib/jquery/jquery-migrate.js
   create WebApplication/wwwroot/lib/jquery/jquery-migrate.min.js
   create WebApplication/wwwroot/lib/jquery/jquery.js
   create WebApplication/wwwroot/lib/jquery/jquery.min.js
   create WebApplication/wwwroot/lib/jquery/jquery.min.map


Your project is now created, you can use the following commands to get going
    dnu restore
    dnu build
    dnx . run for console projects
    dnx . kestrel or dnx . web for web projects



     _-----_
    |       |    .----------------------.
    |--(o)--|    |     Bye from us!     |
   `---------´   |      Chat soon.      |
    ( _´U`_ )    |      Yeoman team     |
    /___A___\    |   http://yeoman.io   |
     |  ~  |     '----------------------'
   __'.___.'__   
 ´   `  |° ´ Y `
复制代码

太麻烦了?看看动画吧。

资料来源:http://blogs.msdn.com/b/webdev/archive/2014/12/17/yeoman-generators-for-asp-net-vnext.aspx

在输出的最后,已经说明我们需要的工作。执行 dnu restore, 但是,报错了。

复制代码
Restoring packages for /Users/Openxlive/Desktop/helloWeb/WebApplication/project.json
Writing lock file /Users/Openxlive/Desktop/helloWeb/WebApplication/project.lock.json
npm WARN package.json WebApplication@0.0.0 No description
npm WARN package.json WebApplication@0.0.0 No repository field.
npm WARN package.json WebApplication@0.0.0 No README data
grunt@0.4.5 node_modules/grunt
├── which@1.0.9
├── dateformat@1.0.2-1.2.3
├── eventemitter2@0.4.14
├── getobject@0.1.0
├── rimraf@2.2.8
├── colors@0.6.2
├── async@0.1.22
├── hooker@0.2.3
├── grunt-legacy-util@0.2.0
├── exit@0.1.2
├── nopt@1.0.10 (abbrev@1.0.5)
├── lodash@0.9.2
├── minimatch@0.2.14 (sigmund@1.0.0, lru-cache@2.6.2)
├── glob@3.1.21 (inherits@1.0.0, graceful-fs@1.2.3)
├── coffee-script@1.3.3
├── underscore.string@2.2.1
├── iconv-lite@0.2.11
├── findup-sync@0.1.3 (glob@3.2.11, lodash@2.4.2)
├── grunt-legacy-log@0.1.1 (underscore.string@2.3.3, lodash@2.4.2)
└── js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.16)

grunt-bower-task@0.4.0 node_modules/grunt-bower-task
├── colors@0.6.2
├── async@0.1.22
├── wrench@1.4.4
├── rimraf@2.0.3 (graceful-fs@1.1.14)
├── lodash@0.10.0
└── bower@1.3.12 (is-root@1.0.0, junk@1.0.1, stringify-object@1.0.1, which@1.0.9, abbrev@1.0.5, chmodr@0.1.0, osenv@0.1.0, archy@0.0.2, opn@1.0.2, rimraf@2.2.8, bower-logger@0.2.2, bower-endpoint-parser@0.2.2, graceful-fs@3.0.6, lockfile@1.0.0, lru-cache@2.5.2, nopt@3.0.1, retry@0.6.0, tmp@0.0.23, q@1.0.1, request-progress@0.3.0, shell-quote@1.4.3, chalk@0.5.0, semver@2.3.2, bower-json@0.4.0, fstream@1.0.6, p-throttler@0.1.0, mkdirp@0.5.0, promptly@0.2.0, bower-config@0.5.2, fstream-ignore@1.0.2, tar-fs@0.5.2, decompress-zip@0.0.8, request@2.42.0, glob@4.0.6, bower-registry-client@0.2.4, cardinal@0.4.0, mout@0.9.1, inquirer@0.7.1, insight@0.4.3, handlebars@2.0.0, update-notifier@0.2.0)
----------
System.ComponentModel.Win32Exception: ApplicationName='bower', CommandLine='install', CurrentDirectory='/Users/Openxlive/Desktop/helloWeb/WebApplication', Native error= Cannot find the specified file
  at System.Diagnostics.Process.Start_noshell (System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process process) [0x00000] in <filename unknown>:0 
  at System.Diagnostics.Process.Start_common (System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process process) [0x00000] in <filename unknown>:0 
  at System.Diagnostics.Process.Start (System.Diagnostics.ProcessStartInfo startInfo) [0x00000] in <filename unknown>:0 
  at Microsoft.Framework.PackageManager.ScriptExecutor.Execute (Microsoft.Framework.Runtime.Project project, System.String scriptName, System.Func`2 getVariable) [0x00000] in <filename unknown>:0 
  at Microsoft.Framework.PackageManager.RestoreCommand+<RestoreForProject>d__69.MoveNext () [0x00000] in <filename unknown>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter`1[System.Boolean].GetResult () [0x00000] in <filename unknown>:0 
  at Microsoft.Framework.PackageManager.RestoreCommand+<>c__DisplayClass68_0+<<ExecuteCommand>b__0>d.MoveNext () [0x00000] in <filename unknown>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in <filename unknown>:0 
  at Microsoft.Framework.PackageManager.RestoreCommand+<ExecuteCommand>d__68.MoveNext () [0x00000] in <filename unknown>:0 
----------
Restore failed
ApplicationName='bower', CommandLine='install', CurrentDirectory='/Users/Openxlive/Desktop/helloWeb/WebApplication', Native error= Cannot find the specified file
复制代码

看样子是少了一个 bower 组件,重新安装一下吧。

sudo npm install -g bower

输出如下:

复制代码
/usr/local/bin/bower -> /usr/local/lib/node_modules/bower/bin/bower
bower@1.4.1 /usr/local/lib/node_modules/bower
├── is-root@1.0.0
├── junk@1.0.1
├── stringify-object@1.0.1
├── user-home@1.1.1
├── abbrev@1.0.5
├── chmodr@0.1.0
├── rimraf@2.3.3
├── archy@1.0.0
├── opn@1.0.2
├── bower-logger@0.2.2
├── bower-endpoint-parser@0.2.2
├── graceful-fs@3.0.6
├── lockfile@1.0.0
├── nopt@3.0.1
├── lru-cache@2.6.2
├── retry@0.6.1
├── tmp@0.0.24
├── q@1.4.0
├── semver@2.3.2
├── p-throttler@0.1.1 (q@0.9.7)
├── fstream@1.0.6 (inherits@2.0.1)
├── promptly@0.2.0 (read@1.0.5)
├── which@1.1.1 (is-absolute@0.1.7)
├── tar-fs@1.5.0 (pump@1.0.0, tar-stream@1.1.4)
├── request-progress@0.3.1 (throttleit@0.0.2)
├── glob@4.5.3 (inherits@2.0.1, once@1.3.2, inflight@1.0.4, minimatch@2.0.7)
├── fstream-ignore@1.0.2 (inherits@2.0.1, minimatch@2.0.7)
├── chalk@1.0.0 (ansi-styles@2.0.1, escape-string-regexp@1.0.3, supports-color@1.3.1, strip-ansi@2.0.1, has-ansi@1.0.3)
├── github@0.2.4 (mime@1.3.4)
├── mkdirp@0.5.0 (minimist@0.0.8)
├── cardinal@0.4.4 (ansicolors@0.2.1, redeyed@0.4.4)
├── mout@0.11.0
├── bower-config@0.6.1 (osenv@0.0.3, graceful-fs@2.0.3, optimist@0.6.1, mout@0.9.1)
├── handlebars@2.0.0 (optimist@0.3.7, uglify-js@2.3.6)
├── decompress-zip@0.1.0 (mkpath@0.1.0, touch@0.0.3, readable-stream@1.1.13, binary@0.3.0)
├── shell-quote@1.4.3 (array-filter@0.0.1, array-reduce@0.0.0, array-map@0.0.0, jsonify@0.0.0)
├── bower-json@0.4.0 (graceful-fs@2.0.3, intersect@0.0.3, deep-extend@0.2.11)
├── inquirer@0.8.0 (figures@1.3.5, ansi-regex@1.1.1, mute-stream@0.0.4, through@2.3.7, readline2@0.1.1, chalk@0.5.1, lodash@2.4.2, rx@2.5.2, cli-color@0.3.3)
├── request@2.53.0 (caseless@0.9.0, json-stringify-safe@5.0.0, forever-agent@0.5.2, aws-sign2@0.5.0, stringstream@0.0.4, tunnel-agent@0.4.0, oauth-sign@0.6.0, isstream@0.1.2, node-uuid@1.4.3, qs@2.3.3, form-data@0.2.0, combined-stream@0.0.7, tough-cookie@1.1.0, bl@0.9.4, hawk@2.3.1, mime-types@2.0.11, http-signature@0.10.1)
├── bower-registry-client@0.3.0 (graceful-fs@2.0.3, request-replay@0.2.0, rimraf@2.2.8, lru-cache@2.3.1, async@0.2.10, mkdirp@0.3.5, request@2.51.0)
├── insight@0.5.3 (object-assign@2.0.0, async@0.9.0, lodash.debounce@3.0.3, tough-cookie@0.12.1, os-name@1.0.3)
├── update-notifier@0.3.2 (is-npm@1.0.0, string-length@1.0.0, semver-diff@2.0.0, latest-version@1.0.0)
└── configstore@0.3.2 (object-assign@2.0.0, xdg-basedir@1.0.1, osenv@0.1.0, uuid@2.0.1, js-yaml@3.3.0)
复制代码

把 grunt 也安装一下。

sudo npm install -g grunt-cli

输出。

/usr/local/bin/grunt -> /usr/local/lib/node_modules/grunt-cli/bin/grunt
grunt-cli@0.1.13 /usr/local/lib/node_modules/grunt-cli
├── resolve@0.3.1
├── nopt@1.0.10 (abbrev@1.0.5)
└── findup-sync@0.1.3 (lodash@2.4.2, glob@3.2.11)

重新 restore ,终于成功了。

复制代码
Restoring packages for /Users/Openxlive/Desktop/helloWeb/WebApplication/project.json
Writing lock file /Users/Openxlive/Desktop/helloWeb/WebApplication/project.lock.json
npm WARN package.json WebApplication@0.0.0 No description
npm WARN package.json WebApplication@0.0.0 No repository field.
npm WARN package.json WebApplication@0.0.0 No README data
Running "bower:install" (bower) task
>> Installed bower packages
>> Copied packages to /Users/Openxlive/Desktop/helloWeb/WebApplication/wwwroot/lib

Done, without errors.
Restore complete, 12380ms elapsed
复制代码

运行网站。

dnx . kestrel

Started

打开浏览器,访问地址: http://localhost:5001

居然又报了一个错误。

An unhandled exception occurred while processing the request.

IOException: kqueue() FileSystemWatcher has reached the maximum nunmber of files to watch.
System.IO.KqueueMonitor.Add (System.String path, Boolean postEvents, System.Collections.Generic.List`1& fds) [0x00000] in <filename unknown>, line 0

这是 Mono 的一个已知错误,需要一个设置。

export MONO_MANAGED_WATCHER=false

再次运行,终于可以看到网站了。

Android中使用HTTP和HttpClient进行通信 - qingyezhu - 博客园

mikel阅读(1039)

来源: Android中使用HTTP和HttpClient进行通信 – qingyezhu – 博客园

</pre>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="http://www.mikel.cn/wp-content/uploads/2015/05/copycode8.gif" alt="复制代码" /></a></span></div>
<pre>/**
     * 使用HTTP的Get方式进行数据请求
     */
    protected void httpGet() {
        /**
         * 进行异步请求
         */
        new AsyncTask<String, Void, Void>() {

            @Override
            protected Void doInBackground(String... params) {
                System.err.println("httpGet start");
                // 在此方法中只能进行数据处理,不能与进行UI交互
                try {
                    URL url = new URL(params[0]);
                    URLConnection connection = url.openConnection();
                    InputStream is = connection.getInputStream();
                    // 使用UTF-8的方式进行数据流转化,从字节流转化为字符流
                    InputStreamReader isr = new InputStreamReader(is, "UTF-8");
                    BufferedReader br = new BufferedReader(isr);
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        System.err.println(line);
                    }
                    // 关闭数据流
                    br.close();
                    isr.close();
                    is.close();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute("http://fanyi.youdao.com/openapi.do?keyfrom=***&key=***&type=data&doctype=json&version=1.1&q=good");
    }

    /**
     * 使用HTTP的Post方式进行数据请求
     */
    protected void httpPost() {
        /**
         * 进行异步请求
         */
        new AsyncTask<String, Void, Void>() {

            @Override
            protected Void doInBackground(String... params) {
                System.err.println("httpPost start");
                // 在此方法中只能进行数据处理,不能与进行UI交互
                try {
                    URL url = new URL(params[0]);
                    HttpURLConnection connection = (HttpURLConnection) url
                            .openConnection();
                    // 设置请求方式以及设置参数

                    // 设置是否向HttpURLConnection对象输出
                    connection.setDoOutput(true);
                    // 设置请求方式
                    connection.setRequestMethod("POST");

                    // 设置参数
                    OutputStream os = connection.getOutputStream();
                    OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
                    BufferedWriter bw = new BufferedWriter(osw);
                    bw.write(params[1]);
                    bw.flush();

                    InputStream is = connection.getInputStream();
                    // 使用UTF-8的方式进行数据流转化,从字节流转化为字符流
                    InputStreamReader isr = new InputStreamReader(is, "UTF-8");
                    BufferedReader br = new BufferedReader(isr);
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        System.err.println(line);
                    }
                    // 关闭数据流
                    br.close();
                    isr.close();
                    is.close();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute("http://fanyi.youdao.com/openapi.do",
                "keyfrom=***&key=***&type=data&doctype=json&version=1.1&q=good");

    }

    private HttpClient httpClient;

    /**
     * 使用HttpClient进行Get请求
     */
    protected void httpClientGet() {
        new AsyncTask<String, Void, Void>() {

            @Override
            protected Void doInBackground(String... params) {
                System.err.println("httpClientGet start");
                String urlString = params[0];
                HttpGet httpGet = new HttpGet(urlString);
                try {
                    // 发送请求
                    HttpResponse response = httpClient.execute(httpGet);
                    // 获取返回内容
                    String value = EntityUtils.toString(response.getEntity());
                    System.err.println(value);
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute("http://fanyi.youdao.com/openapi.do?keyfrom=***&key=***&type=data&doctype=json&version=1.1&q=good");
    }

    /**
     * 使用HttpClient进行Post请求
     */
    protected void httpClientPost() {
        new AsyncTask<String, Void, Void>() {

            @Override
            protected Void doInBackground(String... params) {
                System.err.println("httpClientPost start");
                String urlString = params[0];
                HttpPost httpPost = new HttpPost(urlString);
                try {
                    // 设置参数
                    String[] paramsArr = params[1].split("&");
                    int len = paramsArr.length;
                    List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>(
                            len);
                    BasicNameValuePair pair = null;
                    for (int i = 0; i < len; i++) {
                        String[] paramArr = paramsArr[i].split("=");
                        pair = new BasicNameValuePair(paramArr[0], paramArr[1]);
                        list.add(pair);
                    }
                    httpPost.setEntity(new UrlEncodedFormEntity(list));
                } catch (UnsupportedEncodingException e1) {
                    e1.printStackTrace();
                }

                try {
                    // 发送请求
                    HttpResponse response = httpClient.execute(httpPost);
                    // 获取返回内容
                    String value = EntityUtils.toString(response.getEntity());
                    System.err.println(value);
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute("http://fanyi.youdao.com/openapi.do",
                "keyfrom=***&key=***&type=data&doctype=json&version=1.1&q=good");
    }</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="http://www.mikel.cn/wp-content/uploads/2015/05/copycode8.gif" alt="复制代码" /></a></span></div>
<div class="cnblogs_code_toolbar">

截图:

Android学习笔记:利用httpclient和AsyncTask 发起网络http post操作 - 51kata - 博客园

mikel阅读(942)

来源: Android学习笔记:利用httpclient和AsyncTask 发起网络http post操作 – 51kata – 博客园

1、在Android4中,发起网络http操作,不能在Activity的事件(即主线程)中进行,必须在单独的线程中操作。

另外进行网络操作,需要在manifest文件中增加如下的权限:

<uses-permission Android:name=”android.permission.INTERNET” />

2、下面给出代码事例

    public void loadData() {
        new AsyncTask<String, Void, String>() {
            @Override
            protected String doInBackground(String... paramsInput) {
                String url = "http://10.0.0.5:8080/examples/action";
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("type", paramsInput[0]));
                params.add(new BasicNameValuePair("id", paramsInput[1]));
                /* 建立HTTPPost对象 */
                HttpPost httpRequest = new HttpPost(url);
 
                String strResult = "doPostError";
                try {
                    HttpClient httpClient = getHttpClient();
                    /* 添加请求参数到请求对象 */
                    httpRequest.setEntity(new UrlEncodedFormEntity(params,
                            HTTP.UTF_8));
                    /* 发送请求并等待响应 */
                    HttpResponse httpResponse = httpClient.execute(httpRequest);
                    /* 若状态码为200 ok */
                    if (httpResponse.getStatusLine().getStatusCode() == 200) {
                        /* 读返回数据 */
                        strResult = EntityUtils.toString(httpResponse
                                .getEntity());
 
                    } else {
                        strResult = "Error Response: "
                                + httpResponse.getStatusLine().toString();
                    }
                } catch (ClientProtocolException e) {
                    strResult = "Error Response: " + e.getMessage().toString();
                    e.printStackTrace();
                } catch (IOException e) {
                    strResult = "Error Response: " + e.getMessage().toString();
                    e.printStackTrace();
                } catch (Exception e) {
                    strResult = "Error Response: " + e.getMessage().toString();
                    e.printStackTrace();
                }
                return strResult;
            }
 
            @Override
            protected void onPostExecute(String result) {
                TextView view = (TextView) findViewById(R.id.resultText);
                view.setText(result);
                super.onPostExecute(result);
            }
 
        }.execute("query","1");
    }
 
private HttpClient getHttpClient() {
 
        // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)
 
        HttpParams httpParams = new BasicHttpParams();
 
        // 设置连接超时和 Socket 超时,以及 Socket 缓存大小
 
        HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000);
 
        HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000);
 
        HttpConnectionParams.setSocketBufferSize(httpParams, 8192);
 
        // 设置重定向,缺省为 true
 
        HttpClientParams.setRedirecting(httpParams, true);
 
        // 设置 user agent
 
        String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";
        HttpProtocolParams.setUserAgent(httpParams, userAgent);
 
        // 创建一个 HttpClient 实例
 
        // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient
 
        // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient
 
        HttpClient httpClient = new DefaultHttpClient(httpParams);
 
        return httpClient;
    }

上述代码的loadData方法中,创建一个AsyncTask对象,在对象的doInBackground方法中发起网络操作,获取到操作结果。然后在onPostExecute方法中,利用前面获取到的结果更新界面。

这里的网络操作主要是利用了HttpClient等相关api,位于org.apache.http.client.HttpClient下。

作弊作弊还是作弊

mikel阅读(1413)

互联网上多少见不得光的内幕就集中在两个“作弊”!

不管是游戏还是各种推广项目,都存在作弊的情况,就连小小的体验站五一假期三天内就多出来6个作弊的账号,不明白难道踏踏实实的做任务赚钱不行吗?!非要作弊被查出来然后封号吗?!

很多时候人们总是怀着侥幸心理在作弊赚钱,可是这种行为一下子成风的时候。网站甚至被这些作弊的人弄赔了,结果好好的项目彻底的垮了,大家都一下子没钱赚了,要想项目能够良性的发展,就应该让大家都有钱赚,而不是钱都让一个人赚了,这样谁都活不下去,共赢在互联网上就是那么简单的模式,没什么大家都遵守规矩,赚该赚的钱,不要试图赚不该赚的,得不偿失。

看着那些别封号的人,为了多赚1元就不惜损坏游戏规则,真的很可怜,结果不但赚不到,还白白浪费了心思。有这些心思用在正道儿上,估计赚到的不止1元吧!

一张图、一幅画,献给天下母亲,您辛苦了!

mikel阅读(1188)

6630624662513605640

一张图、一幅画,献给天下母亲,您辛苦了!

祝伟大的母亲 节日快乐 您辛苦了!

作为父母最希望的就是儿女在身边,不远离,时不时的常回家看看,做儿女的也最希望的是父母在身边,不管工作上有多少烦心的事儿,只要在父母身边就觉得踏实,就算天大的事儿,回到家里,父母身边就觉得的无所谓了,至少父母永远支持自己前行。

总觉得追逐成功或者财富是没有尽头的,每个人能够掌控的是有限的,不要奢求一步登天,只需要踏踏实实走好自己的路即可,眼高手低很累人,也累心,牵连着周围的人也跟着槽神费力,首当其冲的就是父母,替你提心吊胆,哪个创业者的后面没有同样操劳的父母亲?!认清自己,善待自己,同样是善待亲人。

 

Mac OS忘记密码怎么办?无光盘破解Mac OS的管理员密码

mikel阅读(876)

日前朋友拿一台新款Mac OS的Air让帮忙装win7,结果Mac OS有密码。以前破过Mac OS密码,直接用苹果的系统安装盘就可以重置密码的。但这次没盘,因此,直接求助度娘。有了如下方法,以后Mac OS忘记密码还用得着,MTOOU.INFO方法二测试是有效的。(延伸:Windows7开机密码破解修改实战

方法一:官方解决方法。找出电脑原配的系统盘,找不到就借一张或者刻录一张,重启电脑,启动的时候按C键,选好语言后进入安装的时候,点击“常用工具”,里面有一项是“重设密码”,这时就可以重新设定Mac OS系统的管理员密码了。

方法二:黑客解决方法。开机, 启动时按“cmd+S”。这时进入单一用户模式(Single user model)。Mac OS的单一用户模式有准入特权(Root access privilege)而不要求根密码(root password)。出现像DOS一样的提示符 #root>。在#root>下逐步输入以下命令,注意空格,大小写


//执行硬盘检测(只读), 这一步可以省略
/sbin/fsck -y

//加载文件系统(读/写)
/sbin/mount -uaw

//删除初始化设置时的OSX生成的隐藏文件”.applesetupdone”
rm /var/db/.AppleSetupDone

//重启
reboot

重启开机后出现类似装机时的欢迎界面。别担心,东西没丢。就像第一次安装一样, 重新建立一个新的Mac OS管理员账号。然后在新的管理员下打开系统预制 - 账户,打开最下面的锁,询问密码时,用新的管理员密码登录。会看到至少两个账号,新的管理员的帐号和原来的帐号,点中原来的账号,选 密码 - 更改密码……(一切,从此改变) 你不必有原先的Mac OS密码就直接可以设新密码了。

点下面的登陆选项 (小房子),选中 自动以右边的身份登陆, 同时在下拉菜单中选你原先的账号。

重启, 大功告成。至此破解Mac OS开机密码工作完成。

如果不喜欢多出一个账号, 删除它。 系统预制 - 账户,选新的管理员帐号, 点一下锁上面的减号

[转载]方寸指间——细节设计_通知 - 超级Peng - 博客园

mikel阅读(885)

来源: [转载]方寸指间——细节设计_通知 – 超级Peng – 博客园

通知设计

通知的设计方式,应该做到及时将用户关心的信息内容传递给用户,信息要针对用户的需要,或者是否是紧急的内容

,否则很容易引起用户的反感。同时需要注意实际的应用场景、时间点和隐私性等问题

通知设计的原则:及时传递有效信息,要能引起用户的注意,但又不打断用户的当前任务。能做到简单预览通知内容,

让用户来决断是否立即查看。如果过有多条同类信息,合并处理。

 

  常见系统通知

1、通知中心:通知提醒内容都集中在此,在进入系统之后任何情况下都能够下拉查看,是最便捷、最不干扰用户的

方式

2、顶部横幅:在界面顶部短暂停留,能引起用户注意,但有打断当前任务界面

3、Alert:打扰程度最大的通知提醒,打断当前页面的所有操作。由于这种形式的滥用,现在很多用户习惯直接关

闭窗口,很少仔细查看通知内容

4、Toast:是一种操作之后的反馈,告知用户结果。可以设置时长,一般是3秒左右

5、标志:告知用户有新内容,提示查看,有部分用户习惯于消除这样的数字。但是如果通知数字过大,则对用户的

意义不大

 

状态栏通知

状态通知方式的打扰程度最小,同时可以显示更长的时长,具有全局性的特点

1、Android的状态栏通知是系统自带的,结合消息中心,将会常见的电话、短信、系统状况等通知内容长期以图标的

方式占据者状态栏

2、IOS系统本身没有状态栏通知,但设计app的时候,可以通过覆盖状态栏的方式来实现通知的设计。所以IOS的状

态栏通知只出现在App本身,点击之后可以进入相应的通知内容

 

浮层通知

浮层通知,主要针对app内的通知提醒,一般不出现在新加载的页面中,以浮层的方式出现,浮层通知,具有较强的

引导性,但又不会打断当前的操作,用户可以选择是否关闭,具有临时性的特点

 

标志通知

标志通知,常见的表现方式为红点和数字。红点是一种更新提示,数字更准确、和用户关联度更高的提示。红点提示

和数字提示常常出现在app的标签导航栏和一些列表中。在权重上来说,红点和数字提示相比,数字更能够引起用户

的注意,但当数字过大时,容易引起用户的忽略。红点提示更适合在大信息量更新,且权重不高的情况下使用,一般

通过点击过后,红点会消失。数字提示更适合在更新信息量小,跟用户相关性更高的情况下使用,点击查看之后,数

字消失

 

硬件辅助

为了追求通知的及时性,引起用户的注意,通知设计有时候会加以硬件的辅助支持。已接收短信为例,常见的会有“叮”

提示音,在一些环境下我们会关闭提示音,使用震动来告知用户有短信。IOS也可以开启LED灯提示,Android上有

硬件指示灯。这些硬件的方式都可以作为通知的辅助手段,再设计中被利用起来