难题就是机会

mikel阅读(1557)

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

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

 

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

mikel阅读(1171)

来源: 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阅读(893)

来源: 在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阅读(941)

来源: 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阅读(1410)

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

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

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

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

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

mikel阅读(1183)

6630624662513605640

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

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

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

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

 

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

mikel阅读(872)

日前朋友拿一台新款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阅读(874)

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

通知设计

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

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

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

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

 

  常见系统通知

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

方式

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

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

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

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

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

意义不大

 

状态栏通知

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

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

方式占据者状态栏

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

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

 

浮层通知

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

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

 

标志通知

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

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

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

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

字消失

 

硬件辅助

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

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

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

 

Memcached 类库 EnyimMemcached 下的JSON序列化和二进制序列化兼容 - Jusfr - 博客园

mikel阅读(935)

来源: Memcached 类库 EnyimMemcached 下的JSON序列化和二进制序列化兼容 – Jusfr – 博客园

usfr 原创,转载请注明来自博客园,文章所用代码见于我的github 。

本人在分布式的项目使用中 EnyimMemcached ,由于业务需求使用了其序列化扩展,这里作下记录。

EnyimCaching 通过配置文件提供了扩展点,见github,序列化由 ITranscoder 接口定义,提供了 DefaultTranscoder 和 DataContractTranscoder 两个实现类,前者作为默认,后面以XML序列化的方式重写了前者的对象序列化方法。

EnyimCaching 是很典型的 DoNet 应用,内部逻辑使用 protected virtual 修饰,用户继承基类重写对应方法即可。

DefaultTranscoder 使用了一组方法对对象进行序列化,我们关注的引用类型使用了原生的 BinaryFormatter 进行序列化,它的效率高,带来的显著的问题是字节流带有 dll 强类型签名。对于分布式应用,到处引用 dll 并不是什么好主意;而非 Donet 语言更直接没辙了,处理好它们是我的需求

二进制序列化的效果

扩展过程并不麻烦,JSON 是首先方案,引用 Newtonsoft.Json 创建继承自 DefaultTranscoder 的 NewtonsoftJsonTranscoder,序列化方法重写 SerializeObject(object value) 方法即可,代码实在不需要贴出来


protected override ArraySegment&lt;byte&gt; SerializeObject(object value) {
JsonSerializer serializer = JsonSerializer.CreateDefault();
using (MemoryStream memoryStream = new MemoryStream())
using (TextWriter textWriter = new StreamWriter(memoryStream))
using (JsonWriter jsonWriter = new JsonTextWriter(textWriter)) {
serializer.Serialize(jsonWriter, value);
jsonWriter.Flush();
memoryStream.Seek(0L, SeekOrigin.Begin);
return new ArraySegment&lt;byte&gt;(memoryStream.ToArray());
}
}

Json 序列化的效果

但是反序列化就不是再丢上几句就完了,因为要对 Memcached 中已有的二进制序列化数据兼容,先说 EnyimCaching 对象序列化与反序列化逻辑:

1. CacheItem 是真正的缓存项,序列化时空对象时,使用长度为0的 byte 数组,结合 TypeCode.DBNull 枚举生成 CacheItem 实例;非空对象 调用 SerializeObject() 方法(内部使用 BinaryFormatter) 得到 byte 数组,组合 TypeCode.Object 枚举生成 CacheItem 实例;
2. 反序列化时检查 TypeCode 枚举,对枚举为 TypeCode.DBNull 的 CacheItem 直接返回 null;对枚举为 TypeCode.Object 的 CacheItem 调用 DeserializeObject() 方法并传入 Byte 数组;

 

下边是我的思路与解决方案

对于非空引用类型,Newtonsoft.Json 会序列化成形如 “{…}”的字符串,那么思路就来了:字符串“{}”的UTF8字节为[123, 125],那么我们是不是可以读出部分字节进行对比?像这样:读取 buffer[0],如果为123,则读取 buffer[buffer.Length – 1],如果为 [125],那么该 Byte 数组为 JSON 对象,可以使用 Newtonsoft.Json 反序列化;否则进行二进制序列化;

对于非引用,Newtonsoft.Json 会序列化 “null” 字符串,虽然反序列化时有开销,但是按照 EnyimCaching 的逻辑,空引用判断在前,不会进入 SerializeObject() 和 DeserializeObject() 方法;如果不放心,可以进行自己的 byte 数组非空与长度判断;


protected override object DeserializeObject(ArraySegment&lt;byte&gt; value) {
if (value.Array[0] != 123 || value.Array[value.Array.Length - 1] != 125) {
return base.DeserializeObject(value);
}

JsonSerializer serializer = JsonSerializer.CreateDefault();
serializer.NullValueHandling = NullValueHandling.Ignore;
using (MemoryStream memoryStream = new MemoryStream(value.Array, value.Offset, value.Count))
using (TextReader textReader = new StreamReader(memoryStream))
using (JsonReader jsonReader = new JsonTextReader(textReader)) {
return serializer.Deserialize(jsonReader);
}
}

很快就被打脸了:本机测试用例通过,开发中也用了不短时间,然后同事和我说遇到反序列化异常,马上就知道问题在这里,我用的 Newtonsoft.Json 版本是 6.0.8,他的是 6.0.4,虽然版本不一致,但是不应该序列化出来的东西不一样;接着调试,发现他进行反序列化时,得到的 byte 数组前面多了4个为0的字节,大概长这样 [0, 0, 0, 0, 123, …],接着调试,发现序列化时他写入的数组确实又是以 123 起头的,我香蕉你个把那!

接着想办法,由于 BinaryFormatter 有自己规律,打印几个看看。可以看到前8个 byte 都是在 0, 1, 255 之间,立马又心生一记,直接贴代码:


Byte[] _donetBytes = new[] { (Byte)0, (Byte)1, (Byte)255 };

protected override object DeserializeObject(ArraySegment&lt;byte&gt; value) {
if (value.Array.Length &gt;= _donetBytes.Length) {
var isOrignalObjectByte = value.Array.Take(10).Distinct().All(b =&gt; _donetBytes.Contains(b));
if (isOrignalObjectByte) {
return base.DeserializeObject(value);
}
}

JsonSerializer serializer = JsonSerializer.CreateDefault();
serializer.NullValueHandling = NullValueHandling.Ignore;
using (MemoryStream memoryStream = new MemoryStream(value.Array, value.Offset, value.Count))
using (TextReader textReader = new StreamReader(memoryStream))
using (JsonReader jsonReader = new JsonTextReader(textReader)) {
return serializer.Deserialize(jsonReader);
}
}

取 byte 数组的前10个,如果全部落入 [0, 1, 255] 中则使用 BinaryFormatter 反序列化,否则按 Newtonsoft.Json 反序列化;

本以为没事了,过几天又有反序列化异常,实在是没功夫调试了,最后写成这样了:


1         private Byte[] _donetBytes = new[] { (Byte)0, (Byte)1, (Byte)255 };
2
3         private static Object JsonDeserialize(Byte[] buffer) {
4             JsonSerializer serializer = JsonSerializer.CreateDefault();
5             serializer.NullValueHandling = NullValueHandling.Ignore;
6             using (MemoryStream memoryStream = new MemoryStream(buffer))
7             using (TextReader textReader = new StreamReader(memoryStream))
8             using (JsonReader jsonReader = new JsonTextReader(textReader)) {
9                 return serializer.Deserialize(jsonReader);
10             }
11         }
12
13         protected override object DeserializeObject(ArraySegment&lt;byte&gt; value) {
14             Boolean isJson = false;
15             if (value.Array[0] == 123 &amp;&amp; value.Array[value.Array.Length - 1] == 125) {
16                 isJson = true;
17             }
18             if (!isJson) {
19                 var isOrignalObjectByte = value.Array.Take(10).Distinct().All(_donetBytes.Contains);
20                 isJson = !isOrignalObjectByte;
21             }
22
23             if (isJson) {
24                 return JsonDeserialize(value.Array);
25             }
26             else {
27                 try {
28                     return base.DeserializeObject(value);
29                 }
30                 catch (SerializationException) {
31                     // Log or something
32                     return JsonDeserialize(value.Array);
33                 }
34             }
35         }

首先用理想的首尾字节判断是否为 JSON,如果不是则判断前10个 byte 是否落入 [0, 1, 255],最后还有一道补救,catch 二进制序列化失败下的异常,重新使用 JSON 序列化;

至此世界太平了,时间有限,要对 byte 数组进行更准确更有效率的推断实在是没有精力,如果您有其他实践或更好的方案,还请指教。

Jusfr 原创,转载请注明来自博客园,文章所用代码见于我的github 。