终于要离开了,昨天跟老板说了辞职的事情。
在淘客一年5个月啦,从淘客诞生开始他就像我的孩子一样一步一步的成长,虽然由于种种原因公司一直没有很好的推广,发展的也比较慢,但他也不妨碍我对他的喜欢,毕竟我付出了大量的心血。
新版淘客上线后我就要离开淘客,然后转战武汉啦,又要重新开始啦!其实新版淘客的思路还是不错的,最大的问题就是线下,说白了就是钱。如果有资金的推进应该有不错的发展的。但是web2.0网站自从05、06年火一把后又开始沉寂啦。唉 一步慢步步慢啊!总是赶不上。
那位过客,谁知道武汉做。net那里招聘的,给我介绍介绍,并重谢。送
一个。(*^__^*) 嘻嘻……
没做私活好久了,自从去年由于模仿豆瓣后就再没接私活做了,主要是不想把时间全部都放到这上面,想放松一下,感受一下家庭的温暖和轻松。
时间过的好快啊,转眼就一年多了,一年多为了生活没日没夜的接单赚钱,现在一年后又要为了生活而去接单子啦。突然有种感觉,自己跟妓女一样,没钱了就去做几把,妓女出卖身体,我出卖劳动力。
很想稳定一下,有固定的收入,每天所有的精力都用在正常的工作上,在工作中满足自己的成就感。可所处的环境就是这样,随时都有可能公司倒闭,失业,没有经济来源,家里还有老婆孩子,为了他们只能继续的这样下去。
最近好多人跟我说起来了转型或者转行,可我很是迷茫,我除了会做web以外好像什么都不会,曾经也满怀希望的自己创业做点事情,但都是以失败告终,赔了时间和金钱,现在更是不敢啦 怕万一出现意外怎么对得起老婆孩子啊,看着他们每天快乐的生活着我就感到很欣慰。
最后引用一位美女说的话:“干活吧!好男人!”
希望能一直做个好男人!
选择 人的一生是在不断的选择中度过的,大部分的选择其实是很痛苦的,每次的选择走的方向可能截然不同,会引起以后一系列的事情发生。我很喜欢看科幻电影,每当有那种可以穿越时空回到过去的作品我就会想如果我可以回到过去的话有多好,可以不断的尝试不断的选择不同的方向然后再到未来看看会有什么样的变化。
最近比较郁闷,又要面对选择啦,生存还是毁灭是个问题,对于我来说选择那个方向是个问题,是去是留是个问题,准备以后做什么是个问题,太多的问题困扰着我。可能是年龄大了吧,想的问题就多了起来,顾虑的事情就多了起来。做技术这么多年啦,累不累到无所谓,可是干了一年又一年连个房子都买不起真的是很郁闷的,听着周围的朋友一个个混的越来越好,而我还是拿着那点死工资,新技术在不断的推出,每天还要抽时间去学习,害怕自己被淘汰。
上帝啊,让我看看未来的我吧,到底方向是什么呢?
自从用了一个pda手机后看的小说就慢慢多了起来,但大多都是看一些武侠类的打发一下上班下班做公交车的无聊,第一次看这种写实的小说《荒淫时代》.
刚看第一章的时候我就产生了强烈的共鸣,主人公”卫君” 深圳的一个工程师,大学毕业后充满希望的去深圳,打工5年后发现干一辈子也没办法买到一栋房子,可怜的工资只能满足生存的需要,然后辞职自己开店做业务,正正经经的做生意为了改变自己的命运,命运总是在最困难的时候打击他,或者天灾或者人祸让他倾家荡产.最后铤而走险抢劫达官贵人.
小说看完之后太沉重了,沉重到心里象压上了一堆巨石,想不相信,却又不敢不相信,很多事情就在身边发生过.
先声明:这不是H小说,这是一本惊人的写实的小说,因为我就在那个城市,一草一木一街一巷,栩栩如生,想象不出作者如没在此生活过能写出如此惊人之作。
但这不是重点,此书在写实之余,让人有很强的读书的乐趣,反正,没看过的人有福了。
简介: 这是一本反映深圳的大杂烩小说,涉及开始的出租屋、纯真的爱、黑手机业、黑U盘、官场、电视台女主播等等。小说其实很写实,并不荒淫,推荐
把这个本书推荐给那些正在打工奋斗中,或者将要走向这条路上的年轻人吧.
我的博客 任我摆弄
2007年3月12日,淘客博客摆弄版重装上阵,用户体验全面升级,一场全新的博客搬家浪潮即将掀起。
完全自定义我的博客页面
我的博客、我的相册、我的好友、我的留言……
想留就留、想去就去
炫酷模板随意选择
魔兽世界版、西游记版、三国演义版、卡通版……
一键选择、想换就换
模块任意拖拽
任意模块想大就大、想小就小、想左就左、想右就右
只需点点拽拽
我的博客任我摆弄!
要开博客 就来淘客
炫酷博客空间 尽在淘客网
淘客网
WWW.TAOKEE.COM
第一天:用UpdatePanel建造Widget的容器
这里有两个概念,一个是Widget容器一个是Widget. Widget容器只是提供一个头和内容的区域.Widget加载在Widget容器的内容区域.在这个页面里每个Widget初始化是通过WidgetContainer 服务器端控件动态创建的.实际上Widget也是服务器控件在Widget容器内部动态创建.
在整个页面刷新或者单个Widget更新的时候每个Widget都是通过里面包含的更新控制板来获取更新的.例如.Widget实际是在容器内的UpdatePanel里加载.因此,不论怎么样Widget都不会回调数据.
正确的组合UpdatePanel和UpdatePanel里的Html Elements是比较困难的.比如,第一次我在Widget里面放了一个UpdatePanel.当每个widget里面只有一个UpdatePanel时,它工作的很好.但是UpdatePanel里面的HTml附加的扩展是个问题.当UpdatePanel刷新的时候,他会创建一个新的,Html扩展就不存在了.由于所有的扩展附属与先前的Html上,要想不丢失必须这些扩展也在UpdatePanel里面.把扩展放到UpdatePanel的意思是,不论UpdatePanel什么时候刷新,新的扩展实例都要创建和初始化.创建这个UI是非常慢的.你可以看到当widget回调的时候很迟缓.
因此.最终的方案是把标题区域和内容区域分开到多个UpdatePanel里面.一个UpdatePaenl负责标题区域一个负责widget.当Widget做一些事情的时候需要widget刷新就不需要标题刷新了,并且扩展可以附加到标题那么就不会丢失啦.CustomFloatingBehavior 就是附加到标题的扩展程序.同样的这个扩展程序需要放到UpdatePanel里面.但是把扩展程序放到UpdatePanel里面就需要每次UpdatePanel刷新就要创建和初始化一次.这样的性能不是很好.
800)this.style.width=800;” src=”http://www.codeproject.com/Ajax/MakingGoogleIG/WidgetContainer1.png” alt=”Widget Container first idea” onclick=”window.open(this.src)” style=”cursor: pointer” />
因此,到目前为止,最好的方案是两个UpdatePanel在每个WidgetContainer里面,一个只是包含标题内容,但不是真个标题部分.当这个标题UpdatePanel刷新的时候.DIV包含的标题部分在UpanelPanel外面而不需要刷新.这样我们也可以放一个CustomFloatingBehavior 扩展程序在UpdatePanel外面.这样这个扩展就可以附加到标题容器的DIV上了.
800)this.style.width=800;” src=”http://www.codeproject.com/Ajax/MakingGoogleIG/WidgetContainer2.png” alt=”Widget Container final idea” onclick=”window.open(this.src)” style=”cursor: pointer” />
这个WidgetContainer 十分简单.他有一个包含标题名称和展开/折叠/关闭按钮的标题部分和一个包含Widgegt的内容区域.在这个方案里”WidgetContainer.ascx” 文件是WidgetContainer.
<asp:Panel ID=”Widget” CssClass=”widget” runat=”server”>
<asp:Panel id=”WidgetHeader” CssClass=”widget_header” runat=”server”>
<asp:UpdatePanel ID=”WidgetHeaderUpdatePanel” runat=”server”
UpdateMode=”Conditional”>
<ContentTemplate>
<table class=”widget_header_table” cellspacing=”0″
cellpadding=”0″>
<tbody>
<tr>
<td class=”widget_title”><asp:LinkButton ID=”WidgetTitle”
runat=”Server” Text=”Widget Title” /></td>
<td class=”widget_edit”><asp:LinkButton ID=”EditWidget”
runat=”Server” Text=”edit” OnClick=”EditWidget_Click” /></td>
<td class=”widget_button”><asp:LinkButton ID=”CollapseWidget”
runat=”Server” Text=”" OnClick=”CollapseWidget_Click”
CssClass=”widget_min widget_box” />
<asp:LinkButton ID=”ExpandWidget” runat=”Server” Text=”"
CssClass=”widget_max widget_box” OnClick=”ExpandWidget_Click”/>
</td>
<td class=”widget_button”><asp:LinkButton ID=”CloseWidget”
runat=”Server” Text=”" CssClass=”widget_close widget_box”
OnClick=”CloseWidget_Click” /></td>
</tr>
</tbody>
</table>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
<asp:UpdatePanel ID=”WidgetBodyUpdatePanel” runat=”server”
UpdateMode=”Conditional” >
<ContentTemplate><asp:Panel ID=”WidgetBodyPanel” runat=”Server”>
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
<cdd:CustomFloatingBehaviorExtender ID=”WidgetFloatingBehavior”
DragHandleID=”WidgetHeader” TargetControlID=”Widget” runat=”server” />
当页面加载每个widget初始化,第一个widget容器创建接着widget在容器内部创建.WidgetContainer是核心框架和Widget之间通道,通过他提供的API来存储状态或者改变状态,像展开/折叠等等.
当Widget折叠或者关闭等等信息也是通过WidgetContainer传递的.
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
var widget = LoadControl(this.WidgetInstance.Widget.Url);
widget.ID = “Widget” + this.WidgetInstance.Id.ToString();
WidgetBodyPanel.Controls.Add(widget);
this._WidgetRef = widget as IWidget;
this._WidgetRef.Init(this);
}
Widget容器首先通过Widget定义的Url地址加载widget.然后把widget放到内容panel里.It also passes its own reference as IWidgetHost to the actual widget
WidgetContainer实现了IWidgetHost接口使目前的widget与框架和容器来通信.
public interface IWidgetHost
{
void SaveState(string state);
string GetState();
void Maximize();
void Minimize();
void Close();
bool IsFirstLoad { get; }
}
执行起来非常的简单.比如.可以用IWidgetHost.Minimize 来折叠Widget内容区域.
首先我们更新WidgetInstance 然后刷新UI.这个Widget也通过IWidget接口获得一个回调.
除了Close以外IWidgetHost都能容易的实现所有的功能.当发起Close信号的时候,我们需要在这个页面移除这个Widget.就是说,WidgetContainer还在这个页面而这个WidgetInstance要从数据库移除.WidgetContainer 自己是不能做到的.需要通过包含WidgetContainer的所在列来实现.Default.aspx包含所有的WidgetContainer.因为,当Close事件触发的时候,WidgetContainer给Default.aspx产生一个事件,并且default.aspx移除这个Widget和刷新这列.
void IWidgetHost.Minimize()
{
DatabaseHelper.Update<WidgetInstance>(this.WidgetInstance,
delegate(WidgetInstance i)
{
i.Expanded = false;
});
this.SetExpandCollapseButtons();
this._WidgetRef.Minimized();
WidgetBodyUpdatePanel.Update();
}
效果:http://i.taokee.com/逗逗
效果:http://i.taokee.com/东方神起
效果:http://i.taokee.com/bisou 可以点击试用。 增加了两个小模块 一个时钟模块具有7种时钟样式可以任意选择,如果你有更好看的时钟可以给我回复我可以帮你加上去。^_^ 另一个是网络收藏夹功能,原来一直在后台才可以看到,现在可以在前台直接查看并且添加修改啦! 使用的人可以回复一下让大家看看效果!用Dlinq来存储数据
Dlinq非常有趣.它写数据储存层是如此的简单并且能生成最佳的Sql.如果你以前没有用过Dlinq那就来感受一下他所带来的冲击吧.
当你用Dlinq的时候,你只用设计数据库然后用SqlMetal.exe创建包含所有数据储存代码和实体类的数据存储类.按照数据库设计手工写这些实体类和数据访问类的时候是件很痛苦的事情.不管什么时候你要重新设计数据库你必须修改实体类和修改数据层的”insert update delete get”方法.当然你可以用第三方的ORM工具或者自己的代码生成工具来产生实体类和数据层代码.Dlinq就可以完成这些所有的事情!
Dlinq最好的事情是他可以生成只包含必要的关键而不需要生成全部的对象.目前ORM工具或者Object Oriented Database类库想要支持必须需要特定的编译器.为了表现优雅的性能.你可以不选择自己不需要的字段,也不需要建造一个包含所有字段的巨大的类.DLinq只需要选择你必须的字段来创建对象.
让我们看看怎么很容易的创建一个”Page”对象
var db = new DashboardData(ConnectionString);
var newPage = new Page();
newPage.UserId = UserId;
newPage.Title = Title;
newPage.CreatedDate = DateTime.Now;
newPage.LastUpdate = DateTime.Now;
db.Pages.Add(newPage);
db.SubmitChanges();
NewPageId = newPage.ID;
这里DashboardData是SqlMetal.exe生成的类.
你想修改页面的名字:
var page = db.Pages.Single( p => p.ID == PageId );
page.Title = PageName;
db.SubmitChanges();
这里只有一行被选择.
你也可以选择一个值:
var UserGuid = (from u in db.AspnetUsers
where u.LoweredUserName == UserName &&
u.ApplicationId == DatabaseHelper.ApplicationGuid
select u.UserId).Single();
这里就是我所说的:
var users = from u in db.AspnetUsers
select { UserId = u.UserId, UserName = u.LoweredUserName };
foreach( var user in users )
{
Debug.WriteLine( user.UserName );
}
如果你想进行分页,比如选择从20行到100行条数据:
var users = (from u in db.AspnetUsers
select { UserId = u.UserId, UserName = u.LoweredUserName }).Skip(100).Take(20);
foreach( var user in users )
{
Debug.WriteLine( user.UserName );
}
如果你想使用事务,看这多么简单:
using( TransactionScope ts = new TransactionScope() )
{
List<Page> pages = db.Pages.Where( p => p.UserId == oldGuid ).ToList();
foreach( Page page in pages )
page.UserId = newGuid;
// Change setting ownership
UserSetting setting = db.UserSettings.Single( u => u.UserId == oldGuid );
db.UserSettings.Remove(setting);
setting.UserId = newGuid;
db.UserSettings.Add(setting);
db.SubmitChanges();
ts.Complete();
}
难以置信?相信他.
你可能对Dlinq执行有些疑惑不解.相信我,他生成的是正确的SQl语句.用SqlProfiler查询他发送给数据库的数据.你可能还觉得这些”变种”老东西好像回到了组件时代.它可能不像输入代码或者手写代码那样又快有强大的准确表达你的意思. 你会惊奇的发现Linq编译器可以把Dlinq代码转化为这么优雅简单的.net 2.0 IL.这不是魔术也不是额外的类库.也不想大多数ORM工具需要靠大量的反射来实现.
