2014年6月30日星期一

【iOS】在页面中展示gif动图 - EverNight

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【iOS】在页面中展示gif动图 - EverNight  阅读原文»

1 - (void)viewDidLoad
2 {
3 [super viewDidLoad];
4 // Do any additional setup after loading the view.
5
6 //1:使用第三方库
7 NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"moe" ofType:@"gif"]];
8 GifView *dataView = [[GifView alloc] initWithFrame:CGRectMake(50, 30, 100, 100) data:data];
9 [self.view addSubview:dataView];
10
11 // 或者
12 GifView *pathView =[[GifView alloc] initWithFrame:CGRectMake(170, 30, 100, 100) filePath:[[NSBundle mainBundle] pathForResource:@"moe" ofType:@"gif"]];
13 [self.view addSubview:pathView];
14
15 //2:使用webview
16 NSString *path = [[NSBundle mainBundle] pathForResource:@"moe" ofType:@"gif"];
17 NSData *gifData = [NSData dataWithContentsOfFile:path];
18 UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(110, 150, 100, 100)];
19 webView.backgroundColor = ;
20 webView.scalesPageToFit = YES;
21 [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
22 [self.view addSubview:webView];
23 }

第三方库代码

//
// GifView.h
// GifDemo
//

#import <UIKit/UIKit.h>
#import <ImageIO/ImageIO.h>

@interface GifView : UIView
{
CGImageSourceRef gif;
NSDictionary
*gifProperties;
size_t index;
size_t count;
NSTimer
*timer;
}

- (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath;
- (id)initWithFrame:(CGRect)frame data:(NSData *)_data;

@end
//
// GifView.m
// GifDemo
//

#import "GifView.h"
#import <QuartzCore/QuartzCore.h>

@implementation GifView


- (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath
{
self
= [super initWithFrame:frame];
if (self) {
gifProperties
= [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]forKey:(NSString *)kCGImagePropertyGIFDictionary];
gif
= CGImageSourceCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:_filePath], (__bridge CFDictionaryRef)gifProperties);
count
=CGImageSourceGetCount(gif);
timer
= [NSTimer scheduledTimerWithTimeInterval:0.12 target:self selector:@selector(play) userInfo:nil repeats:YES];
[timer fire];
}
return self;
}

- (id)initWithFrame:(CGRect)frame data:(NSData *)_data
{
self
= [super initWithFrame:frame];
if (self) {
gifProperties
= [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]forKey:(NSString *)kCGImagePropertyGIFDictionary];
gif
= CGImageSourceCreateWithData((__bridge CFDataRef)_data, (__bridge CFDictionaryRef)gifProperties);
count
=CGImageSourceGetCount(gif);
timer
= [NSTimer scheduledTimerWithTimeInterval:0.12 target:self selector:@selector(play) userInfo:nil repeats:YES];
[timer fire];
}
return self;
}

-(void)play
{
index
++;
index
= index%count;
CGImageRef
ref = CGImageSourceCreateImageAtIndex(gif, index, (__bridge CFDictionaryRef)gifProperties);
self.layer.contents
= (__bridge id)ref;
CFRelease(
ref);
}

-(void)removeFromSuperview
{
NSLog(
@"removeFromSuperview");
[timer invalidate];
timer
= nil;
[super removeFromSuperview];
}

- (void)dealloc
{
NSLog(
@"dealloc");
CFRelease(gif);
}

/*Silverlight 5 系列学习之一 - 浩凡儿  阅读原文»

最近公司要用Silverlight 开发并且使用了5 ,以前只学过WPF 没看过Silverlight ,不过在争光中国看了看其概念原来如此。它只不过是轻量级的WPF,且目标在于跨浏览器及平台。费话少说还是从建项目开始学习吧------------------只是记录下自己个人的学习笔记而已。

一:建立SilverLight项目如下:

Effective Tips 1 - 考虑用静态工厂方法代替构造器

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Effective Tips 1 - 考虑用静态工厂方法代替构造器  阅读原文»

我们有两种常见的方法获得一个类的实例。

・公有的构造器

・提供静态工厂方法(static factory method)

这一篇主要说明静态工厂方法相对于公有构造器的优劣。

相对公有的构造器,静态工厂方法有以下几大优势。

优势1.静态工厂方法的名称,因此比构造器更准确地描述返回的实例。

比如BigInteger.probablePrime方法:

publicstaticBigIntegerprobablePrime(intbitLength,Randomrnd){
if(bitLength<2)
thrownewArithmeticException("bitLength<2");
//Thecutoffof95waschosenempiricallyforbestperformance
return(bitLength<SMALL_PRIME_THRESHOLD?
smallPrime(bitLength,DEFAULT_PRIME_CERTAINTY,rnd):
largePrime(bitLength,DEFAULT_PRIME_CERTAINTY,rnd));

顺便也贴出其调用的largePrime方法:

staticBigIntegerlargePrime(intbitLength,intcertainty,Randomrnd){
p=newBigInteger(bitLength,rnd).setBit(bitLength-1);
p.mag[p.mag.length-1]&=0xfffffffe;
//Useasievelengthlikelytocontainthenextprimenumber
intsearchLen=(bitLength/20)*64;
BitSievesearchSieve=newBitSieve(p,searchLen);
BigIntegercandidate=searchSieve.retrieve(p,certainty,rnd);
while((candidate==null)||(candidate.bitLength()!=bitLength)){
p=p.add(BigInteger.valueOf(2*searchLen));
if(p.bitLength()!=bitLength)
p=newBigInteger(bitLength,rnd).setBit(bitLength-1);
p.mag[p.mag.length-1]&=0xfffffffe;
searchSieve=newBitSieve(p,searchLen);
candidate=searchSieve.retrieve(p,certainty,rnd);
returncandidate;

虽然smallPrime和largePrime最后都是通过公有构造器返回实例。

但是如果仅仅用构造器重载表达这个实例的特征,这很难让人记住什么时候应该调用什么构造器。

而提供一个名称去描述实例更为直观。

优势2.静态工厂方法不必每次都创建一个新的对象,我们可以对实例进行控制。

这样我们就能将创建好的实例缓存起来重复利用,尤其是在创建对象的代价较高的情况下。

比如Boolean.valueOf:

publicstaticfinalBooleanTRUE=newBoolean(true);
publicstaticfinalBooleanFALSE=newBoolean(false);
publicstaticBooleanvalueOf(booleanb){
return(b?TRUE:FALSE);

优势3.静态工厂方法可以返回原返回类型的子类型对象。

这一点能体现静态工厂方法的灵活性,

以EnumSet为例(秦小波老师的<改善Java程序的151个建议>一书中也提到了这一点,即建议枚举项不要超过64个):

*Createsanemptyenumsetwiththespecifiedelementtype.
*@paramelementTypetheclassobjectoftheelementtypeforthisenum
*@throwsNullPointerExceptionif<tt>elementType</tt>isnull
publicstatic<EextendsEnum<E>>EnumSet<E>noneOf(Class<E>elementType){
Enum[]universe=getUniverse(elementType);
if(universe==null)
thrownewClassCastException(elementType+"notanenum");
if(universe.length<=64)
return
Exchange2013中POP3和IMAP4  阅读原文»

每日博报 精彩不止一点关闭
Exchange2013中POP3和IMAP4

Exchange2013如同以前一样,安装完后系统就已经启动了所有用户对activesync, owa, pop, imap, mapi协议的支持。由于系统并没有设置pop3和imap4服务为自动启动。所以用户无法通过pop或imap收发邮件。

如果要启用Exchange的POP3和IMAP4功能,首先我们需要做的就是启动pop3和imap4服务,并对他们进行配置。

由于架构不同,Exchange2013中POP和IMAP4分别有两个服务,前端和后端,即 Microsoft Exchange POP3 服务、Microsoft Exchange POP3 Backend 服务、Microsoft Exchange IMAP4 服务以及 Microsoft Exchange IMAP4 Backend 服务。

Microsoft Exchange POP3、IMAP4 服务在运行客户端访问服务器角色的 Exchange 2013 计算机上运行。Microsoft Exchange POP3、IMAP4 Backend 服务在运行邮箱服务器角色的 Exchange 2013 计算机上运行。

1、启动pop3和imap4服务

在运行客户端访问服务器角色的 Exchange 2013 计算机上,

打开"服务器管理器"―"工具"―"服务"找到"Microsoft Exchange POP3" 和"Microsoft Exchange IMAP4"两个服务,设置其"属性"为"自动",然后"启动"。

在运行邮箱服务器角色的 Exchange 2013 计算机上运行。

打开"服务器管理器"―"工具"―"服务"找到"Microsoft Exchange POP3 Backend" 和"Microsoft Exchange IMAP4 Backend"两个服务,设置其"属性"为"自动",然后"启动"。

由于我们是一台Exchange2013,所以POP3和IMAP4服务都在一起

clip_image002

2、配置pop3和imap4安全登录方式

在 EAC 中,导航到"服务器"―"服务器",在服务器列表中,选择客户端访问服务器,然后单击"编辑"clip_image003

在服务器属性页面上,单击"POP3"选项卡和"IMAP4"选项卡

POP3和IMAP4默认使用【安全的TLS连接】,端口为TCP的995(pop3)和993(imap4),客户端和服务器之间的连接使用加密方式,建议保持默认。

clip_image005

clip_image007

在服务器属性页面的"POP3"和"IMAP4"属性也中向下滚动并单击"更多选项",可以设置pop3和imap4的连接限制

clip_image009

clip_image011

POP3和IMAP4的登陆方法

基本身份验证(纯文本): 端口110(pop3)、143(imap4)

如果要以明文形式发送用户名和密码,请选择此选项。使用此选项可以在没有 TLS 或 SSL 连接的情况下将用户名和密码发送到服务器。

集成 Windows 身份验证(纯文本):

如果要在没有 TLS 或 SSL 连接的情况下使用集成 Windows 身份验证,请选择此选项。

安全TLS登录: 端口995(pop3)、993(imap4)

如果需要 TLS 或 SSL 连接,请选择此选项。

clip_image013

更改设置后单击"保存",并重启POP3和IMAP4服务,以使设置生效。

3、允许 Outlook Web App 中的最终用户查看 POP3、IMAP4 和 SMTP 服务器设置

设置完pop3和imap4功能后,用户需要知道正确的服务器设置,才能使用 POP3 或 IMAP4 连接到其 Microsoft Exchange Server 2013 邮箱。 默认设置中Exchange 2013用户无法查找自己的传入 POP3 或 IMAP4 服务器设置或者传出 SMTP 服务器设置。 我们需要通过EMS配置 Exchange属性,使用户可以登录到OWA来查找自己的设置,以配置Outlook及其他客户端连接。

在EMS中设置POP3和IMAP4传入属性

Set-PopSettings -ExternalConnectionSettings {<server FQDN>:995:SSL}

阅读更多内容

2014年6月29日星期日

百度 flash html5自切换 多文件异步上传控件webuploader基本用法 - eflay

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
百度 flash html5自切换 多文件异步上传控件webuploader基本用法 - eflay  阅读原文»

双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核:

若页面需默认用极速核,增加标签:<meta name="renderer" content="webkit">
若页面需默认用ie兼容内核,增加标签:<meta name="renderer" content="ie-comp">
若页面需默认用ie标准内核,增加标签:<meta name="renderer" content="ie-stand">

要解决302问题也很简单,就是html5的文件上传,正好最近在ueditor里看到百度的webuploader,会自动选择flash html5,就是一个成熟的解决方案了。

先看前端,我们将最常用的操作封装为插件,asp.net中和MVC中最好使用相对于应用程序的绝对路径,自行定义全局applicationPath :var applicationPath = "@(Href("~")=="/"?"":Href("~"))";

前端代码:

(function ($, applicationPath) {
var applicationPath = applicationPath === "" ? "" : applicationPath || "../..";
function initWebUpload(item, options) {
var defaults = {
hiddenInputId: "uploadifyHiddenInputId", // input hidden id
onAllComplete: function (event) { }, // 当所有file都上传后执行的回调函数
onComplete: function (event) { },// 每上传一个file的回调函数
innerOptions: {},
fileNumLimit: undefined,
fileSizeLimit: undefined,
fileSingleSizeLimit: undefined
};

var opts = $.extend({}, defaults, options);

var target = $(item);
var pickerid = guidGenerator().replace(/-/g, "");
var uploaderStrdiv = '<div class="webuploader">' +
'<div id="thelist" class="uploader-list"></div>' +
'<div class="btns">' +
'<div id="' + pickerid + '">选择文件</div>' +
//'<a id="ctlBtn" class="btn btn-default">开始上传</a>' +
'</div>' +
'</div>';
target.append(uploaderStrdiv);

var $list = target.find('#thelist'),
$btn = target.find('#ctlBtn'),
state = 'pending',
uploader;

var jsonData = {
fileList: []
};

var webuploaderoptions = $.extend({

// swf文件路径
swf: applicationPath + '/Scripts/lib/webuploader/Uploader.swf',

// 文件接收服务端。
server: applicationPath + '/MvcPages/WebUploader/Process',

// 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick: '#' + pickerid,

// 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
resize: false,
fileNumLimit: opts.fileNumLimit,
fileSizeLimit: opts.fileSizeLimit,
fileSingleSizeLimit: opts.fileSingleSizeLimit
},
opts.innerOptions);
var uploader = WebUploader.create(webuploaderoptions);

uploader.on('fileQueued', function (file) {
var $list = $("#thelist");
$list.append('<div id="' + file.id + '" class="item">' +
'<div class="info">' + file.name + '</div>' +
'<div class="state">等待上传...</div>' +
'<div class="del"></div>' +
'</div>');
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress .bar');

// 避免重复创建
if (!$percent.length) {
$percent = $('<span class="progress">' +
'<span class="percentage"><span class="text"></span>' +
'<span class="bar" role="progressbar" style="width: 0%">' +
'</span></span>' +
'</span>').appendTo($li).find('.bar');
}

$li.find('div.state').text('上传中');
//$li.find(".text").text(percentage * 100 + '%');
$percent.css('width', percentage * 100 + '%');
});
uploader.on('uploadSuccess', function (file, response) {
$('#' + file.id).find('div.state').text('已上传');
var fileEvent = {
queueId: file.id,
name: file.name,
size: file.size,
type: file.type,
filePath: response.filePath
};
jsonData.fileList.push(fileEvent)
opts.onComplete(fileEvent);

});

uploader.on('uploadError', function (file) {
$('#' + file.id).find('div.state').text('上传出错');
});

uploader.on('uploadComplete', function (file) {
$('#' + file.id).find('.progress').fadeOut();
var fp = $("#" + opts.hiddenInputId);
fp.val(JSON.stringify(jsonData));
opts.onAllComplete(jsonData.fileList);
});

uploader.on('fileQueued', function (file) {
uploader.upload();
});

uploader.on('filesQueued', function (file) {
uploader.upload();
});

uploader.on('all', function (type) {
if (type === 'startUpload') {
state = 'uploading';
} else if (type === 'stopUpload') {
state = 'paused';
} else if (type === 'uploadFinished') {
state = 'done';
}

if (state === 'uploading') {
$btn.text('暂停上传');
} else {
$btn.text('开始上传');
}
});

$btn.on('click', function () {
if (state === 'uploading') {
uploader.stop();
} else {
uploader.upload();
}
});
//删除
$list.on("click", ".del", function () {
var $ele = $(this);
var id = $ele.parent().attr("id");
var deletefile = {};
$.each(jsonData.fileList, function (index, item) {
if (item && item.queueId === id) {
deletefile = jsonData.fileList.splice(index, 1)[0];
$("#" + opts.hiddenInputId).val(JSON.stringify(jsonData));
$.post(/*自己发送处理删除指令*/, function (returndata) {
$ele.parent().remove();
});
return;
}
});
});

}


$.fn.powerWebUpload = function (options) {

var ele = this;
$.lazyload(applicationPath + "/Scripts/lib/webuploader/webuploader.css", function () { }, 'css');
$.lazyLoad(applicationPath + "/Scripts/lib/webuploader/webuploader.min.js", function () {
initWebUpload(ele, options);
});

}
})(jQuery, applicationPath);

  

MVC版后端文件接收,即便你是asp.net 引入mvc做ajax也是可以的:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FormDesigner
{
public class WebUploaderController : BaseController
{
public ActionResult Process(string id, string name, string type, string lastModifiedDate, int size)
{
string filePathName = string.Empty;
string urlPath = "../../App_Upload/Document";
string localPath = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Upload\\Document");
if (Request.Files.Count == 0)
{
return Json(new { jsonrpc = 2.0, error = new { code = 102, message = "保存失败" }, id = "id" });
}
try
{
filePathName = //自己在这里处理文件保存
}
catch (Exception)
{
return Json(new { jsonrpc = 2.0, error = new { code = 103, message = "保存失败" }, id = "id" });
}

return Json(new
{
jsonrpc = "2.0",
id = "id",
filePath = urlPath + "/" + filePathName
});
}
}
}

  

页面后台就自己处理hiddenfiled的内容了。


本文链接:百度 flash html5自切换 多文件异步上传控件webuploader基本用法,转载请注明。

SQL扫描并执行文件夹里的sql脚本 - 一杯晨光  阅读原文»

场景:项目数据库操作全部使用存储过程实现。每天都会有很多存储过程更新/增加,测试环境中存储过程更新遗漏有一定概率,也教麻烦!所以,需要一个工具将文件夹中所有存储过程执行一次。
当然,用c#写一个也很简单,而且功能强大。但是,我想尝试一下使用sql实现同样的功能,然后就发现了xp_cmdshell这个强大而又危险的东西!我实现的还只是扫面一个文件夹里的存储过程,这样如果存储过程被分放到几个文件夹,就需要执行几次,很不方便。如果有大神知道,怎么扫描子文件夹里的存储过程,请赐教!嘿嘿!平时比较懒,很多东西想记录下来,却没有去做,只能写下这样比较省时间的啦!USE [xxxxx]
GO
IF OBJECTPROPERTY(OBJECT_ID(N'ExecDirPro'), N'IsProcedure') = 1
DROP PROCEDURE dbo.ExecDirPro
GO
--------------------------------------------------------------------------------------------
-- Name:ExecDirPro
-- Purpose:传入目录,执行目录下所有sql脚本。
-- Location:Lottery
-- Excecution Example:EXEC dbo.ExecDirPro
-- Authorized to:
--
-- Author:
-- Create date:2014-6-26
-- Alter:
--------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[ExecDirPro]
@dirPath nvarchar(200)--注意路劲请以“\”结束,有中文时,前面加N。
AS
begin try
--开启xp_cmdshell,完成以后关闭。保持开启很危险
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
CREATE TABLE #T([filename] nvarchar(1024));

declare @path nvarchar(300)
set @path='dir '+@dirPath+' *.sql /b'

INSERT #T EXEC xp_cmdshell @path

DELETE #T WHERE [filename] IS NULL;

DECLARE @FILENAME NVARCHAR(1024);

DECLARE cur CURSOR FOR SELECT [filename] FROM #T;

OPEN cur;

DECLARE @sql NVARCHAR(1000);
FETCH NEXT FROM cur INTO @FILENAME;

WHILE @@FETCH_STATUS=0
BEGIN
SET @sql=N'sqlcmd -E -i '+@dirPath+@FILENAME;
EXEC xp_cmdshell @sql;
FETCH NEXT FROM cur INTO @FILENAME;
END
CLOSE cur;
DEALLOCATE cur;
--关闭xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
end try
BEGIN CATCH
--关闭xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
SELECT ERROR_NUMBER() AS ErrorNumber;
END CATCH;
GO利用xp_cmdshell扩展,调用执行系统shell脚本。没错,开启xp_cmdshell之后,可以执行shell脚本,可以干很多坏事!嘿嘿!如果你的数据库权限被人拿到,并且有开启xp_cmdshell的权限,这是极其危险的!xp_cmdshell一直开着不关,更是要不得的!请一定记住,完毕以后关闭xp_cmdshell!

  


本文链接:SQL扫描并执行文件夹里的sql脚本,转载请注明。

阅读更多内容

2014年6月27日星期五

RHCEˇ¤----ńˇRsync

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
RHCEˇ¤----�ˇRsync  阅读原文»

用户名:aaao 文章数:29 评论数:58
访问量:20484:566:624:3 注册日期:2012-04-11

RHCE系列之备份工具----镜像备份Rsync

我一哥们最近在搞备份,需要用到rsync。因此,鄙人就简单总结了下rsync,也就有了这篇博文,希望对51的博友们有所帮助!

RSYNC简介:

Rsync (remote sync)是一款开源、快速,多功能、可实现增量的本地或远程数据镜像同步备份优秀工具。它可通过LAN/WAN快速同步多台主机间的文件。Rsync本来是用以取代rcp的一个工具,它当前由Rsync.samba.org维护。Rsync使用所谓的"Rsync演算法"来使本地和远程主机之间的文件达到同步,该算法只传送两个文件中的不同部分,而不是每次都整份传送,因此速度相当快。

Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。此外,它在windows平台下也有相应的版本,比较知名的有cwRsync和Sync2NAS。

RSYNC的特性:

1、支持拷贝特殊文件如链接、设备等。

2、可以有排除制定文件或目录同步的功能,相当于打包命令tar。

3、可以做到保持原来文件或目录的权限、时间、软硬连接等所有属性均不改变。

4、可实现增量同步,既只同步发生变化的数据,因此数据传输效率很高。

5、可以使用rcp,rsh,ssh等方式配合传输文件,也可以通过直接的socket连接。

6、支持匿名的或认证的进程模式传输,方便进行数据备份及镜像

7、优化的流程,文件传输效率高

RSYNC工作模式:

Rsync有四种工作模式,具体如下:

1、列表模式

和ls -l相似,负责列出源的内容。不仅可以看本地还可以看远端。

2、shell模式,也称为本地模式

和cp相似,本地拷贝文件

3、远程shell模式,可以通过通过rcp,ssh等通道传输

和rcp相似,不过可以实现增量备份,并且能够通过安全的ssh方式进行数据传输。

4、服务器模式

在这种模式下,rsync守护进程在一台机器上永久运行,接收文件传输请求。可以把文件发送给守护进程,也可以向它请求文件。服务器模式非常适合创建中心备份服务器或项目存储库。

以上是对rsync做的一个简单介绍,下面来安装一下rsync,然后再详细介绍我们rsync的四种工作模式!

CentOS6.5x86_64位采用最小化安装,系统经过了基本优化
selinux为关闭状态,iptables为无限制模式

在安装之前,首先让我们看下系统上是否已经安装了rsync。

[root@rsync-server~]#rpm-qa|greprsync
rsync-3.0.6-9.el6_4.1.x86_64

如果出现如上的情况,说明我们的系统已经安装了rsync。如果没有出现,就说明没有安装。

如果系统没有安装,我们就需要自己安装了。安装rsync的方式一共有2种,一种是基于包管理器安装,比如rpm包之类,另外一种是基于源码安装。

1、基于包管理器安装

[root@rsync-server~]#yuminstallrsync-y

2、基于源码安装

a、安装缺少的gcc和库文件等

[root@rsync-server~]#yuminstall-ykernel-headersglibc-headersglibc-devellibgompgccgcc-c++

b、安装rsync

[root@rsync-server~]#wgethttp://rsync.samba.org/ftp/rsync/rsync-3.1.1.tar.gz
[root@rsync-server~]#tarzxvfrsync-3.1.1.tar.gz
[root@rsync-server~]#cdrsync-3.1.1
[root@rsync-serverrsync-3.1.1]#./configure--prefix=/usr/local/rsync[root@rsync-serverrsync-3.1.1]#make&&makeinstall

这样子rsync就安装完成了。

我们需要注意的是,源码安装的rsync默认是没有加入xinetd的,因此你会发现,在/etc/xinetd.d目录下找不到rsync文件。

下面,我就开始带着大家一起来了解下rsync的四种模式!

1、列表模式(listmode)

Rsync的列表模式,即等同于在实现 ls -l 的功能。我们可以通过分别执行rsync和ls命令来观察区别。

[root@rsync-server/]#rsync/rsync
drwxr-xr-x40962014/06/0400:45:06rsync
[root@rsync-server/]#rsync/rsync/
drwxr-xr-x40962014/06/0400:45:06..NET�×AOP  阅读原文»

每日博报 精彩不止一点关闭

用户名:jinyuan0829
文章数:42
评论数:1
访问量:8903
无忧币:738
博客积分:528
博客等级:3
注册日期:2014-04-26

.NET里简易实现AOP

.NET里简易实现AOP

在MVC的过滤器章节中对于过滤器的使用就是AOP的一个实现了吧,时常在工作学习中遇到AOP对于它的运用可以说是很熟练了,就是没想过如果自己来实现的话是怎么实现的,性子比较犟硬是没想明白,茶不思饭不想的,主要问题就是卡在了怎么能拦截用户调用,如果可以解决了这个问题AOP的实现也就引刃而解了,为此在网上看了一些文章解决了这个问题,在这里和大家分享一下。

AOP的作用就是横切关注点,然后将分离后的关注点已面的形式来呈现,这是概念性的说法,举个列子来说明吧。

比如说有个处理过程是计算提交订单中的货品总额,然后想在这个过程中执行之前记录一下数据或者是执行一些必要的操作。

比如说记录日志,然后是选择记录日志的方式,是选择存本地文件还是存库,又或者是选择了存本地文件后选择数据的存储介质(XML格式、文本格式、加密格式、序列化格式等等)。

这只是其中的一个点,比如说还有验证等等其它一些方面的关注点。

图1

图2

从图1、图2中我们就可以看出AOP的目的,就是将日志记录、验证、性能监测这些关注点从一个执行过程中分离了出来,让彼此不再有关系以及和计算总额的关系。在此可以把分离出来的关注点封装,已“面”的形式展现出来,这样的情况下也使得这些“面”可以在其它地方复用。

1拦截的基础实现

在前言中说到在.NET中实现AOP技术难点就是在拦截的那一块,看到一些大神的文章利用remoting中的管道技术来实现信息拦截,我们先来了解一下怎么利用remoting来实现拦截的。

图3

图3就是大概示意出了利用remoting拦截信息的一个示意图,很突兀的插了个图可能不太好理解,我们还是通过代码配合图文来粗浅的解说一下吧。

代码1-1

publicclassMyContextObject:ContextBoundObject
publicvoidWriterLine(stringmeg)
Console.WriteLine("这是方法执行中"+meg);

代码1-1中的MyContextObject类型继承自上下文绑定类ContextBoundObject对象,继承过后就表示MyContextObject类型需要强制绑定上下文意思就是说它需要在一个特性环境的上下文中,对于没有继承ContextBoundObject类型的类型被称之为灵活对象,它们的诞生是在默认的当前上下文中。

这里为什么要说到这些内容呢?因为这样才能创建新的上下文,然后当前上下文对于MyContextObject的调用都是属于远程调用(在remoting里跨越了上下文边界的所有调用都应该叫远程调用,不管服务端在哪),只有这样才能利用remoting中的消息管道来进行消息拦截。

那么是在什么时候创建新的上下文的呢?在MyContextObject类型定义的上面,有个AOPWriter特性类型,我们先来看下它的定义,示例代码1-2.

代码1-2

[AttributeUsage(AttributeTargets.Class)]
publicclassAOPWriterAttribute:Attribute,IContextAttribute
publicvoidGetPropertiesForNewContext(IConstructionCallMessagemsg)
msg.ContextProperties.Add(newAOPContextProperty());
publicboolIsContextOK(System.Runtime.Remoting.Contexts.Contextctx,IConstructionCallMessagemsg)

在代码1-2中我们看到AOPWriterAttribute类型实现了IContextAttribute类型的接口,IContextAttribute类型的定义如下,示例代码1-3.

代码1-3

publicinterfaceIContextAttribute
//在给定消息中将上下文属性返回给调用方。
//将上下文属性添加到的System.Runtime.Remoting.Activation.IConstructionCallMessage。
[SecurityCritical]
voidGetPropertiesForNewContext(IConstructionCallMessagemsg);
//返回一个布尔值,指示指定上下文是否满足上下文属性的要求。
//当前上下文属性检查所依据的上下文。
//构造调用,需要依据当前上下文检查其参数。
//如果传入的上下文一切正常,则为true;否则为false。
[SecurityCritical]
boolIsContextOK(Contextctx,IConstructionCallMessagemsg);

代码1-3中的定义同代码1-2中AOPWriterAttribute类型的实现一样,首先在上下文绑定对象进行实例化的时候系统默认的会调用IsContextOK()方法来判断当前执行实例化过程所在的上下文是否满足于上下文绑定对象的要求,这里我们在代码1-2中的实现是返回的false,意思就是当前上下文并不满足于MyContextObject类型所需要的,这是系统会去调用IContextAttribute中的GetPropertiesForNewContext()方法用于向新建上下文中添加自定义的上下文属性,也就是实现了IContextProperty接口类型的类型对象,在普通的运用中我们可以在自定义的上下文属性中设置一些逻辑操作,以便在新建上下文中使用,对于这部分的示例可以去看我的《.Net组件程序设计之上下文》篇幅。

对于代码1-2中AOPContextProperty类型的定义我们也来看一下,示例代码1-4.

代码1-4

【php】windows安装PHP5.5+Apache2.4 - hoster

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【php】windows安装PHP5.5+Apache2.4 - hoster  阅读原文»

php5.5和apache2.4的整合

看到php的版本升级了,就想试下新的特性

一、准备下载的文件

apache2.4.9 http://www.apachelounge.com/download/

Extjs的form表单自动装载数据(通过Ext.data.Model的代理加载数据) - 失败从新来过  阅读原文»

在做项目的时候遇到一个问题,以前双击grid页面一行数据的时候,会吧双击这一行的数据自动加载到双击的页面(Ext的弹出框),可以通过this.down(''form).getForm().loadRecord(record)来自动加载,可是现在有一个需求就是双击grid一行弹出一个新的浏览器页面(不是ext的弹出框,通过window.open()实现),只能把双击的id传到页面,再重新查数据手动赋值,如果一个页面字段很多,一个一个赋值是很辛苦的,所以就想能不能自动装载数据

通过长时间研究发现,this.down(''form).getForm().loadRecord(record)其中的record其实就是一个Ext.data.Model对象,如果我把查出来的数据封装成model对象在通过这个方法不就可以自动加载了,通过实验真的可以.下面是代码

1:前台Ext的form表单代码,说明:定义一个'selectName'的Ext.data.Model对象通过ajax代理访问后台数据,此时这个代码只是定义,还不能执行方法获得数据

var selectName=Ext.define('selectName', {
extend : 'Ext.data.Model',
fields : ['id','bugNumber','title'],
proxy:{
type:'ajax',
url : 'pribugmanage/controller/getTestData'
}
});

2:后台是SpringMVC(这里不做过多解释),说明通过后台返回map对象,map对象的key值要对象ext中form表单里面字段的name名字

/**
* 问题单库,添加,查询,审批
*/
@Controller
@RequestMapping("/pribugmanage/controller")
public class PrjBugManagerController {

/**
* 获取数据
*/
@RequestMapping(value = "/getTestData")
@ResponseBody
public Map<String, Object> getTestData(final Integer id) {
return prjBugManagerService.getTestData(id);
}
@Autowired
private PrjBugManagerService prjBugManagerService;
}

3: 1和2两个步骤只是定义好啦,要想完成查询还要执行第三步

这里通过监听,监听页面加载之后,通过刚才定义的个'selectName'的Ext.data.Model对象的load方法来执行访问后台,执行成功之后调用回调函数的success方法,这里面就会返回一个record对象,也就是Ext.data.Model,这是我们就可以通过me.down('form').getForm().loadRecord(record);来给当前的form表单自动装载数据了

listeners:{
render:function(){
selectName.load(dataId,{
success: function(record,operation) {
me.down('form').getForm().loadRecord(record);
}
});
}
}

                                                        此文为原创,转载请说明转载地址


本文链接:Extjs的form表单自动装载数据(通过Ext.data.Model的代理加载数据),转载请注明。

阅读更多内容

2014年6月26日星期四

SSH集成Pushlet - jackvc

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
SSH集成Pushlet - jackvc  阅读原文»

首先是需要的资源:

1)、pushlet.jar

2)、ajax-pushlet-client.js

第一步、web.xml配置servlet

<servlet>
<servlet-name>pushlet</servlet-name>
<servlet-class>com.newgsn.tvmall.pushlet.servlet.Pushlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>pushlet</servlet-name>
<url-pattern>/pushlet.srv</url-pattern>
</servlet-mapping>

Pushlet类自定义类,继承自nl.justobjects.pushlet.servlet.Pushlet.java
第二步、创建自定义的Pushlet类

初始化pushlet,并注入applicationContext

public class Pushlet extends nl.justobjects.pushlet.servlet.Pushlet {

/**
*
*/
private static final long serialVersionUID = 1L;

public void init() throws ServletException {
super.init();

ApplicationContext ctx
= WebApplicationContextUtils.getWebApplicationContext(getServletContext());
SessionManager.getInstance().initApplicationContext(ctx);
}

}

第三步、创建推送消息工具类

public class PushletUtil {

private static String PLATFORM_MESSAGE = "UNI_CAST_MESSAGE";

/**
* 发送消息至客户端
*
@param sessionId
*
@param msg
*/
public static void sendMessage(String sessionId, String msg){
if(StringUtils.isNotBlank(sessionId) && SessionManager.getInstance().hasSession(sessionId)){
Event event
= Event.createDataEvent("message");
event.setField(PLATFORM_MESSAGE, msg);
Dispatcher.getInstance().unicast(event, sessionId);
}
}

/**
* 广播至所有在线客户端
*
@param msg
*/
public static void sendBroadcast(String msg){
Event event
= Event.createDataEvent("message");
event.setField(PLATFORM_MESSAGE, msg);
Dispatcher.getInstance().broadcast(event);
}
}

实现点对点推送和广播推送
第四步、jsp页面接收消息

PL._init();
PL.userId
='qinfx';
p_join_listen(
"message");
function onData(event) {
if(event.get('UNI_CAST_MESSAGE') != undefined ) {
alert(event.get(
'UNI_CAST_MESSAGE'));
}
if(event.get('UNI_LOGOFF') != undefined ) {
alert(event.get(
'UNI_LOGOFF'));
}
}

PL.userId为当前登录用户的id


本文链接:SSH集成Pushlet,转载请注明。

Swift实战-豆瓣电台(八)播放进度与时间 - 老镇  阅读原文»

视频观看地址:http://v.youku.com/v_show/id_XNzMyMzI1MzMy.html

这节主要内容是NSTimer,UIProgressView,MPMoviePlayerController类的使用

NSTimer

实例化:

timer=NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "onUpdate", userInfo: nil, repeats: true)// 实例化后即启动定时器,0.4秒后开始第一次触发

0.4 是间隔时间

target 是发送对象

selector 是触发的方法

userInfo 此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器。

repeats 是否重复

立即触发

fire()

停止

invalidate()

UIProgressView

设置进度条进度

progressView.progress=0.0

带动画

progressView.setProgress(p, animated: true)

MPMoviePlayerController

audioPlayer.currentPlaybackTime 已经播放的时间(秒)

audioPlayer.duration 总时间(秒)

秒钟分钟算法

总时间除以60的余数就是秒钟

总时间除以60的商就是分钟

因为我们的展现形式是00:00

所以当数字小于10的时候进行字符串拼接补0例如01,02

还有一节就全部大结局了,敬请期待^_^

本节高清视频和代码下载地址

http://pan.baidu.com/s/1hq22JzA

Swift实战-豆瓣电台系列

Swift实战-豆瓣电台(一)准备

Swift实战-豆瓣电台(二)界面布局

Swift实战-豆瓣电台(三)获取网络数据

Swift实战-豆瓣电台(四)歌曲列表的展现

Swift实战-豆瓣电台(五)播放音乐

Swift实战-豆瓣电台(六)视图跳转,传参及回跳

Swift实战-豆瓣电台(七)显示动画


本文链接:Swift实战-豆瓣电台(八)播放进度与时间,转载请注明。

阅读更多内容

2014年6月25日星期三

可以在SSD上建传统RAID吗?

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
可以在SSD上建传统RAID吗?  阅读原文»

每日博报 精彩不止一点关闭
可以在SSD上建传统RAID吗?

当被问及"在SSD上能否建传统RAID"这个问题的时候,大家的第一反应应该是"可以建,但是需要Trim命令的支持"。在网上也可以看到很多人拿SSD来建RAID,但基本上都会配置成RAID0或者RAID1。很少有人会去建RAID5,这是为什么呢?

答案很简单,在SSD基础上如果配置类似于RAID5这样的Parity-RAID,那么SSD的整体性能不能很好的发挥出来,更为重要的是Parity-RAID会影响SSD的寿命。一句话,Traditional RAID kills SSD。所以,传统RAID不能直接配置到SSD上,不仅仅是因为Trim命令的支持问题。

在分析传统RAIDSSD上的问题之前,首先看一下RAID能够给SSD整体带来什么价值?Tom's HardwareSSD的基础上配置了一个RAID0,并且对比了RAID0和单块SSD的性能。从下图可以看出,当两块SSD被配置成RAID0之后,无论是顺序读或者写,性能基本上可以做到翻倍。所以,配置成RAID0之后,可以提升系统的整体吞吐量。RAID0模式下的顺序读写性能对比如下所示:

wKioL1OpFkLBgv_9AAEOA-7MusU520.jpg

第二个比较关心的是随机读写能力。SSD的一大优势在于随机读写能力强,具有很高的IOPS,因此当配置成RAID之后,是否可以将IOPS的能力翻倍呢?答案是不一定的,当队列深度很小的时候,RAID0模式下的随机读写能力和单盘的性能没有差距。当队列深度为1时,RAID0模式下的随机读写性能对比如下:

wKiom1OpFpShu0GuAAEvgkwKA50413.jpg

只有当队列深度达到一定程度之后,RAID0的随机读写能力才能有所提升。当queue_depth达到64时,随机读写性能如下所示,基本上可以达到单盘性能的两倍:

wKioL1OpFouwlrF4AAEw-pxIiF4409.jpg

第三个比较关心的问题是延迟。在数据库等应用中,特别在意IO延迟指标。组建RAID之后是否能够降低延迟指标呢?从原理上来讲,RAID只能延长IO延迟,并不能降低IO延迟。Tom's Hardware的测试结果如下所示:

wKiom1OpFt2hf9flAAEsHmlFQN0014.jpg

从上图可以看出,引入RAID0之后,延迟时间增加了。所以,总体来讲,RAID可以提升系统的整体吞吐量;在Queue Depth很大的情况下,提升系统的随机IO能力;对延迟没有改善,只能增加延迟;如果配置成Parity-RAID的方式,还可以提升数据的可靠性。

在很多应用中,需要很强的IO吞吐量、IOPS、数据可靠性以及大容量,那么此时就需要RAID来支持了。但是,前面提到传统Parity-RAIDSSD介质上不能很好的工作,只能加速SSD的磨损。传统RAID主要存在的问题如下:

1、RAIDpartial-stripe写问题。在RAID5之类的Parity-RAID中,一旦发生Partial-stripe写,那么首先需要将条带中没有被更新的数据读出来,然后和新写入的数据进行合并,最后计算校验值,将新更新的数据和校验值一同写入磁盘。整个Partial-stripe写的过程就是一次"读-修改-写"。从性能的角度来看,partial-stripe写过程严重影响了性能,增加了IO延迟。更为重要的是partial-stripe写会频繁的更新parity数据。由于SSD采用的是out-of-place的数据更新方式,所以这种频繁parity数据更新会导致SSD写放大系数增大,影响SSD的使用寿命。

2、数据重构问题。传统RAID的数据重构是针对盘的。也就是说当RAID中一块盘出现故障时,RAID会将该盘从RAID组中剔除,并且找一个空闲Spare盘进行数据重构。盘级数据重构会从头至尾对SSD进行数据重构,即Spare SSD会被从头至尾写一遍。在SSD中采用FTL进行page/block映射,如果SSD中的所有page页都被耗尽,那么SSD会被迫启动Garbage Collection,使得SSD性能达到最差。

3、数据同步问题。该问题和数据重构问题类似。

4、SSD盘同时发生故障问题。Parity-RAID将条带中的数据均匀分布到所有磁盘上,使得所有磁盘上的IO均等。对于SSD盘而言,其寿命基本是相同的。因此,在RAID这种使用模式下,SSD在短时间内同时发生故障的概率是很高的。

SSD盘和磁盘相比,底层技术是完全不同的。传统RAID不能很好的配合SSD盘,使得整体性能和SSD使用寿命都会受到严重影响。因此,在SSD上建RAID不是件那么容易的事情。

本文出自 "存储之道" 博客,请务必保留此出处http://alanwu.blog.51cto.com/3652632/1430288

返回顶部

【闲聊产品】之五:谁来背黑锅?  阅读原文»

【闲聊产品】之五:谁来背黑锅?

wKiom1OpAG6zUxKKAAFs7cl5hFA510.jpg

记得有部电影里面讲过,能力越大,责任就越大,其实这句话在一定程度上也可以反过来说,你承担的责任越大,那么你的能力也有可能随之变大,至少你会有增强自身能力的机会,那么为什么会有很多人不愿意去承担责任呢?原因很简单,因为承担责任就有可能背黑锅。

其实人性中始终会有自我保护的意识,比如小时候你和小伙伴玩,推推攘攘的把花瓶打碎了,这时候如果有家长问起,很多小孩会条件反射的不想承认是自己干的,但是由于小伙伴在场又不好说是小伙伴干的,所以就保持沉默,但是如果这时候有个小孩站出来主动承认是自己干的,很容易就赢其他小朋友的尊重,甚至赢得家长的尊重,自然而然在后面的玩耍中这个小孩就是大哥了,所以在人性中我们又会敬佩那些敢抗责任的人。

反之,如果在打碎花瓶之后,两个小朋友相互推卸责任,那么即便以后还会相互玩耍,但必然也会心存芥蒂。江湖大哥是怎么成长起来的?肯定是打群架时冲在最前面的那位。

扯远了,说回和产品相关的话题,在完成一个产品的过程中,产品经理必然会和各种项目组的各个角色打交道,由于产品经理其实在行政上没有直接的权利,更多依靠的是角色职能和在项目推进阶段建立的权威性,那么当产品出了问题的时候,如果产品经理把责任一股脑推给其他人,那么造成的结果必然导致项目团队的人心涣散和其他成员对你的不信任,后面再要推动产品朝前走就困难很多了,干事的时候别人像老黄牛,担责任的时候你跑得比谁都快,别人凭什么要跟着你干?所以该怎么做我想你懂的。

同时我发现在很多时候团队间邮件吵架的一个很大原因就是谁来背黑锅的问题,问题在任何公司都会出现,但是一旦出现了责任的相互指责,事情往往就会很难收场,所以在必要的时刻勇于背黑锅也算是一种人格魅力,尤其是男士,当团队的一群人都站出来承担责任的时候,问题可能就不是问题了,整个团队的气场也会更加团结。

最后一句忠告,在有怒气的时候千万不要发邮件、发微博和打电话,自己找个地方待着,冷静后在去平和的解决问题,往往事情会好办很多。

=====

我的微博:@最牛傻蛋

分享至 一键收藏,随时查看,分享好友!
昵称:
登录快速注册
内容:

阅读更多内容