- 别人开源是种奉献精神, 微软突然把 .Net Framework 也开源, 人们看到的却是一种野心, 现在 .NET Core 开源还真正跨平台了, 真是雄心壮志啊.
本人 Java 多年, 但不可否认 C# 是一个很好的语言, 我认为单纯从语言上来说要优于 Java 语言, 所以 .NET Core 搭上 C# 力量更是不能小觑, 不得不摸索一下.
之前虽有浅尝 .NET Core 的 Hello World, 以及最简单的 ASP.NET 应用, 但未有成文, 在此再作演练一番以备忘.安装 .NET Core
本人所用平台为 Mac, 所以当打开 .NET Core 的首页面 https://www.microsoft.com/net/core 时直接激活了 Mac 标签, 在这个页面我们知道 .NET Core 支持 Windows, Linux, Mac; 还有现成的 Docker 镜像拉下即用. .NET Core 当前版本是 1.0, 可以照着官方向导来做, 不过我倾向于全控制台来完成. 首先你的 Mac 得先有个brew, 现在用port管理应用比较少了吧.1$ brew update 2$ brew cask install dotnet
说白了, 安装 .NET Core 只需要用brew cask install dotnet, 第一条命令没事都应该运行一下的, 发现有可升级的就运行一下brew upgrade.brew cask install dotnet会检测是否有openssl, 没有的话自动安装, 接着帮你下载 dotnet 安装包装上: Read More
本文只是我个人的掌握 Python 的快速入门笔记, 所以混乱不堪, 并不适合于每一个想要学习 Python 的读者
Python 命令进到它的 shell, ctrl+d 或 exit() 退出 python. help(str) 可以查看 str 函数的帮助, q 退出帮助. 对象的方法可用 dir 来查看,dir([]),dir(""), 进而help([].append),help(dir([]))
Python 是用严格的缩进来格式化代码块的, Google 的 Python 代码规范是用 4 个空格来缩进. Google 建议 Java 是用两个空格.
Python 是动态类型的, 所以可以 a = 1; a = "string" 随意赋值为不同类型. Python 也能用分号把多条语句写在同一行里, 但基本没人用分号的.
Python 的基本类型有 整数, 长整数, 浮点数和复数, 以及字符串
字符串可以用单引号和双引号, 它们像 Javascript, 是完全一样的
''' 或 "”” 三引号的字符串是 here doc, 多行字符串
转义符也是用 \, 如 ''What\’s your name\n?
自然字符串: 即不转义, 用 R 或 r 来指定, 如 r"Newlines are indicated by \n”, 会输出 "\n"" 字面值. 可用于书写正则表达式
放在一起的字符串就会被 Python 自动连接, 如 print ''What\'s' ''your name?’, 输出为 "What’s your name?”
Python 的命名规则有几个必须知道的: 类名和 Java 一样; 模块, 方法, 变量名用小写字母下划线分隔, 常量用大写加下划线. 单或双下划线开头是特殊用途. 命名规则请参考 Google Python Style Guide#Naming
Python 是纯面向对象的, 任何东西都是对象, 函数也是
Python 可以用 \ 来连接语句行, 像 Bash 一样, 如 Read More- 像 NodeJS 写的 TCP 服务可以监听在某个 sock 文件(Domain Socket) 上,它的 HTTP 服务也能这么干。虽然作为 HTTP 服务连接某个 sock 文件的意义不大,所以这里只算是一个纯粹的尝试。
TCP 服务是这样写连接上面那个 '/tmp/node_tcp.sock'1var net = require('net'); 2net.createServer(function (socket) { 3 socket.on('data', function (data) { 4 socket.write('received: ' + data); 5 }); 6}).listen('/tmp/node_tcp.sock');✗ telnet /tmp/node_tcp.sock
准确说来本文应该是 NodeJS 的 TCP 和 HTTP 监听 Domain Socket 文件。 Read More
Trying /tmp/node_tcp.sock...
Connected to (null).
Escape character is '^]'.
Hello World!
received: Hello World! - 前阵子还在琢磨于 Atom Shell 和 Node-Webkit 间如何作个选择。基于 Atom Shell 有点像是站在了 Node-Webkit 的肩膀上的原因,感觉 Atom Shell 会有些优势,所以首先体验了下 使用 NodeJS 框架 Atom Shell 编写桌面应用入门。至于它们实现上是否合并了 Context 对我目前来说还不清楚会有什么影响。
正当我要安下心来的时候,先前那个 Node-Webkit 最近几日来了个华丽变身,以更为简洁明快的名字 NW.js 横空出世,并且与 NodeJS 的另一分支 io.js 更热乎。新的名字似乎有意在含糊它与 Webkit 之间的关系。对于 NW.js 的这一激动人心之举, 难免心起涟漪,顿绝不能只是路过,而况它还是出自国人之手,自豪感总有的。
于是决心一试,略玩之后发现, 特别是开发阶段可显示 toolbar -- 浏览任意 html, 前进/后退/刷新,并能用 Developer Tools 调试 UI 和 JavaScript 的特性。这才令我有些爱不释手,尚不知 Atom Shell 是否有类似的功能。
开始随我体验 NW.js 的 Hello World 程序,这里包含了外部 js 和 css 文件,仍是以 Mac OS X 平台为例,其他平台类似。
1. 前提条件,安装 NW.js
$ npm install nw -g
nw 模块就安装在 /usr/local/lib/node_modules/nw 目录下了,以后可以直接用 nw 命令来测试程序。 Read More - NodeJS 使前后台语言上得到了统一,给 “不就是做网站的” 那些人带来了福音,其基于事件驱动的处理机制更是在并发/CPU 密集型计算上大展身手。
虽然我不怎么做 UI 程序,但对于每一种语言却爱关心它做 GUI 程序是否得心应手。像 Java, Groovy, Scala 等写桌面程序也不怎么样,JavaFX 似乎显现出苗头来,因为 JavaFX 也支持 CSS 了,但布局仍然老套。
HTML + CSS + JS 做页面布局等样式控制有种与身俱来的优越感,于是 NodeJS 的世界里便产生了 Node-Webkit(已更名为 NW.js) 和 Atom Shell,它们各自的代表作有 LightTable 和堪与 Sublime 相媲美的 Atom 编辑器。
Node-Webkit(NW.js) 有两个context,node context 和 web context, 应用入口是一个 html 文件。而在 Atom Shell 只维持一个context,入口是一个 JS 文件,浏览器的启动控制要亲自动手。
完了基本的介绍后,回到原点,来看个 Atom Shell 的 Hello World 程序例子。 Read More - 在上一篇 Play2 自定义模板类型 (Java&Scala),是基于 Play2.2 怎么自定义 Json 模板类型,分别用 Java 和 Scala 实现。从 Play2.3 开始,模板明确了是用 Twirl,所以构建文件上的配置略有不同,并且模板编译出的源文件位置也不一样,Play2.2 前生成的模板源文件在
target/scala-2.10/src_managed/main/views目录,现在是生成在target/twirl/main/views目录。
在 Play2.3 中仍然是默认只支持 html, txt, xml, js 四种类型的模板,见 SbtTwirl。我们这里还是以增加 Json 模板支持为例,且只介绍用 Java 的方式。因为 Play2 尽管可以用 Java 来编写应用,但实现部份基本是 Scala,所以如果用 Scala 来进行扩展相对来说来比用 Java 简单些。
Play2.3 官方的自定义模板的文档 Adding support for a custom format to the template engine 有些出入,似乎还未来得急更新,以实操为证。
还是从构建文件开始 Read More - Play2 默认支持的模板类型是 html, txt, xml 和 js,不在这些支持之列的模板文件即使放到 app/views 目录中,也不会被编译的。如果要支持自定义的模板类型就要些定制了,这比 Play1 复杂些。模板的定制包括在 Build.scala 或 build.sbt 中加上 templatesTypes 配置,并需创建 BufferedContent 和 Format 实现类。下面以增加 json 模板类型为例,兼顾 Scala 和 Java 的实现类,是基于 Play2.2 的,在 Play2.3 中又略有不同。
官方有相关的文档,参考:Custom formats on Scala, Custom formats on Java 和 模板定义参考.
在较新一些的 2.2 的 PlaySettings 中,可以看到1templatesTypes := Map( 2 "html" -> "play.api.templates.HtmlFormat", 3 "txt" -> "play.api.templates.TxtFormat", 4 "xml" -> "play.api.templates.XmlFormat", 5 "js" -> "play.api.templates.JavaScriptFormat" 6)
弄清了上面的原理后,开始我们的步骤
第一步:修改项目构建文件
在构建文件 build.sbt 或 Build.scala 中增加下面的内容作为项目的 setting Read More RESTful 时需要考虑每种 HTTP Method 操作的业务含义,再也不是 GET 使用 URL, POST 提交表单这样简单的区别。http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html 定义有 GET, POST, PUT, HEAD, DELETE, PATCH, OPTIONS, TRACE, CONNECT 九种类型的 HTTP Method。
关于它们可能针对的业务含义就不多说了,而是如果要对每一种操作方法赋予一个颜色应该怎么去对应呢,比如一般 GET 不会有边际效应的操作可以选择绿色,或者蓝色。幸好我也不用多想,这里参考了 Swagger 的颜色方案,它支持除 OPTIONS, TRACE 和 CONNECT 之外的颜色配置,其实我也没用过这两种方法。
从 Play2 Swagger 中截图如下: Read More
- 用过 PlayFramework 的都知道默认的路由器文件是 conf/routes,Play2 可以定义自己的 routes 文件。在默认的 application.conf 中有这么一段注释
# Router
# ~~~~~
# Define the Router object to use for this application.
# This router will be looked up first when the application is starting up,
# so make sure this is the entry point.
# Furthermore, it's assumed your route file is named properly.
# So for an application router like `conf/my.application.Router`,
# you may need to define a router file `my.application.routes`.
# Default to Routes in the root package (and `conf/routes`)
# application.router=my.application.Routes
也就是通过 application.router 可以定义自己的 routes 文件。上面的解释很容易把人搞混,问题在于何处是文件路径,何处是类路径,至少写着的 'conf/my.applicaton.Router 就是在混淆视听。对于上面的解释要明白下面几点 Read More - 用过 PlayFramework 的同学们应该都知道,Action 方法间的调用是进行的 302 重定向操作。
简单例子说明一下,当基于下面的 r1, r2 路由配置时,如果 Application.f1() 方法中调用了 f2() 方法,实际运作是 f1() 在调用 f2() 时,会先反向出 f2() 方法对应的路由 GET /r2,然后向 /r2 发出的一个 302 跳转.
上面也算是绕个弯形成了对 f2() 方法的调用,这也是非常合理,在 Action 中很容易理解的。GET /r1 Application.f1
GET /r2 Application.f2
GET /r3 Application.f3
为什么说会反向出 f2() 方法对应的路由,可以反证一下。
例如说在 f1() 中调用了一个public static void f4()方法,但是 f4() 并未出现在 routes 配置中,也就是 f4() 没有对应的路由配置,我们将会看到这样一个异常 Read More