编程语言

各种编程语言的学习记录,有抄来的,有转来的,也有自己的,我觉得有用的都收了

Postgresql的pgadmin 4启动仅显示启动界面

MitchellChu 2017-06-30 其他技术 编程语言

今天安装postgresql 9.6之后,想使用pgAdmin 4打开进行管理,结果,pgAdmin 4打开后,仅显示软件启动界面,一直都没反应,启动界面用鼠标点击下就消失了,然后,然后就没有然后了。多次尝试都是这个情况。但每次启动界面出现后,进程管理器中是能够看到该进程。每启动一次,后台就会多出一个进程。 网上搜索一圈,在stackoverflow上看到说是要安装Java 8,虽然不太相信(pgAdmin使用的python,Flask),但抱着试试心态也装了个Java环境,但没任何作用。无奈之下,删除重装,问题依然如故。 最后的最后,在看pgAdmin的maillist的时候,发现有个问题:a bug report: pgAdmin4 only shows splashscreen, no UI, no error这个问题进去一看,和我的描述一模一样,前面的thread说是1.4要升1.5,可我的pgadmin已经是1.5。后面看到Mike Surcouf说的,是因为proxy的问题,瞬间醒悟。我一直都启用全局代理的呐,关掉关掉!! 解决方案: 在pgAdmin 4(v1.5)下,直接关掉代理,重新启动pgAdmin 4一切正常。

使用Scrapy构建自己的定制网络爬虫

MitchellChu 2016-03-12 其他技术 编程语言

爬虫(Web Spider or Web Crawler),顾名思义:一个在网站之间互相游走的虫子,专好觅食各类页面数据。随着Spider技术门槛降低,爬虫也开始泛滥起来,很多时候爬虫变成了扒虫。然,技术本无善恶,全在用者之念。此处不做过多计较,我们当下要讨论也仅仅是定制一款自己的网络爬虫,仅此。
爬虫就Mitchell个人经验来说分为两大类:
•通用型网络爬虫:该类爬虫并无明确采集目标,每个能够爬及的页面都是其采集对象,除非满足系统指定条件,否则此类爬虫基本全年无休的辛勤劳作。最常见的就是搜索引擎的爬虫,如:Google,Baidu,Yahoo,Bing等;
•专用型网络爬虫:这种爬虫仅针对自身偏好的网站或者主题作为采集目标,采集到的内容或涉及到的URL为此爬虫不感兴趣的,将被爬虫直接忽略,此类爬虫根据需要采集的目标多寡采集时间有所不同。如:各类垂直搜索站,金融爬虫,站点采集等;

BitConverter.IsLittleEndian在x86的机器上返回false

MitchellChu 2016-03-09 .NET技术 编程语言

在DEBUG写的.NET程序时,发现一个有趣的现象,就是本应该返回true的BitConverter.IsLittleEndian,返回的却是false!但在使用BitConverter之后,再次查看其值,却发现变成了正常的true状态。难道在X86的系统上存在两种状态? DEBUG的代码如下: ... // 前面没有使用BitConverter // DEBUG断点设置到这里的时候,可以看到是false的值 // BitConverter.IsLittleEndian // 如果使用BitConverter之后,得到的值却是true byte[] bdata = BitConverter.GetBytes(num); // 此时DEBUG中看到的是true. 但这明显不科学,首先BitConverter.IsLittleEndian在X86下应该是false,其次,不应该在一个系统内,同时出现true和false这两种状态。 抱着好奇的心态,翻开了源代码看了一下,看到如下代码: public static readonly bool IsLittleEndian = true; 赫然写着true啊!哪里来的false? 经过一番搜索,发现有这么一句: 通过调试器读取成员并不会触发执行成员的初始化代码。1 也就是说:通过调试器读取内存中的成员仅仅是读取到该对象的默认初始值而已。有这么一句话,解释起来就豁然开朗了。 为了验证这个说法的真实性,我们可以自己定义一个类来进行验证下: public static class DebuggerInitTester { public static bool BoolData = true; } 在DEBUG中我们可以看到,我们可以在没有调用前尝试获取到BoolData值,发现是true,并非是默认的false!这是什么情况,再仔细看了一遍代码,发现BitConverter里面有静态构造函数: static BitConverter() { // Note: this type is marked as 'beforefieldinit'. BitConverter.IsLittleEndian = true; } 在BitConverter中使用了静态的构造函数,而我们的并没有,看来问题在这里了,我们也改造下代码: static DebuggerInitTester() { DebuggerInitTester.BoolData = true; } 再次测试,确实,这个时候默认是false了。看起来问题就在这个静态构造函数了,原来不是一直听说static的是在加载前初始化了的么?看来并不是这个样子的,还是Too Young Too Simple! 看来是beforefieldinit引起的问题了(可参见Mitchell的另一篇关于BeforeFieldInit的文章) 如果没有BeforeFieldInit标记,则CLR会在第一次访问静态成员的时候调用静态构造函数对静态类中的字段进行初始化。比如,DebuggerInitTester这个类,我们定义了静态构造函数,因此将初始化BoolData的时机锁定了。 一切看起来是这样了,可再仔细看,又蒙了——压根就没有静态构造函数!BitConverter那个构造函数是自动生成的,是有BeforeFieldInit标记的。 .class public abstract auto ansi sealed beforefieldinit System.BitConverter extends System.Object { .custom instance void __DynamicallyInvokableAttribute::.ctor() = ( 01 00 00 00 ) } 根据BeforeFieldInit规则,也就是说BitConverter中IsLittleEndian的初始化会在访问前的任意时候完成,自然也可能会和有自定义静态构造函数那样在第一次访问的时候初始化,也许CLR对于BitConverter是这样处理。  如果能解释初始化时间点后,调试器读取成员不触发成员初始化代码倒是非常可以理解的,因为这样调试器的调试才安全可靠,不至于导致意外的发生(如:读取导致数据变化带来后继逻辑的)。   困惑 BitConverter由于使用了BeforeFieldInit标记,将初始化时机交给了CLR,也就是说这将导致IsLittleEndian初始化时间点不确定,很有可能就是在第一次访问的时候进行初始化的。 令人疑惑的是,为什么自定义的DebuggerInitTester类中的BoolData会那么快就完成了初始化呢?另外测试了好几次(其他类)均是非常早的完成初始化。 这里面到底是什么原因决定CLR来选择BeforeFieldInit标记过的类的初始化时机?    参考 Why does BitConverter.LittleEndian return false on my x86 machine? IsLittleEndian field...

C#的类型构造器和beforefieldinit标志

MitchellChu 2016-03-09 .NET技术 编程语言

首先让我们来看两个类型的定义: // 代码来自C# in Depth // 为了后继的讨论方便,对类名进行了更改(Test改为Test1和Test2) // —— Mitchell Chu class Test1 { static object o = new object(); } class Test2 { static object o; static Test2() { o = new object(); } } 这两个类,经常会被误认为是一样的,但实际情况是如何呢?让我们编译后,反编译后来看看他们产生的代码: // IL代码 // Test1和Test2在定义的时候出现了不同. // —— Mitchell Chu .class private auto ansi beforefieldinit ClassLibrary1.Test1 extends [mscorlib]System.Object { // Fields .field private static object o // Methods .method public hidebysig specialname rtspecialname instance...

用时间换空间的缓存算法

MitchellChu 2016-02-18 其他技术 编程语言

在使用Scrapy爬网站的时候,产生出来的附加产物,因为在Scrapy爬取的时候,CPU的运行时间紧迫度不高(访问频次太高容易被封禁),借此机会难得来上一下,让自己的内存解放一下。 算法原理: 通过将要缓存的数据用二进制展开,得到的二进制数据映射到缓存字段上,要检验是否已经缓存过,仅需要去查找对应的映射位置即可,如果全部匹配上,则已经缓存。 # 二进制就是个二叉树 # 如下面可以表示出来的数据有0, 1, 2, 3四个(两个树独立) 0 1 / \ / \ 0 1 0 1 因此对缓存的操作就转化为对二叉树的操作,添加和查找只要在二叉树上找到对应路径的node即可。   算法关键代码: def _read_bit(self, data, position): return (data >> position) & 0x1 def _write_bit(self, data, position, value): return data | value << position   实际使用效果如何呢? 在和Python默认的set相比较,得出测试结果如下(存取整型,不定长字符串,定长字符串): Please select test mode:4 Please enter test times:1000 ==================================================================================================== TEST RESULT:: ==================================================================================================== set() ...

Tornado中的secure cookie

MitchellChu 2014-08-13 其他技术 编程语言

在开始用Python的web框架Tornado的时候,以为Tornado中的get_secure_cookie和set_secure_cookie是用来设置加密后的Cookie信息的,但今天看了源代码之后,发现情况并非如想象的那样,secure_cookie在Tornado中的作用是对Cookie值进行签名而已。新版本(v4.0)和老版本(1.0)相较而言,虽然增加了第二个版本的secure_cookie,但功能仍然是一样。 在Tornado 1.0中,使用的是SHA1进行签名,而在Tornado 4.0中的新版本中使用的是SHA256进行签名,同时输出的Cookie格式有差异——开始第一个数字是版本号(secure cookie使用的version,而非Tornado的版本)。 新版本的set_secure_cookie设置Cookie的相关源码如下: ## Tornado 4.0中web.py的部分源码 ## set_secure_cookie相关的源码 MIN_SUPPORTED_SIGNED_VALUE_VERSION = 1 MAX_SUPPORTED_SIGNED_VALUE_VERSION = 2 DEFAULT_SIGNED_VALUE_VERSION = 2 DEFAULT_SIGNED_VALUE_MIN_VERSION = 1 class RequestHandler(object): def set_cookie(self, name, value, domain=None, expires=None, path="/", expires_days=None, **kwargs): name = escape.native_str(name) value = escape.native_str(value) if re.search(r"[\x00-\x20]", name + value): raise ValueError("Invalid cookie %r: %r" % (name, value)) ...

Python用fork来创建子进程

MitchellChu 2014-07-02 其他技术 编程语言

今天看到别人的源代码中有fork子进程来操作数据。但是由于fork之后,没有及时的退出,导致系统中的Python进程越来越多,子进程越来越多了。自己随手写了Python下fork进程的测试代码(来说明这个问题不一定完全合适): def fork(a): def now(): import datetime return datetime.datetime.now().strftime("%S.%f") import os import time print now(), a if os.fork() == 0: print '子进程[%s]:%s' % (now(), os.getpid()) while 1: a-=10 print '子进程的a值[%s]:%s' % (now(), a) ...

Python函数的各种参数(含星号参数)

MitchellChu 2014-06-23 编程语言

Python中函数的参数有4种形式,分别是: 位置或关键字参数(Positional-or-keyword parameter) 仅位置的参数(Positional-only parameter) 任意数量的位置参数(var-positional parameter) 任意数量的关键字参数(var-keyword parameter) 第一种:位置或关键字参数 这种参数是Python中默认的参数类型,定义这种参数后,可以通过位置参数,或者关键字参数的形式传递参数: ## 位置或者关键字参数 ## 这个是Python的默认参数类型 ## 示例:arg2提供了默认value def func(arg1, arg2="World!"): print arg1, arg2 ## func可以通过位置参数形式调用 func("Hello", "MitchellChu") ## 也可以通过关键字参数的形式来调用func func(arg1="Hello", arg2="World!") ## 当然,混合的方式也是完全没有问题的 func("Hello", arg2="World!") ## 不过如果你不能将关键字参数优先于位置参数传递给函数(方法) ## 这个调用方法是不能接受的,因为优先级不一样.后面会说 func(arg1="Hello", "World!") ## ERROR  第二种方式:仅适用位置参数的形式 这种形式在需要将参数传递给函数(方法)时,仅能通过位置参数的传递方式。这种形式对于Python的开发者来说,暂时并没有办法使用。这种形式现在仅存在Python的很多内建的函数上: ## Positional-only parameter has no syntax to define ## 虽然无定义方法,但内建的很多函数都是仅接受位置参数的 abs(-3) ## correct abs(a=3) ## wrong ## Traceback (most recent call last): ## File "<stdin>", line 1, in <module> ## TypeError: abs() takes no keyword arguments pow(x=2,y=3) ## Traceback (most recent call last): ## File "<stdin>", line 1, in <module> ## TypeError: pow() takes no keyword arguments pow(2,3) ## 8  第三种:任意数量的位置参数(带单个星号参数) 任意数量的位置参数在定义的时候是需要一个星号前缀来表示,在传递参数的时候,可以在原有参数的后面添加任意多个参数,这些参数将会被放在元组内提供给函数(方法): ## var-positional parameter ## 定义的时候,我们需要添加单个星号作为前缀 def func(arg1, arg2, *args): ...

感叹号提高Bash下效率——历史扩展(bang命令)

MitchellChu 2014-06-03 Unix & Linux 编程语言

前一篇中介绍了在Bash下用快捷键来提高工作效率,而在Bash下要高效的工作,不仅仅可以从快捷键的方式来达到,Bash下还有很多其他方式,比如,使用别名,在之前的使用一些Shell下的特殊符号等,都能够一定程度的简化操作。而在Bash下还有另外一类——历史扩展,如果应用的当也能很大程度提高操作效率,嗯!Linux下你要放这么些代码,也显得很酷! 历史扩展(History Expansion)又被称为Bang(!)命令1,历史扩展是bash将历史命令转换到可执行命令的过程。Bash下的History库提供了一个与csh下历史扩展类似的历史扩展功能。历史扩展中操作历史命令一般有两个部分: 首先要从历史命令中找出相对应的命令,被选择到的命令我们称作为Event(条目),比如上面的Bang Bang(!!),就是选择最后一条命令; 选择选定行的部分或全部文本以包含到当前行中。要操作的条目(Event)Bash将其拆分成了Words(词),命令中的Words是靠空格来分割的,我们就可以使用修饰符(Modifiers)来调整Words以符合我们的要求。注意:Words并不是英文单词,而是一个字符序列而已。 例子: cat /tmp/cat.cat.txt ##这个是cat出cat.cat.txt的内容 !:0 !*:gs/cat./echo. ##获取命令,参数中的cat.换成echo. ##变成/tmp/echo.echo.txt内容. ## 第二个命令中: ##我们首先是选出命令!!(!:0可以写成!!:0,!*同样可以写成!!*) ##有了命令之后我们选择第二步 ##利用0,选择出词(!:0选择出来的是cat) ##第三步是对词进行操作,这里是!*后面对参数进行了字符替换。 ##最后变成完成的命令了: ## cat /tmp/echo.echo.txt 条目标志符(Event Designators)条目标志符是一个到历史列表内一个命令行实体的引用,除非是绝对引用,不然条目的引用是相对历史列表中当前位置的。 条目标志符 条目标志符说明 ! ...

Linux下更高效的使用Bash——快捷键

MitchellChu 2014-06-03 Unix & Linux 编程语言

在Linux下,Bash的地位无可忽视,日常中涉及到Linux下的管理与操作基本都是在Bash中进行,因此,为了提高Linux下工作效率,自然而然的就变成了如何高效使用Bash的问题。虽然上一篇Shell下的一些特殊字符在使用的时候,能够一定程度上提高效率,后一篇关于Bash下的历史扩展也能很大程度提高效率,但Bash上的一些快捷键才是提高效率的最简单也是最直接方式。本文正是奔着这个目标来的! 快捷键的一些说明: C = CTL = CTRL = CONTROL:这个键是指PC键盘上的Ctrl键 M = ALT:这个键是PC键盘上的ALT键,如果你键盘上没有这个键,可以尝试使用ESC键代替 S = SHIFT:此键是PC上的Shift键 E = ESC:这个键是PC键盘上的ESC键,此键一般在键盘的左上角 DEL = Backspace:此键是是PC键盘上的Backspace键,一般位于主键盘区的右上角 文中"[]"括住的为快捷键内容,"-"两边的内容是按住左边键,再按右边键获得,","逗号两边的内容是先按左边键,松开后再按右边键。如:[C-v]是表示按下Ctrl键之后,不要松开,再按下v键。 默认的情况下,快捷键的组成格式是:<Ctrl | Alt | Esc>-[Shift-]<char>。即由Ctrl,Alt,Esc之一开头,中划线,Shift,中划线,和一个字符组成。其中,中括号内的Shift和"-"有时可省略。 默认情况下,快捷键只有最后一个为字符,其他的键值均为功能键 出现[C-?]这类快捷键,由于"?"是需要使用SHIFT按键才能获得的字符,因此此类快捷键默认使用的是[C-S-?] 要注意,在Bash里面,快捷键可能会被写成八进制或者十六进制的形式(跟在转义符后面); 脚本文件中的快捷键并不是总能起作用的。另外快捷键有个规律,Ctrl开头的快捷键一般是针对字符的,而Alt开头的快捷键一般是针对词的。 Bash下,如果使用的是shell脚本文件,快捷键不一定是有的时候会出现同一个快捷键有不同的表现,这种情况一般是由于Bash所处的模式不同而引起的,你可以通过set命令来调整模式: set -o emacs ##切到emacs模式 ## set -o vi ##切到vi模式 ## set -o ## 查看当前选项的设置状态 这个是Bash的option选项,你可以根据具体情况进行设置,本文使用的是emacs模式。 快捷键 快捷键说明 ...

Linux下高效编写Shell——shell特殊字符汇总

MitchellChu 2014-06-02 Unix & Linux 编程语言

Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好,往往能给我们起到事半功倍的效果,为此,特地将Shell里面的一些符号说明罗列成对照表的形式,以便快速的查找。看看你知道下表中哦你的哪些Shell符号呢? Shell符号及各种解释对照表: Shell符号 使用方法及说明 # 注释符号(Hashmark[Comments]) ...

Windows下Python,setuptools,pip,virtualenv的安装

MitchellChu 2014-01-16 其他技术 编程语言

Windows 2003平台,安装Python2.7.4,Python3.3,setuptools,pip,virtualenv。 安装Python2.7.4(当前版本是2.7.6),安装路径:C:\Python27 安装Python3.3.2,安装路径:C:\Python33 安装完毕之后,请勿将python的目录添加到系统的环境变量中。 优先安装setuptools后面的pip和virtualenv可以通过easy_install来安装。 setuptools可以在 http://pypi.python.org/pypi/setuptools 找到Windows的安装方式,现在官网建议使用的是下载ez_setup.py来安装。 下载完ez_setup.py,CMD下路由到下载目录,使用: C:\Python27\Scripts\python.exe ez_setup.py 下载完毕最新版本之后,系统会自动安装setuptools,安装完毕之后,会在scripts下会有一个easy_install.exe可执行文件。 当安装完毕setuptools之后,剩下的就比较简单了。 # 安装pip >C:\Python27\Scripts\easy_install.exe pip #安装完成pip之后,接着安装virtualenv >C:\Python27\Scripts\easy_install.exe virtualenv==1.10.1 安装完毕之后,同样在Scripts下面可以看到pip.exe和virtualenv.exe文件。需要注意,当前irtualenv的版本是1.11,安装的时候如果不设定==1.10.1,默认会安装最新版本,而1.11版本的virtualenv是有问题的,安装1.11后,在创建环境的时候会失败,报错: setuptools pip failed with error code 1.这个问题是1.11的本身的问题,用1.10.1版本,没有这个问题,所以我们安装的时候需要明确版本1.10.1。 安装完毕virtualenv之后,就可以创建虚拟环境了: #创建虚拟环境:先在cmd中路由到需要创建虚拟环境的目录下,创建的虚拟环境是在该目录下的一个文件夹 >c:\python27\Scripts\virtualenv.exe vProject 创建之后,我们可以检查下vProject下是否有文件,同时确认下vProject\Scripts\下是否有activate.bat和deactivate.bat两个文件。至此,虚拟环境就创建好了。运行虚拟环境只需要在CMD下运行activate.bat,并在当前窗口中进行操作——所有的操作此时都已经在虚拟环境中进行的。

使用mingw来编译boost jam

MitchellChu 2013-12-31 其他技术 编程语言

由于编译boost是需要使用bjam(本文是单独编译boost jam 3.1.18)的,而bjam的只是源代码而已,因此,编译boost的第一步就需要编译bjam。不过boost jam的编译还是相对简单,Windows下只需要double click根目录下的build.bat即可。当然,直接双击,在没有对应环境的前提下还是不可能编译成功的。如果是安装有Visual Studio(使用VC),一般是可以成功的,如果不成功到VC目录下运行VCVARS32.bat应该问题就不是很大了。当然,我们也可以指定编译选项 —— 而我机器上有Mingw和VS,默认使用VS,但我更想它使用Mingw来编译。 因此,在cmd下输入: #注意,需要路由到build.bat的这个目录下 #Build.bat 支持的参数有: # borland, como, gcc, gcc-nocygwin, # intel-win32, metrowerks, mingw, # msvc, vc7, vc8, vc9, vc10 build.bat mingw 要这个编译顺利进行,请保证下面这些地方已经处理妥当: 1. Mingw是安装在C:\MinGW下,如果不是,需要打开build.bat修改 ###在build.bat中找到下面的代码 if EXIST "C:\MinGW\bin\gcc.exe" ( set "BOOST_JAM_TOOLSET=mingw" set "BOOST_JAM_TOOLSET_ROOT=C:\MinGW\" goto :eof) #### 将路径修改成MinGW实际所在路径,如我的测试路径 if EXIST "D:\Env\MinGW\bin\gcc.exe" ( set "BOOST_JAM_TOOLSET=mingw" set "BOOST_JAM_TOOLSET_ROOT=D:\Env\MinGW\" goto :eof) 2. 保证MinGW的bin目录已经添加到系统环境变量中,因为后继编译需要使用gcc。 3. 如果是在Cmd中执行build.bat,请保证命令行的当前路径是build.bat所在根目录 —— 这在需要传递参数给build.bat的时候很重要。

MinGW生成C可执行文件,运行报dll丢失

MitchellChu 2013-12-30 其他技术 Unix & Linux 编程语言

MinGW下使用g++.exe/gcc.exe编译出来的可执行文件,在运行时报libgcc_s_dw2-1.dll丢失的错: 无法启动此程序,因为计算机中丢失libgcc_s_dw2-1.dll。尝试重新安装该程序已解决此问题。 这个问题的原因是因为gcc编译器在默认的情况下使用的不是静态关联,所以在执行文件下没有找到该DLL就会导致这个报错。最简单的解决方法是将此DLL直接放入到可执行文件的同目录下即可,当然,还有可能会报: 无法启动此程序,因为计算机中丢失libstdc++-6.dll。尝试重新安装该程序已解决此问题。 这种情况下,只能再次把丢失的DLL拷贝到可执行文件的目录下,这样问题就能得到解决。 虽然上面的方法能够解决这个问题,但每次新项目之后都需要将这些文件放入到部署文件夹。如果对这种方式不太满意,你可以考虑在编译的时候加入:-static-libgcc -static-libstdc++ g++.exe source_files -o target_file -static-libgcc -static-libstdc++ 这将直接告诉编译器,使用静态链接来处理关联。编译之后,就不需要再次将DLL文件拷贝到可执行文件的目录中。 如果你是使用CMake来编译,也可以在CMakeLists.txt中添加这两个参数: project(projectName) cmake_minimum_required(VERSION 2.8) #...... ### 添加下面这段代码 if(WIN32) set(CMAKE_CXX_FLAGS "-static-libgcc -static-libstdc++") endif(WIN32) ### 添加结束 #..... #其他代码 这样在编译的时候,就能自动添加这两个参数到编译器上。

MySql命令行执行多行命令编辑时非常有用的命令

MitchellChu 2013-10-17 其他技术 编程语言

在MySql命令行下进行多行命令编辑是很正常的一个操作,但有的时候,我们在执行多行命令编辑的时候,难免会有各种失误,一旦到此时,我们往往不得其法,其实了解一下MySql命令行的一些参数和提示的信息将会对多行命令编辑起到事半功倍的效果。 为了避免尽可能的错误,首先自然是要了解在多行命令行下,MySQL会给出的各种提示符的作用,下标是在MySQL命令行编辑时可能出现的一些提示符,小伙伴们,你震惊了吗? 提示符 含义 mysql> 准备好接受新命令。 ...

MySql获取数值类型的最大值的另类方法

MitchellChu 2013-10-16 其他技术 编程语言

在MySql中有的时候需要获取整数的最大值——比如在LIMIT的时候: -- 需要获取第5条记录到最后的所有记录 -- 不得不在最后输入一个最大值,这个值如果简单点我们希望是BIGINT的最大值 -- 不过,我们忘了BIGINT的最大值是? SELECT * FROM table_name WHERE condition=cvalue LIMIT 5, 838882; 当忘掉整数的最大值的时候,我们最简单的方法是使用~0,让后通过位移来取得各个整数类型的对应最大值: -- 通过~0来获取BIGINT的最大值(无符号) -- 通过~0的右移位数来获取各个整数类型的最大值 -- \G 是让每一列占据一行显示 SELECT ~0 as max_bigint_unsigned , ~0 >> 32 as max_int_unsigned , ~0 >> 40 as max_mediumint_unsigned , ~0 >> 48 as max_smallint_unsigned , ~0 >> 56 as max_tinyint_unsigned , ~0 >> 1 as max_bigint_signed , ~0 >> 33 as max_int_signed , ~0 >> 41 as max_mediumint_signed , ~0 >> 49 as max_smallint_signed ,...

MySql用户权限配置管理--查看,赋予,回收(GRANT,REVOKE)

MitchellChu 2013-06-19 其他技术 编程语言

  MySql用户管理使用CREATE USER,DROP USER,RENAME USER,SET PASSWORD等语法来完成,而MySql中用户权限配置管理中大部分都可以使用GRANT(赋予权限)和REVOKE(撤销权限)这两个语法来操作。其中,需要注意的是GRANT语句来赋予权限时,当被赋予权限的用户在系统中不存在时,会创建该用户,而后对该用户进行权限赋予。而REVOKE语句用来权限回收(撤销权限)时,即使被操作的用户所有的权限都被回收,但该用户并不会删除,要删除用户,请使用DROP USER或者直接到mysql.user中删除该用户。   GRANT语法: GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level TO user_specification [, user_specification] ... [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] [WITH with_option ...] object_type: TABLE | FUNCTION | PROCEDURE priv_level: * | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name user_specification: user [IDENTIFIED BY [PASSWORD] 'password'] ssl_option: SSL | X509 | CIPHER 'cipher' |...

WMI中的SQL,WQL简明教程系列5:工具,命名空间,路径

MitchellChu 2013-06-17 .NET技术 其他技术 编程语言

  WMI的WQL简明教程系列的前四篇文章[1,2,3,4]完全介绍WQL的各个基本知识,相信对于WMI的WQL的开发来说,这些知识已经足够我们步入WMI的世界,并能准确的驾驭WQL中的各个使用细节了。这些掌控的所有细节,自然只有在实战中进行发挥,才能体现我们学习WMI的WQL的作用。在实际中使用,我们还需要一些辅助的工具来进行开发。WMI的基本知识就像是武功修练中的内功心法,我们练得非常的醇厚,自然可以徒手独步武林,但在我们还没有练到随心所欲,化腐朽为神奇的境界,选择个武器共创天地也不失是个好主意,同样的道理,在全然彻底的了解WMI中的方方面面的时候,工具神码都是浮云,而在我们未能做到这个之前,选择一些工具来帮助我们就显得非常重要了。   由于MitchellChu也是初涉WMI不久,在WMI中的工具可能涉及不够全面,因此如果有不正确的地方,请各位不吝赐教。下面是用过的一些工具,以表格方式放出: 工具名称 描述 ...

WMI中的SQL,WQL简明教程系列4:语法

MitchellChu 2013-06-16 .NET技术 其他技术 编程语言

  WMI的WQL简明教程系列的前三篇文章[1,2,3]分别介绍WQL中的关键字,运算符和WMI中的类,由这三个东西,理论上已经能够完成WQL语句的编写了,不过也仅是理论上。就好比盖房子,理论上有水泥,钢筋和砖头是可以盖的,但实际上,并不是一定能盖出好房子的,甚至房子盖不成的也有,要盖好房子,还需要一个设计图纸,相对应的,咱们的WQL也同样,只有了一些基础的配件,有的时候并不一定能够装配出能正常运行的WQL语句。为了能够让我们能够组装出能够运行的WQL语句,就需要WQL的设计图纸——语法。   从WQL关键字篇我们能够看到,WQL并没有UPDATE,INSERT这类SQL中的语句,因此我们能够想象的到,WMI的WQL最主要的功能就是为了查询系统数据,因此我们学习WQL语法的时候,首先只要能够了解到查询数据的语法,基本上就能够应付大部分情况了,怎么样,还是相当的简单吧?那让我们开始吧,先看看下面的WQL: SELECT * FROM Device WHERE __CLASS = "Modem" OR __CLASS = "Keyboard"   从上面的语句中我们能够看到WQL的基本语法结构,其和SQL语法类似,但WQL中多处了ASSOCIATORS OF和 REFERENCES OF两个查询结构,具体的WQL查询分为Schema,Data和Event查询,他们的区别: 数据查询:用于获取类实例,它返回特定类的所有实例,包括各自的请求属性集 Schema查询:获取类定义,使用的基本语法的形式与其他类型的查询一样 事件查询:用于过滤出一个特定事件通知的属性。事件表征被管理环境的变更。 每个查询允许添加一些附加的操作符,如: WITHIN:指定轮询 GROUP:分组相同的事件 HAVING:过滤WITHIN和GROUP子句收集事件的通知。一般与NumberofEvents属性(收集事件数量)一起。这样可以侦测何时特定事件的数量超过了时间间隔中设置的极限。 下面是Schema和Data查询的语法结构: ; ----------------------------------- ; http://blog.useasp.net/ ; MitchellChu's Blog ; WQL tutorial ; WQL schema and data 查询的语法结构 ; ----------------------------------- DATA-WQL = ("SELECT" <PROPERTY-LIST> "FROM" <CLASS-NAME> <OPTIONAL-SEL-WHERE>)/ ("SELECT" ASTERISK "FROM" <CLASS-NAME> <OPTIONAL-SEL-WHERE>)/ ("SELECT" ASTERISK "FROM META_CLASS" <OPTIONAL-META-WHERE>)/ ("ASSOCIATORS OF {" <OBJECT-REL-PATH> "}" <OPTIONAL-ASSOC-WHERE>)/ ("REFERENCES OF {" <OBJECT-REL-PATH> "}" <OPTIONAL-REF-WHERE>) ;======================================== ; PROPERTY-LIST:属性列表 ; 属性列表有属性名组成,多个属性名使用逗号分隔 ; 如果奥全部选择,可以直接使用*(星号)代替 ;======================================== PROPERTY-LIST = <PROPERTY-NAME> <PROPERTY-LIST2> PROPERTY-LIST2 = [COMMA...

WMI中的SQL,WQL简明教程系列3:类

MitchellChu 2013-06-15 .NET技术 其他技术 编程语言

  系列1和系列2两篇文章比较简单的介绍了下WMI中WQL的关键字和运算符,有这两样东西我们就能够按照WQL的语法规则来写WQL语句了,等等,我们的WQL要操作的是什么?没错,我们会发现,在WQL语句中还缺少一个要操作的对象,这就是本文要说的,WMI中最重要的一个组成部分——类。用过SQL语句的都应该清楚,无论是在MS SQL 还是MySQL中,我们如果要从数据库中查询数据,必须需要在SQL语句中指定查询的对象——表。在WQL中类的作用就相当于表,我们需要的数据会在不同的类中,而要将数据取出来,就要去找到各种对应的类。   如果我们把WQL比作SQL的话,WMI你就可以粗略的看作是数据库了,而WMI中的类,就是数据库中的表了,而类中返回的各种实例对象,可看作是表中的数据了。这个类比不完全正确,当深入会发现,每当要查询数据的时候,我们需要连接到指定的命名空间下,连接成功后,才能进行类的操作。现在暂时不去细究,初步有个概念就好,等具体操作的时候我们就能够明白了。   那么,在WMI中,我们有多少类可以供WQL查询呢?这个Mitchell倒是没有具体去统计数字,但在普通的操作中,能够涉及到的却并不是十分的多,我们可以用表格的形式列出在Win32下面比较常用的一些类。表格如下: 类名 描述 Win32_Fan 系统风扇 ...

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。