[转载]超详细LAMP环境搭建 - gaohj - 博客园

mikel阅读(908)

[转载]超详细LAMP环境搭建 – gaohj – 博客园.

一、准备工作

 

1、安装编译工具gcc、gcc-c++

注意解决依赖关系,推荐使用yum安装,若不能联网可使用安装光盘做为yum源——

1)编辑yum配置文件:

# mount /dev/cdrom /mnt/cdrom

# vi /etc/yum.repos.d/CentOS-Media.repo

[c5-media]

name=CentOS-$releasever – Media

baseurl=file:///mnt/cdrom   * 修改为光盘挂载点

file:///media/cdrom/

file:///media/cdrecorder/

gpgcheck=1

enabled=1  * 改为1意为启用

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

2)剪切/etc/yum.repos.d/CentOS-Base.repo

# mv /etc/yum.repos.d/CentOS-Base.repo /backup

3)依次安装gcc、gcc-c++

# yum -y install gcc

# yum -y install gcc-c++

 

2、关闭系统RPM安装包的Apache、MySQL的服务

关闭启动的服务httpd、mySQLd

# service httpd stop

# service mysqld stop

 

确定rpm包安装的httpd和mysqld不能开机自启动

chkconfig  –level  2345  httpd(mysqld)  off

 

3、关闭SELinux,允许防火墙80端口访问

使用setup

关闭防火墙和SElinux

 

1)关闭SELinux

# vi /etc/selinux/config

SELINUX=disabled   * 若安装时没有禁用SELinux ,将enforcing改为disabled

修改后需重新启动Linux方可生效!

2)关闭防火墙Netfilter/iptables

因尚未做防火墙讲解,直接简单的关闭所有防火墙设置:

# iptables  -F     * 如果没有禁用防火墙,默认80端口禁止访问

iptables  -Z

iptables  -X

 

4、关闭不必要自启动服务

# ntsysv

以下列出服务可保持自启动,未列出的服务都可以关闭:

atd

crond        # atd、crond计划任务

irqbalance

microcode_ctl   # 系统irq端口调用,系统服务

network    #网络设置

sendmail   #邮件

sshd      #远程管理

syslog    #系统日志

 

5、拷贝源码包,解包解压缩

建议将LAMP环境安装源码包统一存放在一个目录下,如/lamp

可编写个批量处理脚本,一次性把所有.tar.gz的安装包解包解压缩

# vi tar.sh

cd /lamp

/bin/ls *.tar.gz > ls.list

/bin/ls *.tgz >> ls.list

for TAR in `cat ls.list`

do

/bin/tar -zxf $TAR

done

/bin/rm ls.list

 

6、查看确认磁盘空间未满

df -h

* 若/分区已满,可以移动安装包到其他分区或删除其他无用文件

 

 

二、编译安装

 

* 每个源码包配置编译安装完成后,确认安装目录下是否生成安装文件

make  clean

# 安装libxml2

Libxml2 是一个xml c语言版的解析器,本来是为Gnome项目开发的工具,是一个基于MIT License的免费开源软件。它除了支持c语言版以外,还支持c++、PHP、Pascal、Ruby、Tcl等语言的绑定,能在Windows、Linux、Solaris、MacOsX等平台上运行。功能还是相当强大的,相信满足一般用户需求没有任何问题。

#yum  install  -y  libxml2-devel      如果报错,安装此包后再尝试安装

 

cd /lamp/libxml2-2.6.30

./configure –prefix=/usr/local/libxml2/

make

make install

 

# 安装libmcrypt

libmcrypt是加密算法扩展库。支持DES, 3DES, RIJNDAEL, Twofish, IDEA, GOST, CAST-256, ARCFOUR, SERPENT, SAFER+等算法。

cd /lamp/libmcrypt-2.5.8

./configure –prefix=/usr/local/libmcrypt/

make

make install

* 需调用gcc-c++编译器,未安装会报错

 

# 安装libltdl,也在libmcrypt源码目录中,非新软件

cd /lamp/libmcrypt-2.5.8/libltdl

./configure –enable-ltdl-install

make

make install

 

# 安装zlib

zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表。zlib使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权

cd /lamp/zlib-1.2.3

./configure

make

make install  >>  /root/zlib.log

* zlib指定安装目录可能造成libpng安装失败,故不指定,为卸载方便,建议make install执行结果输出到安装日志文件,便于日后卸载

 

# 安装libpng

libpng 软件包包含 libpng 库.这些库被其他程式用于解码png图片

cd /lamp/libpng-1.2.31

./configure –prefix=/usr/local/libpng/

make

make install

 

# 安装jpeg6

用于解码.jpg和.jpeg图片

mkdir /usr/local/jpeg6

mkdir /usr/local/jpeg6/bin

mkdir /usr/local/jpeg6/lib

mkdir /usr/local/jpeg6/include

mkdir -p /usr/local/jpeg6/man/man1

cd /lamp/jpeg-6b

./configure –prefix=/usr/local/jpeg6/ –enable-shared –enable-static

make

make install

* –enable-shared与–enable-static参数分别为建立共享库和静态库使用的libtool

 

# 安装freetype

FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。支持单色位图反走样位图的渲染。FreeType库是高度模块化的程序库,虽然它是使用ANSI C开发,但是采用面向对象的思想,因此,FreeType的用户可以灵活地对它进行裁剪。

cd /lamp/freetype-2.3.5

./configure –prefix=/usr/local/freetype/

make

make install

 

# 安装autoconf

Autoconf是一个用于生成可以自动地配置软件源代码包以适应多种Unix类系统的 shell脚本的工具

cd /lamp/autoconf-2.61

./configure

make

make install

 

# 安装GD库

GD库,是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。 在网站上GD库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或者对网站数据生成报表等。

mkdir /usr/local/gd2

cd /lamp/gd-2.0.35

* png错误,修改方法:

vi gd_png.c

把 #include “png.h” 替换为 #include “/usr/local/libpng/include/png.h”

./configure –prefix=/usr/local/gd2/ –with-jpeg=/usr/local/jpeg6/ –with-freetype=/usr/local/freetype/ –with-png=/usr/local/libpng/

make

* 如果出现错误,把上面的两步重新执行一次

make install

* 若前面配置zlib时没有指定安装目录,gd配置时不要添加–with-zlib=/usr/local/zlib/参数

 

# 安装Apache

cd /lamp/httpd-2.2.9

 ./configure –prefix=/usr/local/apache2/ –sysconfdir=/usr/local/apache2/etc/ –with-included-apr –enable-so –enable-deflate=shared –enable-expires=shared –enable-rewrite=shared

 make

 make install

  * 若前面配置zlib时没有指定安装目录,Apache配置时不要添加–with-z=/usr/local/zlib/参数

 

启动Apache测试:

/usr/local/apache2/bin/apachectl start

ps -le | grep httpd

* 若启动时提示/usr/local/apache2/modules/mod_deflate.so无权限,可关闭SELinux或者执行命令chcon -t texrel_shlib_t /usr/local/apache2/modules/mod_deflate.so ,类似此类.so文件不能载入或没有权限的问题,都是SELinux问题,使用命令:“chcon -t texrel_shlib_t 文件名”即可解决,MySQL和Apache也可能有类似问题。

通过浏览器输入地址访问:http://Apache服务器地址,若显示“It works”即表明Apache正常工作

 

设置Apache系统引导时启动:

echo “/usr/local/apache2/bin/apachectl start” >> /etc/rc.d/rc.local

 

# 安装ncurses

Ncurses 提供字符终端处理库,包括面板和菜单。

1、yum -y install “ncurses*”

注:如果报错,包找不到,是*通配符没有识别,给文件名加双引号  “ncurses*”

2、源代码编译:

cd /lamp/ncurses-5.6

./configure –with-shared –without-Debug –without-ada –enable-overwrite

make

make install

* 若不安装ncurses编译MySQL时会报错

* –without-ada参数为设定不编译为ada绑定,因进入chroot环境不能使用ada ;–enable-overwrite参数为定义把头文件安装到/tools/include下而不是/tools/include/ncurses目录

 

# 安装MySQL

groupadd mysql

useradd -g mysql mysql

* 添加用户组mysql ,将mysql用户默认组设置为mysql用户组

cd /lamp/mysql- 5.1.59

./configure –prefix=/usr/local/mysql –without-Debug –enable-thread-safe-client –with-pthread –enable-assembler –enable-profiling –with-mysqld-ldflags=-all-static –with-client-ldflags=-all-static –with-extra-charsets=all –with-plugins=all –with-mysqld-user=mysql –without-embedded-server –with-server-suffix=-community –with-unix-socket-path=/tmp/mysql.sock

选项:

–without-debug                          去除诊断模式

–enable-thread-safe-client            以线程方式编译客户端

–with-pthread                             强制使用pehread库

–enable-assembler                       使用字符函数的汇编版本

–enable-profiling                        启动profile功能(慢查询)

–with-mysqld-ldflags=-all-static   以静态方式编译服务端

–with-client-ldflags=-all-static     以静态方式编译客户端

–with-extra-charsets=all                     设定支持字符集utf8,gb2312,gbk等。All所有

–with-plugins=all                       设定支持所有插件

-with-mysqld-user=mysql             设定mysql用户

–without-embedded-server           去除embedde功能(嵌入服务)

–with-server-suffix=-community  给mysql加个后缀,mysql登录时,版本号后面可以看到

–with-unix-socket-path=/tmp/mysql.sock    使用unix套接字,提高性能

 

make

make install

 

* –with-extra-charsets=all参数为安装所有字符集

* 若编译失败,,make clean后再make ; make install 。默认不支持innodb存储引擎,其中–with-plugins=all可以把innodb加载进来。

 

1、  cp /usr/local/mysql/share/mysql/my-medium.cnf  /etc/my.cnf

修改mysql配置文件

vi  /etc/my.cnf

1.[client]

default-character-set=utf8

2.[ mysqld]

character-set-server=utf8

collation-server = utf8_general_ci

* 生成MySQL配置文件

setfacl -m u:mysql:rwx -R /usr/local/mysql

setfacl -m d:u:mysql:rwx -R /usr/local/mysql

* 用acl来让mysql用户对/usr/local/mysql有所有权限  -m u: 对已存在的文件生效 -m d:

对未来新建文件生效    ls –d 显示默认权限

/usr/local/mysql/bin/mysql_install_db –user=mysql

这一步目的是为了让/usr/local/mysql 下产生var 目录 存放mysql的数据库表  要放在 setfacl -m d:u:mysql:rwx -R /usr/local/mysql

之后为的就是让 mysql 对var也有默认7权限

* 创建数据库授权表

启动MySQL服务:

1.用原本源代码的方式去使用和启动mysql

/usr/local/mysql/bin/mysqld_safe –user=mysql &

2.重启以后还要生效:

vi /etc/rc.local

/usr/local/mysql/bin/mysqld_safe –user=mysql &

3.设定mysql密码

/usr/local/mysql/bin/mysqladmin -uroot password lampbrother

* 给mysql用户root加密码lampbrother

*    注意密码不能写成 “lampbrother”

/usr/local/mysql/bin/mysql -u root -plampbrother

mysql>show databases;

mysql>use test;

mysql>show tables;

mysql>\s                     #查看字符集是否改为utf8

* 进入mysql以后用set来改密码

mysql> exit

* 登录MySQL客户端控制台设置指定root密码

 

# 安装PHP

编译前确保系统已经安装了libtool和libtool-ltdl软件包,安装:

yum -y install “libtool*”

yum -y install “libtool-ltdl*”

cd /lamp/php-5.2.6

./configure –prefix=/usr/local/php/ –with-config-file-path=/usr/local/php/etc/ –with-apxs2=/usr/local/apache2/bin/apxs –with-mysql=/usr/local/mysql/ –with-libxml-dir=/usr/local/libxml2/ –with-jpeg-dir=/usr/local/jpeg6/ –with-png-dir=/usr/local/libpng/ –with-freetype-dir=/usr/local/freetype/ –with-gd=/usr/local/gd2/ –with-mcrypt=/usr/local/libmcrypt/ –with-mysqli=/usr/local/mysql/bin/mysql_config –enable-soap –enable-mbstring=all –enable-sockets

 

l  若前面配置zlib时没有指定安装目录,PHP配置时不要添加–with-zlib-dir=/usr/local/zlib/参数

选项:

–with-config-file-path=/usr/local/php/etc/    指定配置文件目录

–with-apxs2=/usr/local/apache2/bin/apxs     指定apache动态模块位置

–with-mysql=/usr/local/mysql/                   指定mysql位置

–with-libxml-dir=/usr/local/libxml2/           指定libxml位置

–with-jpeg-dir=/usr/local/jpeg6/                 指定jpeg位置

–with-png-dir=/usr/local/libpng/                 指定libpng位置

–with-freetype-dir=/usr/local/freetype/        指定freetype位置

–with-gd=/usr/local/gd2/                           指定gd位置

–with-mcrypt=/usr/local/libmcrypt/            指定libmcrypt位置

–with-mysqli=/usr/local/mysql/bin/mysql_config              指定mysqli位置

–enable-soap                                            支持soap服务

–enable-mbstring=all                                支持多字节,字符串

–enable-sockets                                        支持套接字

make

make install

生成php.ini

cp /lamp/php-5.2.6/php.ini-dist  /usr/local/php/etc/php.ini

测试Apache与PHP的连通性,看Apache是否能解析php文件

vi /usr/local/apache2/etc/httpd.conf

AddType application/x-httpd-php .php .phtml .phps        (注意T的大小写) 不加这句话 输入地址 会提示你下载

* .phtml为将.phps做为PHP源文件进行语法高亮显示

重启Apache服务:/usr/local/apache2/bin/apachectl stop

/usr/local/apache2/bin/apachectl start

 

* Apache无法启动,提示cannot restore segment prot after reloc: Permission denied错误,为SELinux问题,可关闭SELinux或者执行命令chcon -t texrel_shlib_t /usr/local/apache2/modules/libphp5.so

测试:vi /usr/local/apache2/htdocs/test.php

<?

phpinfo();

?>

通过浏览器输入地址访问:http://Apache服务器地址/test.php

Rpm包安装的网页默认目录     /var/www/html/

* 有时第一次浏览器测试会失败,关闭浏览器重启再尝试即可,非编译错误

# 编译安装memcache

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像视频文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

cd /lamp/memcache-2.2.5

/usr/local/php/bin/phpize

./configure –with-php-config=/usr/local/php/bin/php-config

make && make install

 

# 编译安装 PDO_MYSQL

PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。

cd /lamp/PDO_MYSQL-1.0.2/

/usr/local/php/bin/phpize

./configure –with-php-config=/usr/local/php/bin/php-config –with-pdo-mysql=/usr/local/mysql

make && make install

 

修改/usr/local/php/etc/php.ini

extension_dir = “/usr/local/php//lib/php/extensions/no-debug-non-zts-20060613/”

extension=”memcache.so”;

extension=”pdo.so”;

extension=”pdo_mysql.so”;

 

# 安装Zend加速器

cd /lamp/ZendOptimizer-3.2.6-linux-glibc21-i386

./install.sh

l  注意PHP配置文件和Apache启动脚本所在目录指定正确即可

l  /usr/local/php/etc/

l  /usr/local/apache2/bin/apachectl

 

#安装memcache源代码

首先安装依赖包libevent

yum -y install “libevent*”

cd /lamp/memcached-1.4.10

./configure –prefix=/usr/local/memcache

make && make install

useradd memcache

passwd memcache

* Linux不能用root运行memcache软件          密码(lampbrother)

/usr/local/memcache/bin/memcached -umemcache &

netstat an | grep :11211

telnet 192.168.10.1 11211

stats

写入自启动:

vi /etc/rc.d/rc.local

/usr/local/memcache/bin/memcached -umemcache &

 

# 安装phpMyAdmin

cp -r /lamp/phpMyAdmin-3.0.0-rc1-all-languages /usr/local/apache2/htdocs/phpmyadmin

cd /usr/local/apache2/htdocs/phpmyadmin

cp config.sample.inc.php config.inc.php

vi config.inc.php

$cfg[‘Servers’][$i][‘auth_type’] = ‘cookie’;

$cfg[‘Servers’][$i][‘auth_type’] = ‘http’;

* 设置auth_type为http ,即设置为HTTP身份认证模式

通过浏览器输入地址访问:http://Apache服务器地址/phpmyadmin/index.php

用户名为root ,密码为MySQL设置时指定的root密码(lampbrother)

 

 

安装过程中大多错误起始为输入错误,可以通过history命令查看历史记录检查。

#!/bin/bash

cd /root/lamp

/bin/ls *.tar.gz > ls.txt

/bin/ls *.tgz >> ls.txt

for TAR in `cat ls.txt`

do

tar –zxvf $TAR

done

/bin/rm –rf ls.txt

[转载]SQLServer大对象FileTable初体验 - Boyce Yang - 博客园

mikel阅读(1108)

[转载][SQLServer大对象]——FileTable初体验 – Boyce Yang – 博客园.

在我接触FileTable之前,存储文件都是存储文件的链接和扩展名到数据,其实并没有实际的把文件存储到数据库。

FileTable不同于一般的表,他可以存储非结构数据和元数据(如:文件、文档),存储的文件可以像普通的文件一样通过一个路径被访问,而且不必对客户端程序修改。

FileTable 不支持内存映射文件。 “记事本”和“画图”是两个常见的使用内存映射文件的示例应用程序。 不能在 SQL Server 所在的计算机上使用这些应用程序来打开存储在 FileTable 中的文件。 但是,可以从远程计算机使用这些应用程序来打开存储在 FileTable 中的文件,因为在这些情况下不使用内存映射功能

启用FILESTREAM设置

1.  开始菜单 –> 所有程序 –> Microsoft SQL Server Code-Named 2012 –> 配置工具 –>选择SQL配置管理器

当然这么一个接着一个的用鼠标点,有点不像搞IT的同学,那么专业一点,使用命令 SQLServerManager10.msc,如果是SQL2005使用 SQLServerManager.msc 打开。

2. 在服务列表中,单击 SQL Server服务器

3. 在 SQL Server配置管理器中,找到 FILESTREAM 的 SQL Server 实例,右键该实例 –> 点击属性

4. SQL Server属性对话框 –> FILESTREAM 选项卡

5. 勾选 Transact-SQL访问启用FILESTREAM 复选框

6. 如果要在Windows中读取和写入 FILESTREAM 数据勾选针对文件I/O流访问启用 FILESTRAM,在Windows共享名框中输入 Windows 共享名称

    这里配置后,FileTable创建好后,就可以想操作本地文件一样在FileTable中操作文件。

7. 如果希望远程访问存储在该共享中的 FILESTREAM 数据,勾选允许远程客户端针对 FILESTREAM 数据流访问

8. 应用

FileStreamConfig

更改FILESTRAM设置

在SQL Server Managerment studio中,使用Transact-SQL修改配置

 1: EXEC sp_configure filestream_access_level, 2
 2: RECONFIGURE

执行之后,需要重新启动 SQL Server 服务

 

创建启动 FILESTRAM 的数据库

在SQL Server Managerment studio中,使用Transact-SQL创建数据库

 1: CREATE DATABASE  Archive
 2: ON
 3: PRIMARY ( NAME = ArchiveMDF,
 4:     FILENAME = 'C:\MyData\archdat.mdf'),      -- C:\MyData路径必须存在
 5: FILEGROUP FileStreamGroupFirst CONTAINS FILESTREAM( NAME = ArchiveFILESTREAM,
 6:     FILENAME = 'C:\MyData\MyFileStream')      -- C:\MyData路径下MyFileStream文件夹必须不存在
 7: LOG ON  ( NAME = ArchiveLDF,
 8:     FILENAME = 'C:\MyData\archlog.ldf')
 9: GO

运行该脚本后

C:\MyData\MyFileStream 文件夹中会出现filestream.hdr 文件和 $FSLOG 文件夹。filestream.hdr 文件是重要的系统文件,它包含 FILESTREAM 头信息。

启用数据库非事务性访问级别

为了允许对 SQL Server 中存储文件进行非事务性访问,须在FileTable的数据上设置数据库非事务性访问级别。

修改数据库非事务性访问级别

 1: ALTER DATABASE Archive
 2: SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' )    -- 指定数据库访问级别和指定目录名字

创建数据库时设置非事务性访问级别

 1: CREATE DATABASE Archive
 2: WITH FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'MyDirectory' )-- 指定数据库访问级别和指定目录名字

查看数据库访问级别

 1: SELECT DB_NAME(database_id), non_transacted_access, non_transacted_access_desc
 2: FROM sys.database_filestream_options;
 3: GO

 

FileTable

FileTable 是用户表,具有预定义的结构,为了存储 FILESTREAM 数据、文件和目录信息以及文件属性。因此,创建 FileTable 时不需要指定列,但也可以指定,在此我只用最简单的方式创建和使用FileTable。

不指定用户定义值

 1: CREATE TABLE DocumentStores AS FileTable;
 2: GO

指定用户定义值

 1: CREATE TABLE DocumentStores AS FileTable
 2: WITH
 3: (
 4:     FileTable_Directory = 'DocumentStores',
 5:     FileTable_Collate_Filename = database_default
 6: );
 7: GO

在没有指定用户定义值时,FILETABLE_DIRECTORY 的值将为 FileTable 的名称,FILETABLE_COLLATE_FILENAME 的值仍为database_default。

此时,就可以在数据库Archive的数据库 –> Tables –> FileTables,可以看到之前创建的FileTable表DocumentStores

在FileTable上右键 –> 浏览,可以直接复制文件到这个目录,图中我新建一个文本文档。

Browser

 

也可以使用语句进行查询

SelectData

FileTable注意

不能将现有表转换为FileTable。

必须完成上面的步骤启用FILESTREAM设置更改FILESTRAM设置

由于FileTable 包含一个 FILESTREAM 列,因此FileTable 需要有效的 FILESTREAM 文件组。

不能在tempdb或任何其他系统数据库中创建FileTable。

不能将FileTable作为临时表。

不能更改 FILETABLE_COLLATE_FILENAME 的值。

不能更改、删除或禁用 FileTable 系统定义的列。

不能将新的用户列、计算列或持久化计算列添加到 FileTable。

删除FileTable时,将删除 FileTable 的所有列以及与该表关联的所有对象,如索引、约束和触发器。

删除FileTable时,FileTable 目录及其子目录将从数据库的 FILESTREAM 文件和目录层次结构中消失。

[转载]阅读开发高手的代码 分享二则.NET开发框架的技巧 - James Li - 博客园

mikel阅读(834)

[转载]阅读开发高手的代码 分享二则.NET开发框架的技巧 – James Li – 博客园.

最近阅读了一套ERP开发框架的源代码,对开发框架的理解又深入一层,也为其将知识点运用的如此灵活而自叹不如。

郎 咸平教授说,国际金融炒家对国际金融知识的理解与运用程序,是不可想像的。1997年的亚洲金融危机,国际金融炒家对香港的攻击是卖空港币,但是最后却反 应到股票市场,惨败。同理,开发高手将系统的知识点,运用的相当灵活,你完全没有想过可以按这种方式做出程序,灵活简便,维护方便。

1  .NET组件自动重命名

在Windows Forms开发,经常遇到一件头疼的事情是一个Form界面有很多控件,而这些控件的名称(Name)很难维持命名统一。比如,开发规范里面说,要给所有 的Button命名为以btn开发。如果界面中有二个按钮,确定和取消,那么可以按照规范,为之命名为btnOK,btnCancel。再扩展到其它的控 件,都应该遵守这样的前缀命名法。

经过整理,形成下面的表格规范

控件 前缀 举例
Button btn btnOK
ListView lst lstProject
Label lbl lblUserName
Combox cmb cmbProjectType
TextBox txt txtUserId
CheckBox chk chkEnable
GridView grid gridProduct

当一个页面中有很多控件时,如何保证控件命名,还是这样的规范呢?

一种办法是有专门的代码检查,俗称Review,经常的花时间去改善代码,维护代码。从基本的命名上检查,修改,以符合规范。另一种方法就是我从高手的代码中学到的,解释如下。

当 你给一个按钮绑定资料库字段或是修改它的Label/Text/Caption属性时,加入设计时支持,用这个名字来替换无规律的命名。比如,拖一个按钮 Button控件到窗体中,它的名称是Button1, 这时修改它的Text=OK, 回车确认。这里我截获了控件的属性修改事件,于是修改控件Button1的名字为btnOK。数据绑定属性也是一样,截获绑定的数据成员的名称,再依据它 来修改控件的名称,比如下面的一段代码所示

private Foundation.WinUI.Misc.Label lblDbPassword;
private Foundation.WinUI.Editors.TextEditor txtDbUser;
private Foundation.WinUI.Misc.Label lblDbUser;
private Foundation.WinUI.Editors.TextEditor txtDbDatabase;
private Foundation.WinUI.Misc.Label lblDbDatabase;
private Foundation.WinUI.Editors.TextEditor txtDbServer;
private Foundation.WinUI.Misc.Label lblDbServer;
private Foundation.WinUI.Misc.GroupBox grpConnectionParameter1;
private Foundation.WinUI.Editors.Grid grid;

对这些控件的名称,我没有任何的修改,只是对它绑定数据属性,框架会自动根据数据源的属性名称,进行修改,所以看起来规范程度高,完全不需要人为的来执行规范。设想一下,当系统中的窗体很多,控件数量大的时候,这种智能的命名方法是多么的有效率,将代码规范贯彻到底。

这则技巧的实现方法是注册组件改变事件(ComponentChanged),如下面的代码所示

this.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService


2 .NET Remoting 服务器端对象自动化配置

先来看一下,基本的.NET Remoting是如何配置开发的。

先开发服务器对象,即是要暴露给客户端的对象

public class MyObject:MarshalByRefObject 
    { 
        public int Add(int a,int b) 
        { 
            return a+b; 
        } 
    }

服务器端把它激活,供客户端连接进来调用

[STAThread]
static void Main(string[] args)
 {
           RemotingConfiguration.Configure("RemoteServer.exe.config");
           Console.ReadLine();
 }

因为这样的代码很节省,所以还需要在配置文件中作出如下的配置

<configuration>
    <system.runtime.remoting>
        <application name="RemoteServer">
            <service>
                <wellknown type="RemoteObject.MyObject,RemoteObject" objectUri="RemoteObject.MyObject"
                    mode="Singleton" />
            </service>
            <channels>
                <channel ref="tcp" port="9999"/>
            </channels>
        </application>
    </system.runtime.remoting>
</configuration>

客户端代码,调用.NET Remoting服务

[STAThread]
static void Main(string[] args)
  {
          RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
           Console.WriteLine(app.Add(1,2));
           Console.ReadLine();
  }

同样,还是需要作出配置才能使上面的代码生效。

<configuration>
 <appSettings>
 <add key="ServiceURL" value="tcp://localhost:9999/RemoteObject.MyObject"/>
 </appSettings>
</configuration>

 

我提出问题,如果要增加一个服务器端对象MyObjectB,对上面的代码,需要修改几个地方?

增加代码(服务实现和服务接口的调用)是必须的部分,不可少,另外需要修改的地方:

1  服务器端的配置文件,增加服务接口

2  客户端的配置文件,增加对服务的引用

但是,开发高手给的答案是零修改,增加一个服务,对服务端或客户端不需要作出任何的修改。

如何做到这一点呢,著名的.NET通讯组件RemObjects ,它提供了一个通用的GUI工具,用于根据服务端的接口,生成客户端的代码,依照这一点思路。我们可以考虑做一个工具。增加一个服务器端对象后,为了让它 暴露出来可用,要修改的地方是两个配置文件,所以,我只需要当有新的服务器端对象要暴露出来时,运用这个GUI工具,自动完成二个配置文件的修改,即可达 到零修改。而且用工具的好处是不会出错,即方便又有效率。

我以为这两个思路确实不错,能让系统的可读性增强,又提高工作效率。

[转载]十款PHP开发框架对比 - Rayol - 博客园

mikel阅读(1163)

[转载]十款PHP开发框架对比 – Rayol – 博客园.

        PHP开发框架近来在PHP社区中成为讨论的热点,几乎每天都在推出新的框架。面对市面上超过四十种的开发框架,你很难判断究竟哪一款最适合你,尤其是在这些框架所提供的功能不尽相同的时候。 
  
 
  本文将引导你遍览十款最热门最流行的开发框架,并对它们作出横向比对。我会先列出一张所有框架的一览表,而后我们将对它们逐个简述。
 
   

  概览 
  以下你看到是这十款开发框架的一览表,列举了他们各自所提供的功能。 
  #1: 表示框架是否内建模型视图控制器。 
  #2: 表示框架是否无需修改即可支持多数据库。
 
  #3: 表示框架是否支持对象记录映射器,通常这是ActiveRecord的封装包。
 
  #4: 表示框架是否包含其它数据库对象,比如TableGateWay
 
  #5: 表示框架是否内建模板引擎。
 
  #6: 表示框架是否缓存对象或者其他缓存机制。
 
  #7: 表示框架是否内建校验或过滤组件。
 
  #8: 表示框架是否内建Ajax支持。
 
  #9: 表示框架是否内建用户验证模块。
 
  #10: 表示框架是否包含其他模块,例如RSS feed解析器、PDF模块或其他实用模块。   
 
  
 
  
Zend Framework 
  Zend Framework还相当新,尚处在beta阶段(译者注相对于作者写这篇文章之时),因此还有些功能有待完整(比方说用户验证模块),但它本身已经有不少功能了。尽管从对比表上来看它没占到什么便宜,可Zend Framework确确实实涵括了一些处理PDF文档、RSS源、在线服务(Amazon, Flickr, Yahoo)的模块,甚至更多。Zend Framework同时也包含了数个不同的数据库对象,极大地便捷了对数据库进行查询的实现,甚至免去你手写SQL查询脚本的麻烦。
 
  
 
  当前,Zend Framework并未完全支持ORM,但是开发人员仍然陷入在是否要添加ORM层的争论中。也许在将来会实现这些功能,你就可以编写自己的ORM封装包,投稿到社区,并有机会将之整合入框架的未来版本。
 
  
 
  Zend Framework看上去前途一片光明,而且它同时又修正了一些常见的PHP问题。也许稳定版本就可以在对比表里面表现得更出色了!
 
  
 
  
 
  
CakePHP
  CakePHP是一款高级的MVC框架,自带了不多的几个模块。它可以处理大多数的数据库事务,支持Ajax个数据验证。同时,它的用户验证模块(Accsee List)也非常独特,可以针对不同的用户在访问网站不同部分时分配对应的访问权限。
 
  
 
  尽管CakePHP网站看上去令人犯晕,但是框架本身已经比较完整可用了。截至成文尚未见稳定版本,实在令人感到有点意外,毕竟已经开发了好几个月了,不过我猜想也许用beta版本来开发产品也未尝不可吧(译者注: Risk you @ss baby!)
 
  
 
  
 
  
Symfony Project 
  从对比表中不难看出,Symfony是一款极具扩展性的开发框架,它甚至完整植入了一个叫做PropelORMPropel也是开源项目,并且迄今为止可能是PHP上最好的ORM解决方案。Symfony同时还整合了用于数据库抽象层的Creole和用于MVC模型层的Mojavi。由于它仅仅是重用了这些项目的源代码,而非重写,由此使得框架具备了极为强大的扩展性,这一点在表中昭然若是。
 
  
 
  Symfony有两个缺憾,以使它不支持PHP4,这是由于需要PHP5中很多新特性的支持的结果,二是相对来说它有点复杂了。大多数任务,比方像分页,在Symfony中的时限比其他框架要复杂得多,这决不是一款简洁著称的框架。
 
  
 
  
 
  
Seagull Framework 
  
 
  Seagull framework看上去相当不错,自带了很多特性。支持PHP4也对它的推广相当有利,我本人就仍在使用PHP4,况且大多数空间寄存商尚未全面支持PHP5
 
  
 
  不幸的是,Seagull没有提供对Ajax的支持,实在有点说不过去,不过通过Google可以毫不费力地搜索到一篇自己添加Ajax支持的教程,而且这点在将来应该会添加到框架中。
 
  
 
  
 
  
WACT – Web Application Toolkit 
  WACT很有潜力,框架的基件它一应俱全,像MVC、数据库对象和模板引擎,不过仅此而已。它没有任何外挂模块,同时也缺少一些内建的功能,例如Ajax、缓存、验证模块,等等。
 
  
 
  尽管如此,WACT还是拥有最好的模板引擎,甚至可以帮助你创建自己的模板标签来扩展功能。
 
  
 
  
 
  
Prado 
  Prado非常独特,它提供了一些很酷的特性。它没有内建对MVC的支持(就我看来),但是它确实拥有处理大多数PHP任务的各种各样的组件,更棒的是,它实现了事件驱动脚本。例如,在一个HTML按钮上设置onClick事件链接到一个PHP函数。这点近似ASP.NET,而Prado确实包含了更多的ASP.NET组件,像GridViewRepeater Control
 
  
 
  仅凭对比表上的数据,Prado看似要弱于其它框架,但事实并非如此。因为Prado如此独特,尽管它得分不高,但是在实际应用中它是非常强大的。
 
  
 
  
 
  
PHP on Trax 
  这个框架看上其简直就是Ruby and RailsPHP上的一个接口,它以前也确实叫做PHP on Rails。不幸的是,它的文档实在是太稀缺了,所以也很难判断这个框架究竟提供了些什么,但是文档中的确提到了ActiveRecord,所以它可能提供ActiveRecord,就像RoR。还有就是它内建了Ajax支持,从它网站上的两个演示视频中不难看出。
 
  
 
  PHP on Trax基本上能符合使用者对框架的要求,但是它还是缺胳膊少腿,比方像验证模块和缓存模块。它也没有任何外挂模块,是以目前来说,它很初级。
 
  
 
  
 
  
ZooP Framework 
  ZooP Framework可以说包罗万象,对比表上一目了然,差不多该支持的都支持了,除了ORM层。更意外惊喜的是它支持PHP4,这对于它提供的这么全面的功能来说实在是太不简单了,太棒了!
 
  
 
  ZooP还提供了内建的GUI控制,使得创建表单的工作变得异常快捷。它支持绝大多数的常用表单元素,在常规HTML里使用GUI控制的好处就是你可以将验证的逻辑操作和GUI控制紧密地结合在一起。
 
  
 
  
 
  
eZ Components 
  与其说ez Components是个框架,不如说是一个组件集,可能正是因为如此它并没有内建对MVC的支持。
 
  
 
  它包括了大多数常用组件,如数据库组件和缓存组件,可还是缺少点东西。比方说,没有ActiveRecord组件和验证组件。另一方面,它提供了一些外挂组件,比如e-mail组件,但是不多,其它框架(Zend Framework)提供的更多。
 
  
 
  
 
  
CodeIgniter  
  CodeIgniter相对来讲是个很新的框架,它的作者是ExpressionEngine的开发团队(译者注: PHP blog程序pMachine的升级换代产品,很可惜不是免费的),看上去很有潜质。不幸的是,它尚不能处理多数据库,尽管这项功能仍在开发中。
 
  
 
  它源于Ruby on Rails,所以它提供了很多的相同功能,比如scaffolding(代码自动生成)。它的文档编得相当棒,甚至还有视频教程帮助你快速上手。 

   
  
 
  获胜者是
… 
  
 
  在这里我不得不非常遗憾地宣布,无人胜出。每个框架所提供的功能特性不尽相同,因此无人完胜。一如往常,最后这将取决于个人偏好和选择。我极力推荐你在作出决定前先认真仔细地研读各个框架的文档,剩下就靠你自己判断了。
 
  
 
  就个人而言,我的确非常喜欢Zend Framework,但当我仔细研究了每个框架之后,我发现了很多有趣的功能,比方说Prado的事件,抑或SymfonyORM封装包。
 
  
 
  当你实在是无法决定选择哪个框架的时候,你仍可以选择像大多数人那样自己动手。虽然耗时费力,但是乐趣无穷。
 
    
 
  如开始所言,一部分框架已经有了长足的更新,而我最近比较倾向于symfony,它充实的文档令到上手非常方便,但是它的庞杂也令到开发小项目,甚至像我这样的个人迷你项目的过程有点得不偿失,也许CodeIgniter的简洁在这方面已经足够。

[转载]分享!20套惊艳的扁平化设计素材免费下载 - 梦想天空(山边小溪) - 博客园

mikel阅读(1682)

[转载]分享!20套惊艳的扁平化设计素材免费下载 – 梦想天空(山边小溪) – 博客园.

24 Flat Icons

Freen Flat UI Kit PSD

Flat UI Kit

Flat Radial Graph PSD

Flat UI

Free Colorful Icons

UI Kit Free Download

Flat Web Elements

Apple Devices Flat Icons PSD

Free Flat UI

Featherweight UI

Flatlyfe UI Kit Free PSD

Friends Iphone App UI

Minimal Apple Product Templates

3600+ Free Flat Icons

Browsers Glyphs

Flat Blog UI Kit

Flat File Icons

iPhone5 Flat Design

Mac,Ipad & Iphone Flat Illustration

[转载]分享个自己做的CSDN刷下载积分软件 - 第★一★次 - 博客园

mikel阅读(857)

[转载]分享个自己做的CSDN刷下载积分软件 – 第★一★次 – 博客园.

  对于评论里有人反映说,运行完后自动关机了,我要在这解释下,不好意思了亲们,由于昨晚开这个通宵刷积分,就加了个功能,刷完所有可刷积分后自动关机省点电。今天发布的时候忘记取消了。这里给大家带来不便请大家包含,已重新发布。我这这可以用人格担保绝对没有任何恶意代码。大家可以放心使用。

在CSDN上找到了个好东东,要10分,却苦恼没有积分啊!蛋疼。网上各种百度各种google一大堆却没有一个是能用的。

没办法,那就只能自己动手,丰衣足食了。原理很简单,暂不公布源码,有想要的可以联系我。

记得低调一定要低调,不要刷太多,只要自己够用了就好了。

下载地址

 

使用教程
comment.txt为评论列表,如需添加更多,直接在后面添加即可,一条一行。
打开软件看看就知道了。按照步骤去就OK了。
如软件运行不了(win7基本可以,xp可能会缺少组件支持),请去此处下载Microsoft .NET Framework v3.5
http://www.crsky.com/soft/21819.html
如发现有BUG请联系:zxyily38@163.com
如使用该软件造成的一切后果由使用者承担。本软件只为交流编程技术而写,请勿用于商业用途。

更新日志
2013-6-29
1.基本架构设计完毕

2013-6-30
1.修复了一个bug
2.修复多线程更新问题
3.完成编码

2013-7-1
1.修复已知bug,
2.更新了Cookie获取方式
3.更新了数据提交方式

2013-7-2

1.增加了刷完所有积分后自动关机功能

[转载]基于HttpModule的简单.NET网站授权方案 - .CPP - 博客园

mikel阅读(734)

[转载]基于HttpModule的简单.NET网站授权方案 – .CPP – 博客园.

摘要

    本文介绍一种入门级的网站授权(注:这里所指的授权指的是注册码效果,而不是网站登陆时的身份授权)方案,仅供学习交流及对付小白客户使用。复杂的网站授权涉及网站加密等一系列复杂的技术,不做本文介绍内容。(如果有好的开源的项目,还请各位大大们不吝赐教)

功能说明

    网站发布时,做一个授权处理是非常有必要的。可以有效防止客户直接把你发布的网站直接COPY到别的电脑上,经过简单的配置就直接可以运行。记得在学校做 网站时,当时对HTTP请求没研究过,直接在任何一个页面加载时强制验证。这样做出来的功能可移植性很差。于是,写下此文给新手一个指引。本方案可以灵活添加到你自己的ASP.NET站点中,只需要修改两个配置,不须要添加一句C#代码即可实现功能

方案原理

    授权的核心原理其实很简单:

  •         1、读取服务器机器的一个唯一编号(CPU、硬盘序列号、网卡MAC等);
  •         2、实现一个算法处理这个机器唯一编号,把处理的结果与序列号对比,如果相同则网站正常运行,如果不正常则强制跳转到授权页面;
  •         3、直接拦截HttpRequest,即添加一层自定义的HttpModule。这样无论客户打开的是哪个URL,都会被拦截从而进行强制验证;
  •         4、最后当然还要做一个注册机,不然要自己算注册码吗?当然,你可以把做成WEB版,WINFORM版,哪怕DOS版都无所谓;

具体实现

1、新建类库项目,名称LYB.NET.Authorize;添加以下两个引用

项目属性中的目标框架改为:.Net Framework 4.0 而不是默认的.Net Framework 4.0 client profile。也就是用的.NET的完整版,而不是精简版。

2、添加接口IAuthorize,该接口提供一个只读的UniqueID及验证注册码的方法。如下:

 

复制代码
    public interface IAuthorize { /// <summary>
        /// 服务器机器的唯一标识 /// </summary>
        string UniqueID { get; } /// <summary>
        /// 判断所给注册码是否正确 /// </summary>
        /// <param name="strKey">注册码</param>
        bool VerifyKey(string strKey); }
复制代码

3、添加一个MACAuthorize类,用MAC地址实现上面的接口(当然,你也可以自定义其它的类,用硬盘序列号等实现):

复制代码
 public class MACAuthorize : IAuthorize { private string _strId; public MACAuthorize() { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true) { _strId = mo["MacAddress"].ToString(); break; } } } public string UniqueID { get { return _strId; } } public bool VerifyKey(string strKey) { Algorithm alg = new Algorithm(); return (alg.GetKey(_strId) == strKey); } }
复制代码

4、在上面的MACAuthorize验证中,用于一个Algorithm类,这是一个生成注册码的算法类,这个类不但验证要用到,在我们制作注册机的时候,也要用到这个类。我们添加并实现它:

复制代码
 public class Algorithm { /// <summary>
        /// 这里的算法,我只是做了一下简单处理,你可以把整的很复杂,最好复杂到自己都看不懂 /// </summary>
        public string GetKey(string strUniqueId) { string strResult = strUniqueId.Replace(':', 'X'); byte[] resources = ASCIIEncoding.ASCII.GetBytes(strResult); for (int i = 0; i < resources.Length; i++ ) { if (resources[i] <= '9' && resources[i] >= '0') { resources[i] += 17; } } return ASCIIEncoding.ASCII.GetString(resources); } }
复制代码

5、最后,我们要自定义一个HttpModule来拦截http请求,并强制验证:

复制代码
 public class AuthorizeModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); } void context_BeginRequest(object sender, EventArgs e) { IAuthorize auth = new MACAuthorize(); HttpApplication application = (HttpApplication)sender; string strKey = ConfigurationManager.AppSettings["LYB.NET.AUTHORIZE"]; //好吧,我只是把注册码放在web.config中 if (auth.VerifyKey(strKey)) { return; } application.CompleteRequest(); application.Context.Response.Write("你使用的站点未经授权,请复制下面机器码以获取注册信息:<br> "
                + auth.UniqueID); } }
复制代码

6、做完上面这些,你就可以打包生成一个DLL了。把它添加到你的WEB站点引用中。修改两处WEB.CONFIG:

A、appSettings节点添加:(这是用来存储注册码的地方)

<add key="LYB.NET.AUTHORIZE" value=""/>

B、System.Web节点下面添加:(这是为了添加自定义的httpmodule)

    <httpModules>
      <add name="AuthorizeModule" type="LYB.NET.Authorize.AuthorizeModule,LYB.NET.Authorize"/>
    </httpModules>

7、这时运行你的网站,就可以出现类似下面的效果:

8、最后就是注册机的制作了,新建一个WINFORM工程(当然根据你的爱好,你可以建任何工程),界面如下(上面为form1,下面为form2):

添加对LYB.NET.Authorize.DLL的引用,然后在BUTTON中添加以下代码:

复制代码
private void button1_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(textBox1.Text)) { MessageBox.Show("请输入要授权的机器码"); return; } Algorithm alg = new Algorithm(); this.textBox2.Text = alg.GetKey(textBox1.Text); }
复制代码

运行一下,把刚刚你的站点上的机器码COPY过来,生成一个注册码吧!

最后,把你生成的注册码复制到web.config <add key=”LYB.NET.AUTHORIZE” value=””/>这个value中,即授权成功。你的网站即可正常运行。

总结

其实本方案主要是讨论了HttpModule的一种用法,在制作大型商用WEB框架时,该方法相对来说非常鸡肋。有兴趣的同学可以深入研究一下。

[转载]SQL Server 2014新特性:五个关键点带你了解Excel下的Data Explorer - 哥本哈士奇(aspnetx) - 博客园

mikel阅读(766)

[转载]SQL Server 2014新特性:五个关键点带你了解Excel下的Data Explorer – 哥本哈士奇(aspnetx) – 博客园.

Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛。

此文是在微软商业智能官方博客里找到的,我在这里不仅将其简单的翻译过来,同时也加入了一些个人的感悟和笔记,如果你对原文感兴趣可以点击下面的链接查看原文;

http://blogs.msdn.com/b/microsoft_business_intelligence1/archive/2013/05/15/5-things-you-need-to-know-about-microsoft-data-explorer-preview-for-excel.aspx

 

Data Explorer Preview for Excel提供了一种新的方式来为自助式的商业智能发现数据,整合数据以及提炼数据。如果你对它还比较陌生,那么如下五点将使你了解它如何提升你在Excel中处理数据的方法。

借助Data Explorer,你可以:

 

1. 发现数据

Data Explorer带来了在Excel中数据检索(不是简单的文档内搜艘)的概念。也就是说,你可以在Excel中来检索公共数据。在Excel中你可以获 取丰富的并且交互式的数据,当你找到你想要的数据之后,只需要简单的鼠标点击就可以把数据导入到你的Excel工作簿。

下面的截图正在Excel里检索关于”欧洲最大城市”的数据。

 

2. 广泛的数据源连接

Data Explorer支持很多种数据源的连接,包括简单的文本数据,以及比较复杂的Hadoop数据。

其中,文本型的数据包括:

•Text based sources (纯文本, CSV)

•XML

•Excel文件

•Access数据库

•Folders (把一个文件夹下的文件当作一个表来处理)

•对于网页数据源的支持包括:

•网页里的表

•Web APIs / JSON

•OData

关系引擎,包括:

SQL Server, Windows Azure SQL Database, SQL Server PDW

•Oracle

•Teradata

•DB2

•MySQL

•PostgreSQL

其它数据源,包括:

•Windows Azure Marketplace

•SharePoint Lists

•Active Directory

•Hadoop

•Windows Azure HDInsight

•Facebook

更多的数据源,官方团队后续还会加入进来,当然如果你想获得某个数据源的支持,也可以直接联系官方团队。

 

3. 从多个数据源合并数据

Data Explorer使不同数据源的数据整合变得更容易,下边的截图演示了OData feed中的产品表和来自文本文件的供应商数据表的整合。

 

4. 更高效对数据进行整理和转换

在Data Explorer中,整理数据以及根据现有数据派生新数据是很容易的事。这一切通过简单的拆选和排序操作就可以实现,以及更复杂的操作,比如反透视,都可以通过几步简单的点击操作来实现。

通过UI操走就可以实现大多数的转换,同样也可以使用Data Explorer语言来充分利用Data Explorer的强大功能以及表现力。

下面的截图是通过UI操作表中的菜单来实现数据转换。下面的公示栏方便你对公式的引用,以及编写自定义的表达式。

 

5. 在任何时间刷新数据

Data Explorer查询是非常简单的表达式,通过简单的几个步骤你就可以在界面上从数据源导入数据并且对数据进行整理。这也就是说这些查询可以根据需要实时刷新。在查询面板上有一个链接,通过它你可以使你的工作簿里的数据更新到最新。

大家都来关注下Data Explorer吧,我也同样认为,你会喜欢它的。如果你有任何问题以及反馈,除了在此篇下面留言之外,也可以浏览Data Explorer论坛:

http://social.msdn.microsoft.com/Forums/windowsazure/en-US/home?forum=dataexplorer

 

译者写在后面的话:

Data Explorer作为SQL Server 2014的新特性之一发布,它是Excel里的一个功能。借助这个功能,对数据的采集以及整合将不再是IT人员的专利。在传统商业智能项目中,数据的建 模,数据的ETL,都需要专业工具的支持,然而,现在通过SQL Server 2014的这个对Excel的新功能,业务人员通过熟悉的Excel工具,通过界面的简单操作,就可以实现自服务式的商业智能。降低大量需求对IT的依 赖,将大大缩短数据的处理周期。同时,借助PowerPivot, PowerView等功能,完全的贯穿了商业智能自助式的从顶端到底端。从微软发布的一系列新产品以及特性我们可以看到,未来的商业智能将更加灵活和高 效。

 

[转载]C#对图片文件的压缩、裁剪操作初探 - xiaoyang_ - 博客园

mikel阅读(663)

[转载]C#对图片文件的压缩、裁剪操作初探 – xiaoyang_ – 博客园.

在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便。毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意。

于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小、尺寸的目标图片。

进入正题–>

先说图片压缩

第一步:需要读取一个图片文件,读取方法:

// <param name="ImageFilePathAndName">图片文件的全路径名称</param>
public Image ResourceImage =Image.FromFile(ImageFilePathAndName);

说明:

Image类:引用自System.Drawing,为源自 BitmapMetafile 的类提供功能的抽象基类。

主要属性:Size->获取此图像的以像素为单位的宽度和高度。

       PhysicalDimension->获取此图像的宽度和高度(如果该图像是位图,以像素为单位返回宽度和高度。如果该图像是图元文件,则以   0.01 毫米为单位返回宽度和高度。)。

     PixelFormat->获取此 Image 的像素格式。

     Height Width->获取此 Image 的高度、宽度(以像素为单位)。

主要方法:FromFile(String)->从指定的文件创建 Image

     FromStream(Stream)->从指定的数据流创建 Image

Save(String fileName)->将该 Image 保存到指定的文件或流。

       Save(Stream, ImageFormat)->将此图像以指定的格式保存到指定的流中。

Save(String, ImageFormat)->将此 Image 以指定格式保存到指定文件。

更多属性和方法说明请点击

第二步,生成缩略图,并且将原图内容按指定大小绘制到目标图片。

///

&nbsp;

<summary> /// 生成缩略图重载方法1,返回缩略图的Image对象
/// </summary>

&nbsp;

&nbsp;

///缩略图的宽度 ///缩略图的高度 /// 缩略图的Image对象
public Image GetReducedImage(int Width, int Height)
{
try
{
//用指定的大小和格式初始化Bitmap类的新实例
Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);
//从指定的Image对象创建新Graphics对象
Graphics graphics = Graphics.FromImage(bitmap);
//清除整个绘图面并以透明背景色填充
graphics.Clear(Color.Transparent);
//在指定位置并且按指定大小绘制原图片对象
graphics.DrawImage(ResourceImage, new Rectangle(0, 0, Width, Height));
return bitmap;
}
catch (Exception e)
{
ErrMessage = e.Message;
return null;
}
}

说明: 1、Bitmap类

引用自System.Drawing,封装 GDI+ 位图,此位图由图形图像及其特性的像素数据组成。Bitmap 是用于处理由像素数据定义的图像的对象。

(封装图像的对象),详细介绍请点此

2、Graphics类

引用自System.Drawing处理图像的对象),封装一个 GDI+ 绘图图面。

详情请点此

第三步,保存

第二步操作中返回的Image对象,暂时命名为:iImage:

iImage.Save(pathAndName, System.Drawing.Imaging.ImageFormat.Jpeg);

以上是压缩操作,做了下试验,101k的图片,经过压缩后是57k。这个应该和尺寸有关系。

以下是图片裁剪,其实原理和上面相似,无非也就是对图片进行重画操作。

///

<summary> /// 截取图片方法
/// </summary>

&nbsp;

///图片地址 ///开始位置-X ///开始位置-Y ///截取宽度 ///截取长度 ///文件名称 ///保存路径 ///后缀名 public static string CutImage(string url, int beginX, int beginY, int getX, int getY, string fileName, string savePath, string fileExt)
{
if ((beginX &lt; getX) &amp;&amp; (beginY &lt; getY))
{
Bitmap bitmap = new Bitmap(url);//原图
if (((beginX + getX) {
Bitmap destBitmap = new Bitmap(getX, getY);//目标图
Rectangle destRect = new Rectangle(0, 0, getX, getY);//矩形容器
Rectangle srcRect = new Rectangle(beginX, beginY, getX, getY);

Graphics.FromImage(destBitmap);
Graphics.DrawImage(bitmap, destRect, srcRect, GraphicsUnit.Pixel);

ImageFormat format = ImageFormat.Png;
switch (fileExt.ToLower())
{
case "png":
format = ImageFormat.Png;
break;
case "bmp":
format = ImageFormat.Bmp;
break;
case "gif":
format = ImageFormat.Gif;
break;
}
destBitmap.Save(savePath + "//" + fileName , format);
return savePath + "\\" + "*" + fileName.Split('.')[0] + "." + fileExt;
}
else
{
return "截取范围超出图片范围";
}
}
else
{
return "请确认(beginX &lt; getX)&amp;&amp;(beginY &lt; getY)";
}
}

说明:
Rectangle类:矩形,详情请点此
以上是裁剪一个图片文件的示例代码。

本文所使用代码,是项目中真实代码,已经过测试。

希望和大家交流共同学习。

[转载]OpenCV中的神器Image Watch - 阳光守望者 - 博客园

mikel阅读(936)

[转载]OpenCV中的神器Image Watch – 阳光守望者 – 博客园.

Image Watch是在VS2012上使用的一款OpenCV工具,能够实时显示图像和矩阵Mat的内容,跟Matlab很像,方便程序调试,相当好用。跟VS2012配合使用,简直就是一款神器!让我一下就爱上它了!

第一次看到Image Watch是今年3、4月份的时候,当时是在微博上看到新闻,点击链接的下载页面一直出问题,后面就忘了这事,昨天碰巧在OpenCV主页看到OpenCV2.4.5的Change Logs里面有链接,点进能下载果断试用下啊!

闲话少说,先看看部分相关链接。

1、Image Watch 的下载链接

2、OpenCV关于Image Watch的介绍页面链接

3、OpenCV2.4.5在线文档关于Image Watch的介绍文档

4、更详细的信息参见Image Watch的官方网站

直接上图,有个直观印象。

 

下面利用一个实际的例子,来说明下Image Watch。

利用二维SURF特征和单映射寻找已知物体。输入两幅图像,一幅是需要寻找的物体图像,另一幅是场景中包含此物体的图像。

SURF特征的特征描述方法封装在SurfFeatureDetector类中,利用成员函数detect函数检测出SURF特征的关键点,保存在 vector容器中,再利用SurfDesciptorExtractor类进行特征向量的计算,将之前的vector变量变成矩阵形式保存在Mat中。

利用FLANN特征匹配算法进行匹配,此算法封装在FlannBaseMatcher类中,匹配后保留好的特征匹配点。利用findHomography获取匹配特征点之间的变换,最后利用perspectiveTransform定位到场景图中物体的4个点。

代码如下:

#include
#include
#include
#include
#include
#include
#include

using namespace cv;

void usage()
{
std::cout &lt;&lt; "Usage: ./FindObjectByFeature " &lt;&lt; std::endl;
}

int main(int argc, char *argv[])
{
if(argc != 3)
{
usage();
return -1;
}

Mat img_object = imread(argv[1], CV_LOAD_IMAGE_COLOR);
Mat img_scene = imread(argv[2], CV_LOAD_IMAGE_COLOR);

if(!img_object.data || !img_scene.data)
{
std::cout &lt;&lt; "Error reading images!" &lt;&lt; std::endl;
return -1;
}

//step1:检测SURF特征点/////////////////////////////////////////////////////////////////
int minHeassian = 400;
SurfFeatureDetector detector(minHeassian);

std::vectorkeypoints_object, keypoints_scene;

detector.detect(img_object, keypoints_object);
detector.detect(img_scene, keypoints_scene);

//step2:计算特征向量///////////////////////////////////////////////////////////////////
SurfDescriptorExtractor extractor;

Mat descriptors_object, descriptors_scene;

extractor.compute(img_object, keypoints_object, descriptors_object);
extractor.compute(img_scene, keypoints_scene, descriptors_scene);

//step3:利用FLANN匹配算法匹配特征描述向量//////////////////////////////////////////////
FlannBasedMatcher matcher;
std::vector matches;
matcher.match( descriptors_object, descriptors_scene, matches);

double max_dist = 0; double min_dist = 100;

//快速计算特征点之间的最大和最小距离///////////////////////////////////////////////////
for(int i = 0; i &lt; descriptors_object.rows; i++)
{
double dist = matches[i].distance;
if(dist &lt; min_dist) min_dist = dist; if(dist &gt; max_dist) max_dist = dist;
}

printf("---Max dist: %f \n", max_dist);
printf("---Min dist: %f \n", min_dist);

//只画出好的匹配点(匹配特征点之间距离小于3*min_dist)//////////////////////////////////
std::vector good_matches;

for(int i = 0; i &lt; descriptors_object.rows; i++)
{
if(matches[i].distance &lt; 3*min_dist)
good_matches.push_back(matches[i]);
}

Mat img_matches;
drawMatches(img_object, keypoints_object, img_scene, keypoints_scene,
good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

//定位物体////////////////////////////////////////////////////////////////////////////
std::vector obj;
std::vector scene;

for(int i = 0; i &lt; good_matches.size(); i++)
{
//从好的匹配中获取特征点/////////////////////////////////////
obj.push_back(keypoints_object[good_matches[i].queryIdx].pt);
scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);
}

//找出匹配特征点之间的变换///////////////////
Mat H = findHomography(obj, scene, CV_RANSAC);

//得到image_1的角点(需要寻找的物体)//////////
std::vector obj_corners(4);
obj_corners[0] = cvPoint(0,0);
obj_corners[1] = cvPoint(img_object.cols, 0);
obj_corners[2] = cvPoint(img_object.cols, img_object.rows);
obj_corners[3] = cvPoint(0, img_object.rows);
std::vector scene_corners(4);

//匹配四个角点/////////////////////////////////////
perspectiveTransform(obj_corners, scene_corners, H);

//画出匹配的物体///////////////////////////////////////////////////////////////////////
line(img_matches, scene_corners[0] + Point2f(img_object.cols, 0), scene_corners[1] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4);
line(img_matches, scene_corners[1] + Point2f(img_object.cols, 0), scene_corners[2] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4);
line(img_matches, scene_corners[2] + Point2f(img_object.cols, 0), scene_corners[3] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4);
line(img_matches, scene_corners[3] + Point2f(img_object.cols, 0), scene_corners[0] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4);

imshow("Good Matches &amp; Object detection", img_matches);

waitKey(0);
return 0;
}

匹配结果图如下(下图中左边子图为待寻找的物体图像,右边子图场景中寻找到的物体图像):

Debug模式下,如果我们在程序某处设置调试断点,当程序运行到断点处时,可以在Image Watch窗口(View->Other Windows->Image Watch)查看已经分配内存的Mat图像。

还在将鼠标放置在所选图像上进行放大,最大能放大到像素级别。如下图所示:

在这个例子中,再稍微多说一点编译工程时我遇到的问题。

1、如果用的是OpenCV2.4以后版本,在程序include中包含:#include <opencv2/features2d/features2d.hpp>,可能会出现SurfFeatureDetector无法解析的情况。

这是因为OpenCV2.4后,SurfFeatureDetector类移到了opencv2/nonfree/features2d.hpp, 而不是opencv2/features2d/features2d.hpp。因此需要把#include<opencv2/features2d /features2d.hpp>改为

#include <opencv2/nonfree/features2d.hpp>,另外还需要把opencv_nonfree245d.lib库文件链接进去。

2、另外,对于工程中有两个以上OpenCV版本的情况,加入#include <opencv2/nonfree/features2d.hpp>后编译又可能出现重定义的情况。开始我一直没搞清楚原因,后来在stackoverflow查了下。原因如下

复制代码
Your compiler and editor are confused by the two OpenCV versions installed on your system. First, make sure that all the settings ( include paths in Visual Studio, lib path in Visual studio linker settings and bin path -probably an environment variable) point to the same version. Next, make sure to include all the needed headers. In OpenCV 2.4 and above, SURF and SIFT have been moved to nonfree module, so you also have to install it. Do not forget that some functions may be moved to legacy. And if you uninstall one version of OpenCV, the editor (which doesn't have all the parsing capabilities of the compiler) will not be confused anymore.
复制代码

也就是说如果VS中安装了两个以上的OpenCV版本,VS可能会搞混,把include的地址解析到了两个不同OpenCV目录下的头文件,因此引起重定义。

于是在VS中把include目录下的OpenCV2.3.1的头文件地址删除,问题解决。

看来程序员真的应该多上下stackoverflow,能学到很多知识。