Binzy&Jasmin

Binzy & Jasmin's Life Style
随笔 - 8, 评论 - 64, 引用 - 0

导航

关于

标签

每月存档

最新留言

  • asdf
    sadf
    by (匿名) on 2004/10/28 14:10:00
  • re: 生命不打草稿
    这篇文章总的来说是值得肯定的
    by 张美(匿名) on 2004/10/8 10:39:00
  • re: 生命不打草稿
    哎,说的真好
    by DelphiKey(匿名) on 2004/9/27 16:48:00
  • re: Growing Pains
    我也是非常喜欢看。只是现在在学校看不到了。
    by ll(匿名) on 2004/9/25 9:15:00
  • re: Growing Pains
    我看这部电视剧最大的感触就是时间的流逝,真的可以改变一切。 <br>我可以一遍一遍的看它。看着孩子们逐渐长大。呵呵。真的是一部难以超越的经典!
    by growing(匿名) on 2004/9/10 3:26:00
  • re: 奇怪的控件
    Infragisitics的东西还是非常不错的,我经常用他们的Grid和按钮Listbar之类的东西,刚开始可能有点复杂,用多了就会感觉到他的功能强大了。
    by Leon.Guan(匿名) on 2004/8/17 14:27:00
  • re: Growing Pains
    我很感动,就像楼主说的,“每次每阶段看&quot;成长的烦恼&quot;都会在开怀一笑之余有所感悟和收获” <br>
    by handy magic(匿名) on 2004/8/15 23:39:00
  • re: Growing Pains
    里面有个“本”的笨蛋男孩!
    by 仪表(匿名) on 2004/8/2 10:13:00
  • 回复: NHibernate
    NHibernate还不错.如果有问题,直接和开发人员联系,那个哥们回的挺快.
    by courlake(匿名) on 2004/7/3 4:16:00
  • 回复: Growing Pains
    我也喜欢!
    by 波那(匿名) on 2004/5/30 1:40:00
  • 回复: 奇怪的控件
    hoho~ <br> <br>有没有用过devexpress控件套?
    by luoluo(匿名) on 2004/5/9 18:45:00
  • 回复: TestNHibernate
    ........ <br>老兄 <br>那你知道为什么编译不过么? <br>不会不知道吧?
    by Bz(匿名) on 2004/4/20 8:56:00
  • 回复: TestNHibernate
    老兄,你的代码有问题,联编译都不能通过.
    by 你的代码有问题(匿名) on 2004/4/19 15:00:00
  • 回复: DB2
    在用DB2开发中,他的数据库确实没有,sql server好用! <br>操作太繁琐,整天用命令行
    by 小桥流水(匿名) on 2004/4/15 8:37:00
  • 回复: DB2
    这张图把我头都扭痛了
    by progame(匿名) on 2004/4/14 15:27:00

广告

2004年04月14日

感谢一篇文章: '用.Net开发DB2应用程序比较'
作者对他自己所做的测试进行了总结。如下图,  原来并不是我一个人碰到oledb死活不支持参数的情况(尝试了无数种Pose).  所以大家还是用IBM的好。

posted on 2004-04-14 15:12:00 by BJ  评论(2) 阅读(890)

 
2004年03月22日

那天需要把Console的输出在TextBox中显示, 本来以为要大干一番的是候突然想起了NUnit, 不看代码不知道一看代码吓一跳, 也太容易了-_-. 原来Console有个SetOut方法, 极度火星-_-. 这里的给出的示例代码并不好,因为很多时候你得进行Buffer和Lock咧嘴笑脸.
示例代码如下:

TextBoxWriter.cs>>
Biz.cs>>
button1_Click>>

posted on 2004-03-22 18:10:00 by BJ  评论(1) 阅读(974)

 
2004年03月14日

对于SF上的NHibernate, 很多人都在期望中失望了. 只有2个主要开发人员,  漫长的开发, 至今仍没有的Release. 呼. 但现在我所见所知的Persitence框架中的确都差Hibernate很多. 所以对于NHibernate是那么充满期待! 大约一个月前, 其中的一个主要开发人员Michael Doerfler签入了大量代码. 并解释迟迟不发布是因为还没有做更多的测试.
不过依旧失望. 经过一些简单的使用, 不仅在效率上不是很高以外, 还有许多的问题. 甚至在重写Hibernate Reference中的那个example代码亦无法顺畅的进行. 查询问题多多. 同时NHibernate的Proxy是基于RP/TP的. 在SF已经有人建议改进了. 不过我期待依旧笑脸.

上次碰到一个老外的控件, 居然把License Key写在Demo的Application里--b. 不过和控件作者交流的时候, 作者虽然之前没意识到这个问题, 但也没有很在意. 因为在他看来, 法律是大家都会自然而然遵守的. 偶汗--b. 在中国这可是任重而道远.

.Text 0.96 的改变不是一点点的大. 只是安装还是一团糟. 而新的EntryHandling, 可以让dudu不那么辛苦来小题大做的过滤了.

上次同事转发给我一篇'生命不打草稿', 而上次惊闻18岁少年球员因雷击而客死他乡. 生命不打草稿, 书写精彩每一天

最后, 上次写了一篇'PHP4中实现动态代理', 呵呵.

posted on 2004-03-14 22:00:00 by BJ  评论(11) 阅读(1652)

 

using System;

using System.Collections;

using System.Reflection;

using NHibernate;

using NHibernate.Cfg;

using NHibernate.Dialect;

using NHibernate.Tool.hbm2ddl;

using NHibernate.Expression;

 

namespace TestNHibernate

{

    /// <summary>

    /// BlogMain µÄժҪ˵Ã÷¡£

    /// </summary>

    public class BlogMain

    {

 

        public static void Main(string[] agrs)

        {

 

            BlogMain blogMain = new BlogMain();

            blogMain.Configure();

            BlogItem item = (BlogItem)blogMain.GetBlogItem("6a5ceeff-3161-44ec-8fc2-e23dff2d31d7");

            blogMain.UpdateBlotItem(item, "i am be changed");

 

 

            string id = item.Text;

 

        }

 

        private ISessionFactory sessions;

 

        public void Configure()

        {

           

            this.sessions = new Configuration()

                                .AddXmlFile("Blog.hbm.xml")

                                .AddXmlFile("BlogItem.hbm.xml")

                                .BuildSessionFactory();

        }

 

        public void ExportTables()

        {

            Configuration cfg = new Configuration()

                .AddXmlFile("Blog.hbm.xml")

                .AddXmlFile("BlogItem.hbm.xml");

            new SchemaExport(cfg).Create(true, true);

        }

 

        public Blog CreateBlog(string BlogName)

        {

            Blog blog = new Blog();

            blog.ID = Guid.NewGuid().ToString();

            blog.Name = BlogName;

            blog.Items = new ArrayList();

           

            ISession session = sessions.OpenSession();

            ITransaction tx = null;

            try

            {

                tx = session.BeginTransaction();

                session.Save(blog);

                tx.Commit();

 

            }

            catch(HibernateException he)

            {

                if (tx != null) tx.Rollback();

                throw he;              

            }

            finally

            {

                session.Close();

            }

 

            return blog;

        }

 

        public Blog UpdateBlog(Blog blog, string Name)

        {

            // a new instance-_-

            blog.Name = Name;

            ISession session = sessions.OpenSession();

            ITransaction tx = null;

            try

            {

                tx = session.BeginTransaction();

                session.Update(blog);

                tx.Commit();

 

            }

            catch(HibernateException he)

            {

                if (tx != null) tx.Rollback();

                throw he;              

            }

            finally

            {

                session.Close();

            }

 

            return blog;

        }

 

        public BlogItem CreateBlogItem(Blog blog, string title, string text)

        {

            BlogItem item = new BlogItem();

            item.ID = Guid.NewGuid().ToString();

            item.Title = title;

            item.Text = text;

            item.blog = blog;

            //blog.Items.Add(item);

 

 

            ISession session = sessions.OpenSession();

            ITransaction tx = null;

            try

            {

                tx = session.BeginTransaction();

                session.Save(item);

                tx.Commit();

 

            }

            catch(HibernateException he)

            {

                if (tx != null) tx.Rollback();

                throw he;              

            }

            finally

            {

                session.Close();

            }

 

            return item;

        }

 

        public BlogItem CreateBlogItem(string blogID, string title, string text)

        {

            BlogItem item = new BlogItem();

            item.ID = Guid.NewGuid().ToString();

            item.Title = title;

            item.Text = text;

            ISession session = sessions.OpenSession();

            ITransaction tx = null;

            try

            {

                tx = session.BeginTransaction();

                Blog blog = new Blog();

                session.Load(blog, blogID);

                item.blog = blog;

                session.Save(item);

                tx.Commit();

 

            }

            catch(HibernateException he)

            {

                if (tx != null) tx.Rollback();

                throw he;              

            }

            finally

            {

                session.Close();

            }

 

            return item;

        }

 

        public void UpdateBlotItem(BlogItem item, string text)

        {

            item.Text = text;

            ISession session = sessions.OpenSession();

            ITransaction tx = null;

            try

            {

                tx = session.BeginTransaction();

                session.Update(item);

                tx.Commit();

 

            }

            catch(HibernateException he)

            {

                if (tx != null) tx.Rollback();

                throw he;              

            }

            finally

            {

                session.Close();

            }

        }

       

        public void UpdateBlotItem(string itemGuid, string text)

        {

            ISession session = sessions.OpenSession();

            ITransaction tx = null;

            try

            {

                tx = session.BeginTransaction();

                BlogItem item = (BlogItem)session.Load(typeof(BlogItem), itemGuid);

                item.Text = text;

                session.Update(item);

                tx.Commit();

 

            }

            catch(HibernateException he)

            {

                if (tx != null) tx.Rollback();

                throw he;              

            }

            finally

            {

                session.Close();

            }

        }

 

        public BlogItem GetBlogItem(string itemGuid)

        {

            ISession session = sessions.OpenSession();

            BlogItem item = (BlogItem)session.Load(typeof(BlogItem), itemGuid);

            session.Close();

            return item;

        }

       

        public IList ListAllBlogNamesAndItemCounts(int max)

        {

            ISession session = sessions.OpenSession();

            ITransaction tx = null;

            IList result = null;

 

            try

            {

                tx = session.BeginTransaction();

                IQuery q = session.CreateQuery(

                    "select blog.ID, blog.Name, count(blogItem) " +

                    "from Blog as blog " +

                    "left outer join blog.Items as blogItem " +

                    "group by blog.Name, blog.ID "

                    );

                q.SetMaxResults(max);

                result = q.List();

                tx.Commit();

 

            }

            catch(HibernateException he)

            {

                if (tx != null) tx.Rollback();

                throw he;              

            }

            finally

            {

                session.Close();

            }

 

            return result;

        }

 

        public Blog GetBlogAndAllItems(string blogGuid)

        {

            ISession session = sessions.OpenSession();

            ITransaction tx = null;

            Blog blog = null;

 

            try

            {

                tx = session.BeginTransaction();

                IQuery q = session.CreateQuery(

                    "from Blog as blog " +

                    "left outer join fetch blog.Items " +

                    "where blog.ID = :blogid"

                    );

                q.SetParameter("blogid", blogGuid);

                blog  = (Blog) q.List()[0];

                tx.Commit();

            }

            catch(HibernateException he)

            {

                if (tx != null) tx.Rollback();

                throw he;              

            }

            finally

            {

                session.Close();

            }

 

            return blog;

        }

 

 

 

    }

}

 

 

posted on 2004-03-14 21:35:00 by BJ  评论(4) 阅读(825)

 
2004年03月11日

    在学书法的时候,我曾经听我的一个老师说过这样的一个故事:

    有一个书法家教学生练字,有一次,一个经常用废旧报纸练字的学生,反映他已经跟着书法家学习了好长一段时间,可是一直没有大的进步。书法家就对他说:“你改用最好的纸试试,可能会写得更好。”

    那个学生按照他说的去做了,果然,没过多久,他的字进步很快。他很奇怪的问书法家什么原因。书法家说:“因为你用废旧报纸写字的时候,总会感觉是在打草稿,即使写得不好也无所谓,反正还有的是纸,所以就不能完全专心;而用最好的纸,你会心疼好纸,会感觉机会的珍贵,从而心态投入,也就比平常练习时更专心致志。用心写的字,自然会更好。”

    真的,平常的日子总会被我们不经意的当作不值钱的“废旧报纸”,涂抹坏了也不心疼,总以为来日方长,平淡的“旧报纸”还会有很多。实际上,这样的无所谓的心态可能使我们每天都在与机会擦肩而过。

    生命并非演习,而是真刀实枪的实战。生活其实也不会给我们打草稿的机会,因为,我们所认为的草稿,其实就已经是我们人生那张无法更改的答卷。

    请把生命的每天都当作一张最好的纸来书写!

posted on 2004-03-11 15:08:00 by BJ  评论(2) 阅读(715)

 
2004年03月09日
PHP4中实现动态代理
一、 摘要
本文简单阐述了Proxy模式及具体说明了如何在PHP4中实现动态代理, 本文只是给出了一个实现的方法的原型. 由于水平有限, 有任何意见和建议请反馈给Binzy [ Binzy at JustDN dot Com ].
 
二、  概述
在我们开始实现Dynamic Proxy之前, 也许我们应该先了解一下什么是Proxy和它有什么用. 下面是一篇来自博客堂加菲猫的不错的形象讲述Proxy的文章: “武当学艺与缓存代理”. Proxy模式是”GoF”介绍的23个设计模式之一, Proxy的目的是” Provide a surrogate or placeholder for another object to control access to it(为其他对象提供一种代理以控制对这个对象的访问)”. 一般常见的代理模式有: 远程代理(Remote Proxy), 虚代理(Virtual Proxy), 保护代理(Protection Proxy), 智能代理(Smart Proxy).
但是使用代理有一个坏处就是你得手动创建所需要代理类的副本(即代理类). 这意味着如果你为Image类创建一个Virtual Proxy, 那么你不得不手动创建一个与Image类有相同Method的ImageProxy类. Ok, 如果你和我一样懒, 你一定会想到动态来产生Proxy. 是的, 接下来你就会发现, 其实在PHP4中你很容易实现它.
 
三、  实现
由于PHP4是解释型语言, 弱类型, 且无接口. 所以在实现的时候既有方便之处又有不妥之处. 此处不拘泥于实现方法, 本文也只是实现方法之一.
本文实现的策略其实非常简单. 核心即ProxyFactory类及Clazz类, ProxyFactory负责实例化Clazz, 并赋值. 而由Clazz类负责创建并返回Proxy. 创建Proxy是以写入临时文件方式进行的.
具体请查看ProxyFactory.php和Clazz.php二个文件中的代码. 此处不再赘述.
另外在ProxyInvocationHandler.php中我们定义了一个ProxyInvocationHandler类.
 
四、  示例
我们现在有一个ReadFileClass类, 该类继承自IReadFileClass, 由于PHP4没有接口, 所以此处接口算是模拟的, 事实上在PHP4中不使用实现接口也是可行的J. 二个类的具体内容请见清单一和清单二.
 

清单一

class IReadFileClass
{
         function ReadMyFile() {}
}

 

清单二

class ReadFileClass extends IReadFileClass 
{
         function ReadMyFile()
         {
 
                 $fp = fopen('test.txt', "r");
                 $data = fread($fp, filesize('test.txt'));
                 fclose($fp);
                 return $data;
         }
}

 

OK, 我们现在要加入验证用户的功能, 即为ReadFileClass中的方法加入保护控制. 如果采用手动创建代理, 那么你可以继承ReadFileClass或者实现IReadFileClass, 并加入保护代码(其实在PHP4中甚为自由, 因为除了基本类型外都是object-_-). 不过我们现在试试用刚才实现的动态代理来创建Proxy.

请看清单三的ReadFileClassProxy的代码, 注意该类继承自ProxyInvocationHandler.

清单三

require_once('ProxyFactory.php');
require_once('ProxyInvocationHandler.php');
require_once('Auth.php');
 
class ReadFileClassProxy extends ProxyInvocationHandler
{
 
         var $object;
 
         function ReadFileClassProxy(&$obj)
         {
                 $this->object = &$obj;
         }
 
         //
         function NewInstance(&$obj)
         {
                 $proxyFactory = ProxyFactoryInstance();
                 return $proxyFactory->create(new ReadFileClassProxy(&$obj),
                 get_parent_class(&$obj));
         }
 
         // $proxy is not used here, but it is useful.
         function Invoke(&$proxy, $method, $parameters)
         {
                 $uname = 'Binzy';
                 //$uname = 'Jasmin';
                 if (Auth::CheckAuth($uname))
                 {
                          Return parent::Invoke(&$proxy, $method, $parameters);
                 }
                 else
                 {
                          //
                          return 'No Permission!';
                 }
         }
 }

 

Auth类是一个进行权限验证的类, 此处我们只是简单的查看传入的UserName, 如果是Binzy, 那么自然是可以看秘密的J, 如果是Jasmin, 那么HoHo, 没得看, Binzy点空间嘛咧嘴笑脸. 详见清单四.

清单四

class Auth
{
         function Auth()
         {
         }
         // bool
         // 
         function CheckAuth($username)
         {
                 if ($username == 'Binzy')
                 {
                          return true;
                 }
                 return false;
         }
}

 

Ok, 下面我们来使用我们创建的代理. 请见清单五.

清单五

require_once('ReadFileClass.php');
require_once('ReadFileClassProxy.php');
 
$proxy = ReadFileClassProxy::NewInstance(new ReadFileClass());
print $proxy->ReadMyFile();
结果如下:
如果是Binzy, 那么自然可以知道那个秘密J.
   
如果是Jasmin, 这个秘密当然不能让她知道.
   
 
五、  总结
代理是一个非常有用的模式. PHP4虽然并不是真正的Object-Oriented, 但仍然可以实现你想实现的设计. 写本文的目的有很大部分是希望国内PHP开发者不要再拘泥于现在的开发现状, 开发出更好的PHP软件. 而不是一堆Script的堆积.
 
六、  感谢
感谢好友Freeman为我做测试.
感谢mmkk的Code Formatter HTC.
 
七、  参考
1.     GoF
2.     GoF中译本
3.     PHP参考手册 http://www.php.net/manual/en/
 
八、  相关下载

posted on 2004-03-09 10:53:00 by BJ  评论(1) 阅读(713)

 
2004年03月08日

很多朋友都在做.Net的Persistence Framework, 或者说轻量级的DAL层. 公司里现在的二个解决方案都不甚理想, 不是需要手动填充就是需要拼SQL, 虽然都有工具产生代码.  而且我理想中的Persistence Framework并不是类似于Hibernate那样的框架. 看过一些朋友和公司的一个外包公司的持久层实现,  几乎都是参照了Scott Ambler先生的理论. 不过上次在SF上看到的ObjectBroker有我想要的味道, 而且我的确认为按照它的思路可以来实现我所想要的Persistence Framework, 并且正符合公司Balance Server + AppServer的结构. 但是实现一个好的Persistence框架实在是复杂, 一大堆的大小问题都不知道该如何处理.

由于大概5个月没有修理过头发了,  所以昨天Jasmin拖我去剪头发.
"先生是干洗水洗?", "随便"
"先生要哪位理发师?", "随便"
"先生头发平时是往左还是往右梳?", "嗯.... 平时不梳头"咧嘴笑脸

今天三八妇女节, 特别祝Jasmin节日快乐, 还有我妈妈和其他广大妇女同志.

posted on 2004-03-08 08:33:00 by BJ  评论(6) 阅读(906)

 
2004年03月04日

JGTM'2004 [MVP]Unit Testing with .NET Quiz: Adaptable Mock Objects? 中提到Mock Object的创建. 手动创建肯定是不现实的, 而正如冰云在评论提到的JMock, 在.Net中也有一个NMock的存在. 是MatinFolwerThoughtWorks的一个项目. 不过在sf上发布的release是1.0的, 而很多特性只有在1.1, 和1.2中有-_-. 它的使用可以看CVS中的example.

不过也正如冰云在该文后的评论中说的, 如果方法多.......--b, 不过在开发过程中, 如果真如JGTM'2004 [MVP]所说如果开发周期长, 那么还是非常值得的.

posted on 2004-03-04 11:11:00 by BJ  评论(4) 阅读(864)

 
2004年03月03日

中国国奥队今天一举击溃韩国队! 祝国奥好运, 祝祥子好运, 祝中国球迷好运


最后还是输了, 0:1, 继续书写着不胜史.
在我看来, 中国失败失败在于中场, 在上半场, 韩打二个边, 但并无太大效果, 下半场开始打中间, 而朴开始左右跑位, 而中国队的愚蠢后腰开始无所适从, 而二个边, 特别是右边, 便开始无法盯住崔了, 然后更加混乱. 而中国的后腰是个失败中的失败, 首先可以放倒崔, 或者说如果那个后腰是李铁, 那么我想中国就不会失球了.
另外二个边卫真是不行, 而且中国队进攻不主动积极, 而一旦积极, 就丢球了......

posted on 2004-03-03 07:55:00 by BJ  评论(15) 阅读(861)

 
2004年03月02日

在公司会用Infragisitics公司的NetAdvantage控件, 现在用的版本是2003年V2. 控件效果虽然极为漂亮, 但个人感觉并不实用, 而且结构非常复杂-_-.

前二天用它的WebTab控件(第一次笑脸), 在Tab中加入模板的方式有三种, 一种是将ascx拖入, 一种是将Control拖入其中(或者赋值给ContentPane), 还有就是实现ITemplate接口后赋值给ContentTemplate. 按照道理说无论何种方法我都应该可以通过ContentPane的Children方法来获得控件列表, 或者FindControl方法来获得我想要的控件(注: 该类继承自Web.UI.Control, 前者是调用的Control的Controls属性[instance class [System.Web]System.Web.UI.ControlCollection [System.Web]System.Web.UI.Control::get_Controls(), //then ret], 而且该类并没有重写Controls属性). 起先死活找不到模板中的Control-_-, 但当调试进去的时候, 在局部变量里明显可以看到Controls下面的内容, 而且当我看见内容的时候, 就能找到那个Control了--b. 不服, 不看(不把局部变量点开), 不行, 看, 行......... 投降! 不知道有没有朋友也用该公司的控件.

我经常写着写着就看看Mono的代码..... 今天在看Web.UI下面的代码时发现, 原来Mono真的已经为.Net 1.2做好准备了, 如Page类,
#if NET_1_2
.....
 protected object XPath (string xpathexpression)
 {
  return XPathBinder.Eval (CurrentDataItem, xpathexpression);
 }
 
 protected object XPath (string xpathexpression, string format)
 {
  return XPathBinder.Eval (CurrentDataItem, xpathexpression, format);
 }
......
#endif
http://longhorn.msdn.microsoft.com/lhsdk/ref/ns/system.web.ui/c/page/m/xpath.aspx

B&J's Bz

posted on 2004-03-02 20:02:00 by BJ  评论(4) 阅读(1011)

 
那天和三位同事吃饭的时候谈起"成长的烦恼, Growing Pains", 一部伴随我长大的室内情景喜剧. 遗憾的是, 三位同事中二位没有看过没有听说过, 一位听说过不过只看过一点点. -_- 难道是代沟么? 不知道博客堂的各位朋友是否和我一样非常钟爱这部电视剧.
每次每阶段看"成长的烦恼"都会在开怀一笑之余有所感悟和收获. 不似其他的一些仅仅搏人一笑的室内剧. 而且里面还有年少时的Leonardo和Jasmin非常喜欢的年轻时的Brad Pitt. 我一直喜欢DR. Jason Seaver, 记得在有一个电视节目中把他选为所谓"新好男人"的楷模, 因为他幽默, 稳重, 专业, 有责任心, 有才华, 稍有财富, 不花心. 似乎优点都齐了.
那天无意中在电视上看到了关于成长的烦恼的一部记录篇, 原来Mike变好并不是编剧初衷, 而是Mike的扮演者Kirk Kameron因为信仰了基督教, 不想再演坏孩子. Kameron一再的写信给哥伦比亚电视公司, 要求改变剧本, 并最终导致编剧的集体辞职及电视剧的最后结束. 当然我还是非常喜欢看到好却带着一点点坏的Mike的, 甚至在第一次看到Mike变化的时候非常的感动. 一个叛逆的孩子总有一天是会长大的.而且信仰和人生观对于一个人的至关重要. 我信仰脚踏实地, 所以我坚信我有天一定会有丰富的回报.
剧中有一阶段Carol出去读书了, 原来是因为Carol扮演者得了厌食症-_-, MM还是不要减肥的好啊.
我要努力, 学习Seaver大夫的幽默, 稳重, 专业, 有责任心, 有才华, 稍有财富, 不花心, 学习Mike努力成熟.
找到一个相关网站http://www.cnsitcom.com/cngp/index.htm

posted on 2004-03-02 08:46:00 by BJ  评论(15) 阅读(1283)

 

Powered by: Joycode.MVC引擎 0.5.2.0