posts - 120,  comments - 184,  trackbacks - 5
公告
  2012年3月13日

经过大半天的折腾,终于可以让RoR在OS X系统里访问Sql Server数据库了。这里记录一下操作的过程,免得以后忘了。

第一步,安装FreeTDS

从FreeTDS的官网上下载最新的稳定版的压缩包,然后,遵照这里的说明进行手工编译(好怀念微软的Setup.exe和*.msi啊),其中只需要前7步:

1. Download the latest stable release of freetds.
2. Extract freetds tgz file within Downloads
3. Open terminal and cd to Downloads/freetds-0.** folder
4. run “./configure”
5. run “cp /usr/bin/glibtool libtool” <----Important!
6. run "sudo make"
7. run "sudo make install"

这样,我们的FreeTDS就算是装好了。

第二步, 安装Tiny_TDS

就在命令行里执行: gem install tiny_tds

不要问我gem从哪里来的,google一下gem就会找到很多信息。在OS X里,gem是内置的。呵呵。

注意,如果没有安装FreeTDS的话,tiny_tds也肯定会安装失败,因为它依赖FreeTDS

第三步, 安装 activerecord_sqlserver_adapter

同样,只需要在命令行里执行: gem install activerecord_sqlserver_adapter

第四步, 修改RoR项目根目录下的Gemfile文件,增加一下2句:

gem 'tiny_tds'

gem 'activerecord_sqlserver_adapter'

第五步,运行bundle install

在命令行里运行 bundle install,运行完毕之后会输出很多Using语句,看看tiny_tds和activerecord_sqlserver_adapter是否包含在里面,应该都包含在里面才正确。

第六步,修改database.yml

打来RoR项目根目录下、config子目录下的database.yml文件,根据需要修改配置,比如:

development:

adapter: sqlserver

mode: dblib

dataserver: 10.4.30.77\Sql2005   # Name from freetds.conf, host or instance 'localhost\SQLEXPRESS'

host: 10.4.30.77          # Used if dataserver is blank.

port: 1433              # Used if host present. Default is 1433.

database: ALO_DB

username: db_user

password: xxxx

timeout: 5000

azure: false # for windows azure

最后,大功告成

可以创建model了: rails generate model MyShipper ShipperID:int ShipperName:string

posted @ 2012-03-13 18:30 零度的火 阅读(76) 评论(0) 编辑
  2012年2月22日

对于时间紧、任务重的遇到同个问题的程序员兄弟,请直接看代码,跳过下面的絮叨文字。

最近都快成了一个JavaScript前台程序员了。。。原本我想只关注后台来着……没办法,工作需要啊~

今天一个同事突然跑过来,问我jQuery UI 里的DatePicker能不能增加一个Clear按钮,来个一键清除,我想强大的DatePicker肯定已经考虑到了这个需求,或许就是一个简单属性设置的事儿,结果,让我失望了,DatePicker并没有提供Clear功能,Google了一顿,结论是,或许曾经有,但从某个时间开始,基于某种原因被去掉了,并且再也没有回来过。网上有些人给了一些重度hack的做法,深入到控件的生成HTML的函数之中增加了一个Clear按钮。这对于我辈JavaScript菜鸟,实在是不敢妄动,哪怕只是Copy & Paste. 其实DatePicker提供了2个按钮, Today 和 Done,为何我们不从这个Done按钮入手,让它洗心革面,改造成一个Clear按钮,同时又尽量只从控件的外围打补丁呢?经过对DatePicker生成的HTML的分析,发现似乎并不能难。只需要用以下代码解决之。

 1 $(document).ready(function ()
2 {
3 //用来存放当前正在操作的日期文本框的引用。
4 var datepicker_CurrentInput;
5
6 // 设置DatePicker 的默认设置
7 $.datepicker.setDefaults({ showButtonPanel: true, closeText: 'Clear', beforeShow: function (input, inst) { datepicker_CurrentInput = input; } });
8
9 // 绑定“Done”按钮的click事件,触发的时候,清空文本框的值
10 $(".ui-datepicker-close").live("click", function ()
11 {
12 datepicker_CurrentInput.value = "";
13 });
14 });



posted @ 2012-02-22 16:14 零度的火 阅读(376) 评论(0) 编辑
  2012年2月14日

在最近做的一个项目中,使用jQuery Validation验证日期,遇到的问题和一个没有预料到的情况是,在ASP.NET MVC 3的项目中,对于 <input type="date" data-val="true" />的元素,如果调用form的valid方法验证form,虽然我没有添加日期验证的设置,仅仅type="date",但其依然调用了日期验证逻辑来验证日期格式是否正确。这本来是个不错的行为,但问题在于,其支持的日期格式有限,阅读jQuery Validation的代码会知道(当然,文档中也有说明),对于“date”,日期验证只是利用Javascript内置的处理来验证,反映到代码里,就是看new Date(日期字符串)能否成功。在我的电脑中,输入日期"9/5/2012"可以验证通过,但“2012-9-5”验证失败,后者显然也是一种正确的格式。我需要改变或者改善这种行为。如何做?

当然,我们可以修改jQuery Validation的源代码,但是首先,我引用的是CDN上的代码,其次,作为一个public的库,我想还是尽量不要自己去改动,日久天长,可能我们已经忘记了对它的修改,而官方更新新版本时,我们弄下来更新,结果就把我们自己的修改给覆盖了。更好的办法,是打补丁,从外部把date的验证函数替换成我们自己的。这里或许要感谢Javascript的OO还不是那么彻底,并没有把那些内置验证方法整成protected/private,看了源代码之后,替换的方法很简单,在引用jQuery Validation的源码之后,再这样替换:

$.validator.methods.date = function (value, element)
{
// Date.parse函数源自另外一个处理日期的库
return this.optional(element) || Date.parse(value) != null;
};

此外替换默认的message,也可以用同样的办法,比如:

$.validator.messages.date = "hey, you entered an invalid date"

当然,处理messages有其他支持的更好的办法,这在jQuery Validation的全球化和本地化的说明中有提及。


posted @ 2012-02-14 14:27 零度的火 阅读(290) 评论(0) 编辑
  2012年2月9日

原文和演示在这里:http://jsfiddle.net/DkHyd/

我在这里直接粘贴出代码作为备份:

首先是演示用的Html,这里我简化一点内容,使其更短一些

Html Code
<h1>Toggle Panels</h1>
<div id="notaccordion">
<h3><a href="#">Section 1</a></h3>
<div>
<p>
Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
</p>
</div>
<h3><a href="#">Section 2</a></h3>
<div>
<p>
Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
</p>
</div>
<h3><a href="#">Section 3</a></h3>
<div>
<p>
Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.
</p>
<ul>
<li>List item one</li>
<li>List item two</li>
<li>List item three</li>
</ul>
</div>
<h3><a href="#">Section 4</a></h3>
<div>
<p>
Cras dictum. Pellentesque habitant morbi tristique senectus et netus
</p>
<p>
Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus.
</p>
</div>
</div>

然后是关键,jQuery代码:

 1 $.fn.togglepanels = function(){
2 return this.each(function(){
3 $(this).addClass("ui-accordion ui-accordion-icons ui-widget ui-helper-reset")
4 .find("h3")
5 .addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-top ui-corner-bottom")
6 .hover(function() { $(this).toggleClass("ui-state-hover"); })
7 .prepend('<span class="ui-icon ui-icon-triangle-1-e"></span>')
8 .click(function() {
9 $(this)
10 .toggleClass("ui-accordion-header-active ui-state-active ui-state-default ui-corner-bottom")
11 .find("> .ui-icon").toggleClass("ui-icon-triangle-1-e ui-icon-triangle-1-s").end()
12 .next().slideToggle();
13 return false;
14 })
15 .next()
16 .addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom")
17 .hide();
18 });
19 };
20
21 $("#notaccordion").togglepanels();



posted @ 2012-02-09 08:12 零度的火 阅读(68) 评论(0) 编辑
  2012年1月31日

jQuery Mobile 在我开发移动web站点的时候,帮了很大的忙,但是今天发现一个问题,就是在执行listview("refresh")函数之后,开了data-inset="true"的listview原来的圆角边框变成了直角边框了。。。经过调试发现,在调用refresh之后,listview中的第一个 li 的 class 缺少了 ui-corner-top,而最后一个 li 缺少了 ui-corner-bottom,解决的办法很简单,就是refresh之后把这2个class 加上。

1 // lv就是listview对象
2 lv.listview("refresh");
3 lv.find("li:first").addClass("ui-corner-top");
4 lv.find("li:last").addClass("ui-corner-bottom");

这或许应该算是一个bug吧~

posted @ 2012-01-31 17:13 零度的火 阅读(167) 评论(0) 编辑
  2011年12月15日
摘要: 我简直不敢相信这是真的。XDocument类的Load方法利用XmlReader类读取一个模板XML文件,然后进行各种节点的增加操作最后利用Save方法存到文件去。结果发现输出的XML并没有很好的格式化,所有元素堆在一行上,各层节点之间没有换行。用尽了办法也没有发现为什么,把网络翻了个底朝天,结果一样,默认情况下,XDocument的Save方法会输出经过良好格式化的文本。但是为啥我这里就是不行呢?最后竟然发现,因为我用XmlReader作为XDocument加载原始数据的方法导致的,不要用XmlReader,换个比如StreamReader就可以了。神啊,怎么会这样?阅读全文
posted @ 2011-12-15 15:19 零度的火 阅读(12) 评论(0) 编辑
  2011年11月20日
摘要: 整理照片是个麻烦事情。这几天有一批照片需要整理。需要按照拍摄日期进行重命名。经过文件复制之后,文件本身的日期早已面目全非,但是现在的相机的好处是会自动记录照片的很多独立的详细信息,比如照片的拍摄日期。那么怎么才能取到这些信息呢?一番查找,知道这些信息好像是叫做“EXIF”的格式信息。这个网站有它们的详细说明,基本上,每项信息包括ID,数值以及类型和长度等信息。这里我只关心拍摄日期。ID代表数据名称,比如16进制0x0132, 0x9003, 0x9004应该就代表拍摄日期,但具体区别我还不是很清楚,我怎么知道的那个值?从上面提到的那个网站里查到的,当然里面内容很长,看起来也有些复杂,我只是找到阅读全文
posted @ 2011-11-20 21:45 零度的火 阅读(18) 评论(0) 编辑
  2011年11月8日
摘要: 在RDLC 2010里面添加数据源,发现在Data Source下拉列表框中没有列出来我需要的类。最后发现是因为那些类是静态类,变成普通类之后就可以列出来了,但是类中的静态方法是可以正确列出来的。不晓得为什么不列出静态类,也许是因为设计器在内部总是会实例化数据源对象?阅读全文
posted @ 2011-11-08 16:37 零度的火 阅读(29) 评论(0) 编辑
  2011年11月2日
摘要: 获取事件的event对象,以及获取按键码,其他浏览器也兼容var evt = window.event || arguments.callee.caller.arguments[0];var charCode = (evt.which) ? evt.which : evt.keyCode;备忘。阅读全文
posted @ 2011-11-02 14:19 零度的火 阅读(18) 评论(0) 编辑
  2011年9月20日
摘要: 发现JQuery Autocomplete 控件很好用,但是有些地方需要根据我的需要调整:无论是否匹配上结果,都需要引发result事件(或者说调用result方法),这样我可以及时更新选中项对应的隐藏域的ID值,如果没有匹配项就更新一个负数ID值如果设置minChars的值大于1,那么待选项就不显示了,这似乎是一个bug,修改一点代码解决。这里是修改之后的js文件: jquery.autocomplete.js阅读全文
posted @ 2011-09-20 08:45 零度的火 阅读(42) 评论(0) 编辑
仅列出标题  下一页