为什么要使用 IDE 啊,因为它有代码提示、有自动完成啊(code completion),开发 Chrome extension 也是,如果没有代码提示、没有自动完成总是很焦虑(会不会我把 API 记错了呢)

编写代码时的 API 提示(code completion)

没有 Chrome extension 的源文件,但是它的 API 文档(接口说明)都是开放的,你可以到 DefinitelyTyped 项目把 chrome 项目的文件下载下来,然后添加到 IDEA/WebStorem 的库里,就可以啦。

chrome 的 .d.ts 文件添加到项目的 Libraries 中

一般我们访问项目的 Setting 是这样的:

Properties.Settings.Default.XXX

其实包含完整 Namespace 的访问是这样的:

ProjectNamespace.Properties.Settings.Default.XXX

很显示我们在别的项目里不能直接这样去访问这 Setting,正确的方式是:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ClientSettingsSection configSection = config.SectionGroups[@"userSettings"].Sections["ProjectNamespace.Properties.Settings"] as ClientSettingsSection;
var xxx = configSection.Settings.Get("xxx").Value.ValueXml.InnerText;

本文来自:Recommendations and best practices for implementing MVVM and XAML/.NET applications

项目的文件(目录)结构

项目的文件结构

  • App.xaml
  • Controls: 重复使用的 UI(没有 ViewModel)
  • Localization: 用于程序本土化的类代码和资源文件
  • Models: Model and domain classes
  • ViewModels: View models classes
    • MainWindowModel.cs
    • MyViewModel.cs
    • Dialogs
      • SelectItemDialogModel.cs
  • Views: Contains the views
    • MainWindow.xaml
    • MyView.xaml
    • Dialogs
      • SelectItemDialog.xaml

View 的名称体是以它的类型(Window、View、Dialog)结尾的;ViewModel 的名称是 View名称 + Model 后缀(例如:MainWindow – MainWindowModel)。

View – ViewModel 原则

View – ViewModel 是一一对应的关系,只有 View 才能访问它的 ViewModel,别的 View 不能访问其它的 ViewModel。

ViewModel 不能直接访问它的 View,只能通过 messenger (或其它 IoC 机制)实现方法 调用。

如果 View 很大(复杂),应该把它拆分成多个 View。

ViewModel 的实例化和赋值

在 XAML 里以根元素 Resources 方式实例化 ViewModel,然后再分配给顶级子元素的 DataContext,像这样:

 <UserControl x:Class="My.Namespace.MySampleView" ...> 
    <UserControl.Resources> 
        <viewModels:MySampleViewModel x:Key="ViewModel" /> 
    </UserControl.Resources> 

    <Grid DataContext="{StaticResource ViewModel}"> 
        ... 
    </Grid> 
</UserControl> 

如果需要在 View 中访问 ViewModel,那么可以在 .xaml.cs 中这样实现:

 protected MySampleViewModel Model 
{
    get { return (MySampleViewModel)Resources["ViewModel"]; } 
}

这样做的好处是:

  • Visual Studio 的编辑器能识别到 Resource 的类型,这样就可以提供 IntelliSense 功能
  • 其它 UI 需要 ViewModel 的内容时,可以很方便通过 Resource 的 key 来访问。

不要在 View 实例化的地方设置 DataContext 属性, 只有 View 自己才能给它的 DataContext 赋值。 如下做法是错的:

<MySubView DataContext="{Binding MySubViewModel}" />

根元素需要绑定 ViewModel 属性怎么办

因为 ViewModel 只有在 Resources 之后才可用,所以我们就无法直接在根元素上使用属性绑定,需要换种方式,像这样:

 <Window ...> 
    <Window.Resources> 
        <viewModels:MyWindowModel x:Key="ViewModel" /> 
    </Window.Resources> 
    <Window.Title> 
        <Binding Source="{StaticResource ViewModel}" Path="Document.Title" /> 
    </Window.Title> 

    ...  

Command 实现

所有 UI 动作都在 ViewModel 中以 Command 实现 。

使用 Dependency Property 来给 View 传参

Dependency Property 这样实现:

public class MySubView
{
    public static readonly DependencyProperty ProjectProperty = DependencyProperty.Register( 
        "Project", typeof(Project), typeof(MySubView),  
        new PropertyMetadata(default(Project), OnProjectChanged)); 

    public Project Project 
    { 
        get { return (Project)GetValue(ProjectProperty); } 
        set { SetValue(ProjectProperty, value); } 
    } 

    private static void OnProjectChanged(DependencyObject obj,  
        DependencyPropertyChangedEventArgs args) 
    { 
        ((MySubView)obj).Model.Project = (Project)args.NewValue; 
    }  

    public ProjectPropertiesViewModel Model 
    { 
        get { return (ProjectPropertiesViewModel)Resources["ViewModel"]; } 
    } 
}

然后,在 xaml 中可以这样传参:

<MySubView Project="{Binding SelectedProject}" />

ViewModel 的生命周期

View 调用 ViewModel 的相关方法:

public MyView() 
{ 
    InitializeComponent(); 
    Model.Initialize();    
    Loaded += delegate { Model.OnLoaded(); }; 
    Unloaded += delegate { Model.OnUnloaded(); }; 
}

ViewModel 实现:

public class MyViewModel  
{ 
    private bool _isLoaded = false;  

    public MyViewModel()
    {
        // TODO: Add your constructor code here
        // The ctor is always called, initialize view model so that it also works in designer
    }

    public void Initialize()
    {
        // TODO: Add your initialization code here 
        // This method is only called when the application is running
    }

    public void OnLoaded() 
    { 
        if (!_isLoaded) 
        { 
            // TODO: Add your loaded code here 
            _isLoaded = true;  
        } 
    } 

    public void OnUnloaded() 
    { 
        if (_isLoaded) 
        { 
            // TODO: Add your cleanup/unloaded code here 
            _isLoaded = false; 
        } 
    }
    ... 

注意,我们在 xaml 中实例化了 ViewModel,这样 ViewModel 的构造函数在 Visual Studio 编辑器中就会被执行,没必要让代码在设计阶段就执行,所以我们独立出了 Initialize 方法。

XAML 的绑定一定要声明类型

这一条很重要:XAML 里的所有绑定(Binding)都要声明类型,通常在 Resources 会声明类型的,但是如果有其它的绑定方式,一定要手动声明绑定的类型:

<Window xmlns:MyNamespace="clr-namespace:MyNamespace"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        mc:Ignorable="d"
        ...>
    ... 
    <StackPanel d:DataContext="{d:DesignInstance Type=MyNamespace:MyType}"> 
        ... 
    </StackPanel> 

如果使用 WordPress multi site 功能的话,你会发现 administrator 账号是缺少安装插件的权限的,必须要 super admin 才行。通过数据库可以直接把账号提升到 super admin 权限,需要操作 *sitemeta 表,给 meta_key=site_admin 的 meta_value 加入账号名即可。

通过 curl 发送 cookie ,可以使用 –cookie 参数,请点击

还可以通过 -H 设置 Header 来实现的,比如:

 

可以使用 php_flag 来禁止 php 的执行

除了 php_flag 外,还可以通过 RemoveHander 和 RemoveType 来禁用 php 执行:

还可以通过 SetHandler 和 ForceType:

 

  1. 基本上 attrib 设置文件夹的“只读”是无效的,或者说,attrib 设置的这个“只读”和我们预想的(不能在文件夹内创建文件)是完全不一样的。attrib 对应于“属性”窗口 – “常规”。
  2. 真正要让文件夹“只读”,你需要做的是正确设置用户的权限,比如某个用户在这个文件夹只有“读取”的权限,你可以通过 icalcs 来做到,对应于“属性”窗口 – “安全”。

先看下这个问题

有两个文件 a.txt 和 b.txt
a.txt:

b.txt:

你需要能输出 b.txt 里没有在 a.txt 中的行:

最简单的方法是使用 Windows 的 findstr 命令

是不是超级简单的,参数请参考这里

如果需要使用 document.querySelector 选择勾选的 checkbox 你会怎么做?是不是这样:

看上去没错,但你要清楚 attribute 和 property 的区别,attribute 指的是最初声明在 HTML(源码)中的属性,通过 JS 或点击改变的是 input.checked 这个 property。

所以更安全的写法是用 : 指定 property: