12
7

本文要点
WebAssembly 是一种新的客户端技术,可以在所有现代浏览器(包括移动浏览器)中实现近乎原生的性能,而且不需要插件。
许多语言,包括 C、C#、Go 和 Rust,都可以编译成面向基于栈的 WebAssembly 虚拟机的代码。
.NET 代码可以在任何地方运行,包括浏览器内部。
Blazor 是一个客户端库,它在 WebAssembly 上使用.NET 来支持借助 Razor 模板使用 C# 编写的单页应用程序。
Blazor 支持代码重用和将遗留代码移植到现代 Web 应用程序的能力。
在 2019 年 4 月中旬,微软悄悄地推出了一个年轻的框架,从“一切皆有可能”的实验阶段过渡到“我们致力于实现这一目标”的预览版。这个框架名为Blazor,因为它在浏览器中运行,并利用了一个名为 Razor 的模板系统或“视图引擎”,促成了这个.NET 开发人员几乎放弃了的场景。它不仅允许开发人员使用 C# 构建客户端代码(不需要 JavaScript),还允许开发人员在没有插件的情况下在浏览器中运行现有的.NET 标准 DLL。

Blazor 有两种托管模式。本文主要关注客户端版本。你可以阅读“Blazor 服务器端托管模型”了解更多关于服务器端版本的信息。

Silverlight 的希望
在任何地方运行.NET 的梦想始于 2006 年,当时有一个名为“Windows Presentation Foundation/Everywhere(WPF/E)”的应用程序框架以 Silverlight 的形式向公众发布。第一个版本支持通过 WPF 引入的声明性用户界面,即可扩展应用程序标记语言(Extensible Application Markup Language,简称 XAML)。该平台提供了对 UI 元素的细粒度控制,并提供了自己的文档对象模型(DOM),可以通过 JavaScript 访问。

当 Silverlight 2 在 2008 年发布时,它通过一个作为浏览器插件运行的公共语言运行时(CLR)实现.NET 的完全支持,从而加快了采用速度。开发人员可以使用任何.NET 语言来构建 Web 应用程序,利用成熟的数据绑定模式,如 Model-View-ViewMode(MVVM),并使用 REST 或 Windows Communication Foundation(WCF)客户端与 Web API 通信。看起来,.NET 开发人员可以摆脱 JavaScript 的束缚,不用再担心跨浏览器测试,而是专注于一个具有公共代码库的平台来交付他们的应用程序。

Silverlight 开发者不知道的是,2007 年对于这个平台来说是艰难的一年。两个看似不相干的事件发生了,最终导致了它的灭亡。首先,Web 超文本应用技术工作组(WHATWG)和万维网联盟(W3C)之间开始着手合作编写将于 2008 年发布的 HTML5 规范初稿。

第二,2007 年 6 月 29 日,苹果发布了 iPhone。

每隔一段时间,我们就会有一件革命性的产品横空出世,并彻底改变一切。
——史蒂夫•乔布斯

比赛开始了。手机几乎是在一夜之间从带有联系人列表的翻盖手机发展到带有游戏和内置网络浏览器的便携式电脑。在很短的一段时间内,Silverlight 的未来似乎充满了希望。微软对 iPhone 的回应是 Windows Phone 7,支持以 Silverlight 作为开发平台。Chrome 支持即将到来。如果微软能够找到一种将 Silverlight 应用到 iPhone 和 Android 手机上的方法,那么“一次编写,到处运行”的圣杯将最终被发现。

只是,它没有找到。

出于许多原因,包括运行“浏览器中的虚拟机”的安全性考虑,以及潜在的电池消耗,通向浏览器插件的大门砰地关上了,特别是在移动设备上。业界开始期待 HTML5 在打造移动体验方面的前景。微软改变了自己的关注点,到 2011 年 Silverlight 5 发布时,大多数开发人员已经看到了不祥之兆:不会再有新版本了。

HTML5 和 JavaScript 继续赢得 Web 开发人员的青睐。jQuery 等工具对 DOM 进行了标准化,使构建多浏览器应用程序变得更加容易,同时,浏览器引擎开始采用通用的 DOM 标准,使“一次构建,到处运行”变得更加容易。Angular、React 和 Vue.js 等前端框架的爆炸式增长使单页应用程序(SPA)成为主流,并巩固了 JavaScript 作为浏览器操作系统首选语言的地位。

JavaScript 即平台
2013 年 3 月,asm.js正式推出。其文档把它描述为JavaScript 的一个严格子集,可以用作编译器的一种低级、高效的目标语言。该规范本质上定义了一组 JavaScript 约定,这些约定使通过提前编译优化代码成为可能,并提供了强类型(JavaScript 本身是一种动态语言)和基于堆的内存模型。

Asm.js 的推出使将 C/C++ 代码编译成 JavaScript 成为可能,从而开启了一个新的可能性领域。对约定的限制使得“支持 asm.js”的引擎可以有效地将 JavaScript 编译成高性能的本地代码。为了更好地理解这是如何实现的,请考虑下面的 C 代码片段:

int find(char *buf, char test) {
char *cur = buf;
while (*cur != 0 && *cur != test) {
cur++;
}
if (*cur == 0) {
return -1;
}
return (cur - buf);
}
该代码有效地扫描一个字符串,寻找标记其结束的测试字符或零字节,并计算偏移量。C++ 已经可以使用一个名为Clang的工具编译成字节码,该工具与LLVM 工具链兼容。LLVM 是一组支持快速跨平台编译代码的技术。一个名为Emscripten的项目利用该工具链来生成 asm.js。

使用 Emscripten 编译 C++ 代码可以生成几十行高度优化的 JavaScript。以下代码经过简化,用于说明生成的内容:

function find(buf, test) {
buf = buf|0;
var cur = buf|0;
var result = -1|0;
while (1) {
var check = HEAP8[cur>>0]|0;
var foundZero = (check) === (0);
if (foundZero) {
break;
}
var foundTest = (check) === (test|0);
if (foundTest) {
result = (cur - buf)|0;
break;
}
}
return result|0;
}
生成的 JavaScript 与所有浏览器兼容并且运行良好。带零操作的异或(|0)可以很容易地将任何数字转换为带符号整数。在较老的浏览器中,这可以确保数字没有小数部分。在现代浏览器中,该约定可以提前通知编译器使用 32 位整数(使数学运算更快),而不是默认的 64 位浮点值。0 右移(>>0)可以防止溢出,它还声明了一个“索引”整数类型,该类型在 HEAP8 上迭代,而 HEAP8 是一个可以在 asm.js 中使用的类型化的字节缓冲区。

在 asm.js 中没有定义 for 循环。所有内容都被转换为 while(1) 循环。这使得应用编译器优化变得更容易。这些优化非常有效,以至于一个团队能够将 Unreal 4 引擎移植到 Web 浏览器中,以近乎原生的性能直接运行 3D 第一人称视角游戏。

WebAssembly:新希望
时间很快来到 2017 年,WebAssembly发布了,这是一种基于栈的虚拟机的二进制指令格式。WebAssembly 提供了一个可移植的编译目标(简称 Wasm),与 asm.js 相比,它有几个优点:

作为字节码格式,不需要解析脚本和预编译来进行优化。代码可以直接翻译成本机指令。与 asm.js 相比,加载和开始执行代码的启动时间要快几个数量级。
字节码格式是一种更紧凑的代码交付方式。
Wasm 实现了自己的指令集,因此不受 JavaScript 语言的限制。
任何编译成 asm.js 的代码都可以把 WebAssembly 作为目标。对于前面的示例,编译器标志的一个简单修改就会生成一个扩展名为.wasm 的文件。该文件只有 116 字节长。尽管该文件包含字节码,但也存在代码的标准化文本表示形式,名为WebAssembly 文本格式。这是 WebAssembly 中 find 模块的文本表示:

(module
(type $t0 (func (param i32 i32) (result i32)))
(import "env" "memory" (memory $env.memory 256 256))
(func $a (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
(local $l0 i32) (local $l1 i32) (local $l2 i32) (local $l3 i32)
get_local $p0
set_local $l0
loop $L0
get_local $l0
i32.load8_s
tee_local $l2
i32.eqz
set_local $l1
get_local $l0
i32.const 1
i32.add
set_local $l3
get_local $l1
i32.const 1
i32.xor
get_local $p1
i32.const 24
i32.shl
i32.const 24
i32.shr_s
get_local $l2
i32.ne
i32.and
if $I1
get_local $l3
set_local $l0
br $L0
end
end
i32.const -1
get_local $l0
get_local $p0
i32.sub
get_local $l1
select)
代码大小进行了优化,因此函数被重命名为了 a。

WebAssembly 现在是 1.x 稳定版,支持所有的现代浏览器,包括手机。若干语言都以 Wasm 作为有效的编译目标。你可以使用 C、C++、Go、Rust、TypeScript 和许多其他语言来构建 WebAssembly 程序。它已经应用于计算机视觉、音频混合、视频编解码器支持、数字信号处理、医学成像、物理模拟、加密、压缩等解决方案中。

但是 C# 呢?

在 WebAssembly 推出之后,将. NET 框架的工作版本(包括它的公共语言运行时)移植到 WebAssembly 上运行的工作就立即开始了。

这一努力取得了成功。

浏览器和 Razor 视图引擎
2017 年底,微软软件工程师 Steve Sanderson 在他的个人博客上宣布了 Blazor 的消息。当时,它“只是一个实验”,并不是正式产品。它始于这样一个问题:“我们如何让.NET 在 WebAssembly 中运行?”第一个答案是比较老的简化版.NET 运行时,他能够在几个小时内将其编译成 Wasm 二进制文件。.NET 本身在浏览器中并不是非常有用:你需要一个 UI 和某种与用户交互的方式。Razor 文件将标记和 C# 结合起来创建 Web 模板,基于这项扎实的工作,Blazor 添加了大量的服务,从数据绑定和依赖注入到可重用组件、布局,以及调用 JavaScript 和从 JavaScript 调用。所有这些服务结合使得使用.NET 和 C# 构建单页面应用程序(SPA)成为可能。

为什么会有人在意呢?开发人员最初对 Blazor 的反应非常积极,这主要是因为:

它允许开发人员使用他们已经熟悉的语言(C#)和框架(.NET)来构建以前深深扎根在 JavaScript 中的客户端应用程序。
它可以在所有现代浏览器中运行,包括移动浏览器,而且不需要插件。
它使开发人员能够进入.NET 生态系统并“按原样”使用现有的库。例如,如果你正在构建一个使用 Markdown 的博客引擎,那么你可以为现有的 Markdown 引擎安装 NuGet 包,并将 Markdown 直接转换为 HTML,以便在浏览器中预览。
.NET 的性能会随着时间的推移不断提高,因此在浏览器的 Wasm 上运行已经足够了。
Blazor 是一个真正的单页应用程序,它从一组静态资产运行,可以使用Azure Storage 静态网站等服务以非常低的成本托管这些静态资产。
现在,你已经了解了 Blazor 背后的历史和动机,让我们来研究一些技术细节。

本文中的所有代码示例都可以在Blazor WebAssembly GitHub 存储库中找到。

安装 Blazor 并开始使用所需要了解的所有内容都可以在Blazor 入门这篇文章中找到。在安装了 Blazor 之后,你可以选择只创建客户端或带有ASP.NET Core后端的客户端。对于现有的基于 MVC 的服务器端项目来说,该项目看起来非常熟悉。但是,生成的 DLL 直接加载到浏览器中,并由.NET 的 WebAssembly 版本运行。

 

Mono.js JavaScript 动态加载 mono.wasm 并开始在浏览器中运行.NET。其余的加载是组成应用程序的实际 DLL 文件。

浏览器中的 C#(带依赖注入)
默认模板包含一个获取模拟天气信息的页面。这是 Razor 视图,完全由 Wasm 在客户端上渲染。

<h1>Weather forecast</h1>

<p>This component demonstrates fetching data from the server.</p>

@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<tableclass="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
在模板的上部,一组指令决定了页面的路径,声明了一个 using 指令,并使用依赖注入来获取.NET Framework 的 HttpClient 副本,该副本可以在浏览器中使用。
@page "/fetchdata"
@using GetStarted.Shared
@inject HttpClient Http
最后,页面上的一小段代码嵌入到 @functions 块中。这里需要注意的是,代码完全是 C# 的。你可以使用熟悉的 HttpClient 执行网络操作,并且支持 async/wait。

WeatherForecast[] forecasts;

protected override async Task OnInitAsync()
{
forecasts = await Http.GetJsonAsync<WeatherForecast[]>("api/SampleData/WeatherForecasts");
}
视图模板渲染一个页面,但是控件呢?

可重用组件
Blazor 基于分层组件的可组合 UI。天气预报组件与其他组件的唯一区别是提供路由的页面指令。下面是一个名为 LabelSlider.razor 的组件的模板,使用一个显示当前值的 span 扩展内置的 HTML Input Range。

<inputtype="range"min="@Min"max="@Max"bind-value-oninput="@CurrentValue"/>
<span>@CurrentValue</span>
绑定语法的格式为 bind-{property}-{event}。事件是可选的,触发事件时绑定会更新。如果没有这个,滑块只会在用户停止移动滚动条时更新 span。通过连接到 oninput,该值将随着滑块的移动而刷新。

关联的代码暴露了参数,这些参数允许父组件设置最小和最大范围值,并将数据绑定到当前值。Action 属性暴露一个与 CurrentValue 关联的事件,并按照约定将其命名为 CurrentValueChanged,以方便双向数据绑定(父组件可以“侦听”更改事件并相应更新绑定值)。

[Parameter]
int Min { get; set; }

[Parameter]
int Max { get; set; }

private int _currentValue;

[Parameter]
int CurrentValue
{
get => _currentValue;
set
{
if (value != _currentValue)
{
_currentValue = value;
CurrentValueChanged?.Invoke(value);
}
}
}

[Parameter]
Action<int> CurrentValueChanged { get; set; }
注意,没有使用 Parameter 属性标记的属性只对组件可见。组件重用非常简单,只需把组件名置入标签并提供必要的参数,用法如下:

<LabelSlider Min="0" Max="99" bind-CurrentValue="@currentCount"/>
在本例中,一个与父组件上的 currentCount 属性之间的双向绑定建立起来了。

使用现有的库
Blazor 的一个非常强大的优点是能够“按原样”集成现有的类库。例如,考虑一个使用Markdown的博客引擎,它能够在浏览器中预览生成的 HTML。在 Blazor 中构建它就像安装一个 NuGet 包一样简单,在本例中是开源的MarkDig处理器。然后,可以直接调用库:

var html = Markdig.Markdown.ToHtml(SourceText);
NuGet DLL 像其他项目引用一样被导入浏览器,并且可以从客户端应用程序调用。

调用 JavaScript/ 从 JavaScript 调用
Blazor 提供的一个重要服务是能够从.NET 调用 JavaScript,反之亦然。你希望从 Blazor 调用的任何 JavaScript 方法都必须能够从全局 window 对象访问,调用方法如下:
window.jsAlert = msg => alert(msg);
该互操作功能的使用方式如下:
await JsRuntime.InvokeAsync<object>("jsAlert", "Wow!");
InvokeAsync 方法支持传递和返回值,这些值将自动在 JavaScript 与.NET 之间转换并由 Blazor 运行时编组。使用 JsInvokable 属性来暴露 C# 方法,以便可以从 JavaScript 调用它。下面是一个例子,它封装了 Markdown 转换调用:
public static class Markdown
{
[JSInvokable]
public static string Convert(string src)
{
return Markdig.Markdown.ToHtml(src);
}
}
从 JavaScript 调用 DotNet.invoke 方法并传递程序集名称、暴露的方法名称和任何参数。

这使得扩展遗留应用程序和使用现有的 JavaScript 库成为可能。你甚至可以从 Blazor 应用程序调用其他 WebAssembly 模块。

Blazor 在发展
微软将 Blazor 移出了实验阶段,进入了官方预览版。使用组件模型进行服务器端渲染的 Blazor 版本将与.NET Core 3 的最终版本一起发布(请参阅.NET Core 路线图),客户端版本将在随后不久发布。还有工作要完成:调试体验极其有限,必须改进;有机会通过提前编译生成本机 Wasm 来优化代码性能;在将未使用的代码库发送到浏览器之前,需要从库中删除未使用的代码,从而降低总体大小(这个过程称为树抖动)。对 WebAsssembly 的兴趣和采用与日俱增,借助 Blazor,编写可以在任何地方运行的 C# 和.NET 代码的梦想终于实现了。

关于作者
Jeremy Likness是微软 Azure 的云推广专员。Jeremy 在 1982 年编写了他的第一个程序,并且已经开发企业应用程序 25 年了。他是四本科技书籍的作者,曾做过 8 年微软 MVP,是国际性的主题演讲家。Jeremy 的饮食以植物为主,在大部分空闲时间里,他都在太平洋西北部他的家附近跑步、徒步旅行和露营。关注Jeremy 的博客。

10
7

IIS如何设置反向代理

0
归档:2019年7月分类:LAMP开发

说到反向代理,很多人会想到nginx,其实iis也是可以实现方向代理的。

1.安装ARR、URL Rewrite(URL重写工具2.0)

注意英文和中文环境的对应:

Application Request Routing 对应中文 应用程序请求路由

URL Rewrite Module 对应中文 URL重写

下载安装ARR(也可以在IIS管理器中,Web平台安装程序->产品->搜索框中搜索"arr"->应用程序请求路由3.0 Beta->添加->安装): http://www.iis.net/downloads/microsoft/application-request-routing

下载安装URL Rewrite Module(也可以在IIS管理器中,Web平台安装程序->产品->搜索框中搜索"url"->url重写工具2.0->添加->安装): http://www.microsoft.com/en-us/download/details.aspx?id=7435

这里推荐使用IIS自带的Web安装包工具,微软还是很强大的。

2.启用ARR:双击ARR(Application Request Routing)->点击右侧Server Proxy Settings...->选中Enabel proxy->点击右侧“应用”;

3.启用URL重写,可以通过web.config配置,也可以通过界面设置(web.config最终也可以使用界面来查看和操作),比如web.config样例:

此时 www.baidu.com/api 或者 www.baidu.com/api/xxxx 都被代理到 www.proxy.com 或者 www.proxy.com/xxx,如果不想过滤掉"baidu",只需要把match url 改成 "^(baidu(/?|.*))$"

<?xml version=”1.0” encoding=”UTF-8”?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name=”bdProxy” stopProcessing=”true”>
<match url=”^baidu(/?|.*)$” />
<conditions>
<add input=”{HTTP_HOST}” pattern=”www.baidu.com” />
</conditions>
<action type=”Rewrite” url=”http://www.baidu.com{R:1}“ />
<serverVariables>
<set name=”HTTP_X_FORWARDED_HOST” value=”{HTTP_HOST}” />
</serverVariables>
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

这里要特别注意了:由于使用了变量 HTTP_X_FORWARDED_HOST,所以需要在 url重写->查看服务器变量->添加->添加HTTP_X_FORWARDED_HOST

01
7

Angular项目部署和跨域问题

0
归档:2019年7月分类:前端技术

采用Angular开发,部署的时候有两种方式:第一种是把打包后的文件直接发布到站点根目录下面,这种情况Angular的项目将作为一个独立的网站,那么必然会面对跨域的问题;第二种是把Angular打包后的文件放到站点根目录下的某个文件夹,这种情况不需要跨域,但是需要对路径做相关的配置。这里先讨论第一种情况。

一、开发环境

可以通过代理跨域,在angular项目中

1)在项目根目录新建proxy.config.json;

2)跟上面的proxyTable 一样配置好;

3)执行命令ng serve --proxy-config proxy.config.json即可

4)可以在package.json里配置下

"scripts": {
"start": "ng serve --proxy-config proxy.config.json"
},
然后执行npm run start

二、生产环境

上面的方式可以解决我们在Angualr项目中开发环境的跨域问题,但是无法解决生产环境上的跨域问题,有的时候生产环境上也需要处理跨域问题,这个时候proxyTable是不行的,需要通过Nginx或者IIS反向代理(你没有看错,IIS反向代理,而且效率也很高,下一篇我会讨论)。

反向代理作用

1) http服务器,可以独立提供http服务;

2) 虚拟主机:多个域名指向同一个服务器,服务器根据不同的域名把请求转发到不同的应用服务器;

3) 反向代理:负载均衡,将请求转发至不同的服务器

nginx的相关配置

location / {
root D:\cross-demo\dist #直接指向打包后的文件
index index.html index.htm;
}

location /api/ {
proxy_pass http://localhost:8888/; # 将地址代理到api上
}

25
6

关于简·奥斯汀和英文名著

0
归档:2019年6月分类:点滴生活

我读的第一本英文名著是简·奥斯汀的《理智与情感》,虽然我阅读过了7.5,但是刚开始前几章还是有些吃力,但是慢慢的越读越顺,一发不可收拾,然后一口气读完了《傲慢与偏见》、《艾玛》、《曼斯菲尔德庄园》、《劝导》和《诺桑觉寺》。对于她所有的作品,我也不免俗地最喜欢《傲慢与偏见》和《理智与情感》,这两部作品体现出作者年轻的心境,激烈、热烈和沉浸,而《艾玛》和《劝导》则是像小溪一样涓涓地流,静谧、热忱和稳健。期间了解到奥斯汀的个人经历以及她作品的影响力,她确实是可以和莎士比亚齐名的英国作家。

简·奥斯汀略传

一、出生

奥斯汀于1775年12月16日在史蒂文顿堂区出生,于次年4月5日公开洗礼。她在家里待了几个月后,被母亲送到住在附近的乳母伊丽莎白·利透伍德(Elizabeth Littlewood)家抚养,为期一年或18个月[19]。1783年,简和卡珊德拉按照家庭传统被送到牛津,在安·考利太太(Mrs. Ann Cawley)处接受教育,同年晚些时候跟着老师去了南安普顿。两个女孩都得了斑疹伤寒,简差点丧命。奥斯汀随后在家学习,直到于1785年和姐姐一起去寄宿学校。学校课程可能包含了法语、拼写、针线活、舞蹈和音乐,可能还有戏剧。至1786年12月,简和卡珊德拉已回到家,因为奥斯汀家无法承担同时送两个女儿上学。

奥斯汀接下来的教育是通过阅读书籍完成的,父亲及哥哥詹姆斯和亨利给予了指导。奥斯汀显然可以无限制地使用父亲和家庭友人沃伦·黑斯廷斯的图书室,两者加在一起有数量可观、内容各异的藏书。父亲也容许她有时尝试写涉及性爱的内容,并给姐妹俩的写作、绘画活动提供了价格不菲的纸张和其他材料。据传记作者帕克·赫南(Park Honan)所述,奥斯汀家的生活在“一个开放、愉快、无拘束的知识分子家庭氛围”中进行,与她家立场相反的政治或社会观点也在家中被提及和讨论[24]。奥斯汀在1786年从学校返家后,余生一直住在自己小家庭的生活范围内。

225px-CassandraAusten-JaneAusten(c.1810)_hires

奥斯汀受到教育还有私下的戏剧演出。在她7岁到13岁期间,她的家人和好友筹划上演了一系列舞台剧,包括理查·谢立丹的《情敌》(The Rivals)和大卫·加里克(David Garrick)的《上流社会》(Bon Ton)。虽然具体细节无从所知,奥斯汀很有可能参与了这些活动,一开始作为观众,长大些后成为参与者。这些戏剧大部分为喜剧,奥斯汀在喜剧和讽刺方面的天赋可能来源于此。

二、少年

英王亨利四世的画像,是奥斯汀姐姐卡珊德拉为《英格兰历史》所作插画(约1790年)。作者奥斯汀自称为“一位偏袒的、有成见的、无知的历史学家”。
可能早至1787年奥斯汀就开始创作诗歌、故事和剧本,作为她自己和家人的娱乐消遣[28]。她日后取了这些早期作品中的29篇汇编成了三本笔记本,它们如今被称为《少年作品》(Juvenilia),包括了1787年到1793年间的创作。手稿中有证据表示奥斯汀直到1809年至1811年间还在继续修改这些作品,她的侄子侄女表示最晚修改时间可至1814年。其中有一篇书信体讽刺小说题名为《爱与友情》(原文为Love and Freindship),嘲讽了流行的感伤小说(sentimental novel)[31]。还有一篇《英格兰历史》(The History of England)的手稿长34页,姐姐卡珊德拉为其添加了13幅水彩插画。

奥斯汀的《英格兰历史》戏仿了流行历史读物,尤其是奥立佛·高德史密斯的《英格兰史》(History of England,1764)。学者理查德·延金斯认为她的《少年读物》时常“喧嚣狂暴”、“无拘无束”;他将其与18世纪小说家劳伦斯·斯特恩和20世纪喜剧团体蒙提·派森的作品相比较。

三、成年

奥斯汀成年后继续住在父母家中,从事合乎她性别年龄和社会地位的活动:练习弹钢琴(fortepiano),辅助母亲和姐姐管理仆人,照顾家里分娩期的女性和临终的老人[34]。她把写好的短篇寄给刚出生的侄女范妮·凯瑟琳和简·安妮·伊丽莎白。她尤其为自己的裁缝手艺自豪。她也定期去教堂,频繁地和朋友与邻居来往 ,还在晚间给家人朗读小说(经常是她自己的作品)。邻里间的社交活动通常是跳舞,有时是晚饭后在某人家里即兴而起,有时是在市政厅的聚会厅(assembly rooms)举办的舞会[38]。她的哥哥亨利日后说:“简喜欢跳舞,并且很擅长。”

1793年,奥斯汀开始写一个短剧,随后弃稿。该剧本是一部“六幕喜剧”,后来被题名为《查尔斯·格兰德森爵士;又,那个高兴的人》(Sir Charles Grandison; or, The Happy Man)。她后来重拾该剧,在1800年左右完成。奥斯汀的课本中收录了她最爱的当代小说《查尔斯·格兰德森爵士的历史》(The History of Sir Charles Grandison,塞缪尔·理查森著,1753年)的节选,该短剧是对这部小说的戏仿[40]。 传记作者赫南猜测,奥斯汀在1789年写成《爱与友情》后不久,决定“为利润写作,把写故事作为她的主要追求”,也就是成为一名职业作家。大约从1793年起,她开始写更长,更复杂的作品。

1793年到1795年间,奥斯汀写了《苏珊夫人》,常被认为是她最精妙、最具雄心的早期作品。传记作者克莱尔·托马林(Claire Tomalin)认为书中女主人公是一个性方面的捕猎者,用她的才智和魅力操纵、背叛和伤害她的情人、朋友与家人,这一点和奥斯汀的其他作品不同。

四、作品

在查顿时,奥斯汀出版了四本小说,大体上反响都不错。通过哥哥亨利的关系,出版商托马斯·埃杰顿(Thomas Egerton)同意出版《理智与情感》[A]。小说于1811年10月出版,收获了好评,流行于舆论界人士间,首版在1813年中旬售罄[B]。小说的利润使奥斯汀取得了一定程度上的经济和心理独立。随后,埃杰顿在1813年1月出版了《傲慢与偏见》,是《第一印象》修改后的成果。他为这本书做了宣传,它立即大获成功,收到了三篇好评,销量也很好。到同年10月,埃杰顿开始了第二版的销售。1814年5月,《曼斯菲尔德庄园》出版。虽然它被评论界忽视,但受到大众欢迎,在六个月内全部卖出,给奥斯汀带来的收入比其他作品都高。

奥斯汀得知摄政王(即后来的乔治四世)欣赏她的作品,每个住地都有一套她的书。1815年11月,摄政王的图书管理员詹姆斯·斯坦尼尔·克拉克(James Stanier Clarke)邀请奥斯汀拜访位于伦敦的王室居所,并暗示她向摄政王献上即将出版的小说《爱玛》。尽管奥斯汀不喜欢摄政王,她无法拒绝这个请求。日后,她写了讽刺文《根据各方意见写就的小说计划》(Plan of a Novel, according to Hints from Various Quarters),是听取图书管理员为她将来作品提供的许多建议后作出的“完美小说”大纲。

1815年中旬,奥斯汀的出版商换成了更有名的约翰·默里。他于1815年12月出版了《爱玛》,于1816年2月出版了《曼斯菲尔德庄园》的第二版。虽然前者卖的不错,但后者销量惨淡,抵消了《爱玛》的大部分利润。这两本书是在她生前出版的最后两部小说。

在默里准备出版《爱玛》时,奥斯汀开始创作一部新小说《艾略特一家》(后来出版为《劝导》),在1816年7月完成初稿。在《爱玛》出版后不久,哥哥亨利从考斯比处买回了《苏珊》的版权。亨利的银行在同年3月破产,使他丧失了财产,深陷债务中,让兄弟爱德华、詹姆斯和弗兰克花去了大笔金钱。亨利和弗兰克无力再供养他们的母亲和姐妹了。因家庭财务危机,奥斯汀被迫推迟这两本已完成小说的出版。

14
6

Censys是一个可恨又可爱的搜索联网设备信息的新型搜索引擎, 利用他可以搜索到很多有用的信息, 比如通过ssl证书查找到CDN后面背后的真实IP.

kB8m4I.md

防范:
1, 建议屏蔽所有Censys段

https://censys.io/ipv4?q=censys.io

搜索censys的ip段并屏蔽.

如下面两个段

198.108.0.0/16
141.212.0.0/16

2, 或者屏蔽除了CDN以外所有IP访问. (推荐, 但请注意操作, 别把自己给屏蔽了)

CentOS 7 firewall防火墙屏蔽除指定IP外的所有IP

https://www.openos.org/post/340/

3, 如果是cloudflare用户, 也可以使用argo-tunnel

https://www.cloudflare.com/zh-cn/products/argo-tunnel/
https://developers.cloudflare.com/argo-tunnel/quickstart/

其他查询Cloudflare源IP的相关工具

http://www.crimeflare.org:82/
https://securitytrails.com

cloudflare 服务器IP地址

https://www.cloudflare.com/ips/

IPv4
173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/12
172.64.0.0/13
131.0.72.0/22

IPv6
2400:cb00::/32
2606:4700::/32
2803:f800::/32
2405:b500::/32
2405:8100::/32
2a06:98c0::/29
2c0f:f248::/32

13
6

mysql.sock默认的是在/var/lib/mysql, 如果发现确实是在该目录下,可以在[mysqld]下面加入mysql.sock的path
vi /etc/my.cnf(my.cnf也可能在其他路径下)

[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock

但是要保证使用mysql的用户具有对该目录的写权限,否则这样的改动由于权限限制仍然会报错。

所以为了避免权限问题也可以使用软链接为/var/lib/mysql/mysql.sock创建一个到/tmp/mysql.sock的联接

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

由于/tmp/文件夹默认对other有w权限,这样就可以避免权限问题。

此外,如果发现mysql.sock不在默认的/var/lib/mysql位置,一种解决方法是使用find命令搜索mysql.sock的位置,然后按前面两种解决方案挑一种做即可。

或者进行初始化:/usr/local/mysql/bin/mysql_install_db --user=mysql

12
6

東方之珠

0
归档:2019年6月分类:点滴生活

東方之珠

羅大佑 詞曲 《皇后大道東》

小河彎彎向南流

流到香江去看一看

東方之珠我的愛人

你的風采是否浪漫依然

月兒彎彎的海港

夜色深深 燈火閃亮

東方之珠 整夜未眠

守著滄海桑田變幻的諾言

讓海風吹拂了五千年

每一滴淚珠彷彿都說出你的尊嚴

讓海潮伴我來保佑你

請別忘記我永遠不變黃色的臉

船兒彎彎入海港

回頭望望 滄海茫茫

東方之珠 擁抱著我

讓我溫暖你那蒼涼的胸膛

For HK~

12
6

php-fpm找不到php-cgi.sock

0
归档:2019年6月分类:LAMP开发

这两天整理centos服务器,为了节省空间清理了不少文件,没想到不小心把/tmp/下的目录清除了,导致程序报错:php-fpm找不到php-cgi.sock。

php-fpm有两种listen方式,一种是通过端口来操作,一种是sock文件。

在nginx的server配置当中,如果设置为fastcgi_pass unix:/tmp/php-cgi.sock的话,有可能会出现502错误,这是以为nginx此项没有找到php-cgi.sock文件或者权限问题导致的,我们也可以改成fastcgi_pass:127.0.0.1:9000来修正这个错误 。

当我们用php-fpm来管理我们的php启动时,按照如下的配置,就会自动生成/tmp/php-cgi.sock文件,然后再访问的话就不回出现502 Gateway错误了。配置如下:

[global]
pid = /var/run/php-fpm.pid
error_log = /var/log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-cgi.sock
user = www
group = www
pm = dynamic
pm.max_children = 20
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

注:将php.ini里的cgi.fix_pathinfo设置为0,不然会有漏洞。

公告栏

欢迎大家来到我的博客,我是dodoro,希望我的博客能给你带来帮助。