其他技术

暂时未能找到对应分类的技术相关资料信息

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一切正常。

Python重新安装所有模块

MitchellChu 2017-03-10 其他技术

系统重装后,Python2.7也重装了,重装的时候,Python选的路径还是原来的,直接覆盖,因为很多packages,舍不得!但在使用命令行工具的时候,却报错: Fatal error in launcher: Unable to create process using '"' 处理的方法是将所有的python2.7下可以用命令行直接调用的包重新安装。也即Scripts文件夹下的exe对应的包重装,方法如下: @echo OFF REM 指定Scripts所在路径 set ScriptsHome=D:\Program Files\Python\2.7\Scripts REM 遍历文件,并获取文件名 for /F "delims=\" %%a in ('dir /b /a-d /o-d "%ScriptsHome%\*.exe"') do ( REM 调用pip install来重新安装, REM 注意::这里使用--force-reinstall参数 pip install %%~na --upgrade --force-reinstall ) 在重新安装的过程中,会有很多package提示没有(因为那时真的没有,有些包提供了几个命令行工具而已!=.=!!!),忽略即可,实在不放心,你可以尝试两遍上面的代码来重装,当所有的packages重新安装后,直接使用时将不会出现上面的错误。   TIPS:在安装的时候 ,如果有的包依赖了lxml的话,将会出现报错: Cannot open include file: 'libxml/xpath.h': No such file or directory ********************************************************************************* Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed? ********************************************************************************* 这个报错是因为lxml在编译安装(需要VC++的编译环境,没有的话,请先安装VCForPython27,微软官网下载)的时候需要libxml2的支持,然而,似乎没有简单的方法可以直接处理,因此,直接到这里1下载对应的whl文件来进行安装更合适。 pip install path\to\lxml.whl   当然,如果你pip都报错的话,自然需要先安装好pip这个命令在来操作上面这些了。   参考: 1. http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

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

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

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

FLV音频视频文件的加密解密方式

MitchellChu 2016-03-02 其他技术

在FLV文件结构一文中,我们已经了解了FLV文件的大致结构信息,同时在FLV文件校验一文中,我们可以完成对FLV文件的完整性进行校验。此文在这两篇文章的基础上尝试进行更深入一些的探讨——对FLV文件进行加密和解密操作。 在互联网时代,资源的分发已经变得非常容易,FLV也不例外,对于资源的版权方来说,分发难度的降低一方面降低了自身资源的传播成本,另一方面却由于没有良好的防止非法分发而带来对自身的利益侵害。稍稍驻步,我们就能看到已经有很多为保护版权而创造的各种方法,CSS。AACS,Key 2 Audio,Always-Online等等。本文作为保护FLV来说,也算是一种尝试,在实践中,灵活的使用也可一定程度保护资源的非法传播。下面让我们来简单聊聊:   Mitchell Chu 注:以下方法名称并非“官方”说法,而是自创,请注意!   第一式: 反位 反位的方法算是最基础的加密方式,原理就是将二进制中的比特位全部取反(注意:不是反码,是特定的异或操作)。代码如下: byte GetReverse(byte b) { return (byte)(b ^ 0xFF); } byte Encrypt(byte data) { return GetReverse(data); } byte Decrypt(byte data) { return GetReverse(data); } 加密: 对每个字节进行操作之后,我们就能得到一个被加密的新的FLV文件,此时,FLV文件的Header,Tag之类的已经全部被抹掉了,剩下的就是一堆数据而已。 解密: 解密此文件的方式非常简单,仅需要对FLV重新再来一遍异或操作即可得到原始文件。 优缺点:  这种加密解密方法的优点是,简单的没有负担,无需任何高达上的算法,不需要复杂的操作。但缺点是,只要有原始文件对比后,基本瞬间能了解加密算法,破解难度很低。 说明: 这种方法并非一无是处,相反,操作的恰当,还是有可为之处,比如,我们仅对某些敏感数据进行操作(哪些是敏感的?可以在FLV文件结构一文中找找:P),那么,在表面看起来这是一个完整(也可以是不完整)的FLV,但得到数据,没有得到具体算法的人拿到FLV也不再那么容易发现数据的加工之处。播放之时,却会因为数据的错误导致播放失败。 说到这里,看到网上曾经有了对FLV的加密方式是对每个字节进行-128,在此表示怀疑:此方法能否保证加密后的数据是真的能够被安全还原么?    第二式:对称加密 对称加密这个方法的原理是让合法用户在请求之后,系统同时发送解密密码,这样,用户在获得FLV资源的时候,同时拥有一个匹配的密码,这样,在播放之前,可以通过这个密码来得到正常的FLV源文件。 这个方法的实现种类很多,这里就不放出代码,只要是对称加密方式均可用在此处。 加密: 初始化密码,而后用对称加密算法+密码对FLV文件进行加密,得到加密后的FLV文件。 解密: 获得密码,而后用相匹配的对称加密算法+密码来完成对FLV的解密,得到正常的FLV文件。 优缺点: 如果不嫌事多,可以达到一人一码或者说一机一码(广告词啊,这是),但劣势也明显,一旦获得一次密码,也就丧失了对FLV的控制权,因为解密后,就是FLV原始文件嘛——所以,很多时候,要隐藏机密算法。 说明: 稍显复杂的一个算法,但在使用配套的客户端(Flash Player/PC 播放器等),还是能够比较好的完成对FLV的保护工作的,不同重点的防护是对自身加解密算法和FLV对应文件密码做保护,同时还得顾虑到解密的文件处理方式。   恩,本来还有第三式的,但还是到此为止吧,以免贻误众生。 使用上面的加密解密方法基本上已经能够完成对FLV的保护,当然,要保护FLV也不一定要使用加密方式,当年的Key 2 Audio不是通过创造多余的数据区来达到毁灭消费者的光驱么。 本人并不是积极的DRM(数字版权管理)拥护者,个人觉得适当保护对版权所有者,正版消费者有一定的益处,但过度的保护反而会让版权者迷失,而失去精进的动力,陷入过度的依赖DRM,反而可能会伤及正版消费者利益,比如:Online-Always的DRM,当年刺客信条的正版用户体验竟然不如盗版 。  

FLV文件完整性校验方法

MitchellChu 2016-02-28 其他技术

书接上回,我们讨论了FLV文件的结构,有了这些基础之后,我们就能够对FLV文件进行一些操作了,比如本文要讨论的——校验FLV文件的完整性。 完整的FLV文件应该按照FLV文件的结构提供完整的数据信息,如:FLV Header,FLV Body中的Previous Tag Size,Tag。那我们下面由简入繁的步骤来对FLV文件校验一番。 最简单的校验方法,仅校验FLV Header信息,如(.NET代码): public static bool IsValidFlvHeader(byte[] bytes) { if (bytes.Length != 9) return false; byte[] header0 = new byte[] { 0x46, 0x4C, 0x56 }; byte flvVer = bytes[3]; byte flvType = bytes[4]; byte[] header_offset = new byte[] { 0x00, 0x00, 0x00, 0x09 }; if (!header0.SequenceEqual(bytes.Take(3).ToArray())) return false; if (flvVer != 0x01) return false; if (flvType != 0x01 && flvType != 0x04 ...

FLV文件格式详解

MitchellChu 2016-02-28 其他技术

在集体挺进HTML5的时代,来讨论Adobe Flash相关的话题似乎有点过时,但现如今还是有很多的视频网站采用的是Flash播放器,播放的文件也依然还有很多是FLV格式,而且仅从一个文件格式的角度去了解和分析FLV应该也还说的过去的。 FLV(Flash Video)是Adobe的一个免费开放的音视频格式,babala~~ 省略若干字的介绍,要看,到官网看吧,这里不赘述,我们主要来讨论下FLV文件格式的细节,在此之后,我们会进一步讨论下FLV的加密解密相关内容。 整体上,FLV分为Header和Body两大块。 Header: 记录FLV的类型,版本,当前文件类型等信息,这些信息可以让我们对当前FLV文件有个概括的了解。 Body: FLV的Body是Flv的数据区域,这些是FLV的具体内容,因为FLV中的内容有多种,并可同时存在,因此,Body也不是一整块的数据,而是由更细分的块来组成,这个细分的块叫Tag。 这就是整个FLV的大概结构,下面我们进入到比特/字节数据的世界,看看FLV的内部世界。   HEADER Flv 文件的Header总共由9个字节组成,他们构成如下: ---------------------------------------------- 字节序 | 46 | 4c | 56 | 01 | 05 | 00 | 00 | 00 | 09 | ---------------------------------------------- 字符序 F L V 1 / \ 9 ...

Windows 7下启用对SATA硬盘支持的AHCI模式

MitchellChu 2016-02-18 其他技术

在主板支持AHCI(Serial ATA Advanced Host Controller Interface)模式的情况下,一般为了兼容也会将这个模式切到IDE的模式,在IDE模式下使用SATA硬盘,写问题不大,但读的速度大受影响,建议在Win7下开始对SATA硬盘的支持以获得更好的读性能。 如果Win7没有开启SATA模式的时候,切换到AHCI模式会出现蓝屏,因此,操作顺序应为: 1.Win7上先行切换SATA模式(后附方法) 2.重启到主板切换为SATA的AHCI模式 3.重启后进入Win7,自动安装AHCI相关的驱动 4.重启,正常使用.

用时间换空间的缓存算法

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() ...

Python在Console下显示文本进度条的方法

MitchellChu 2016-02-13 其他技术

在用Python处理耗时的任务时,往往希望能够了解到任务当前的处理进度,这个时候需要在任务中不断打印出任务的进度信息。一般我们是这样的: def process_mission(): """ 任务处理方法 """ # 这里是任务处理过程 print('当前处理到第[%d]项' % count) # 这里是任务处理过程  这种方式会在窗口输出一堆类似下面这样的信息: 当前处理到第1项 当前处理到第2项 当前处理到第3项 当前处理到第4项 当前处理到第5项 .... 这种信息有可能非常非常的长,也有可能输出的时候非常非常的快,以至于根本就无法看清楚(输出非常快的时候)。 这时候,我们期待这样的功能: [================== ] 25.60% 但如果纯粹的使用print是无法达到效果的,会变成和前面一样,满屏都是这种杠杠。 如何正确显示进度条呢? Python提供了一个模块,叫:progressbar,当使用这个模块之后,你要显示进度的仅需如下: import progressbar # 先定义一个进度条 # http://blog.useasp.net/ pbar = progressbar.ProgressBar(maxval=100, \ widgets=[progressbar.Bar('=', '[', ']'), ' ', \ progressbar.Percentage()]) for i in xrange(100): # 更新进度条 pbar.update(i+1) pbar.finish() # Ok,到此完结。  是不是很容易就完成进度条的显示?不过遗憾的是,这个python模块并不是默认的,而是需要安装: pip install progressbar 如果没有安装pip可以参考这里 。 对于只要一个简单进度条的人来说,安装个python包似乎有点动静太大,那么,自己动手写一个便是了。 下面是Mitchell自己写的一个类似的进度条,不用安装包,简单易用。 # 在使用本方法之前,请先做如下import # from __future__ import division # import math # import sys # ##blog.useasp.net## def progressbar(cur, total): percent = '{:.2%}'.format(cur / total) sys.stdout.write('\r') ...

VS清除打开项目时的TFS版本控制提示

MitchellChu 2015-12-15 .NET技术 其他技术

对于曾经做过TFS版本控制的项目,在版本控制服务不可用的时候,依然会在每次打开项目的时候都提示:当前项目是版本控制的项目,但是当前版本控制不可用,balabala的信息,如果是需要进行版本控制的项目在临时无法连接到版本控制服务器的时候出现这个提示,也属于正常的,但是如果是不再需要进行版本控制的项目,还这么次次打开都这么提示,就有些受不了——关键是,没有TFS,只能想办法删除了。 在项目中要永久清除TFS版本控制,需要操作三步(请确保操作之前没有在使用当前项目): 清除(删除)项目下的所有版本控制文件,这些文件有:*.vssscc,*.vspscc 删除这些版本控制文件比较简单,搜索这些后缀的文件,删除即可; 修改项目的解决方案文件:*.sln 先要确认解决方案文件(*.sln)是可修改的,如果是Read-Only的文件,则需要先调整为可修改。 切勿使用Visual Studio打开文件,使用文本编辑器打开*.sln文件,在文件中,我们将能看到类似下面的代码: GlobalSection(TeamFoundationVersionControl) = preSolution SccNumberOfProjects = 4 SccEnterpriseProvider = {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} SccTeamFoundationServer = here is your project's tfs SccLocalPath0 = . SccProjectUniqueName1 = project-unique-name1.csproj SccProjectName1 = your-project-name ...

Sublime Text一个文件内创建多个代码片段(snippets)

MitchellChu 2015-11-30 其他技术

在使用IDE做开发的很多时候,为了减少代码的输入,会创建代码的片段,在需要的时候直接呼出即可。这种方法往往能够提高我们的效率,同时也大大降低我们代码的出错几率!在Sublime Text中,同样提供了创建代码片段的功能(Snippets),但ST默认提供的创建代码片段的方式是一个代码片段一个文件,这种方式对于代码片段的管理有些不便——虽然和Emacs一样提供文件夹的方式来集中管理,不过还是有些不够方便,本文就从创建ST默认的代码片段开始,到一个文件多个snippets的过程做个记录。 ST(Sublime Text)创建Snippets ST的Tools->New Snippet...为创建代码片段,点击后,出现代码片段的模板,如下(ST3): <snippet> <content><![CDATA[ Hello, ${1:this} is a ${2:snippet}. ]]></content> <!-- Optional: Set a tabTrigger to define how to trigger the snippet --> <!-- <tabTrigger>hello</tabTrigger> --> <!-- Optional: Set a scope to limit where the snippet will trigger --> <!-- <scope>source.python</scope> --> </snippet> 这个即是单个snippet的全貌了。 TIPS: content :这个即是代码片段,注意: <![CDATA[ ]]>  这个是不能删掉的,表示数据内容。如果要开启Tab触发的话(一般都会开启吧),那么: tabTrigger:这个就需要取消注释了,这个里面填写的是触发字符串,当在ST编辑时,和此内容匹配时,即可用Tab直接呼出content内容来替换当前位置tabTrigger的内容 scope: 应用的范围,Mitchell Chu创建比较多的snippet是针对python的,所以,这里我一般是source.python,当然,你也可以是其他内容,比如,针对js的可以是source.js 但根据需要对上面三个内容作出了适当修改后,我们就得到了我们需要的一个代码片段了(snippet),比如像下面这样: <snippet> <content><![CDATA[ #!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright @ ${1:2015} ${2:Mitchell Chu} # Blog: http://blog.useasp.net/ ]]></content> <!-- Optional: Set a tabTrigger to define how to trigger the snippet --> <tabTrigger>!python</tabTrigger> <!-- Optional: Set a scope to limit where the snippet will trigger --> <scope>source.python</scope> </snippet> 确认无误,我们保存到文件即可完成一个代码片段的添加。 注意: 代码片段的文件一定要保存为:.sublime-snippet...

Python产生token唯一值的算法性能比较

MitchellChu 2015-11-08 其他技术

在很多场合的时候,我们都需要产生不重复的字符串来标志操作的唯一性,比如:HTTP请求中,我们需要产生SessionID,在数据存储的时候,我们也可能需要生成唯一的字符串来作为数据的ID以便我们进行索引。本文的由来是在使用tornado的时候,需要使用Session,Session需要有唯一的ID值。为了尽可能快速的生成安全可用的Session ID,而对Python当前的一些比较通用的生成方法进行了比较。为了方便说明,后继的所有说法均以token作为SessionID, 唯一字串等的统一表述。 在网络中比较流行的是使用uuid4().hex的方式来生成token,但另外一种声音是,uuid4().hex的安全性不高,需要使用安全性更高的算法来代替,后继出现了使用os.urandom(24),或者自行随机生成字符串的形式(uuid4使用的是os.urandom(16)),再到后来,使用OpenSSL和M2Crypto的方式来生成随机数。OpenSSL和M2Crypto需要Python安装pyOpenSSL和M2Crypto。M2Crypto由于接触少,因此没有对M2Crypto进行测试。   测试环境: CPU: Intel Xeon E3 3.30Hz 3.70Hz Memory: 16GB System: Windows 7 64-bits # times:测试次数 # func: 要测试的函数名称 # 此方法是入口方法 # 各个算法以函数的形式定义,接受times参数即可——By MitchellChu def crash_testx(times, func): import time print('\r\n--------------------------------------------') print("test function: %s" % func.func_name) print("begin time: %s" % time.strftime('%Y%m%d %X')) begin_time = time.time() (crashed_times, hash_data_len) = func(times) print("end time: %s" % time.strftime('%Y%m%d %X')) print("take time:%s" % (time.time() - begin_time)) print("test times: %d, crashed times:%d, hash data length:%d" % (times, crashed_times, hash_data_len)) print('--------------------------------------------\r\n')   产生方式(generate method) ...

Windows下git使用代理服务器的设置方法

MitchellChu 2015-08-26 其他技术

SVN中,使用TortoiseSVN来进行版本控制时,设置代理非常简单,只需要在设置里面添加代理的信息即可。而git在GUI(v0.17.GITGUI)中却无法找到类似的设置,只能求助git bash来设置。 Git支持四种协议1,而除本地传输外,还有:git://, ssh://, 基于HTTP协议,这些协议又被分为哑协议(HTTP协议)和智能传输协议。对于这些协议,要使用代理的设置也有些差异: 使用git协议时,设置代理需要配置core.gitproxy 使用HTTP协议时,设置代理需要配置http.proxy 而是用ssh协议时,代理需要配置ssh的ProxyCommand参数 由于个人需求仅仅是HTTP的代理(相对来说,HTTP有比较好的通适性,Windows配置git/ssh比较棘手),设置的时候,只需要针对单个设置http.proxy即可,在需要使用代理的项目下面使用git bash如下命令进行设置 ——你的Uri和port可能和我的不同,你懂的。: git config http.proxy http://127.0.0.1:8088 # 也可以是uri:port形式  这个是不需要鉴权的代理设置,如果需要鉴权,可能需要添加用户名密码信息: git config http.proxy http://username:password@127.0.0.1:8088 如果git的所有项目都需要启用代理,那么可以直接启用全局设置: git config --global http.proxy http://127.0.0.1:8088 为了确认是否已经设置成功,可以使用--get来获取: git config --get --global http.proxy 这样可以看到你设置在global的http.proxy值。  需要修改的时候,再次按照上面的方法设置即可,git默认会覆盖原有的配置值。 当我们的网络出现变更时,可能需要删除掉原有的代理配置,此时需要使用--unset来进行配置: git config --global --unset http.proxy  在命令之后,指定位置的设置值将会被清空,你可以再次使用--get来查看具体的设置情况。  如果使用了HTTPS,肯呢个会碰到HTTPS 证书错误的情况,比如提示:SSL certificate problem。。。,此时,可以尝试将sslVerify设置为false: git config --global http.sslVerify false  恩,到此,可以试试git来获取/更改项目了,此时,项目应该是使用代理来进行通讯的。   后记: 如果非必要,一般不使用--global的方式来设置代理,毕竟代理有的时候访问一些项目比直接访问还慢,特别是当代理在国外,项目源在国内的时候,按需使用才是王道。 不要多次使用不同的参数来设置代理,一般使用文中两种方式酌情选用即可,--global,--system,--local各级设置后,可能会给自己带来不必要的麻烦。git默认是先到git Repository的配置文件中查找配置文件,如果没有才会到--global设置的文件中查找,因此,单个项目文件中的设置会覆盖--global的设置。 使用--global来配置的信息保存在当前用户的根目录下的.config文件中,而仓库中的配置保存在项目仓库的根目录下的.git/config文件中。 如果是Linux的用户,再使用git/ssh协议时,根据网上的说法,需要使用connect工具来做代理的转换。—— 本人Linux下的暂时没有配置git使用代理,暂时无法验证,摘录方法如下: GIT协议配置:安装完毕connect之后,你可以在特定的目录中建立一个socks5_proxy_wrapper(或其他的文件名亦可),然后文件内容改为: #!/bin/sh connect -S 127.0.0.1:8088 "$@" 而后即可以配置git了,设置gitproxy: git config core.gitproxy /path/to/socks5_proxy_wrapper # 路径要改 抑或export GIT_PROXY_COMMAND: export GIT_PROXY_COMMAND="/path/to/socks5_proxy_wrapper" ...

获取本机系统内已经安装的浏览器列表

MitchellChu 2015-01-15 .NET技术 其他技术

最近突然碰到个比较棘手的问题,客户需要罗列出机器上所有可用的浏览器列表,至于作用么,就是让用户可以选择自己喜欢的浏览器来浏览指定信息。对于混杂的浏览器市场,这个需求确实够喝上一壶的了。 带着泪流满面的表情进入了无穷无尽的方案寻找中,不过到现在还是没有一个完满的答案。本文就记录下已经得到的一些信息吧。 对于一些标准的浏览器(有国内的么?自然是没有,谢谢),他们都会将自己的信息保存到StartMenuInternet这个注册表项下面,里面提供了丰富多彩的内容,基本上你想要的,他都能告诉你。需要注意的是,在64位系统中,会有两个位置可以找到。 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Clients\StartMenuInternet HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet 上面这两个路径下,就包含了机器上所有的浏览器信息(再次排除国内浏览器)。如果是在32位系统中,只有后一个路径可以使用。 知道位置之后,在程序中要获取浏览器列表信息就比较简单了,参见以下C#(.NET)代码: public static void BrowsersData() { RegistryKey browsersKey; browsersKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\Clients\StartMenuInternet"); if (browsersKey == null) browsersKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Clients\StartMenuInternet"); using (browsersKey) ...

将自己写的Python代码打包放到PyPI上

MitchellChu 2014-09-09 其他技术

如果是开源的Python代码,为了能够让大家更方便的使用,放到PyPI上也许是个非常不错的主意(PyPI:Python Package Index)。刚开始我以为要将代码打包放到PyPI上是一件非常复杂繁琐的事情,不过看过《Dive Into Python 3》的PACKAGING PYTHON LIBRARIES介绍(CHAPTER 16),并自己动手操作了一下,发现打包发布这个事情并没有想象中的那么有难度。为了方便其他朋友阅读的方便,就尝试写了这个博文,来记录下如何将自己写的Python代码打包上传到PyPI上。 在Python的世界里,有个叫Distutils的工具模块可以帮我们轻松的解决这个问题,既然这样,让我们开始打包之旅吧。 要打包代码,首先你的确保你的代码得是个包。比如,你写了一些功能的代码块,为了方便引用,你就需要将代码变成一个包,下次需要使用的时候,直接引用这个包里面的某个具体功能就好了。在Python中,要将这些代码变成包非常容易,你的这些功能的合集,可以用一个你觉得合适的名称来命名,创建这个命名的文件夹,并在文件夹下创建一个__init__.py文件,剩余的就是将你这些代码放入到这个文件夹下面即可。整理成包的文件结构大概像下面这样: somefunctions/ | +-- __init__.py | +-- myscripts1.py | +-- mysscripts2.py | +-- mymorescripts.py | somefunctions就是你包的名称,下面my***.py的各种文件就是你原有的各种代码模块。是不是很简单就将自己的代码变成了包?确实很简单,你这步就是新建一个文件夹,把文件全放进去而已——哦,还有添加个__init__.py文件(文件内容可以为空). 到这里,我们已经有Python包了,如果不传到PyPI上的话,你都可以直接用了,最直接的方法是将这个文件夹拷到你的项目目录下,然后在项目代码里,你大概就能引用它了: import somefunctions module = somefunctions.myscripts1 ### 这里你就可以调用myscripts1里面的功能了. 当然,我们的目标是打包到PyPI上,而不是将这个包拷来拷去的,后面安装一下,引用起来将更加的方便。 好了,既然要放到PyPI上,那么我们就需要在上面的基础上,在加点料。首先,我们需要调整下文件的目录结构,把上面的改成下面这个样子: somefunctions/ | +-- somefunctions/ . | . +-- __init__.py . | ....

reStructuredText链接报重复目标名的编译警告

MitchellChu 2014-09-06 其他技术

在进行reStructuredText的文件编译的时候,有的时候会出现下面的警告信息: warning: check: Duplicate implicit target name: "license" 编译中出现这个警告是因为.rst文件中包含了两个相同的链接名称,但这两个相同的名称指向的目标地址却不一样导致的。比如下面的这两个: `我的博客 <http://blog.useasp.net/>`_ '我的博客 <http://blog.useasp.net/default.aspx>`_ 这两个相同的文字,指向了不同的地址(虽然访问后是一样的)。在reStructuredText编译的时候就会出现编译警告了。 要解决这个问题,其实只需要在后面在加一个下划线,变成下面这样即可: `我的博客 <http://blog.useasp.net/>`__ '我的博客 <http://blog.useasp.net/default.aspx>`__ .. 希望你已经看到了最后下划线数量的不同了。   

Emacs中reStructuredText模式(rst-mode)的快捷键

MitchellChu 2014-09-06 其他技术

这篇是前面一篇reStructuredText教程文章的补充,因为本人使用Emacs来编辑rst文件,为了加快编辑速度,需要使用到rst-mode下的快捷键,因此根据文档整理出一份快捷键对照表,方便自己后继查找使用,也希望能够给有需要朋友一些帮助。 快捷键 说明 M-x rst-mode 进入rst-mode。 ...

reStructuredText(.rst)语法规则快速入门

MitchellChu 2014-09-05 其他技术

这几天写了个Python的模块,用Markdown写个个README,传到GitHub,感觉效果还不错,就难抑冲动,打了个包,也想放到PyPI上,结果放上去,发现README变成了源代码。一查,才发现PyPI竟然不支持Markdown格式的README文件,好像支持的README要reStructuredText格式的,对菜鸟的我来说这是个坑啊,好不容易在Emacs下用Markdown用的有点熟路了,结果发现却不被支持。只好重新看看reStructuredText的语法了,因此,也就有了此篇reStructuredText语法快速入门。 先文绉绉的来一段reStructuredText的介绍吧: reStructuredText是一种轻量级的文本标记语言,直译为:重构建的文本,为Python中Docutils项目的一部分。其一般保存的文件以.rst为后缀。在必要的时候,.rst文件可以被转化成PDF或者HTML格式,也可以有Sphinx转化为LaTex,man等格式,现在被广泛的用于程序的文档撰写。  好了,时间无多,直接正题: reStructuredText大致分章节,段落,块和列表这几种内容。而在这其中reStructuredText最主要用得到的标记也就是: 标题 段落 列表 表格 块(如:代码块) 样式 下面一一介绍:     标题(Title) 来看看标题的实例: =================== 这就是一个标题 =================== ---------------- 这也是一个章节标题 ---------------- 怎么样,看起来不难吧,你只要按这个写法,就能被reStructuredText认识,并被解释为章节标题。reStructuredText可用于作为标题修饰的字符有很多很多: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ 只要你想,上面的任意一个都可以用来作为标题的修饰符,当然,reStructuredText也是有推荐的,它推荐下面这些字符: = - ` : . ' " ~ ^ _ * + # 这些字符是上面一堆字符中稍微看起来不会那么奇怪的一部分,当然,个人建议不要那么花哨,尽量用这两个中的一个: = - 上面实例的写法也许有点复杂,.rst文件中,你还可以只给出下半部分的字符即可: 这个标题和上面的一样 =================== TIPS:作为修饰的字符长度要大于等于文字长度。另外,标题是能够嵌套的。   段落(Paragraphs) 段落一般隶属于某个章节中,是一块左对齐并且没有其他元素体标记的块。在.rst文件中,段落和其他内容的分割是靠空行来完成,如果段落相较于其他的段落有缩进,reStructuredText会解析为引用段落,样式上有些不同。 这里是一段reStructuredText的内容,它可以很长很长。。。。最后,末尾留出空行表示是本段落的结束即可。 这里是另外一段reStructuredText的内容,这段内容和上一段之间,乃至后面的其他内容之间都要留出空行进行分割。 这个也是段落,当时由于缩进了,会变成引用段落。显示和直接的段落有点不同   列表(List) 列表在HTML中被分为两种,一个是有序列表(Enumerated Lists),一种是无序列表(Bullet Lists),在reStructuredText中,我们也能找到这两种列表,还有一种称为定义列表(Definition Lists),这和HTML中的DL一样,在.rst文件中可以支持嵌套列表。 无序列表要求文本块是以下面这些字符开始,并且后面紧跟空格,而后跟列表项的内容,其中列表项比趋势左对齐并且有与列表对应的缩进。 * + - • ‣ ⁃ 还是那句话,用最常用的几个字符就好,不用那么花哨。下面是示例: - 这里是列表的第一个列表项 - 这是第二个列表项 - 这是第三个列表项 - 这是缩进的第一个列表项 注意,这里的缩进要和当前列表项的缩进同步。 - 第一级的第四个列表项 - 列表项之间要用个空格来分割。 有序列表在格式上和无序列表差不多,但是在使用的前缀修饰符上,使用的不是无序列表那种字符,而是可排序的字符,可以识别的有下面这些: arabic numerals: 1, 2, 3, ... (no...

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)) ...

Emacs的临时文件和备份文件

MitchellChu 2014-07-18 其他技术

Emacs在编辑文件的时候实际上并非对文件本身进行编辑,而是会将要编辑的文件内容拷贝到Emacs的一个临时缓冲区(buffer)内,而我们编辑的时候,也只是对这个缓冲区的内容进行更改。为了便于在需要的时候能够方便的应对,Emacs会自动产生一些其他的辅助文件,其中最常见的有临时文件和备份文件。 临时文件(Auto-Save file) Emacs的临时文件的文件名是使用“#”包围,这种文件一般是在Emacs中编辑时,emacs自动保存的文件,他在编辑文件的同一个目录内生成一个以#file-name#这样的文件,这个文件会在我们保存文件之后被emacs删除。这个文件的作用是为了防止在进行编辑的时候异常退出造成的损失。 1. 在Emacs内使用[C-x,C-f]打开要编辑的文件(test-file.txt) 2. 在打开的buffer中编辑内容 3. Emacs自动侦测buffer是否更改,如果更改会自动Auto-Save 4. 此时我们能够在编辑的文件同一目录下看到临时文件为: #test-file.txt# 5. 使用[C-x,C-s]保存当前buffer 6. 当前buffer中的内容被写入文件,#test-file.txt#消失——被Emacs自动删除  如果你不想产生这个临时文件也是有办法的,就是关闭自动保存功能,在你启动的.emacs文件内添加下面这行 (setq auto-save-default nil) ;; 默认值是t, 要关闭直接用nil更改默认值  当然,一般是不建议关闭的,因为在异常退出之后,如果你想要恢复自己辛苦编辑的内容,它能帮上大忙,你只要在emacs内打开你要恢复的文件,然后在恢复即可。 1. 打开要恢复的文件,如:test.txt 2. [M-x] 3. 输入:recover-file 回车 4. 确认恢复 用起来还是不错的。   备份文件(Backup files) 备份文件是在第一次保存的时候,如果保存的文件已经存在,Emacs会自动将当前已经存在的文件重命名作为备份文件,并将当前buffer的内容写入同名的文件中来替代原来的文件。而备份文件使用的是一个“~”作为后缀(如:file-name~)。大概的流程如下: 1. 打开文件,如:MitchellChu.txt 2. 编辑...(这涉及到临时文件的问题,忽略) 3. 在emacs内发出保存指令 4. emacs先将MitchellChu.txt保存为:MitchellChu.txt~ 5. 保存完成后,Emacs将当前buffer的内容写入MitchellChu.txt 注意:此时的MitchellChu.txt已经不再是原来的那个文件,但所有连接到原来那个文件的,现在被这个新文件接管。  当然,上面的这个流程是可以定制的,比如,我们可以要求emacs通过拷贝,而非重命名的方式来备份文件,在.emacs或者Emacs内设置个变量就成: ;; 在.emacs文件中添加下面这行表示使用拷贝模式 (setq backup-by-copying t) ;; 默认是nil,开启之后使用拷贝模式 ;;;;;;;;;;;;;;; ;; 如果是在Emacs中 ;; 你可以通过直接设置这个变量的值来改变模式 ;;;;;;;;;;;;;;; ;; [M-x] ;; set-variable ;; backup-by-copying ;; t ;; 回车,即可修改模式  这里同上,还是建议不要修改这个值,因为重命名的方式Mitchell个人感觉要优于拷贝模式。 备份文件默认仅会发生在Emacs第一次写入的时候,即,开启Emacs之后,第一次打开文件并保存的时候,编辑期间多次保存并不能产生多次备份动作。然而,下次重新打开Emacs,再次执行同样的动作的时候,同样在第一次保存时,Emacs是会将上次的备份文件覆盖的(如果有)。这也许是你不想要的,这时候你可以通过设置,让每次的备份文件都不同。具体的操作涉及到比较多的参数,这个功能觉得没有太大用处的,这里就不赘述,如果感兴趣,可以参看:version-control。

关于博主

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