WordPress博客搭建——PHP安装+IIS处理

旧地址:http://blog.canself.com/wordpress_Environment/

第一次自己搞服务器,安装php,还是有点迷茫的。

首先是下载php,打开下载网站 http://windows.php.net/download。

看到如此多的版本,瞬间凌乱了,就此上网查了查windows server上用啥版本,最后确定用非线程安全的版本。自己买的服务器是64为的,下了个64位非安全版。

接下来,就上网找了下php+iis配置,照样来

1、先将下载的压缩包解压到C:\php目录,一开始傻傻的以为只能这样弄,后来感觉这样只能这样就太弱智了,就试了下,随便解压到那个路径都可以【不要傻傻的弄到系统相关的文件夹下哦】,现在的路径就是D:\..\php啦,又觉得世界多彩啦。

2、修改配置文件

将php.ini-development改名为php.ini,然后就各种模块修改啦

当时查到的主要有:

1
2
3
4
5
6
7
8
9
data.timezone=”Asia/Shanghai”

extension=php_gd2.dll

extension=php_mbstring.dll

extension=php_mysql.dll

extension=php_pdo_mysql.dll

另外就是将extension_dir=改为 extension_dir= “D:\..\php\ext\”

这样php就算搞定啦,另外的扩展,有待慢慢研究,毕竟木有学过php。。。。

3、接下来就是安装CGI,安装完添加模块映射,在iis中处理程序映射——添加模块映射

PDF解析记录——Pdfbox

旧地址:http://blog.canself.com/pdfbox/

此文仅作记录【嫌放电脑里碍事-_-😀】,内容为以前收集的一小段代码。

下面为pdf获取文本的简要代码片段:

1
2
3
4
5
6
private string GetPDFText(string filename)
{
PDDocument pdf = PDDocument.load(filename);
PDFTextStripper pdftext = new PDFTextStripper();
return pdftext.getText(pdf);
}

其中对于旧版本,如pdfbox0.7.3版本,对于一些pdf解析会有问题,例如提示“Unknown encoding for ‘UniGB-UC32-H’”。而将dll换成新的如pdfbox-1.8.2。就可避免此问题【此处本人是通过nuget添加的引用-Pdfbox.1.1.1】。

至于想要其他新版本,可以自己通过pdfbox官网步骤自行生成

教程地址:http://pdfbox.apache.org/building.html


此技术后期很可能不会继续深究(用到再说吧),仅作技术学习路上的留下的一点痕迹。🐌

WPF之MVVM(Step4)——使用Prism(2)

旧地址:http://blog.canself.com/mvvm_prism2/

上一篇简单介绍使用Prism中的NotificationObject,以及DelegateCommand。这一篇更是简单,仅仅描述下DelegateCommand<T>如何使用。

ICommand接口一开始提供的就是带参数的方法,而我们使用时经常会遇到那个参数毫无用处的情况,Prism也就帮了偶们一把啦。当然,Prism并没有忘记我们有时还是要参数滴。

在定义上,我们使用ICommand定义,DelegateCommandDelegateCommand<T>一样。在实例化时有所区别,当然在界面绑定时亦有区别,详细如下:

1
TestParameterCommand = new DelegateCommand<string>(TestParameter);
1
2
3
4
private void TestParameter(string para)
{
TestStr = para + "para";
}
1
<Button Grid.Row="2" Content="TestParameter" Command="{Binding TestParameterCommand}" CommandParameter="{Binding Text, ElementName=textBox}" />

下面是用代码进行Command的调用【带参数】,若不带参数的直接传null即可。

1
2
3
4
private void Button_Click(object sender, RoutedEventArgs e)
{
(this.DataContext as TestViewModel).TestParameterCommand.Execute("testpara");
}

Prism在MVVM方面的介绍就如此啦,主要Prism不仅仅限于MVVM,后期再单独介绍Prism吧,毕竟那可不是个简单的活。


项目代码托管地址:https://wpfmvvm.codeplex.com/

WPF之MVVM(Step3)——使用Prism(1)

旧地址:http://blog.canself.com/mvvm_prism1/

使用WPF-MVVM开发时,自己实现通知接口、DelegateCommand相对来说还是用的较少,我们更多的是使用第三方的MVVM框架,其中微软自身团队提供的就有Prism框架,此框架功能较多,本人现学有限,暂时先介绍简单的使用。

注:此处使用Prism版本4.1

Prism首先方便我们的是帮助我们实现了INotifyPropertyChanged接口,其中RaisePropertyChanged不仅实现利用字符串通知,更实现了Lambda表达式,这样在代码重构上提供了一些方便。。。

其次,Prism帮助我们实现了ICommand接口,可以利用其DelegateCommand实现。

下面为简要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class TestViewModel : NotificationObject
{
private string teststr;
/// <summary>
/// 待通知字符串
/// </summary>
public string TestStr
{
get { return teststr; }
set
{
teststr = value;
RaisePropertyChanged(()=>TestStr);
}
}

/// <summary>
/// 测试命令
/// </summary>
public ICommand TestCommand { get; set; }


public TestViewModel()
{
TestCommand = new DelegateCommand(Test,CanTest);
}

int i = 0;
/// <summary>
/// testcommand执行的方法
/// </summary>
private void Test()
{
i++;
TestStr = i.ToString();
}
/// <summary>
/// testcommand是否可用
/// </summary>
/// <returns></returns>
private bool CanTest()
{
return true;
}
}

此处使用了Prism中的DelegateCommand,此类用于无需传递参数使用,下篇将描述使用DelegateCommand<T>创建可以传递参数的Command。


项目代码托管地址:https://wpfmvvm.codeplex.com/

WPF之MVVM(Step2)——自己实现DelegateCommand:ICommand

旧地址:http://blog.canself.com/mvvm_DelegateCommand/

在自己实现MVVM时,上一篇的实现方式基本是不用,因其对于命令的处理不够方便,没写一个命令都需要另加一个Command的类。此篇主要介绍DelegateCommand来解决上面所遇到的问题。

首先,我们创建自己的DelegateCommand。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/// <summary>
/// 实现DelegateCommand
/// </summary>
class MyDelegateCommand : ICommand
{
/// <summary>
/// 命令所需执行的事件
/// </summary>
public Action<object> ExecuteCommand { get; set; }
/// <summary>
/// 命令是否可用所执行的事件
/// </summary>
public Func<object, bool> CanExecuteCommand { get; set; }

public MyDelegateCommand()
{
}

public MyDelegateCommand(Action<object> execute, Func<object, bool> canexecute)
{
ExecuteCommand = execute;
CanExecuteCommand = canexecute;
}

/// <summary>
/// 命令可用性获取
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public bool CanExecute(object parameter)
{
return CanExecuteCommand(parameter);
}

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

/// <summary>
/// 命令具体执行
/// </summary>
/// <param name="parameter"></param>
public void Execute(object parameter)
{
ExecuteCommand(parameter);
}
}

其中的重点是利用两个委托,将方法的实现分离出去,接下来看我们的ViewModel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class TestViewModel : INotifyPropertyChanged
{

private string teststr;
/// <summary>
/// 待通知字符串
/// </summary>
public string TestStr
{
get { return teststr; }
set
{
teststr = value;
RaiseChanged("TestStr");
}
}

/// <summary>
/// 测试命令
/// </summary>
public ICommand TestCommand { get; set; }


public TestViewModel()
{
TestCommand = new MyDelegateCommand();
(TestCommand as MyDelegateCommand).ExecuteCommand = Test;
(TestCommand as MyDelegateCommand).CanExecuteCommand = CanTest;
//or
//TestCommand = new MyDelegateCommand(Test, CanTest);
}

int i = 0;
/// <summary>
/// testcommand执行的方法
/// </summary>
/// <param name="para"></param>
private void Test(object para)
{
i++;
TestStr = i.ToString();
}
/// <summary>
/// testcommand是否可用
/// </summary>
/// <param name="para"></param>
/// <returns></returns>
private bool CanTest(object para)
{
return true;
}

#region INotifyPropertyChanged接口实现
public void RaiseChanged(string propertyname)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}

其中的Test,CanTest就是之前写在Command中的实现,通过此实现,我们可以将界面呈现逻辑全部集中到ViewModel中。

其界面还是一样使用上一篇的。