nonocast

Digital Life

Log4xxx确实是一个能够跨语言跨平台的Solution,不过确实存在几个问题:

  • 过于繁琐的配置,每次项目需要copy-paste,而且哪里记得那么多logger和参数
  • 如果采用txt,当日志很多的时候,虽然可以配合工具进行分析,不过还是略显简单和粗糙

如果在Windows平台下,个人觉得还是借助Windows提供的日志机制更为经济。
关于EventLog的文章直接在google就O了,不过这里需要提几个点:
1. 删除自定义日志,貌似没有GUI,需要注册表删除,然后删除evtx文件。
eventlog的相关信息基本都在下面能找到,包括log-source的绑定关系
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog
2. 一旦source进行绑定后,如果需要修改这个source-log的关系,则需要手动在log节点下删除source项。然后重新CreateEventSource。发现通过代码DeleteEventSource无效。
http://www.eggheadcafe.com/community/aspnet/2/10022041/writing-to-custom-event-log.aspx

Once you create an event source, you cannot reuse that event source name. The framework searches through all of the event sources on the machine, and if it finds one that matches the name, it uses it. To make the code work properly, you need to create a new event source.

其实操作注册表就好了,注册表其实就是Windows的根据地,不要客气,兄弟们,上。
项目中封装了一个Logger,供大家参考,;等项目结束后,想写一下Log的实践,其实还是很有讲究的。

PowerPoint 2007另存为图片后发现文字边缘存在明显锯齿,而且最奇怪的事情是同样的PPT有些机器好有些机器不好,折腾了一个晚上,OMG,原来没有打SP2.
解决方法说来也无比简单,不过如果能上手就意识到版本问题可能就不会兜那么大一圈了,从字体折腾到显卡最后才发现是SP的问题。请一定记得在解决问题前核对版本号。

前面文章还说PowerPoint转图片无话可说,因为没有任何设置给到我们,今天又是无意搜到PowerPoint导出TIF改分辨率
在HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\PowerPoint\Options下增加ExportBitmapResolution(DWORD值),11.0针对2003,12.0针对2007
可选值分别是: 50,96(Default), 100, 150, 200, 250, 300.对应关系如下(dpi->pixel):

  • 50 500×375
  • 96 960×720
  • 100 1000×750
  • 150 1500×1125
  • 200 2000×1500
  • 250 2500×1875
  • 300 3000×2250

设为300后启动PowerPoint另存为png,出来的图片分辨率是3000×2250。
我的Office版本: Office 2007 Plus
BTW: 官方版本

转换PowerPoint的动作无非是利用Microsoft.Office.Interop.PowerPoint,后面就不说了,因为没有话可以说,SaveAs就是了。
But图片质量你就不用操心了,因为操了也是白操,不给设置啊!!
codeproject上竟有达人通过截屏这种下三滥的手法得到高分辨率的图片,我也算服了,如果没有记错,应该是3年前看的那篇文章,3年中没有再看到更好方法来获取高分辨率的图片,3年中竟然时不时还去忽悠别人一把,=.=|||
But前面装了Acrobat Pro,于是顺便将一个打开的PowerPoint转成Pdf,打开发现Pdf保持矢量形态,导出成图片,COOL,2200×1650,如果只是PowerPoint的另存为分辨率只有960×720。3年的问题就在不经意间化解了,想想有点意思。

如果需要将Pdf转成图片序列,动作如下:
1. 下载并安装Adobe Acrobat (Adobe Acrobat 9 Pro)
2. 注册或者破解
3. VS中新建项目,Console/Winform/Wpf皆可
4. 引用Adobe Acrobat 9.0 Type Library
5. 将附件中的PdfConverter增加到项目中
6. 调用

new PdfConverter().Convert(@"c:\users\nonocast\desktop\Unilever Bubble Wall.pdf");

DONE!

下载PdfConverter,代码是从cnblogs上copy过来,略加整理。
最后需要注意一下,由于转换过程中用到了Clipboard,所以如果在Console中需要将线程模式设置为STAThread。

原先Winform只需要在Toolbox中choose加入Shockwave Flash Object即可,可到了WPF则变得有些麻烦,需要通过Winform来做跳板,具体如下:
1. 通过原先Winfrom的引入方式,将Flash控件拖入Winform中,VS会自动生成下面2个dll:

  • AxInterop.ShockwaveFlashObjects.dll
  • Interop.ShockwaveFlashObjects.dll

2. 将这两个dll copy到wpf的project中,在project新建2个目录分别是Lib和Runtime,将Interop…dll放入Lib,Ax…dll放入Runtime,在project编写Post Build Event,如下:
copy “$(ProjectDir)Runtime\*.dll” “$(TargetDir)”
将AxInterop.ShockwaveFlashObjects.dll在build后copy到最终exe生成的目录,因为运行exe需要它。

3. 在wpf project中add reference:

  • AxInterop.ShockwaveFlashObjects.dll
  • Interop.ShockwaveFlashObjects.dll
  • System.Windows.Forms
  • WindowsFormsIntegration

4. 开始编写放入flash的代码:

private void Window_Loaded(object sender, RoutedEventArgs e) {
	System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowsFormsHost();
	flash = new AxShockwaveFlashObjects.AxShockwaveFlash();
	flash.FSCommand += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEventHandler(flash_FSCommand);
	host.Child = flash;
	this.Stage.Children.Add(host);

	flash.Movie = @"c:\users\nonocast\desktop\hello.swf";
	flash.Play();
	flash.BackgroundColor = 0x000000;
	flash.SetVariable("testValue", "Hello World");
}

private void flash_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e) {
	string cmd = e.command.ToString();
	MessageBox.Show(cmd);
}

private AxShockwaveFlashObjects.AxShockwaveFlash flash;

以Flash8 AS2为例(:(我也没办法),可以通过FsCommand事件接收flash中fscommand的调用,反之可以通过SetVariable给flash ’send message’.

5. 上面说到的Flash很简单,在第一帧中放入一个Label,然后F9编写’动作’,如下:

var testValue:String = "";
 watchCallback = function (id, oldval, newval):String {
	mylabel.text = newval;
	fscommand("GotIT");
	return newval;
 };
 _root.watch("testValue", watchCallback);

另外一种情况就是,直接采用动态文本,然后在’变量’中填上相应的变量名,然后直接就可以在.NET中Set,这个非常方便。
6. 参考Url:
Using the External API for Flash–JavaScript Communication
如何在 WPF 中嵌入 Flash (ActiveX)
7. 附上我的代码,有点乱糟糟,

大就要有大的样子,一半kds一半vs,很喜欢Benq V2200,线条很简洁,有力量,常年对着T61让我有了一丝惊喜。

整个7月都是On Project,所以很难有时间一个一个整理知识点,提供完整的Demo,只能蜻蜓点水。

1. 一个快门切换的过渡效果

动画很简单,类三角的图形绕左下角进行旋转,由于是Bezier,2个控制确定曲线弧度,为了计算每个曲线的控制点坐标,这个时候才发现自己的数学有多可怜,在不断的sin/cos/距离公式的摧残下,竟然让我想到一个BT的方法,如果可以算是方法,

2. 图片/视频间的切换效果

WPF可以很容易的做出Fade In-Out效果,也可以通过Pixel Shader作出非常华丽的效果,不过当你需要一打过渡效果的时候,还是去看看Transitional

3.使用Uploadify

最近在写一个管理SignageBox的网站,其中需要在ASP.NET MVC中上传文件(100M以内),采用了Uploadify,感觉不错。
简单的提一下用法和注意事项:

  • uploadify.com上去下载zip包
  • 参考这篇在asp.net mvc中使用Uploadify上传文件
  • 解压后连带目录直接copy到网站(ASP.NET MVC)的Content下
  • 确认在使用uploadify的页面已经引用了JQuery的script,一度因为没有加JQuery导致IO Error,现在想来害的好苦啊 啊啊 啊
  • 经草率的测试,个人感觉Uploadify只能支持到100M的文件,超过会出现不稳定的现象(HTTP Error),可能和Flash的FileReference有关,没有查证,据说只能支持到100M,不过我在测试的时候1G也OK,不过IIS里面就不行了。

4.使用EventLog

通过EventLog可以借助Windows所提供的日志体系来管理应用程序日志。
系统日志可以通过命令eventvwr查看,另外注册表中记录了自定义日志的信息,具体的日志文件在‘%SystemRoot%\System32\Winevt\Logs’ (Windows 7)
EventLog需要注意两个概念,Source和LogFile,一个LogFile其实本质表示一个evtx的日志文件,而Source则代表日志来源,换句话说Source和LogFile是多对一的关系,而CreateEventSouce其实做了2件事情,1是创建LogFile,2是建立LogFile和Source的关联关系。
还有一个需要注意的事情就是删除日志文件,系统管理中只有清空日志,貌似没有删除日志,非常不解,而DeleteEventSource也是Exception而不能正常删除,最后只能通过在注册表中强行search后delete,感觉不是很踏实。anyway,除去删除这小小的问题,感觉通过这种方式比Log4Net来的更加方便,有更好的配套设施,值得尝试。

估计8月应该还是坚持On Project,可以预见的是8月是属于Flash和AS3的时间,OMG。
最后,推荐2个iPhone应用软件,分别是Air Video和Mobile RSS。实在太贴心,SO SWEET。

PS: 本人有幸经历了非常不幸的T61显卡门,*#&$(#($*,估计现在本子应该已经在去香港的路上了,不过也好,去百脑汇折腾了一台Hackintosh,有的折腾了。

I always see beginners thinking that good code is code that doesn’t throw exceptions. This is not true. Good code throws exceptions as needed, and handles only the exceptions it knows how to handle.

The worst thing you can do is catch (Exception) and put an empty code block on it. Never do this.

cnblogs中有太多人重复不断不厌其烦不辞辛劳去写如何配置Log4net各个版本的blog,不过一旦你去找如何用好Log,如何去设计Log,包括如何去做Exception Handle,文章数目急剧减少,可能这就是cnblogs的现状,多些思考少些重复,真不明白cnblogs还能变成口水战战场。

推荐一下这篇文章,静下心来看:
Exception Handling Best Practices in .NET

有光明,有Espresso,有Two Man and a Half.

原来生活还是很美好…