LAMP+VPS+VPN+SSH

因为一些众所周知的原因,一直打算将服务器放到国外,周末的时候逛了国外的一些VPS服务商,选定了一款。原本服务器上的资料有7G多,包括一些站点和个人文档,当然也包括这个blog,这两天下班回到家后就SSH到VPS上折腾,现在终于算基本完善了,下面列出一些目前提供的服务。

VPN,国外的VPS当然第一件事就是架一个VPN,这样就可以自由FAN墙啦。VPN Service使用的是Pritunl。

因为公司的网络只提供80端口对外,无法在公司连到VPS,于是在VPS上提供了一个web-based ssh,使用的是shellinabox。

然后搭建了必须的3个服务:Apache2, MySqL, Php

Apache提供了Proxy reverse服务,以提供对Pritunl, shellinabox的代理访问

防火墙使用的是ufw.

[2015/12/1] Apache的并发性能不如nginx, 所以今天把apache换成了nginx,apache下的 url rewrite rule 很多不能在nginx下用,重写了一些url rewrite规则。

Markdown 语法

概述

宗旨

Markdown 的目标是实现「易读易写」。

可读性,无论如何,都是最重要的。一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成。Markdown 语法受到一些既有 text-to-HTML 格式的影响,包括 Setext、atx、Textile、reStructuredText、Grutatext 和 EtText,而最大灵感来源其实是纯文本电子邮件的格式。

总之, Markdown 的语法全由一些符号所组成,这些符号经过精挑细选,其作用一目了然。比如:在文字两旁加上星号,看起来就像*强调*。Markdown 的列表看起来,嗯,就是列表。Markdown 的区块引用看起来就真的像是引用一段文字,就像你曾在电子邮件中见过的那样。

兼容 HTML

Markdown 语法的目标是:成为一种适用于网络的书写语言。

Markdown 不是想要取代 HTML,甚至也没有要和它相近,它的语法种类很少,只对应 HTML 标记的一小部分。Markdown 的构想不是要使得 HTML 文档更容易书写。在我看来, HTML 已经很容易写了。Markdown 的理念是,能让文档更容易读、写和随意改。HTML 是一种发布的格式,Markdown 是一种书写的格式。就这样,Markdown 的格式语法只涵盖纯文本可以涵盖的范围。 Continue reading “Markdown 语法”

install gulp

1. Install gulp globally:

$ npm install --global gulp

2. Install gulp in your project devDependencies:

$ npm install --save-dev gulp

3. Create a gulpfile.js at the root of your project:

var gulp = require('gulp');

gulp.task('default', function() {
  // place code for your default task here
});

4. Run gulp:

$ gulp

The default task will run and do nothing.

To run individual tasks, use gulp <task> <othertask>.
在项目的根目录新建gulpfile.js,require需要的module

var gulp = require('gulp'),

    minifycss = require('gulp-minify-css'),

    concat = require('gulp-concat'),

    uglify = require('gulp-uglify'),

    rename = require('gulp-rename'),

    del = require('del');

压缩css

gulp.task('minifycss', function() {

    return gulp.src('src/*.css')      //压缩的文件

        .pipe(gulp.dest('minified/css'))   //输出文件夹

        .pipe(minifycss());   //执行压缩

});

压缩js

gulp.task('minifyjs', function() {

return gulp.src('src/*.js')

.pipe(concat('main.js'))    //合并所有js到main.js

.pipe(gulp.dest('minified/js'))    //输出main.js到文件夹

.pipe(rename({suffix: '.min'}))   //rename压缩后的文件名

.pipe(uglify())    //压缩

.pipe(gulp.dest('minified/js'));  //输出

});

执行压缩前,先删除文件夹里的内容

gulp.task('clean', function(cb) {

del(['minified/css', 'minified/js'], cb)

});

默认命令,在cmd中输入gulp后,执行的就是这个命令

gulp.task('default', ['clean'], function() {

gulp.start('minifycss', 'minifyjs');

});

 

Visual Studio 2012 / 2013 Update 1 2 3 4 5 Offline Installer

  1. Get the update from Microsoft here. (updated with Update 4 link)
  2. Save the file to a folder.
  3. open the folder
  4. Pro tip – Shift + right-click the background of the folder and choose ‘Open command window here’
  5. open_command_window
  6. in the command window type VS2013.4.exe /Layout
  7. (or VS2013.1.exe /Layout or VS2013.2.exe /Layout depending on your update)
  8. command_window
  9. It will then ask you where you would like to save and extract the files.
  10. vs2012_update_2_download_location
  11. This step will take some time depending on your download speed.  This is the step that adds time to the install when you choose the web installer.
  12. downloading_extracting_update_2
  13. You will now see a folder with the update installer along with all the source files.  You can now store this safe on a network share or your hard drive and update your installation of Visual Studio without downloading 2GB of files!
  14. vs2012_extracted
  15. This should work for any version of Visual Studio going forward.

Oracle Data Provider for .NET / ODP.NET connection strings

Using TNS

Data Source=TORCL;User Id=myUsername;Password=myPassword;

Example:

Data Source=localhost:1521/orcl; User Id=scott; Password=scott;

Using integrated security

Data Source=TORCL;Integrated Security=SSPI;

Using ODP.NET without tnsnames.ora

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));
User Id=myUsername;Password=myPassword;

Using the Easy Connect Naming Method (aka EZ Connect)

The easy connect naming method enables clients to connect to a database without any configuration.

Data Source=username/password@//myserver:1521/my.service.com;

Port 1521 is used if no port number is specified in the connection string.

Make sure that EZCONNECT is enabled in the sqlnet.ora file. NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

‘//’ in data source is optional and is there to enable URL style hostname values

Easy Connect Naming Method to connect to an Instance

This one does not specify a service or a port.

Data Source=username/password@myserver//instancename;

Easy Connect Naming Method to connect to a dedicated server instance

This one does not specify a service or a port.

Data Source=username/password@myserver/myservice:dedicated/instancename;

Other server options: SHARED, POOLED (to use instead of DEDICATED). Dedicated is the default.

Specifying Pooling parameters

By default, connection pooling is enabled. This one controls the pooling mechanisms. The connection pooling service creates connection pools by using the ConnectionString property to uniquely identify a pool.

Data Source=myOracle;User Id=myUsername;Password=myPassword;Min Pool Size=10;
Connection Lifetime=120;Connection Timeout=60;Incr Pool Size=5;Decr Pool Size=2;

The first connection opened creates the connection pool. The service initially creates the number of connections defined by the Min Pool Size parameter.

The Incr Pool Size attribute defines the number of new connections to be created by the connection pooling service when more connections are needed.

When a connection is closed, the connection pooling service determines whether the connection lifetime has exceeded the value of the Connection Lifetime attribute. If so, the connection is closed; otherwise, the connection goes back to the connection pool.

The connection pooling service closes unused connections every 3 minutes. The Decr Pool Size attribute specifies the maximum number of connections that can be closed every 3 minutes.

Restricting Pool size

Use this one if you want to restrict the size of the pool.

Data Source=myOracle;User Id=myUsername;Password=myPassword;Max Pool Size=40;
Connection Timeout=60;

The Max Pool Size attribute sets the maximum number of connections for the connection pool. If a new connection is requested, but no connections are available and the limit for Max Pool Size has been reached the connection pooling service waits for the time defined by the Connection Timeout attribute. If the Connection Timeout time has been reached, and there are still no connections available in the pool, the connection pooling service raises an exception indicating that the request has timed-out.

Disable Pooling

Data Source=myOracle;User Id=myUsername;Password=myPassword;Pooling=False;

Using Windows user authentication

Oracle can open a connection using Windows user login credentials to authenticate database users.

Data Source=myOracle;User Id=/;

If the Password attribute is provided, it is ignored.

Operating System Authentication is not supported in a .NET stored procedure.

Privileged Connections

Oracle allows database administrators to connect to Oracle Database with either SYSDBA or SYSOPER privileges.

Data Source=myOracle;User Id=myUsername;Password=myPassword;DBA Privilege=SYSDBA;

SYSOPER is also valid for the DBA Privilege attribute.

Runtime Connection Load Balancing

Optimizes connection pooling for RAC database by balancing work requests across RAC instances.

Data Source=myOracle;User Id=myUsername;Password=myPassword;Load Balancing=True;

This feature can only be used against a RAC database and only if pooling is enabled (default).

批处理

摘自网络

例一、先给出一个最easy的批处理脚本让大家和它混个脸熟,将下面的几行命令保存为name.bat然后执行(以后文中只给出代码,保存和执行方式类似):

ping sz.tencent.com > a.txt
ping sz1.tencent.com >> a.txt
ping sz2.tencent.com >> a.txt
ping sz3.tencent.com >> a.txt
ping sz4.tencent.com >> a.txt
ping sz5.tencent.com >> a.txt
ping sz6.tencent.com >> a.txt
ping sz7.tencent.com >> a.txt
exit

是不是都能看的懂?是不是很easy?但它的作用却是很实用的,执行这个批处理后,可以在你的当前盘建立一个名为a.txt的文件,它里面记录的信息可以帮助你迅速找到速度最快的QQ服务器,从而远离“从服务器中转”那一痛苦的过程。这里>的意思,是把前面命令得到的东西放到后面所给的地方,>>的作用,和>的相同,区别是把结果追加到前一行得出的结果的后面,具体的说是下一行,而前面一行命令得出的结果将保留,这样可以使这个a.txt文件越来越大(想到如何搞破坏了??)。By the way,这个批处理还可以和其他命令结合,搞成完全自动化判断服务器速度的东东,执行后直接显示速度最快的服务器IP,是不是很爽?后面还将详细介绍。

例二、再给出一个已经过时的例子(a.bat):

@echo off
if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif
a.bat

为什么说这是个过时的例子呢?很简单,因为现在已经几乎没有人用带广告的QQ了(KAO,我的QQ还显示好友三围呢!!),所以它几乎用不上了。但曾经它的作用是不可小窥的:删除QQ的广告,让对话框干干净净。这里用的地址是QQ的默认安装地址,默认批处理文件名为a.bat,你当然可以根据情况自行修改。在这个脚本中使用了if命令,使得它可以达到适时判断和删除广告图片的效果,你只需要不关闭命令执行后的DOS窗口,不按CTRL+C强行终止命令,它就一直监视是否有广告图片(QQ也再不断查看自己的广告是否被删除)。当然这个脚本占用你一点点内存,呵呵。

例三,使用批处理脚本查是否中冰河。脚本内容如下:

@echo off
netstat -a -n > a.txt
type a.txt | find “7626” && echo “Congratulations! You have infected GLACIER!”
del a.txt
pause & exit

这里利用了netstat命令,检查所有的网络端口状态,只需要你清楚常见木马所使用的端口,就能很easy的判断出来是否被人种了冰河。然这不是确定的,因为冰河默认的端口7626,完全可以被人修改。这里介绍的只是方法和思路。这里介绍的是方法和思路稍做改动,就变成可以检查其他木马的脚本了,再改动一下,加进去参数和端口及信息列表文件后,就变成自动检测所有木马的脚本了。呵呵,是不是很过瘾?脚本中还利用了组合命令&&和管道命令|,后面将详细介绍。

例四,借批处理自动清除系统垃圾,脚本如下:

Continue reading “批处理”

UML Class Diagram Relationship总结

在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)

1. 泛化(Generalization)

【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。 Continue reading “UML Class Diagram Relationship总结”

SQL Server调优系列进阶篇(如何维护数据库索引)

  1. SQL Server调优系列基础篇
  2. SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)
  3. SQL Server调优系列基础篇(联合运算符总结)
  4. SQL Server调优系列基础篇(并行运算总结一)
  5. SQL Server调优系列基础篇(并行运算总结篇二)
  6. SQL Server调优系列基础篇(索引运算总结)
  7. SQL Server调优系列基础篇(子查询运算总结)
  8. SQL Server调优系列进阶篇(查询优化器的运行方式)
  9. SQL Server调优系列进阶篇(查询语句运行几个指标值监测)
  10. SQL Server调优系列进阶篇(深入剖析统计信息)
  11. SQL Server调优系列进阶篇(如何索引调优)
  12. SQL Server调优系列进阶篇(如何维护数据库索引)

技术准备

数据库版本为SQL Server2012,前几篇文章用的是SQL Server2008RT,内容区别不大,利用微软的以前的案例库(Northwind)进行分析,部分内容也会应用微软的另一个案例库AdventureWorks。

相信了解SQL Server的朋友,对这两个库都不会太陌生。

一、创建索引

当我们要开始对表进行索引的创建的时候,首先明确的是,一张表内只能创建一个聚集索引,最多可以创建最多249个非聚集索引(SQL Server2005),在SQL Server2008以后聚集索引数提升至999个,上一篇文章我们知道对于聚集索引项一般要创建上,而非聚集索引项要根据日常的T-SQL语句进行选择。

关于索引的选择是一个很考验调优能力的事情,大部分的情况下优质的索引新建全靠经验而论,有兴趣的可以点击查阅我前面的一系列关于分析查询计划的文章,掌握住里面的精髓才能有的放矢。

当然,小白级别的也可以参照如下方法尝试进行创建:

由于SQL Server有着自己的一套调优技巧,所以在我们每次运行的T-SQL语句应该怎样优化,SQL Server是了如指掌的,所以它会将缺失的索引项进行记录,用于提示使用者,尝试去建立这些索引。

主要记录在以下几个DMV中

sys.dm_db_missing_index_details

sys.dm_db_missing_index_groups

sys.dm_db_missing_index_group_stats

sys.dm_db_missing_index_columns(index_handle)

sys.dm_db_missing_index_details
关于这些个DMV的使用,来举一个例子:

Continue reading “SQL Server调优系列进阶篇(如何维护数据库索引)”

周瑜故里游

在周瑜逝世1800年后的第一个春天,我们走进周瑜故里——安徽舒城县,来到周瑜的出生地——周瑜城。

周瑜是建安时期杰出的政治家和军事战略家,“赤壁之战”不仅奠定了三国鼎立的历史格局,也成就了这场战争的策划者、指挥者周瑜的军事伟业。周瑜也成为中国历史上妇孺皆知的历史人物。

“地以人显”,舒城因为出了周瑜这样的历史伟人,声名更加鹊起。

舒城在西周时为舒国,到春秋后期,舒国分列为舒、舒庸、舒鸠等近10个诸侯小国,历史上称“群舒侯国”。汉时为庐江郡舒县,庐江郡的郡治也在舒城。唐开元二十三年(739年)正式设立舒城县,至今县名未改,疆域基本稳定。

舒城地处江淮之间,大别山东麓,巢湖西滨,面积2100平方公里。西南为山地,山高林密,飞瀑流泉,有国家森林公园万佛山;中部为丘陵,盛产桑麻瓜果,有国家AAAA级旅游景区万佛湖,有西汤池温泉,有周瑜古城;东北为巢湖冲积平原,平畴沃野,水网纵横,“杭埠河畔好风光,十里荷花百里秧”,是久负盛名的鱼米之乡。悠久的历史,厚重的文化,秀美的山川,肥沃的田园,不仅哺育了西汉官办学校创始人文翁,三国周瑜,宋代大画家李公麟等伟大历史人物,也造就众多的自然人文旅游风景,因此,被誉为“安徽的北戴河,合肥的后花园”。

舒城最高点万佛山主峰海拔1539米。万佛山为大别山腹地,是南北植物分布的结合部。生长在这里的维管束植物就有147科、654属、1336种,其中香果树、银缕梅等珍稀植物有25种。这里栖息的野生动物有数百种,象金钱豹、穿山甲、娃娃鱼等国家保护动物就有数十种。

万佛山四季都是美景,我们来时正值春雨蒙蒙,漫山遍野是深红、浅白、淡紫的各色山花点缀于绿树丛林,如水墨画家的泼彩点染。花的芬芳、鸟的歌声给视觉、听觉、嗅觉极大的审美愉悦。峰之秀削,石之肖物,松树之奇特,瀑布之壮观,让人叹为观止。当登上主峰极顶,俯看大地,仰望蓝天,倍感宇宙之辽阔,山河之壮美!自豪与快慰油然而生。觉得自己不仅为大山增加了高度,也是人生的一次自我超越。

“仁者爱山,智者乐水”。国家AAAA级旅游风景区万佛湖,是集“仁”集“智”的自然山水,是理想的寻梦之地。她的美让人如梦如幻如痴如醉。

万佛湖又名龙河口水库。是上个世纪60年代,舒城人用肩挑手推,土法上马修建的大型水利工程。水面积50平方公里,库容9.2亿立方,湖岸线206公里。站在雄伟的拦洪大坝上,面对烟水大湖,遥望对岸峰峦叠嶂的群山,俯看万顷碧波中60多个绿岛、花坞,眼眸追逐着翩翩自由飞翔的沙鸥、白鹭……耳际萦回飘渺的晨钟暮鼓,以及水灵灵的秧歌水调,自然的松风、水声、虫鸣、鸟唱……以及驾一叶轻舟,陶醉于湖光山色……这一切,让你的心灵如这湖水一样清澈透明,身心像水中游弋的鱼儿,天空飞翔的鸟儿一样自有安详。

第三天下午,我们在舒城县文物管理所同志陪同下来到来到周瑜出生地周瑜城。史料记载,舒城周氏为江淮豪族。东汉中后期,周瑜的先人周荣、周兴、周景、周忠等皆为朝廷显宦,有的位列三公,周瑜的父亲周异曾为洛阳令,相当于今天北京市市长这样的高官。东汉后期,孙坚兴兵讨伐董卓时,一度移家舒城。周瑜与孙坚长子孙策同年所生,随结为异姓兄弟,周瑜将自家南大宅让给孙策一家居住。建安三年(198)孙策亲自接周瑜渡江,授其建威中郎将,时年周瑜二十四岁。孙策称赞他“英俊奇才”,吴人皆称周郎。

在与岁月的抗衡中,周瑜城显得有点苍黄,但突兀的土城仍然不屈不挠地固守着周氏家族的精神底色。周瑜城遗址坐落在一个岗丘上,南临杭埠河(古龙舒水),它的西面是著名的汉代水利工程七门堰。周瑜城面积约140亩,四个对称的城门豁口依然存在。城中有一高台地,为当年城中的主体建筑台基。县文管所同志介绍,城内曾出土过汉代筒瓦、板瓦等文物。环城四周是阡陌纵横的田园,平畴之上疏落点缀着绿树围合的村庄,一座掩映于桃花竹林中的村庄,据说就是小乔的出生地乔楼村。

我们伫立于周瑜城上遥思遐想——正当向晚,落入衔山,万佛湖的波涛山影飘渺在神秘的霞光烟云里,晚风拂过金黄的油菜碧绿的麦田,远山近树在雾霭炊烟中凝聚、流动、变幻着。九宫格似的田野上曾经有三座呈犄角之势的高丘,据说那是当年周瑜布阵练兵的练三墩。朦胧里,眼前便浮现周瑜设帐高丘,指挥三军演教的潇洒英姿,耳际依稀咚咚战鼓,啸啸马鸣的壮观场面……一辆卡车鸣着长笛,划破了千年沉寂,从古老的周瑜城边弛过。

明代以前,周瑜的形象是一位英俊奇才,胸怀大度,风流倜傥的英雄人物,特别是苏轼的《念奴娇·赤壁怀古》把周瑜描绘的完美至极。自从罗贯中的《三国演义》问世后,周瑜便被被歪曲成心胸狭隘,嫉才妒能的猥琐小人了。当今,主流媒体根据历史的真实,又恢复了周瑜的英雄本色,特别是新《三国》的播出,周瑜的风流潇洒英姿又鲜活在世人的心目中。

周瑜的确给舒城添了光彩,但自从《三国演义》流传于世,很多没有读过正史的人,往往认为周瑜就是嫉才妒能的小人,由此觉得舒城人也多少带点周郎的气息,怕与共事。可谓“一从《演义》书成后,说到周郎唯妒能”,这是周郎给舒城人带来的麻烦。《三国演义》是小说,不是信史,周郎也不是嫉才妒能的周郎,周郎仍然是舒城人心目中的美周郎。

《江表传》记载这样一个故事,东吴老将程普开始认为周瑜年轻,便居功自傲,多次在公众场合给周瑜难堪,但周瑜“折节容下,终不与校(较),普后自敬服而亲重之。”并对人说:“与公瑾交,若饮醇醪,不觉自醉。”故当时人们对周瑜就有“雅量高致、谦让服人”的评价。由此推想,当年三国交兵的赤壁之战本来在湖北的蒲圻(今天的赤壁市)县境,后因苏轼谪居黄州写下千古名篇《赤壁赋》,后人便以假认真,假赤壁装饰得金碧辉煌,游人如织,真赤壁却冷冷清清……我凝视缓缓东流的杭埠河水,聆听河水轻拍着城下的岩壁——这里不也曾被附会为“小赤壁”吗?并说破曹操的水军就是从这里开赴巢湖,再由巢湖开赴长江的。历史上也有几位文人墨客写下了不少诗赋,我想,他们中如果有一二位苏东坡那样的名人,这周瑜古城、这“小赤壁”也同样被装饰得金碧辉煌,游人如织呢!——据介绍,舒城县正在积极开发“周瑜城遗址公园”旅游项目,如果周瑜城遗址能达到科学合理的开发,这一历史人文景点融合舒城美丽的自然风光,定能成为安徽的一个旅游亮点。

明代胡守恒《登周瑜城》写道:“登城见古寺,慷慨吊周公。两汉余王业,三分定霸功。云平战士垒,花压美人宫。往问孙吴事,江南梦已空。”徘徊于古城废墟,追忆“小乔初嫁了,雄姿英发,谈笑间樯橹灰飞烟灭”,一个是明眸皓齿的美人,一个是金戈铁马的英雄,“曲有误,周郎顾”,可堪绝代风流啊!然而,“浪淘尽千古风流人物”,只留下“不见人提三尺剑,空闻屯聚八千兵”的古城废墟,只有这城下的流水,流去多少岁月,流去多少兴亡,还是那样年轻,那样欢快!

当我们依依不舍地离开周瑜城,一轮圆月已走进21世纪墨蓝的夜空。