SQL Server on Linux 初体验

最近才无意中发现,原来微软已经在去年(2016年)的3月8日(一个特殊的日子)发布了SQL Server on Linux 版本,已经过去一年多了,我竟然才知道,真是大意了。无论怎样,还是先大概的试一下吧,至少先把数据库安装上看看长什么样子的吧。
先说下安装的前提条件:

1.CentOS(没提版本,最好是7.0以上吧,不确定6.x及以下的可不可以)、ubuntu 16.04或ubuntu 16.10,或docker等
2.要求内存最低3.25G
3.如果没有突发内存(即swap分区),不能安装,如部分不带swap分区的VPS就不能安装SQL Server

整体来说要求很高,下面开始安装体验。
之前看过其他的文章,说需要openssl 1.0.2以上版本,实际测试过程中发现并不需要;另外安装过程大概需要几分钟至几十分钟时间不等,取决于你的网络状态,下载服务器位于国外,会比较慢,最好是在screen下安装。我是在CentOS 7.1环境下安装的,下面简单说下安装过程:
1.添加centos的SQL Server源的配置文件:

curl https://packages.microsoft.com/config/rhel/7/mssql-server.repo > /etc/yum.repos.d/mssql-server.repo

2.使用yum安装SQL Server:

yum install -y mssql-server

3.配置数据库:

/opt/mssql/bin/mssql-conf setup

之后设置数据库sa账号的密码,要满足一定的复杂度,一般大小写英文+数字+特殊符号,长度8位以上,都可以满足。
4.查看数据库状态:

systemctl status mssql-server

5.设置防火墙,把1433端口添加到例外:

firewall-cmd --zone=public --add-port=1433/tcp --permanent
firewall-cmd --reload

6.更新:

yum update mssql-server

7.卸载:

yum remove mssql-server

卸载之后删除数据库文件:

rm -rf /var/opt/mssql/

到这里数据库部分就安装完了,下面可以安装可选包:

一、安装SQL Server工具包:
1.安装
如果工具包是在其他Linux服务器上安装,需要先添加源:

curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/msprod.repo

之后安装:

yum install mssql-tools unixODBC-devel

2.更新:

yum check-update
yum update mssql-tools

二、安装全文检索:
1.安装:

yum install -y mssql-server-fts

2.更新:

yum check-update
yum update mssql-server-fts

以上过程完毕后,我们的数据库就彻底安装完了,下面是使用。
Linux下:
1.连接数据库:
需要安装SQL命令行工具,具体包含在前面安装的SQL可选工具包中,如果你已经安装了,那么使用下面的命令连接:

sqlcmd -S localhost -U SA -P '你的SA账号的密码'

2.查询可用的数据库:

SELECT Name from sys.Databases;
GO

3.创建数据库:

CREATE DATABASE testdb;
GO

4.选择指定的数据库:

USE testdb;
GO

5.建表:

CREATE TABLE inventory (id INT, name NVARCHAR(50), quantity INT);
GO

6.向表中插入数据:

INSERT INTO inventory VALUES (1, 'banana', 150);
INSERT INTO inventory VALUES (2, 'orange', 154);
GO

7.查询:

SELECT * FROM inventory WHERE quantity > 152;
GO

8.退出SQL命令行:

QUIT

Windows下连接:
可以使用SQL Server Management Studio (SSMS)、PowerShell和SQL Server Data Tools (SSDT)。
使用SQL Server Management Studio的话,需要安装新版本:https://go.microsoft.com/fwlink/?linkid=840957,之后使用方法与Windows下的一致。

以上。

在Apache下bW博客强制访问HTTPS

HTTPS已经是大势所趋了,而国内的网络环境更需要尽早的使用HTTPS,因为运营商太流氓,像DNS劫持什么的都是家常便饭了,如果运营商的DNS劫持系统被黑,黑客利用这个系统给网站加上点什么恶意代码,那损失就更大了。下面就说下在bW下,怎样强制访问https。
如果已经开启了伪静态(使用官方的规则),那么请使用下面的.htaccess文件内容:

RewriteEngine on
RewriteBase /

# RewriteCond %{REQUEST_FILENAME} -f [OR]
# RewriteCond %{REQUEST_FILENAME} -d
# RewriteRule ^.*$ - [L]

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

RewriteRule ^index/([0-9]+)/?$ index.php/$1/ [QSA,L]
RewriteRule ^category/([^/]+)/([0-9]+)/?$ category.php/$1/$2/ [QSA,L]
RewriteRule ^category/([^/]+)/?$ category.php/$1/ [QSA,L]
RewriteRule ^post/([^/]+)/?$ read.php/$1/ [QSA,L]
RewriteRule ^tag/([^/]+)/([0-9]+)/?$ tag.php/$1/$2/ [QSA,L]
RewriteRule ^tag/([^/]+)/?$ tag.php/$1/ [QSA,L]
RewriteRule ^page/([^/]+)/?$ page.php/$1/ [QSA,L]

如果未开启伪静态,请使用下面的内容:

RewriteEngine on
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

以上。

C# 实现的Javascript加密算法

不打算公开的,不过转念一想,反正又没人看,就发出来吧。
这是使用C#来实现的JS加密的,被加密的JS文件,代码需要写的规范,不能少了分号(;)等js中可能会被忽略的符号。
下面是完整代码,自己看吧

    public class JavascriptEncoder
    {
        public static string ENCODE_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$";
        public bool isDebug = false;

        public string JsEncode(string filename, int offset)
        {
            string js = WebTools.FileObj.ReadFile(HttpContext.Current.Request.MapPath(string.Format("/tmp/{0}", filename)));
            int length = js.Length;

            js = RemoveAnnotation(js);

            WebTools.FileObj.WriteFile(System.Web.HttpContext.Current.Request.MapPath("tmp.js"), js);

            StringBuilder sb = new StringBuilder(js);
           
            sb.Replace(@"\r", " "); //\n替换为空格
            sb.Replace(@"\n", " "); //\n替换为空格
            sb.Replace(Environment.NewLine, " ");
            sb.Replace((char)13, (char)32);
            sb.Replace((char)10, (char)32);
            sb.Replace(@"\", @"\\");    //\替换为\\
            sb.Replace(@"'", @"\'");    // '替换为\'
            js = sb.ToString();
            Regex regex = new Regex(@"([\w\$]+)");            
            MatchCollection matches = regex.Matches(js);
            string element = "";
            List<string> dict = new List<string>();
            int index = 0;
            StringBuilder encscript = new StringBuilder(js);
            StringBuilder dicttab = new StringBuilder();

            foreach (Match match in matches)
            {
                element = match.Groups[1].Value;
                index = dict.FindIndex(m => m.Equals(element));
                if ( index < 0)
                {
                    dict.Add(element);
                    index = dict.Count - 1;
                }
                encscript.Replace(element, Base64Encode(offset + index + 1));
                //regex.Replace(js,element, Base64Encode(offset + index + 1));
            }

            foreach(string d in dict)
            {
                dicttab.AppendFormat("{0}|", d);
            }

            string dictstr = dicttab.ToString().TrimEnd('|');   //字典字符串,删除最后一个|

            string res = formatCode(encscript.ToString(), dictstr, dict.Count, offset);

            return res;
        }

        /// <summary>
        /// 仿Base64
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        private string Base64Encode(int c)
        { 
            string res="";
            if (c < 0) throw new Exception("Error:Offset必须>=0.");
            if (c > 63)
                res = Base64Encode(c >> 6) + Base64Encode(c & 63);
            else {
                //为了配合appendReplacement方法的使用,将$替换为\$
                res = c.Equals(63) ? @"\$" : ENCODE_BASE64[c].ToString();
            }
            return res;
        }

        private string formatCode(string enc, string dict, int size, int offset)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("/* Power by Shoresoft.Cn */\neval(function(E,I,A,D,J,K,L,H){function C(A){return A<62?String.fromCharCode(A+=A<26?65:A<52?71:-4):A<63?'_':A<64?'$':C(A>>6)+C(A&63)}while(A>0)K[C(D--)]=I[--A];function N(A){return K[A]==L[A]?A:K[A]}if(''.replace(/^/,String)){var M=E.match(J),B=M[0],F=E.split(J),G=0;if(E.indexOf(F[0]))F=[''].concat(F);do{H[A++]=F[G++];H[A++]=N(B)}while(B=M[G]);H[A++]=F[G]||'';return H.join('')}return E.replace(J,N)}(");
            sb.Append("'" + enc + "',");
            sb.Append("'" + dict + "'.split('|'),");
            sb.Append(size + "," + (size + offset) + ",/[\\w\\$]+/g, {}, {}, []))");
            return sb.ToString();
        }

        /// <summary>
        /// 移除块注释
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private string RemoveAnnotation(string str)
        {
            string result = str;
            int start = 0;
            int end = 0;
            start = str.IndexOf("/*");
            end = str.IndexOf("*/");
            StringBuilder sb = new StringBuilder(str);
            if (start >= 0 && end>start)
            {
                sb.Remove(start, end - start + 2);
                return RemoveAnnotation(sb.ToString());
            }
            else
                return sb.ToString();
        }
    }

plupload多文件上传插件上传文件出现blob的问题处理

第一次使用plupload,上传文件后发现出现了一个blob文件,同时有的文件并没有被上传上,这是什么鬼,大概的搜了下,有遇到这个问题的,不过没有几个实质性的解决了的这个问题还是得靠自己了。

观察了下plupload的参数,有一项引起了我的怀疑,那就是chunk_size : '1mb',这项设置是什么鬼?查了下,chunk_size 用来设置块的大小,也就是把一个文件分成这么大的块来进行上传,看来问题就是出在这儿了。把这项设置的值加大,改成10mb或者100mb,再测试就没这问题了。

说下原因:
chunk_size 可以把文件分成多块来上传,这样可以绕过服务器允许的最大上传文件大小的限制,前提是需要上传接口支持文件续传。这个参数一般设置成与服务器允许的最大文件大小一致就可以了,或者是上传接口支持文件续传。

关于在IIS下的.NET网站出现应用池挂掉的Bug排查方法

环境:MVC4+IIS7

现象:测试的时候没有显现出来,当运行到生产环境出现大量访问量的情况下,会出现如下错误:


如果应用程序池挂掉的话,可以肯定的是,代码出现了很严重的错误,导致程序挂了,原因可能是死循环之类的。而又是个别现象引起,测不出来,只能想其他的办法了。

解决方法

首先,在服务器端:

1.开启Windows Error Reporting Service服务

2.执行下面的注册表脚本,在w3wp.exe程序挂掉的时候,自动将dump文件保存到D:\dumps文件夹中:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe]
"DumpFolder"=hex(2):64,00,3a,00,5c,00,64,00,75,00,6d,00,70,00,73,00,00,00
"DumpCount"=dword:00000002
"DumpType"=dword:00000002

3.记录出问题的w3wp.exe程序的pid,把生成的dump文件复制到本地,进行调试。

之后,在本机:

1.双击从服务器上拿下来的dump文件,使用vs(2013、2015等,2010、2008没有测试过)打开,之后会显示出异常摘要等信息。

2.点击右侧“操作”列中的“设置符号路径”菜单

3.通过菜单“视图”——“解决方案资源管理器”,打开解决方案管理器,之后打开解决方案的属性页,选择调试源文件,之后新加一行,选择对应的源代码(项目)文件夹,之后确定保存。

4.回到dump文件摘要页面,通过右侧“操作”菜单下的“使用仅限托管进行调试”菜单进行调试,可以定位到问题代码位置进行解决处理。当然根据问题的不同,还可以选择其他几个调试方法。

以上。

分类

最新文章

最近回复

  • 老徐: 已经加上了,抱歉才看到
  • 青山: 某种原因,暂停友链,抱歉。
  • 搬瓦工: 朋友 交换链接吗
  • 飞刀说: 名称:飞刀说 描述:...
  • 青山: 计划搬迁到腾讯云,正...
  • 河边的飞刀: 网站名称:飞刀说 网...
  • 老徐: 具体要哪个呢?
  • 老徐: 是不是有点老?
  • 青山: 哇,林志炫
  • 老白: 哇,这改的可以,能不...

归档

标签云

C# .net core asp.net 情感 SQL mongodb sql server EasyUI 安全 激活 linux 身份验证 https typecho .net sql注入 kms MVC IIS 高并发 IE 坑爹 服务器 mysql Oracle Combobox Datagrid 口语 数据抓取

其它