.NET 有的没的

转眼间发现快一个月没有更新BLOG了, 终于明白了为什么有那么多人整天说忙, 现在轮到自己了, 是不是瞎忙还不清楚, 但是是真忙.

总结一下这个月的新发现:

WCF 数据契约不是专指 DataContract 而言的吗?

Allan 的文章里看到:

WCF 在 .NET3.5sp1 中, 实体类即使不指定 DataContract 特性也能够被序列化. 具体规则是:

  • 不指定特性, 序列化公有属性.
  • 指定 Serializable 特性, 序列化所有属性.
  • 指定 DataContract 特性, 仅序列化注明 DataMember 的属性.

之前确实不知道, 还有这么一说, 试了试也确实如此. 不过对我来说 DataMember 的 Order 属性同样重要, 所以还是坚持原来的做法好了.

MySQL 要怎么对付 Guid?

这个问题一直困扰着我, 在 MySQL.NET 连接器 5.2 版的更新中有这样一句:

BINARY(16) columns are now treated as Guid objects

嗯, 我该如何理解这句话呢? 暂且当做是官方的建议好了. 不过接下来实在是忍不住要抱怨一下.

当列类型是 BINARY(16) 的时候, 我该如何把一个 Guid 存入数据库呢?

显然拼接 SQL 语句是不行的. 况且对于我这样的一个完美主义者来说也是不可能容忍的.

那么参数化插入会怎样? 答案是报错: 数据太长. 看来连接器是把 Guid 当成字符串装入参数了, 那的确是太长了 (36比16). 看来我还得自己手动转化成二进制才行 (ToByteArray), OK~ 这次算是插入成功了. 不过接下来在查询浏览器里看到的结果就… (…æýO.-áG©÷).

等等, MySQL 不是有个 UUID() 函数么?, 难道它不能和 Guid 统一起来么? 答案是”不能!”. UUID 的生成原理与 Guid 几乎相同, 但结果却不一样, UUID 本质上是个字符串, 而 Guid 却是 .NET 的一个类型. 倘若我们使用 VARCHAR(36) 来做主键, 不仅仅是空间上的浪费, 索引的性能, 而且还会带来存取双向转换的麻烦.

反观参考手册中的那句话 (treated as Guid), 大概意思是说一个 BINARY(16) 列会被当成 Guid 读取, 但你不能直接把 Guid 存储进去. 唉~

MySQL 名称引号陷阱.

用过 WorkBench 的人肯定知道, 数据库名和表名会用”点号”括起 ( Database.Table ), 也就是数字 1 前面那个键.

我因此也想当然的认为这是官方的”建议”, 这样括起的部分应该不会被语义解析, 而是当成名字来使用, 所以我在存储过程中写下了灰色的一段:

1
2
3
4
5
CREATE PROCEDURE `TEST`.`User_Delete` (id BINARY(16))
BEGIN
DELETE FROM `User` WHERE `ID`=id;

SELECT ROW_COUNT();
END

我本以为这样名称会统一些, 虽然我知道 MySQL 是不区分大小写的, 不过括起来的 ID 自然会代表列名, 而 id 自然是传递过来的参数. 结果 MySQL 却不这样认为, 那条 WHERE 语句被解释成了 id=id (又或者 ID=ID)

User 表就这样被清空了… (还好是测试!)

F# 项目组近来在忙什么?

已经很久没有关于 F# 的任何新闻了, 很久是多久? 可能两个月左右吧, 是有些心急, 只不过感觉有些奇怪, Don 的博客没了更新, cs.hubfs.net 也变得冷冷清清, 连 MailList 都不如以前热闹.

昨天再一次碰到智能感知失效的问题, 这次精准定位到了 System.Xml.Linq 上面, 只要打开这个命名空间就会导致某些类型的智能感知显示不出来. 成员列表只有一个 <None>, 显示的信息是:

>
a reference to the type ‘System.Xml.Linq.XNode’ supposedly in assembly mscorlib was found, but the type could not be found in that assembly.

我决定把这个问题反映到 hubfs 上面去, 证实这的确是一个 BUG, 只不过早就有人提交过了, 让我感兴趣的是这句:

>
It is already known and fixed in the latest internal version.

嗯, 看来项目组没有偷懒, 只是可能版本处在一个大的跨度区间上面, 没办法单独发布吧.

DLR 为什么会和 Silverlight 走的这么近?

Silverlight 动态语言 SDK 已经出现有一段时间了, 另一个动态语言运行时也在跃跃欲试, 再看看这个用 Silverlight 实现的 DLR 命名行 吧. 他们到底想要干什么? 动态语言就一定要和动画联系在一起么? 或者这样才符合 DLR 时髦的外型?

当然对于 Python 我知之甚少, Ruby 一直没太大的兴趣, 至于 JScript 不是已经死了么? 难道是死而不僵?

抛开这些个人的喜好, 推荐看一看 rednaxelafx 的一套文章, 了解一下 DLR 的前世今生, 从某种意义上说, 可以认为 IronPython 对于 LINQ 意义真是蛮大的, 这种作用就好像 F# 之于 Lambda, 如果继续说下去又会被当成谬论了, 那么, 好吧, .NET是一家.

Silverlight Tools RTW 英文版释出

Silverlight Tools

http://www.microsoft.com/downloads/details.aspx?FamilyID=c22d6a7b-546f-4407-8ef6-d60c8ee221ed&DisplayLang=en

Silverlight Toolkit

http://www.codeplex.com/Silverlight

Silverlight Toolkit 是什么?

Silverlight Toolkit 是搜集 Silverlight 控件, 组件和在 Silverlight 发行版之外有用的部分. 它为设计和开发人员迅速的提供新功能, 还能借力社区以便帮助快速定位 创意和 BUG 修复. 第一个发行版本包含 12 个新控件 (图表 样式 布局和用户输入) 的完整源代码 单元测试, 例子和文档.

DEMO:

http://silverlight.net/samples/sl2/toolkitcontrolsamples/run/default.html

http://silverlight.net/samples/sl2/toolkitchartsamples/run/default.html

Blend 与 VisualSVN 冲突

Silverlight 身上有一样东西, MS 能碰, SVN 不能碰. 是什么?

呃… 很不时髦的笑话. 今天却发生在我身上.

如果你在开发 Silverlight, 肯定离不开 Blend, 你需要用 Blend 来打开解决方案. 当然可能你还需要 SVN 进行源代码管理.

一切看起来理所当然, 不幸的是, 如果你碰巧使用的是 VisualSVN, 你会发现 Blend 与 SVN 之间罕见的冲突. 受 SVN 管理的解决方案在 Blend 中再也打不开了, 即使是你把 SVN 卸载掉!

问题出在你的解决方案 (XXX.sln) 文件上面, 使用记事本打开, 末尾会发现这样三行:

GlobalSection(ExtensibilityGlobals) = postSolution
VisualSVNWorkingCopyRoot = EndGlobalSection

这是 VisualSVN 用来记录目录的节点, 怕生的 Blend 看到后就会提示打开的解决方案包含不安全代码拒绝打开.

解决方案竟然不能解决问题, 真是个大笑话.

把这三行删除掉就可以解决这一问题, 注意: .sln 文件的内容对格式要求极严, 你要保证只删除这三行且不留空行才可以.

如果你也碰巧同时安装了 Blend 和 VisualSVN, 试试这个解决方案吧.

旧问题的 F# 新解法

在我还对程序开发比较迷糊的时候, 曾经听说过一个问题, 编写一段程序, 运行的结果是输出程序的全部源代码(一字不差).

当初曾经有很多人认为这是不可能的, 因为这与逻辑相悖, 不过后来真的有人用纯C做到了, 思路一出, 其他版本纷纷涌现.

这是一个老问题了, 今天在订阅里意外的看到一篇文章:

代码摘自: http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!599.entry

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#light 
open System
let nl = new String([|char 13;char 10|])
let quote = char 34
let Quote (s:String) = s.Replace(new String([|quote|]), new String([|char 92; quote|]))
let Quine s =
String.Format("let s = {0}{1}{2}{3}printf {4}%s%s{5} s (Quine s){6}",
[| box quote; box (Quote s); box quote; box nl; box quote; box quote; box nl|])
let s = "#light
open System
let nl = new String([|char 13;char 10|])
let quote = char 34
let Quote (s:String) = s.Replace(new String([|quote|]), new String([|char 92; quote|]))
let Quine s =
String.Format(\"let s = {0}{1}{2}{3}printf {4}%s%s{5} s (Quine s){6}\",
[| box quote; box (Quote s); box quote; box nl; box quote; box quote; box nl|])
"

printf "%s%s" s (Quine s)

Silverlight 2 RC1 简体中文版释出

http://www.microsoft.com/downloads/details.aspx?FamilyID=c22d6a7b-546f-4407-8ef6-d60c8ee221ed&DisplayLang=zh-cn

安装体验较之前的版本好了很多, 可以自动对之前的版本进行卸载, 不过强烈建议还是先卸载旧版本之后再装.

另外: 从 Shawn Burke’s Blog 看到了 Silverlight 接下来的走向, 我们可以看到实际上控件还是很丰富的, 为了尽可能的减少运行时的体积, 非内置的控件将会以控件包的形式发布:

Silverlight 2 RC0 释出

Visual Studio 2008 Tools RC0:

http://go.microsoft.com/fwlink/?LinkId=129043

Expression Blend SP1 RC0:

http://www.microsoft.com/expression/try-it/default.aspx?filter=prerelease

Windows Silverlight 2 Dev Runtime RC0:
http://go.microsoft.com/fwlink/?linkid=129011

我是从 http://silverlight.net/forums/p/30209/97238.aspx#97238 得知的消息之后转到 http://silverlight.net/blogs/msnow/archive/2008/09/25/silverlight-version-2-rc0-released.aspx 找到的下载地址, 详细的我也没来得及细看, 就是这样…

突然发现近来莫名其妙的忙…

补充: 中文版VS2008用户稍安勿燥

Installation Requirements:

Visual Studio 2008 (English) or Visual Web Developer Express 2008 (English) must be installed before installation of Silverlight Tools can continue. Silverlight Tools is available in other languages at http://go.microsoft.com/fwlink/?LinkId=120319

Build 9.0.30729.XX of Visual Studio 2008 SP1 or Visual Web Developer 2008 SP1 must be installed before installation can continue. See http://go.microsoft.com/fwlink/?LinkID=122094 for download information.

Beta and preview versions of Microsoft Expression Blend must be uninstalled before installation can continue.

FCKeditor 双引号变单引号

内置于 WordPress 中的 TinyMCE 从 2.2 时代开始就罢工了, 连续升级 N 次 WP 程序也救不活.

一直以来都是用的 FCKeditor, 大部分感觉还算好, 最不爽的是它会转化许多符号, 例如双引号变成 &quot. 经常要发一些代码, 这些符号当然不会少, 以至于大部分时间我都是先编写文字, 后最在编辑 HTML 加入源代码段.

今天终于忍无可忍, 必须解决这个问题!

首先我在 http://www.fckeditor.net/demo 试了一下, 发现不是我自己的问题, 官方的 DEMO 也是如此.

之后我试着用各种关键词搜索答案, 最后总算被我找对了关键词 FCKeditor double quotes

官方论坛上看到的一个解释是把 fckconfig.js 中的 FCKConfig.ProcessHTMLEntities 置为 false

还有 Drupal 版块给出的解决方案

Hubfs 给出的答复

我在初学 F# 的时候, 对 C# 只能算是一知半解, 甚至可以说是个门外汉, 所以我一直没有机会去深刻的领会什么是 OOP, 连最基本的类都定义不好. 反倒是学习 F# 后, 经常需要到网络上搜索一些 C# 代码再转换, 这样才对 C# 有了一些了解…

我说我连类都定义不好, 这是个很尴尬的事实. 比如像 C# 的可视化设计器生成的代码那样, 新建一个 Form 修改窗口标题, 再加入一个Button. 这是再简单不过的例子了, 可是用 F# 该如何写呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// 例子程序里展示了如何使用 FP 的风格建立窗体
let form =
let form = new Form(Text = "MyForm")
let b = new Button()
form.Controls.Add b
form

// 但是今天我们要讨论的是如何像 C# 那样继承自 Form 实现自己的类
// 第一种方法是我在 Simple101 中看到的
// 这是一种被称为详尽语法(Explicit syntax)
// 这是最中规中矩的定义方式 当然也最繁琐
type MyForm1 =
inherit Form
val b :Button
member t.InitializeComponent() =
t.Text <- "MyForm1"
t.Controls.Add t.b
new() as t =
{ b = new Button() }
then
t.InitializeComponent()

// 第二种是很常规的定义类的方法
// 被称为隐含语法(Implicit syntax)
// 隐含了什么? 我猜是隐含了构造函数吧
// 之前一直疑惑构造函数隐含了 那我怎么调用呢?
type MyForm2() =
inherit Form()
let b = new Button()
member t.InitializeComponent() =
t.Text <- "MyForm2"
t.Controls.Add b

// 感谢 Tomas Petricek
// 我一直不解的问题终于解开了 原来可以后接 as 语法来指向自己
type MyForm3() as t =
inherit Form()
let b = new Button()
do
t.Text <- "MyForm3"
t.Controls.Add b

// 感谢 Danny Asher
// 他的方法提醒了我基类的方法是可以直接调用的
type MyForm4() =
inherit Form()
let b = new Button()
do
base.Text <- "MyForm4"
base.Controls.Add b

F# 1.9.6.2 CTP 释出

http://www.microsoft.com/downloads/details.aspx?familyid=61ad6924-93ad-48dc-8c67-60f7e7803d3c&displaylang=en&tm

更新如下:

  • 修正包含单位的浮点型类型缩写行为
  • 修正Quotations.Expr.TupleGet 零索引异常
  • CodeDom 使用 ‘—nologo’ 参数
  • 修正 decimal 不支持操作符的问题
  • 修正包括 ‘let’ 和 ‘use’ 的序列化表达式回收 enumerator 过早的问题
  • 修正对有效的表达式评估不成功的问题 (Credit Suisse 报告)
  • 修正对象表达式中的 base 变量与类型中的 base 变量行为不一致的问题