[转载]信息发布系统 Jquery+ASP.NET MVC架构开发(1) 需求分析和架构构思

mikel阅读(950)

[转载]信息发布系统 Jquery+MVC架构开发(1) 需求分析和架构构思 – 似水流年-johnhuo – 博客园.

最近朋友的公司已经注册完成了,需要我帮它来开发信息发布系统.

我最近在公司做的项目多为微软的mvc 架构的开发,借给朋友做系统的机会,自己也总结一下,也跟大伙分享一下.

首先是工具准备

Enterprise Architect 7.5 汉化版(描述需求和设计)

microsoft  visio

VS2010+SQL SERVER 2008(朋友的网站小access就够了,我本机就用SQL server吧)

动软.Net代码生成器+CodeSmith Studio(用于生成一些重复用的代码)

下面描述一下信息发布的需求:

开发这个系统本身是为了朋友公司的网站信息发布,朋友的公司主要是做仪表类的产品销售。这样的网站需要发布的内容如下:
1.一些普通的信息.2.带图片的信息.3.直接为一个图片.4.一个仪器类别。
网站的首页及其子页面主要是把后台存取的类别,信息,图片展示出来。

这样我们分析一下,软件的功能需求如下:

账号管理(增,删,改,查)

类别管理(增,删,改,查)

新闻管理(增,删,改,查)

图片管理(增,删,改(覆盖))
下面是用例描述:

单个用例的描述可参考下面的例子

用例名称:账号查询
用例标识号:101
参与者:管理员
简要说明

查询所有的账号信息

前置条件:

管理员已经登录后台信息管理系统

基本事件流:

1.管理员进入账号管理页面
2.系统出现需要输入账号名称的查询框和默认显示所有的账号信息
3.管理员可以输入账号名称,模糊查询所有符合条件的账号信息
4.用例终止

其他事件流A1
异常事件流

1.提示错误信息,管理员确认

2.返回到管理系统主页面

后置条件
注释:无

架构构思:

主要想采用

modal+dal+bll (wcf ) +Controllers+view(JQuery)展现层

请注意我是为了总结一些技术,朋友的网站就不需要wcf了。

[转载]Android开发教程 --- 葵花宝典第二层 Activity生命周期

mikel阅读(945)

[转载]Android开发教程 — 葵花宝典第二层 Activity生命周期 – Jason_CC – 博客园.

Hi 大家好

今天我准备花一节课来讲讲Activity的生命周期,这个概念还是比较重要的,相信大家看书或者资料都会提及它,可想而知!希望大家能看了我的博客后能搞明白生命周期的概念以及在以后的代码编写中,代码往哪里去写。

照例,上笑话。。。

有的女人就是Windows虽然很优秀,但是安全隐患太大。
有的女人就是MFC她条件很好,然而不是谁都能玩的起。
有的女人就是C#长的很漂亮,但是家务活不行。
有的女人就是C++,她会默默的为你做很多的事情。
有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
有的女人就是SQL,她会为你的发展带来莫大的帮助。  感慨下,呵呵

这是Android帮助文档中的图,我先发上。帮助文档位置在例如我将SDK文件夹放在D盘,那么我的帮助文档路径为

D:\Adnroid\Android-sdk-windows\docs\index.html  英文好的朋友可以参考这个帮助文档

我们主要会学习以下七个生命周期函数,活动(窗体)的生命周期函数并不止这七个,后面会说到。。耐心看

以下是对每个生命周期函数的中文解释

大家看过这些解释,对它有了一个大概的认识,那么接下来我们动手开始编写代码,来看看运行时的效果,这是代码

public class MainActivity extends Activity {
Button btn1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
System.out.println("第一个活动(窗体)初始化------------- onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 =(Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, ResultActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println("第一个活动(窗体)初始化完毕,并将要显示时------------- onStart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println("第一个活动(窗体)在即将于用户交互时------------- onResume");
}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println("第一个活动(窗体)在系统即将启动第二个活动时------------- onPause");
}

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println("第一个活动(窗体)在用户不可见时------------- onStop");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println("第一个活动(窗体)当重新启动时------------- onRestart");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("第一个活动(窗体)当活动销毁时------------- onDestroy");
}

}
public class ResultActivity extends Activity {
TextView txtResult;
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
System.out.println("第二个活动(窗体)初始化------------- onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
txtResult = (TextView)findViewById(R.id.txtResult);
txtResult.setText("第二个窗体");
btn1 = (Button)findViewById(R.id.btn1);

btn1.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent();
i.setClass(ResultActivity.this, MainActivity.class);
startActivity(i);
}
});
}

@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println("第二个活动(窗体)初始化完毕,并将要显示时------------- onStart");
}

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println("第二个活动(窗体)在即将于用户交互时------------- onResume");
}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println("第二个活动(窗体)在系统即将启动第二个活动时------------- onPause");
}

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println("第二个活动(窗体)在用户不可见时------------- onStop");
}

@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println("第二个活动(窗体)当重新启动时------------- onRestart");
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("第二个活动(窗体)当活动销毁时------------- onDestroy");
}
}

如果大家要创建多个活动(窗体)时,需要到AndroidManifest.xml中进行活动(窗体)的注册:

<!--?xml version="1.0" encoding="utf-8"?-->











在这里说下,如何LogCat切换到Java透视图中

在Java透视图的左下角有一个小图标,点击后 -> 其它 -> Android -> LogCat -> 确定 此时LogCat就会出现在我们的包资源管理器那里,你可以拖动它到你想要放置的地方。

由于我们在代码中使用了System.out.println 那么 我们可以在LogCat中去新建一个Filter 如何建立呢?

点击那个绿色的加号,会弹出一个窗体 ,在Filter Name 中任意输入一个名字 ,我这里叫做Sys,在By Log Tag 中输入 System.out 然后确定,此时就会创建成功,我们在程序中使用的System.out.println 就会显示在刚才建立的那个选项卡中。

大家观察,打印结果

到这里,两个窗体跳转所要执行的函数,大家应该是能够明白了。

当我们按下Home键,又该如何执行呢?

大家看图,然后再参照最开始的那七个生命周期的说明,自己动手实践下,就能明白了

当点击Back键后,其实,Android操作系统是在向活动栈中逐一销毁之前压入的活动。大家可以这样做个试验,两个窗体直接反复跳转4次,在跳转前,在编辑框中输入一些值,然后在点击Back键,看要点击几次,并看编辑框中的值。

Full Lifetime 全周期介于调用 onCreate onDestroy 之间。在一些情况下,终止一个活动并不调用 onDestroy Activity通过调用 onCreate 来初始化用户界面,数据,启动服务以及线程。onCreate 方法有个Bundle对象参数,这个参数含有最后一次调用 onSaveIntanceState 保存的UI状态数据。我们可以在 onCreate 中利用这个参数来恢复UI状态数据,或者重写 onRestoreInstanceState 。重写 onDestroy 释放资源,关闭数据库等操作。
为了写出比较高效的代码,有个比较好的建议是避免创建短期对象。快速的创建和销毁对象容易增加碎片回收线程的压力,这样会直接影响用户体验。

Visible Lifetime 可视期介于调用 onStart onStop 之间。此时Activity是可见的,但是不能响应用户事件。一个Activity在其生命周期中是有可能经历多个可视期的。在非常极端的情况下,系统也有可能终止一个处于可视期的活动,这种情况很少见。onStop 方法通常用于暂时或者停止那些用来更新UI的动画,线程,定时器,服务等,所以当活动不可见的时占用的系统资源是很少的。当活动由不可见状态转化为可见状态时,在 onStart 中再启动相关的线程和服务。onStart onStop 同样也用来注册和取消注册(unregister)那些用来更新UI的广播接收者。在活动不可见时我们需要取消注册接受者(Receivers),特别是那些支持目的动作(Intent)以及更新UI的接收者。

Activity Lifetime 当活动的 onResume 被调用,活动进入激活期;当 onPause 被调用时,激活期结束。一个活动被激活,它将处于前景屏幕,同时响应用户的事件。同样在活动的生命周期结束之前,存在多个激活期,一旦有新的活动被激活,当前活动将会失去焦点(暂停甚至停止……)。激活期是活动生命周期比较活跃的部分,会频繁调用 onResume onPause ,所以为了有良好的用户体验,在 onResume onPause 方法中的代码需要有更高的效率。
在调用 onPause 之前,活动会调用 onSaveInstanceState 来保存活动的UI状态到 Bundle ,这个 Bundle 就是 onCreate onRestoreInstanceState 这两个方法的参数了。onSaveInstanceState 保存UI状态(比如多选按钮的状态,界面焦点=),这样当活动被重新激活时,能够正确显示被暂停前的UI。多数的活动都重写 onPause 方法来提交未保存的数据,我们也可以在此选择是否暂停线程,广播接收者,这完全依软件架构本身而定。在 onResume 中一般不执行太多的代码,创建UI一般在 onCreate 或者 onRestoreInstanceState 中实现。
以上就是我对生命周期的理解以及整理,希望能帮到大家理解。

[转载]ASP.NET中动态获取数据使用Highcharts图表控件

mikel阅读(1150)

[转载]ASP.NET中动态获取数据使用Highcharts图表控件 – 某人的 – 博客园.

ASP.NET中动态获取数据使用Highcharts图表控件

Highcharts 官网:http://www.highcharts.com

Highcharts 官网示例:http://www.highcharts.com/demo/

Highcharts 官网文档:http://www.highcharts.com/documentation/how-to-use

Highcharts 官网参考手册:http://www.highcharts.com/ref/#credits–enabled

具体实现的效果如图:

具体代码:

ASP.NET前台脚本代码:

&lt;%@ Page Title="" Language="C#" MasterPageFile="~/MyHome/MasterPage.master" AutoEventWireup="true" CodeFile="ryfb.aspx.cs" Inherits="MyHome_tixi_ryfb" %&gt;
<script src="http://www.cnblogs.com/JScript/JQuery/jquery-1.4.2.min.js" type="text/javascript"></script> <script src="http://www.cnblogs.com/JScript/JQuery/Highcharts/highcharts.js" type="text/javascript"></script>
<script src="http://www.cnblogs.com/JScript/JQuery/Highcharts/modules/exporting.js" type="text/javascript"></script> <script type="text/javascript">// <!&#91;CDATA&#91;
    var chart;
    $(document).ready(function() {
        chart = new Highcharts.Chart({
            chart: {
                renderTo: 'container',
                defaultSeriesType: 'bar'
            },
            title: {
                text: '人员体系分布情况'
            },
            subtitle: {
                text: 'Source: 下级人员'   //图标的副标题
            },
            xAxis: {
                categories: <%= xAxisCategories %>,//从后台获取数据
                tickPixelInterval:0.2,
                title: {
                    text: null
                }
            },
            yAxis: {
                min: 0,
                title: {
                    text: '人数 (个)',
                    align: 'high'
                }
            },
            tooltip: {
                formatter: function() {
                    return ''+
                         this.series.name +': '+ this.y +' 个';
                }
            },
            plotOptions: {
               column: {
                        pointPadding: 0.3,
                        borderWidth: 0
                    },
                bar: {
                    dataLabels: {
                        enabled: true
                    }
                }
            },
            legend: {
                layout: 'horizontal',
                align: 'center',
                verticalAlign: 'top',
                y: 50,
                borderWidth: 1,
                backgroundColor: '#FFFFFF',
                borderColor: '#CCC',
                shadow: true
            },
            credits: {
                enabled: false
            },
            series: <%= returnValue %> //此处数据从后台获取
        });
    });
// &#93;&#93;></script>
<div class="profile">
<div class="profile_title">
<h2>人员分布</h2>
</div>
</div>

CS获取数据并处理数据的代码段:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using LHCYW.Core.DataAccess;
using System.Data;

public partial class MyHome_tixi_ryfb : System.Web.UI.Page
{
public string returnValue = "";//"[{name: '人员体系城市分布情况',data: [15,18,13,13,10,16,23,23]}]";
public string xAxisCategories = "";//"['北京市', '上海市', '重庆市', '天津市','抚州市','长沙市','常德市','济南市']";
public string containerHeight = "400px";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
XTUserDataAccess l_XTUserDataAccess = new XTUserDataAccess();
DataTable dt = l_XTUserDataAccess.GetRYFB(LHCYW.Core.WebSession.User.DTG);
if (dt.Rows.Count &gt; 0)
{
if (dt.Rows.Count &gt; 4)
{
containerHeight = (dt.Rows.Count * 50).ToString() + "px";
}
else
{
containerHeight = "200px";
}
string dataY = "[{name: '人员体系城市分布情况',data: [";
string dataX = "[";
foreach (DataRow dr in dt.Rows)
{
dataX += "'" + dr["CS"].ToString() + "',";
dataY += dr["NUM"].ToString() + ",";
}
xAxisCategories = dataX.Substring(0, dataX.Length - 1) + "]";
returnValue = dataY.Substring(0, dataY.Length - 1) + "]}]";
}
}
}
}

代码下载:点击我下载

[转载]60款高质量的网站模板免费下载(上篇)

mikel阅读(877)

[转载]60款高质量的网站模板免费下载(上篇) – 梦想天空(山边小溪) – 博客园.

当你想快速制作出一个网站的时候,网站模板就非常有用了。学习网页设计的朋友也可以从网站模板入手,学习模板网站的布局方式和编码风格。这篇文章收集了60个高质量的网站模板免费,您可以免费下载使用,希望这些网站模板能帮助到您。

Beez design
演示下载

Greefies

演示下载

Greefies Css Template 60 High Quality Free Web Templates and Layouts

Beauty co
演示下载

Beauty Co Template 60 High Quality Free Web Templates and Layouts

Jet 30 v2
演示下载

Jet 30 60 High Quality Free Web Templates and Layouts

Individual v2
演示下载

Individual 60 High Quality Free Web Templates and Layouts

Redish
演示下载

Redish 60 High Quality Free Web Templates and Layouts

Facing
演示下载

facing 60 High Quality Free Web Templates and Layouts

New Horizon
演示下载

new horizon 60 High Quality Free Web Templates and Layouts

Update
演示下载

updates 60 High Quality Free Web Templates and Layouts

Temper
演示下载

temper 60 High Quality Free Web Templates and Layouts

RS11
演示下载

rs11 60 High Quality Free Web Templates and Layouts

Imagination
演示下载

imagination 60 High Quality Free Web Templates and Layouts

Stylish
演示下载

stylish 60 High Quality Free Web Templates and Layouts

Simple Life 2.0
演示下载

simple life 60 High Quality Free Web Templates and Layouts

Green House
演示下载

green house 60 High Quality Free Web Templates and Layouts

Snowglass 1.0
演示下载

snowglass 60 High Quality Free Web Templates and Layouts

Compressed v2
演示下载

gotoview 60 High Quality Free Web Templates and Layouts

Nightvision
演示下载

nightvision 60 High Quality Free Web Templates and Layouts

Glazed
演示下载

glazed 60 High Quality Free Web Templates and Layouts

FrozenAge
演示下载

frozenage 60 High Quality Free Web Templates and Layouts

Earthling
演示下载

earthling 60 High Quality Free Web Templates and Layouts

Keep It Simple
演示下载

keep it simple 60 High Quality Free Web Templates and Layouts

Colourise
演示下载

colourise 60 High Quality Free Web Templates and Layouts

Vectorlover
演示下载

vectorlover 60 High Quality Free Web Templates and Layouts

UrbanArtist
演示下载

urbanartist 60 High Quality Free Web Templates and Layouts

Techjunkie
演示下载

techjunkie 60 High Quality Free Web Templates and Layouts

Watch This
演示下载

watch this 60 High Quality Free Web Templates and Layouts

Unbound 1.0
演示下载

outbound 60 High Quality Free Web Templates and Layouts

[转载]60个优秀的免费网站模板下载(下篇)

mikel阅读(920)

[转载]60个优秀的免费网站模板下载(下篇) – 梦想天空(山边小溪) – 博客园.

这篇文章收集了60款各式各样的高质量网站模板,您可以免费下载使用。当你需要在短时间内制作出网站的时候,网站模板就非常有用了,感谢那些优秀的设计师分享他们的劳动成果,让更多的人可以使用他们的创意设计,希望这些网站模板能帮助到您。

BuBlue
演示下载

PG Photo Gallery
演示下载

pg photo gallery 60 High Quality Free Web Templates and Layouts

Squick Design
演示下载

squick design 60 High Quality Free Web Templates and Layouts

My Personal Page
演示下载

my personal page 60 High Quality Free Web Templates and Layouts

Organic Beauty
演示下载

organic beauty 60 High Quality Free Web Templates and Layouts

Conceptnova
演示下载

conceptnova 60 High Quality Free Web Templates and Layouts

Small Corporation
演示下载

small corporation 60 High Quality Free Web Templates and Layouts

Web Application
演示下载

web application 60 High Quality Free Web Templates and Layouts

Internet Studio
演示下载

internet studio 60 High Quality Free Web Templates and Layouts

Internet Corporation
演示下载

internet corporation 60 High Quality Free Web Templates and Layouts

Internet Music
演示下载

internet music 60 High Quality Free Web Templates and Layouts

Internet Market
演示下载

internet market 60 High Quality Free Web Templates and Layouts

Organic Design
演示下载

organic design 60 High Quality Free Web Templates and Layouts

New York Magazine
演示下载

new york magazine 60 High Quality Free Web Templates and Layouts

Environmental Brand Design
演示下载

environment 60 High Quality Free Web Templates and Layouts

Eco Business
演示下载

ecobusiness 60 High Quality Free Web Templates and Layouts

The Autumn
演示下载

the autumn 60 High Quality Free Web Templates and Layouts

Green Web
演示下载

green web 60 High Quality Free Web Templates and Layouts

Breaking On Top
演示下载

breaking on top 60 High Quality Free Web Templates and Layouts

Apple Web
演示下载

apple web 60 High Quality Free Web Templates and Layouts

Wallpaper Medialab
演示下载

wallpaper medialab 60 High Quality Free Web Templates and Layouts

The Watch Shop
演示下载

the watch shop 60 High Quality Free Web Templates and Layouts

Surreal
演示下载

surreal 60 High Quality Free Web Templates and Layouts

Colorus
演示下载

colorus 60 High Quality Free Web Templates and Layouts

Clicker
演示下载

clicker 60 High Quality Free Web Templates and Layouts

News Portal
演示下载

news portal 60 High Quality Free Web Templates and Layouts

Electronix
演示下载

elecronix 60 High Quality Free Web Templates and Layouts

[转载]程序员该如何规划自己的人生

mikel阅读(1178)

[转载]程序员该如何规划自己的人生 – 南京.王清培 – 博客园.

其实大大小小的文章讨论程序员的人生规划不计其数。本人还是坚持谈谈个人对于程序员日后规划的看法,也是本人做事的一种风格跟对人生的态度吧。希望能给大家有点帮助。

首先我们庆幸的是我们是软件行业的一员,我们作为程序员从最基础的“农民工”开始的,从反反复复的代码中成长起来。我们要为我们的职业感到骄傲才对,他赋予了我们善于动脑的习惯,程序员每天要应对的问题多种多样,我们要快速的思考,不知不觉我们锻炼出了思考的习惯。[当思考成为习惯,成功将随之而至]

思考是前进的本质,我们在当初能进入程序员行业,就说明我们还是喜欢挑战的。但是话说回来,程序员的最终是需要归宿的,我们不可能一辈子这样处于 “基层”。所以我们需要思考,我们以后的归宿在哪里,等过了三十岁,我们的本钱是什么。可能你会说我有的是编程的经验,是项目经验,我框架写的很好。技术 就好比水,“可载舟亦可覆舟”。当我们沉浸在技术的水潭里,可能无法自拔。模式、框架等等太多了,我们是学不完的。多年的项目经验固然是我们的核心竞争 力,但是这样的竞争力似乎显的有点“沧桑”,已没有当年的激情和霸气。仅靠那些辛辛苦苦的血汗“架构”,已不能满足我们所付出的回报。

我们基本上都是来自小城市,到大城市上班工作,我们买不起房子。从二十出头就出来打拼,到了三十岁我想都该回家了;这短短的近十年的时间,对我们程 序员来说真的很重要,我们不要企图一步登天,我们需要慢慢的学习。学习做人、学习技术、学习与人交流、学习公司的运行原理、学习盈利模式、学习的东西太 多。我们要抓紧这短短的时间好好学习,不仅要学技术,我们还需要学习更多的大智慧、大战略。[没有远虑,必有近忧]

所以我们程序员需要做长远打算,在学习技术的过程中,我们更多接触的是公司的业务。业务驱动公司日常运转,我们应该善于总结一个公司是如何运转的,包括管理、资金、营销、广告等等。

我们是程序员,我们的资本是什么,相比大家都知道,我们有技术我们有项目经验。不错,我们是有这些,但是我们不能总是停留在代码的层次上,我们需要 有产品的理念,代码不值钱,产品值钱。在不断的开发过程中,我们需要将自己提升到一个高度,看产品不是看代码。这样的理念对于日后的创业尤其重要。

下面是本人抽象出来的人生规划图(程序员职业病改不了,喜欢分析):

1。

我大概将程序员的整个发展周期进行了基本四项的抽象。

一:自身修养

俗话说的好,先学会做人在学会做事。这是我们做人的根本,任何事情均是建立在与人交往上的。如果我们在三十岁之前还没有改变自己身上的缺点,没有让自己进入一个备战状态,还是整天浑浑噩噩,那就真的太迟了。这是纵向分析,所有的东西离不了它,我们日常需要注意了。

二:技术的学习

这是我们天天都在做的,但是技术这个东西变化太快。所以我们必须抓住核心的东西,以不变应万变。我们是.NET程序员,那么我需要抓住框架本身的原 理,C#语言的原理,任何新东西都是建立在这些基础上的。就算哪天学起来也很快。如果有时间的话,可以学习一些底层知识。我们来看对技术的抽象图:

2。

技术是我们的核心竞争力,我们必须话大功夫去学习。由于以后自主创业的可能性比较大,所以多学点技术不坏。

三:荣誉,提高自己的身份

其实这种身份不是贬义词,而是我们的知名度,在技术的领域里,我们需要有一帮自己玩的好的朋友。比如一些技术的圈子如:MVP圈子,程序员俱乐部等 等;在靠自己去跟人打交道的时候,往往真的很看重个人的荣誉,所以我们可以参加一些国内的或者国际的一些荣誉考试,MVP、Oracle、Java等等; 证书在手还是有好处的。

3.

荣誉可以根据个人喜好自己去争取努力。需要有一定含金量的证书,能证明自身能力的证书才重要。

四:三十而立的准备

这是至关重要,十年的时间,我们好好总结好好学习对于我们后期的创业也好,干嘛都好,不只是一个简简单单的程序员了。我们有产品的理念,我们有与人交往的技巧等等。

4。

总结:这样全面的学习,等我们到了三十岁。那就全身是宝,那个时候再做什么决定可能60%意味着成功。

[转载]Ubuntu安装Mono2.10并使用Apache承载Asp.Net mvc3应用程序

mikel阅读(1010)

[转载]Ubuntu安装Mono2.10并使用Apache承载Asp.Net mvc3应用程序 – 傲雪啸风 – 博客园.

ASP.NET长久以来令大规模部署所诟病的便是其成本的高企,mono的出现为.net应用程序打开了通往linux的一扇大门,使得.Net应用程序 低成本部署成为可能。最近为了尝试将ASP.NET Mvc3部署在Linux下,查阅了很多资料,但发现大多数都是在OpenSUSE的,介绍如何Ubuntu下使用Apache2的文章比较少,但也终于 找到了一些比较有价值的并最终安装部署成功,把安装过程总结出来,供广大.Neter参考。

0. 在安装之前

Ubuntu10.04为全新安装,并在安装的过程中选择了ssh server, LAMP server, samba三个角色

1. 安装依赖程序

apt-get install build-essential bison gettext pkg-config autoconf libtool automake

2. 安装Mono2.10

wget http://ftp.novell.com/pub/mono/sources/mono/mono-2.10.tar.bz2
tar -xjvf mono-2.10.tar.bz2
cd mono-2.10
./autogen.sh
make
sudo make install
cd ..

记得make install需要sudo,否则会提示无权限

参考资料[1]中的./autogen.sh一行有路径参数,但发现实际输入路径参数会提示找不到该参数,故取消,安装后路径在/usr/local/bin下

3. 安装XSP服务器

wget http://ftp.novell.com/pub/mono/sources/xsp/xsp-2.10.tar.bz2
tar -xjvf xsp-2.10.tar.bz2
cd xsp-2.10
./configure
make
sudo make install
cd ..

同第2步,参考资料[1]中的./configure一行有路径参数,但发现实际输入路径参数会提示找不到该参数

4. 安装apache-dev

apt-get install apache2-dev

5. 修整相关文件

sudo mv /etc/apache2/mod_mono.conf /etc/apache2/mods-available/
sudo a2enmod mod_mono
sudo service apache2 restart

默认mod_mono安装完成后mod_mono.conf会直接出现在/etc/apache2下,ubuntu下的apache2采取分离-包含的配置文件策略,需将mod_mono.conf复制至mods-available并启用mod_mono

6. 修改站点配置文件


ServerAdmin webmaster@localhost
ServerName mono.me.com
DocumentRoot /var/www/mono

MonoServerPath mono.me.com "/usr/local/bin/mod-mono-server4"
MonoDebug mono.me.com true
MonoSetEnv mono.me.com MONO_IOMAP=all
MonoApplications mono.me.com "/:/var/www/mono"

Allow from all
Order allow,deny
MonoSetServerAlias mono.me.com
SetHandler mono
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-zip dontvary


AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript

ErrorLog /var/log/apache2/error-mono.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel debug
CustomLog /var/log/apache2/access-mono.log combined

除了手动更改, 该配置文件还可使用Mono Config Tool自动生成.

需要注意”MonoServerPath mono.me.com “/usr/local/bin/mod-mono-server4″一行,mono2.10采取上述默认过程安装完成后并不在很多文章中提到的/usr/bin下,而在/usr/local/bin下

还有DocumentRoot /var/www/mono 此目录需要有执行权限,否则apache会报403错误

7. 部署站点

新建一个Asp.Net Mvc3应用程序,将该Mvc项目生成部署包,通过samba复制至第6步中设置的站点根目录下,并重启apache2服务,在客户机设定好Host并在 浏览器中输入设定的域名,如果一切正常,恭喜你可以看到一个经典的Asp.Net错误页,将customerError设为Off,将会看到,是因为缺少 一个System.Web.Helpers的dll。此时,回到Mvc项目中,你需要

(1). 添加如下引用

System.Web.Razor.dll
System.Web.WebPages.Razor.dll
System.Web.WebPages.Deployment.dll

(2). 将如下引用的dll设定为复制到本地

System.Web.Helpers.dll
System.Web.Mvc.dll
System.Web.WebPages.dll
System.Web.Razor.dll
System.Web.WebPages.Razor.dll
System.Web.WebPages.Deployment.dll

(3). 重新生成部署包,覆盖服务器上的bin目录即可。

OK,此时,你已经摆脱了昂贵的Window Server,当然,使用盗版的同学可以偷偷走开,如果你还想摆脱昂贵的SQL Server,那么你可以使用MySQL、PostgreSql、Mongodb,如果你不需要多么强大的性能,那么sqlite也是一个不错的选择。

参考资料:

[1] 《How to get ASP.NET MVC 2 working with Mono in 10 Steps》buddylindsey

[2] 《ASP.NET MVC 3 with Razor on Mono 2.10.1》Robert Jordan

[3]  Configure Apache Mod_Mono

[转载]Android开发教程 --- 葵花宝典第一层 初识Android

mikel阅读(930)

[转载]Android开发教程 — 葵花宝典第一层 初识Android – Jason_CC – 博客园.

Hi 大家好!

今天带大家一起来认识Android,照例上笑话。。。

某邮局下面的支局通过MODEM于总局连通.但线路质量不好,  常常在用的时候断线,于是,支局打电话给维护人员,”我的机死  啦……”维护人员说:”你的进程吊在上面了,等一下,我帮你把  进程杀掉……”  时间长了,支局打电话的时候就说,”我又吊死啦,你把我杀掉!”   🙂

创建一个Android项目  选择菜单栏中的 文件 -> 新建 -> Android Project

会弹出如下窗体

创建成功后,将在包资源管理器中,生成的项目框架如图

运行程序 需要先配置AVD(虚拟机)  单击菜单栏中的 窗口 -> Android SDK and AVD Manager 选项,在弹出的窗口中,选择 New… 按钮

创建。

然后 对着包资源管理器中的项目名称 右键 -> 运行方式 -> 1 Android Application

此时,模拟器就会启动,第一次启动 大概需要1-2分钟,请耐心等待。

双击打开src 下的HelloActivity.java文件,会看到如下图的代码,

1 首先一个活动(窗体)需要继承 一个叫做 Activity的类

2 需要重写基类的onCreate方法

2.1 生成onCreate方法的快捷方式 在空白处 输入 oncreate 然后 按 Alt + /  (呼出智能提示) 然后回车

2.2 在空白处 鼠标右键 -> 源代码 -> 覆盖/实现方法  在弹出的窗体中,找到onCreate方法,选中 -> 确定

展开 res 文件夹 ,会看到有一个叫做 values的文件夹,里面有一个string.xml

这个文件里可以定义我们程序中需要用到的显示常量 ,例如 按钮中的提交 ,提示用户的信息 ,例如 注册时的用户名 提示,等。。

都可以在string.xml中的 <string name=””></string>定义,此时定义的name将会在项目的 gen文件夹下的R.java中生成索引ID

这个生成过程是自动完成,不需要我们编写代码。

在 res 下还会有一个叫做 layout的文件夹,此文件夹下主要是用来存放,活动(窗体)的布局文件。。如果不太好理解,大家可以

把它理解成 我们做HTML时,用到的CSS文件 ,只不过这个文件中不仅可以写样式,还可以写标签而已。可以在这个文件中定义一些控件,

以及对这些控件进行美化(样式)。

好,到这里不知道大家对Android是否有了一个大概的了解。还是没有弄清的朋友在回头好好看看,加深理解。

现在大家学习3个控件

1 TextView (用于提示的文本框)  例如我们在网页中的注册页面中看到的 用户名: 类似与HTML标签中的 <label>

2 EditText (用于用户填写的编辑框) 类似与HTML中的 <input type=”text”>

3 Button 这个不用说了吧。。。。

大家把这3个控件都写到布局文件中(main.xml),并给它们赋值,使用上边说到得string.xml进行配置,勤加练习!

接下来,需要大家了解下Intent,目前,到这里大家先知道Intent可以做活动(窗体)与活动(窗体)之间的跳转,大家暂时可以把它

理解为HTML中的a标记

首先

1 Button btn1; 需要先声明一个Button类型的对象

2 btn1 = (Button)findViewById(R.id.btn1); 这里需要获取main.xml(布局文件)中你定义的Button,并赋值给btn1对象

2.1 R.id.btn1 代表

2.2<Button android:id=”@+id/btn1″ android:layout_width=”wrap_content”
android:layout_height=”wrap_content” android:text=”@string/btnck” />

上边红色代码将会在R.java中生成出一个对应的ID值,我们在代码中只需要通过R.id.btn1就能获取到这个Button控件

3 btn1.setOnClickListener(new Button.OnClickListener(){}); 代表需要向btn1对象绑定一个单击事件(监听器),当用户单击这个按钮时,会触发

public void onClick(View v) {

这里面的代码

}

4 test.class 这个代表我又创建了一个叫做test.java文件并继承了Activity 重复HelloActivity.java的步骤

并且单击btn1按钮后,跳转到test窗体中

今天的课程就到这里,给大家布置一个小练习,如图

PPT和代码我已经上传到公司网站 http://www.bj-stl.com/android.html

[转载]自己动手写SQL字符串分解函数Split

mikel阅读(1075)

[转载]自己动手写SQL字符串分解函数Split – 会动的稻草人 – 博客园.

前段时间,在做一个可以批量审核或删除数据的功能时,遇到这么个问题:

因为审核或删除操作是在存储过程进行的,所以,就打算将选中的数据的主键拼成字符串,传到存储过程进行分离,再继续处理。

C#中和JavaScript中都有相应的分离字符串的Split函数,就想当然的以为SQL中也会有类似的函数,结果查了半天的MSSQL帮助文档,也没找到。

没办法,只好自己写了,在网上搜了下相关的,看了一两篇关于SQL分离字符串的自定义函数的文章,结果,有点失望,可能是自己水平差,或者是因为人家的代码没写注释吧,总之就是看着挺吃力的,还没看完就决定自己写了。。。

思路很简单:在需要分解的字符串中,如果存在指定的分隔符,则将第一个分隔符前面的字符串取出,存入表内,然后在需要分解的字符串中将已取出的字符串及第一个分隔符删除,然后继续下一次分解(如果还存在指定的分隔符,就分解)

以下是SQL:

-- =============================================
-- Author:        Henson
-- Create date:   2011-04-20
-- Description:   字符串分离函数
-- =============================================
ALTER FUNCTION [dbo].[Split]
(
@strText varchar(3000),--待分离的原字符串
@strSplit varchar(100)--分隔符
)
RETURNS @temp Table
(
ID int IDENTITY PRIMARY KEY,
SingleVal varchar(1000)
)
AS
BEGIN
Declare @intLen int --用来存储待分离原字符串长度
Declare @intSplitLen int --分隔符长度
Declare @intIndex int --用来存储分离字符串在原字符串的位置
Declare @strVal varchar(1000)--用来存储分离出来后的字符串
--获取原字符串的长度
Set @intLen = LEN(RTRIM(LTRIM(@strText)))
Set @intSplitLen = LEN(RTRIM(LTRIM(@strSplit)))
--原字符串不为空,才继续分离
If(@intLen &gt; 0)
Begin
--循环原字符串,直至原字符串被分离完毕
While CHARINDEX(@strSplit,@strText)&gt;0
Begin
--获取分离字符串在原字符串的位置
Set @intIndex = CHARINDEX(@strSplit,@strText)
--获取分离出的字符串,并插入表中
Set @strVal = RTRIM(LTRIM(LEFT(@strText,@intIndex-1)))
if(LEN(@strVal)&gt;0)
Begin
Insert Into @temp (SingleVal) values(@strVal)
End
--分离后,将分离出的字符串(包括分隔符)从原字符串中删除
Set @strText = Substring(@strText,@intIndex+@intSplitLen,@intLen-@intIndex)
--重新设置原字符串的长度
Set @intLen = LEN(@strText)
End
--如果分离后的原字符串依然不为空,则也应该插入表中
if(LEN(RTRIM(LTRIM(@strText)))&gt;0)
Begin
Insert Into @temp (SingleVal) values(@strText)
End
End
return
END

(分隔符允许是多位的)

按一般的习惯来说,在组织多个字符串时,一般都是这种写法:strKeys += strSingleKey + “,”;

所以可能最终该字符串可能会以逗号结尾,如果组织完成后,将结尾的逗号去掉了,那就不会以逗号结尾,所以,在循环分解完成后,如果剩下的原字符串中(去除左右空格后),如果还有内容 ,则也应该存入表中。

可能我这种写法不是最好的,也可能会有问题,如确实有需要改进的,还请指出,不胜感激!!!

[转载]Asp.Net 在线代码编辑工具

mikel阅读(1054)

[转载]【原创】Asp.Net 在线代码编辑工具 – 追求、品味、境界 – 博客园.

通常CMS软件中最基本的一个功能就是在线文件内容的编辑,内容更新并且发布后,可实时看到编辑后的效果,可是企业Web应用项目更多是业务逻辑的控制, 不适合基于CMS来做开发,尤其是已经部署在线运行的项目,用户会频繁地提出前端页面的修改,例如颜色,字体大小,网页标题等等琐碎的调整,加上经常忘记 服务器管理密码,更新程序极为不便,于是在线代码编辑工具在这样的场景下应用而生了。

以图为例:

说明:上图中左边区域为工程的文件目录,右边区域为代码编辑区,选择左边的文件节点,右边编辑区将加载文件内容,编辑内容后,选择保存即可即时更新代码文 件。也可以选择左边的文件夹节点,新增空白文本文件,也可以新增文件夹,当然也可以上传文件,比如图片,或者dll文件,替换当前程序文件,即时更新应 用。

注意事项,该功能应包含在现有项目中发布,此外应考虑安全因素,如单独提供一个登录页面访问控制

示例工程代码如下:I’m here