Delphi Memo中禁止汉字

在memo里面的OnKeyPress里面加入 if Key>#127 then Key:= #0; 即可!!! 转载于:https://www.cnblogs.com/rogee/archive/2010/09/20/1832023.html

VC中的CWnd指针和HWnd的区别于联系

HWND是Windows系统中对所有窗口的一种标识,即窗口句柄。这是一个SDK概念。 CWnd是MFC类库中所有窗口类的基类。微软在MFC中将所有窗口的通用操作都封装到了这个类中,如:ShowWindow等等,同时它也封装了窗口句柄即m_hWnd成员。 由HWnd得到CWnd*: CWnd wnd; HWnd hWnd; wnd.Attach(hWnd); 通常一个窗口资源已经和一个CWnd类的对象关联起来的,由于一般来说这个类是自己创建的,所以自然知道怎么得到指向这个类的指针。如果没有就创建一个CWnd对象,将这个对象与窗口资源的hWnd句柄关联起来。(如上边的语句)。如果用 static CWnd* CWnd::FromHandle(HWND hWnd) ; 则返回值是一个暂时的CWnd对象,并且我们确保返回值为非空,也就是hWnd是有效的。 static CWnd* CWnd::FromHandlePermanent(HWND hWnd) ; 返回的是一个永久的对象。只有在返回的CWnd在类表里已经存在是返回值为非空。 由CWnd获取HWnd就容易多了,因为它的一个成员m_hWnd就是所对应窗口的句柄。 wnd->m_hWnd。 —————————————————————————————————————————————————————————— CWnd* 和 HWND 差别很大 HWND 是 SDK 定义的类型, 是一个无确切意义的 32-bit 值,在调用 API 时用于指代窗体。 CWnd* 是一个有确切意义的指针,指向一个 MFC 窗体类 CWnd 的实例。因为 MFC 对 SDK 做了封装,大部分调用都可以用 CWnd* 作为参数,所以很容易混淆。从一个 CWnd* 获取句柄的方法是 pWnd->GetSafeHwnd(), 他比 pWnd->m_hWnd 安全,因为前者在 pWnd == NULL 的时候返回 NULL 而后者出现 access violation 从 hWnd 转换到 CWnd * 一个可以使用的方法是 CWnd::FromHandle

XSLT学习笔记

1. 样式声明: <xsl:stylesheet>或<xsl:transform> 2. XSLT常用元素: 2.1 <xsl:template>:创建模板 Match属性的作用是使模板和XML元素相关联 e.g.:<xsl:template match="\">......</xsl:template> 2.2 <xsl:value-of>:选取XML元素,并添加到已被转换的输出流中 e.g.:<xsl:value-of select = "xpath"/> 2.3 <xsl:for-each>:循环 2.4 <xsl:sort>:对结果进行排序 e.g.:<xsl:for-each select ="catalog/cd["article='Bob']"> <xsl:sort select="article"/> ..... </xsl:for-each> 在我实际练习时,发现如果select属性中若要带参数,需要按照如下语法:<xsl:sort select="*[name()=$param1Name]" order="{$para2Name}"/> 2.5 <xsl:if>:相当于if-then <xsl:if test="price>10"> ...... </xsl:if> 2.6 <xsl:choose>:相当于if-then-else <xsl:choose> <xsl:when test="expression"> ...... </xsl:when> <xsl:otherwise> ...... </xsl:otherwise> </xsl:choose> 3. XSLT常用函数 3.1 current():返回当前节点 e.g.:<xsl:value-of select="current()"/> 等效于:<xsl:value-of select="."/> 3.2 document():访问一个外部的XML文档的节点 e.g.:<xsl:value-of select="document('other.xml')/root/xpath"/> 实际应用中,貌似document后面的接的Xpath中不能带参数变量,例如这样会出现解析错误:"document('other.xml')/root/$paramName/ChildNode" 3.3 element-available():测试指定的元素是否能被XSLT处理器支持 e.g.:<xsl:when test="element-available('xsl:comment')"> 判断是否支持注释 </xsl:when> 3.4 format-number():数字转换为字符串 e.g.:<value-of select="

Effective C# 摘录(2) - .NET资源管理

12:变量声明时初始化优于赋值语句。 Prefer Variable Initializers to Assignment Statements。 若类的实例变量成员在声明时初始化,初始化代码会内联到该类的每个实例构造函数中:构造对象实例时,先执行初始化代码,再调用基类构造函数,最后执行构造函数中代码。 当构造函数有多个重载版本时,建议在定义字段时避免进行初始化,而应该将这些公共的初始化语句放在一个构造函数中,然后使其他的构造器显示地调用这个初始化构造函数。 13:使用静态构造器初始化静态类成员。 Initialize Static Class Members with Static Constructors. 若类中的静态变量成员在声明时初始化,初始化代码会内联到类的静态构造函数中:运行时,先执行初始化代码,再执行静态构造函数中的代码。建议:简单静态成员可以直接在声明时初始化,而可能产生异常的初始化则应放在静态构造函数中初始化。 14:利用构造器链。 Utilize Constructor Chaining. 只能使用this(args)(构造器链中的最后一个构造函数中调用Base))和base(args)中一个,不能同时使用。 15:利用using和try/finally语句来清理资源。 Utilize using and Try/finally for Resource Cleanup. using所使用的对象必须继承IDisposable,且不支持运行时类型检查(可用as转换,但可能会隐藏bug,一般确保每一个实现了IDispose接口的对象分配在在using范围内)。 16:尽量减少内存垃圾。 Minimize Garbage. 使用类成员而代替每个函数中都用到的局部变量;使用Singleton模式来实现公用对象或将其实现为对象池。 17:尽量减少装箱与拆箱。 Minimize Boxing and Unboxing。 防止隐式装箱。eg:Console.WriteLine( "Number list:{0}, {1}, {2}",1,2,3 );=>Console.WriteLine( "Number list:{0}, {1}, {2}",1.ToString(),2.ToString(),3.ToString() ); 18:实现标准Dispose模式。 Implement the Standard Dispose Pattern. Dispose()应做的工作:释放所有非托管资源;释放所有托管资源,这包括取消事件绑定;设置标志位,标明对象已经释放;调用“GC.SuppressFinalize(this)”来避免GC再去掉用对象的析构函数。 如果父类和子类都使用了非托管资源,则子类在重载父类的Dispose()函数中,要记得显式调用父类的Dispose()。 转载于:https://www.cnblogs.com/happyhippy/archive/2007/03/15/676392.html

pdftk - 一个不错的pdf文档合并工具

没有直观的操作界面,需要在命令行进行操作( 将pdftk.exe放在要处理的pdf文档所在的目录下): 开始->运行->cmd->(用cd命令切换到pdf文档和pdftk.exe所在的目录下) 合并sourse1.pdf和sourse2.pdf文档到target.pdf: >pdftk sourse1.pdf sourse2.pdf cat output target.pdf 或者: >pdftk A=sourse1.pdf B=sourse2.pdf cat A B output target.pdf 将目录中所有的pdf合并到target.pdf(用通配符*): >pdftk *.pdf cat output target.pdf 其他功能: (1) Decrypt a PDF: >pdftk secured.pdf input_pw foopass output unsecured.pdf (2) Encrypt a PDF using 128-bit strength (the default), with-hold all permissions (the default) >pdftk 1.pdf output 1.128.pdf owner_pw foopass (3) Same as above, except password 'baz' must also be used to open output PDF

xslt 2.0 分组

把数据拆成200个一组 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> <xsl:template match="/"> <a> <xsl:for-each-group select="x/data" group-adjacent="(position()-1) idiv 200 "> <sfdc:create xmlns:sfdc="urn:partner.soap.sforce.com"> <xsl:for-each select="current-group()"> <sObjects> <type>bbbbb</type> <Material__r> <type>ddd</type> <PN_NO__c> <xsl:value-of select="material"/> </PN_NO__c> </Material__r> <Sub_Material__r> <type>Product__c</type> <PN_NO__c> <xsl:value-of select="sub_material"/> </PN_NO__c> </Sub_Material__r> <Plant__c> <xsl:value-of select="plant"/> </Plant__c> </sObjects> </xsl:for-each> </sfdc:create> </xsl:for-each-group> </a> </xsl:template> </xsl:stylesheet> 转载于:https://www.cnblogs.com/caihemm/p/7998135.html

测试

测试 live writer 测试 转载于:https://www.cnblogs.com/2world/archive/2009/04/16/1437443.html

SQL Server 2005锁的问题

SQL Server通过锁定资源来保证数据库的一致性。SQL Server中的锁不会对行、页、表或索引等资源有实际影响,它更像一个预订系统,所有任务在数据库内预订某些资源时都遵守它。过多的锁或长时间持有的锁会导致阻塞和其他问题,但锁本身也可能产生一些问题。 1 解决锁内存问题 为了确定SQL Server中锁使用的内存量,可以监视SQL Server中的“锁内存(KB)”计数器和系统监视器(Perfmon)中的“内存管理”对象。通过设置sp_configure中的锁选项,可以修改SQL Server中锁的内存配额。使用SQLServer:Locks计数器,可以了解更多关于锁行为的细节。 如果系统中的锁内存消耗完了,SQL Server不能分配更多的锁内存,session会收到消息1204: The instance of the SQL Server Database Engine cannot obtain a LOCK resource at this time. Rerun your statement when there are fewer active users. Ask the database administrator to check the lock and memory configuration for this instance, or to check for long-running transactions. 这个消息说得很清楚:需要增加锁的内存配额,或者减少系统中锁的数量。 如果锁占用很大的内存,应该首先尝试找出造成这么多锁的根本原因。例如,可能是SQL Server的锁升级不充分。如果是这样,就需要修改锁的配置。一旦修改了锁动态配置,就影响了锁升级的行为,由此可能造成意外的影响。 如果数据库不需要任何写访问,建议将其设置为只读的。这会降低系统中产生的锁的数量。在一个只读的数据库中,SQL Server仍会发行数据库的共享锁和读表的意向共享锁,但行锁、页锁及SERIALIZABLE隔离级别的行锁,都不会被发行。例如,对于只在夜间更新的报表数据库,用户可以将在白天对数据库的查询设置为只读的。这样做对锁内存的影响会降低,这也是SQL Server的锁管理器必须做的。还可以在同一台服务器上对只读数据库创建数据库快照,SQL Server不会在数据库快照上发行共享锁。 为了减少锁内存,同样建议将读操作与写操作分开。一种方法是把报表从一个OLTP系统中分开,通过创建报表服务器和使用事务复制或SQL Server集成服务(SSIS)来为另一个用户查询读操作的服务器获取数据。这会去掉OLTP主服务器的共享锁。如果数据库服务器能够支持这种方法,可以考虑用一个数据库快照来定期卸载读操作。在本章后面我们还可以看到使用一种基于行版本的快照隔离级别来减少读数据查询产生的锁。 2 锁超时 默认状态下,一个被阻塞的查询会无限地等待一个未被满足的锁的请求。通过使用LOCK_TIMEOUT设置,可以指定一个session锁等待的时间。当锁超时发生时,session会收到消息1222: Lock request time out period exceeded.

ExtJs Extender controls 不错的例子

一些ExtJs Extender controls 不错的例子,很适合初学者学习!可以直接运行查看效果,而且可以直接查看aspx代码和C#代码 . http://extendersamples.rodiniz.com/ 转载于:https://www.cnblogs.com/DanielChow/archive/2009/05/12/1454762.html

Access Denied when running Spring.IocQuickStart.MovieFinder

I just begin to learn something about Spring.Net, heaps of probem are waiting for me. The very first one has been solved. It is an error saying “Cannot create OBJ folder” when I try to strat the move finder example. This issue could be related to “windows vista” system only, in vista system, the folders under C:\program folder is not full right even your login in administrator right. I have to right click “C:\Program Files\Spring.

MVC client validation step

Server Side: 1. Model: [Required(ErrorMessage = "It's Required")] [MinLength(2,ErrorMessage = "Name should longer than 2")] public string UserName { get; set; } 2. View : <p> @Html.Label("UserName") @Html.Editor("UserName") @Html.ValidationMessage("UserName") </p> If you want it show in client side: 1. add below to web.config. <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 2. include the Jquery file manually: <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.4.js"></script> <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/jquery.validate.js"></script> <script type="text/javascript" src="~/Scripts/jquery.validate.unobtrusive.js"></script> 转载于:https://www.cnblogs.com/leonwcy/archive/2013/03/17/2964998.html

Clang 中 AST 相关类简介(不定时更新)

Clang 中 AST 相关类简介(不定时更新) 1. Decl(declaration)1.1 FunctionDecl 2. Stmt(statement)3. Expr(expression)3.1 FullExpr3.2 ExprWithCleanups3.3 CallExpr 1. Decl(declaration) 它表示程序中的一个声明。 1.1 FunctionDecl 表示一个函数声明(declaration)或定义(definition)。 因为一个给定的函数可以在程序中声明多次,所以可能有几个 FunctionDecls 对应于该函数。当遍历此 FunctionDecl 上下文中的声明列表时(例如,翻译单元),只会找到其中的一个 FunctionDecl;这个 FunctionDecl 包含关于函数的所有已知信息。另外,此函数的前置声明可以通过 getPreviousDecl() 链获得。 一个函数声明可能是: 一个非定义声明,一个定义。一个函数可能被如下定义: 它有一个 body,或者在稍后解析中将会有一个 body。它有一个未实例化(uninstantiated)的 body。此 body 不存在,因为尚未使用该函数,但是此声明被视为一个定义,并且不允许对该函数进行其他定义。它没有一个用户指定的 body,但它不允许重新定义(redefinition),因为它是 deleted/defaulted 或通过其他机制(alias、ifunc)定义的。 它的 public 成员函数: DeclarationNameInfo getNameInfo() const 使用它来获取函数名:FunctionDecl *f; std::string funcName = f->getNameInfo().getName().getAsString(); QualType getReturnType() const 获取函数的返回类型SourceRange getSourceRange() constbool hasBody() const 如果此 Decl 表示代码体(如函数或方法定义)的声明,则返回 true。 注意,如果这个 Decl 的任何 redeclaration 表示代码体的声明,那么 hasBody 也可以返回 true。bool isDefined() const

《Programming in Lua 3》读书笔记(十七)

日期:2014.7.24 PartⅢ The Standard Libraries 21 The String Library Lua的string标准库提供了完整的对string型变量进行操作的方法。string库将其操作函数输出为一个叫做string的模块,而从lua的5.1版本开始,也将这些函数输出为string型变量的方法(这里涉及到元表),因此使用string标准库中的函数有两种方法,这里以upper函数为例:string.upper(s) 21.1 Basic String Functions string.len(s) 计算s的长度,与#s的结果一样。 string.rep(s,n)/s:rep(n) 返回重复n次的s。如print(string.rep("a",5)) -- aaaaa string.lower(s) 返回s的小写版 string.upper(s) 返回s的大写版 string.sub(s,i,j) /s:sub(i,j) 从s中抽取出从index i至j位的字符。 string.char(s) 、string.byte(s,i) 在字符/数字 之间进行转换。string.char获取0个或多个整数,将每一个数字转换成字符,返回这些字符连接起来的字符串;string.byte(s,i)将字符串s的第i个字符转换成整数,默认i = 1.从lua5.1开始,string.byte接受第三个参数--string.byte(s,i,j),将字符串s中的第i至j个字符转换成整数,返回值为这些整数 e.g. print(string.char(97)) -- a i = 99; print(string.char(i,i+1,i+2)) -- cde print(string.byte("a")) --97 {s:byte(1,-1)} --这将以s中所有的字符转换的整数来创建一个 tablestring.char(table.unpack(t)) --这个相当于上一步的逆向运算 string.format()用来转换string型变量的格式。具体的使用规则与C中的类似。 这里要注意的是,所有对string型的变量进行的操作不会对传进去的参数进行修改,而是会创建一个新的string型变量再返回,如果需要修改原数据,则需要通过赋值来实现。 21.2 Pattern-Matching Functions 模式匹配?? string标准库中的find,match,gsub(global substitution),match(global match)函数都是基于模式匹配的? string.find函数 该函数从给定的string型变量中查找一个待搜索的模式串。组成一个最简单的模式串就是用一个word(单词),如模式串为"hello",被查找的字符串"hello world",该函数将会从中查找hello这个单词。当查到到了,该函数将会返回两个值:匹配到的起始index,和最终index,如果没有查找到将会返回nil: e.g. s = "hello world" i , j = string.

《Programming in Lua 3》读书笔记(三)

因为前段时间返校进行毕业论文答辩,就好久都没有更新博客了。毕业了,然后该干啥就干啥吧,毕业没有失业,应该小小的庆幸一番。 之前的第二篇读书笔记记录到了第二章的倒数第二点,剩下没有记录table相关。接触过Lua的朋友都说,很多时候Lua就是围绕着table在写东西,由此可见table的重要性吧。第二章大致的介绍了下Table的相关用法,在此记录一下。 2.5 Table 首先第一点要注意的是,Table的索引是非常灵活的,书中也介绍到了table不仅可以以下标index为索引,还可以使用除nil之外的Lua所支持的类型做为索引,所以这里体现出了其灵活性。 Table的形式: a = {} 关于Table的一些用法: a = {y = 10} --一个table,键=y,值=10 x = "y" -- --注意这里的索引方式,这里很容易混淆 print(a[x]) print(a.y) print(a["y"]) 由上可以看出Table使用起来的灵活性,关于其索引方式我感觉有点容易混淆。在此我使用的一种很笨的方式:如果使用"[]"这种方式索引,那么"[]"里面的值就一定得是双引号下的键,可以是[y],或者x = "y";[x],如果使用"."这种方式索引,那么点号后面就直接是table的键。 可以使用"="将一个Table传递给另外一个变量(不知道这个到底该怎么说),如下: a = {x = 10} b = a print(b.x) --10 这种语法的支持特性为灵活使用Table奠定了基础,关于这个知识点在后文还得复习一遍,该如何表述还不是很清楚。 当我们不需要某个table的时候,可以通过给其赋值nil来使系统自动回收内存,这里需注意: a = {x = 10} b = a a = nil --在将nil赋值给a之后,系统回收a占用的内存,但此时b依旧可以使用,即可以使用b.x print(b.x) --10 print(a.x) --error 在使用Table的时候,不必要申请内存大小,只需要根据自己所需使用即可。 需要注意的是,假如我们使用数字为索引,Table是以1开始进行索引的。 得到table的长度的方法:# 2.6 Function 关于Function的知识后续内容有详细的介绍,大致觉得需要注意的是其返回值是可以有多个的,Lua支持调用用Lua写的函数和用C写的函数。 2.7 Userdata and Threads 这两点在第二章没有过多的介绍,提到了会在后续章节有详细的介绍,那就在后文在说吧。 转载于:https://www.cnblogs.com/zhong-dev/p/4044587.html

found for dependency: expected at least 1 bean which qualifies as autowire candidate for this depend

日志报错: 七月 04, 2019 10:15:48 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:parent_web' did not find a matching property. 七月 04, 2019 10:15:48 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server version: Apache Tomcat/8.0.53 七月 04, 2019 10:15:48 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server built: Jun 29 2018 14:42:45 UTC 七月 04, 2019 10:15:48 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server number: 8.0.53.0 七月 04, 2019 10:15:48 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: OS Name: Windows 10

桶排序及一些其应用

海量数据 一年的全国高考考生人数为500 万,分数使用标准分,最低100 ,最高900 ,没有小数,要求对这500 万元素的 数组进行排序。 分析:对500W 数据排序,如果基于比较的先进排序,平均比较次数为O(5000000*log5000000)≈1.112亿。但是我们发现,这些数据都有特殊的条件: 100=<score<=900。那么我们就可以考虑桶排序这样一个“投机取巧”的办法、让其在毫秒级别就完成500万排序。 方法:创建801(900-100)个桶。将每个考生的分数丢进f(score)=score-100的桶中。这个过程从头到尾遍历一遍数据只需要500W次。然后根据桶号大小依次将桶中数值输出,即可以得到一个有序的序列。而且可以很容易的得到100分有***人,501分有***人。 实际上,桶排序对数据的条件有特殊要求,如果上面的分数不是从100-900,而是从0-2亿,那么分配2亿个桶显然是不可能的。所以桶排序有其局限性,适合元素值集合并不大的情况。 典型 这个算法的精妙之处在于第三步中,似乎和分治法的思想有些像,通过不断缩小判断方法来不断降低目标数的位置的模糊度 在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G。只写出思路即可(内存限制为2G意思是可以使用2G空间来运行程序,而不考虑本机上其他软件内存占用情况。) 关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。 分析:既然要找中位数,很简单就是排序的想法。那么基于 字节的桶排序是一个可行的方法。 思想:将整型的每1byte作为一个关键字,也就是说一个整形可以拆成4个keys,而且最高位的keys越大,整数越大。如果高位keys相同,则比较次高位的keys。整个比较过程类似于字符串的 字典序。 第一步:把10G整数每2G读入一次内存,然后一次遍历这536,870,912即(1024*1024*1024)*2 /4个数据。每个数据用位运算">>"取出最高8位(31-24)。这8bits(0-255)最多表示256个桶,那么可以根据8bit的值来确定丢入第几个桶。最后把每个桶写入一个磁盘文件中,同时在内存中统计每个桶内数据的数量NUM[256]。 代价:(1) 10G数据依次读入内存的IO代价(这个是无法避免的,CPU不能直接在 磁盘上运算)。(2)在内存中遍历536,870,912个数据,这是一个O(n)的线性 时间复杂度。(3)把256个桶写回到256个磁盘文件空间中,这个代价是额外的,也就是多付出一倍的10G数据转移的时间。 第二步:根据内存中256个桶内的数量NUM[256],计算中位数在第几个桶中。很显然,2,684,354,560个数中位数是第1,342,177,280个。假设前127个桶的数据量相加,发现少于1,342,177,280,把第128个桶数据量加上,大于1,342,177,280。说明,中位数必在 磁盘的第128个桶中。而且在这个桶的第1,342,177,280-N(0-127)个数位上。N(0-127)表示前127个桶的数据量之和。然后把第128个文件中的整数读入内存。(若数据大致是均匀分布的,每个文件的大小估计在10G/256=40M左右,当然也不一定,但是超过2G的可能性很小)。注意,变态的情况下,这个需要读入的第128号文件仍然大于2G,那么整个读入仍然可以按照第一步分批来进行读取。 代价:(1)循环计算255个桶中的数据量累加,需要O(M)的代价,其中m<255。(2)读入一个大概80M左右文件大小的IO代价。 第三步:继续以内存中的某个桶内整数的次高8bit(他们的最高8bit是一样的)进行桶排序(23-16)。过程和第一步相同,也是256个桶。 第四步:一直下去,直到最低字节(7-0bit)的桶排序结束。我相信这个时候完全可以在内存中使用一次快排就可以了。 整个过程的 时间复杂度在O(n)的线性级别上(没有任何 循环嵌套)。但主要时间消耗在第一步的第二次内存-磁盘数据交换上,即10G数据分255个文件写回磁盘上。一般而言,如果第二步过后,内存可以容纳下存在中位数的某一个文件的话,直接快排就可以了(修改者注:我想,继续桶排序但不写回磁盘,效率会更高?)。 [2] 转载于:https://www.cnblogs.com/Gaoqiking/p/11127690.html

Git_Windows 系统下Git安装图解

Windows 系统下Git安装图解 心得 :很成功~ 简单来说Git是一个免费的、开源的版本控制软件,从功能上讲,跟我们比较熟悉的Subversion(SVN)这类版本控制软件没什么两样。由于工作的需求,需要在WinXP下安装git配合团队完成相应的工作,以前一直在别的系统下使用,今天经Drupal花园的龙马指点终于安装成功了,特意贴出来与有需要的童鞋一起分享。 获取Git软件: 大家可以通过两种方式获取Git的软件,一个是在官网上获取,另一个可以点击这里下载。只是有一点需要说明就是需要下载支持WinXp系统的版本。 Git在WinXP安装过程 在WinXP下安装Git详细步骤参考如下安装示意图: 点击上图的“Finish”后Git的安装就完成了,安装完成后需要在进行一下环境变量的设置,改变环境变量的具体步骤可以参考下图: 生成ssh公钥 双击桌面上的git运行程序: 启动git的运行程序: 在程序中依次输入: 1、配置email,命令如下: $git config --global user.name "your name" $git config --global user.email "your@email.address" 其中"your name"换成你的名字,"your@email.address"换成你的邮箱地址。 2、生成公钥,用于身份认证: ssh-keygen.exe -C "your@email.address" -t rsa 这样就可以在你的用户下取得需要的公钥匙,公钥位于你的电脑中“C:\Documents and Settings\Airen\.ssh”的“id_rsa.pub”文件下: 你使用文本编辑器打开“id_rsa.pub”就可以看到公钥的内容: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAs1c3zL3IbjhMbSCwooZ7WHlkga7xq+5inQUCTqmZ7xqBclvEwofDd4BYts99X+xfNXgGSlil85wrOfXX9ZH27ZmPR3Z8KWp3pekFOvk7iLmt0b9lZqhgpUll76Q7D2KED8se9gV4FNxg05ZK6AUZm70cBj9sZqjV//weE7ufkibcqd3ngHsTKB+0Js8NcMwldHmxIxZEwufxgT/D4EGQCA6ijjuj9ILIydzzLwWzKoH1wuGDU5LAE1qptIpAt50uWxPNlsBPoqZnbJjHg+As9If6tRkG4YzkwzSBTP725bJDcWkArhWRRkJ2cwUgcJYRyCY+8jI2oxDawYjWQ+w9HQ== airenliao@gmail.com 此时只要把你的公钥放进你项目的服务中就可以进行git的相关操作。 关于git的命令更多操作,可以到官网查阅,或点击这里查看更多的命令操作。 顺便列出解决中文目录支持问题: 1、ls不能显示中文目录 解决办法:在git/etc/git-completion.bash中增加一行: alias ls='ls --show-control-chars --color=auto' 2、git commit不能提交中文注释 解决办法:修改git/etc/inputrc中对应的行: set output-meta on set convert-meta off 3、git log无法显示中文注释 解决办法:在git/etc/profile中增加一行: export LESSCHARSET=iso8859 到这时有关于git在winxp下安装就介绍完了,希望这个能给一些朋友带来一定的帮助。同时更希望朋友们关注W3CPLUS,因为只有你们的关注才能带来我的成长。 原文地址:http://www.w3cplus.com/node/74 转载于:https://www.cnblogs.com/someonelikeyou/p/3391340.html

iOS  如何判断当前网络连接状态  网络是否正常  网络是否可用

网络资源:出处http://blog.csdn.net/mad1989/article/details/8987368 众所周知,我们在开发APP时,涉及网络连接的时候,都会想着提前判断一下当前的网络连接状态,如果没有网络,就不再请求url,省去不必要的步骤,所以,这个如何判断?其实很简单。 前提:工程添加:SystemConfiguration.framework framework 然后在需要判断的类中包含头文件: [cpp] view plain copy #import "Reachability.h" 【如果你使用的ASIHTTPRequest类库,那么直接import Reachbility.h就可以了,ASIHTTP类库里包含Reachbility.h和.m】 下面是我写的一个方法: -(BOOL) isConnectionAvailable{ BOOL isExistenceNetwork = YES; Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"]; switch ([reach currentReachabilityStatus]) { case NotReachable: isExistenceNetwork = NO; //NSLog(@"notReachable"); break; case ReachableViaWiFi: isExistenceNetwork = YES; //NSLog(@"WIFI"); break; case ReachableViaWWAN: isExistenceNetwork = YES; //NSLog(@"3G"); break; } if (!isExistenceNetwork) { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];//<span style="font-family: Arial, Helvetica, sans-serif;">MBProgressHUD为第三方库,不需要可以省略或使用AlertView</span> hud.removeFromSuperViewOnHide =YES; hud.mode = MBProgressHUDModeText;

Watchdog源码--ownPacketDetected

节点发送数据包,则将数据包缓存。 /** * I read my own packet. */ void WATCHDOG::ownPacketDetected(int32_t source_ip, int32_t destination_ip, int sourcePort, int destinationPort, int mac_dst, char * tmp_data, packet_t packet_type, double pktime) { if (debug > 2) printf("Ownpacket\n"); int data_size; neighbour *neigh_dst; data_size = strlen(tmp_data); protocol = packet_type; neigh_dst = neigs->ExistNeighbourMac(mac_dst); if (mac_dst != 666) { /* If the destination IP is different of the destination neighbour, means that must be forwarded */ //if (neigh_dst !

Super Ugly Number

Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k. For example, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] is the sequence of the first 12 super ugly numbers given primes = [2, 7, 13, 19] of size 4. Note: (1) 1 is a super ugly number for any given primes.

Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example, [1,1,2] have the following unique permutations: [ [1,1,2], [1,2,1], [2,1,1] ] 这题是Permutations的一个拓展,主要是当原数组有重复元素的时候,如果依然按permutations的做法,则会产生重复的排列。比如[1,1,2]的数字,如果首先选择了第一个1,然后是第二个1,再是2和先选择第2个1,再选择第二个1,然后再选择2的结果是一样的。必然产生重复。所以对于这种情况,需要进行重复排除。首先输入的数组不一定有序,如果无序,先进行排序,之后在每一步的选择中,只选择重复数字的第一个数字作为一步,后面的一样的数字则不做操作。避免上述的重复情况。代码相比permutation的代码只需要增加一行,如下: class Solution(object): def permuteUnique(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ if not nums: return [[]] nums.sort() allPer = [] per = [] used = [False] * len(nums) self.helper(nums, used, per, allPer) return allPer def helper(self, nums, used, per, allPer): if len(per) == len(nums): allPer.

Edit Distance

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a character b) Delete a character c) Replace a character 编辑距离,非常经典的二维DP题目,也是传说中的双序列问题。 首先定义最优解的表示,f[i][j]表示将word1前i 个字符转化为word2前j个字符需要的step数目(注意为了方便处理初始值,f[0][0] = 0表示空串的最小编辑距离,之后定义最优解之间的转换状态, 即: f[i][j] = min(f[i][j-1]+1,f[i-1][j]+1,f[i-1][j-1]) (word1[i-1]==word2[j-1]) f[i][j] = min(f[i][j-1]+1,f[i-1][j]+1,f[i-1][j-1]+1) (word1[i-1]!=word2[j-1]) 注意在f[i][j-1],f[i-1][j],f[i-1][j-1]都是可以经过1步或者0步到达f[i][j]的子状态(增加word2[j-1],删除word1[i-1],替换(或者不替换)得到f[i][j]。 这种直接的解法代码如下: class Solution(object): def minDistance(self, word1, word2): "

如何获得Oracle系统性能统计? Oracle大型数据库系统在AIXUNIX上的实战详解 集中讨论 14...

累计读者的来信中,有若干位同仁谈到Oracle的性能问题。什么叫性能慢?怎么量化性能统计?问题我不一一列出了,下面的文字大部分来自Oracle 英文文档,我认为描述的极为精确,比我说的强。 也请参见www.usedb.cn. 如果有效地诊断性能问题,则进行性能统计必不可少。Oracle能够产生基于整个系统表现的、或者基于会话的、或者基于单个SQL语句的统计数据。Oracle也可以在段和服务追踪和获取统计数据的累积值。当我们关注某个方面的性能问题时,我们只需将该范围的统计数据拿来,并作出判断。一种典型方法是取得采样期间统计数据的“首”“尾”,判断期间的差异,并据此得出新能问题所在的判断。 统计数据,通常是自系统启动后到当前的累计统计数据,可以通过诸如V$SESSTAT V$SYSSTAT等动态视图获得。因此,任何一次数据库系统的启动关闭操作都会导致这些统计数据的重置。 Oracle 10g/11g 包含了如下类型的统计数据: ¨ AWR的统计数据,关于系统运行的累计统计; ¨ 度量值,关于累计统计差异性描述的变化值; ¨ 抽样数据,关于激活会话的统计数据。 Oracle在10g版本中提供了自动的工作量资料档案库功能,简称AWR,就是自动进行性能取样,数据涵盖了除会话级别统计以外的大多统计。这个过程在一段时期内重复进行,每次取样结果称为一张AWR快照。每张快照之间的差异描述了系统性能状态的改变,因此,这种快照代表了系统在取样期间内的改变。 除此之外,Oracle还自动收集另一种类型的统计,称之为:度量值。所谓度量,就是某个累计统计数据,在取样期间内改变的程度、比率。“度量”能涵盖各种性能方面,包括响应时间、事务处理吞吐量、数据库调用数量、磁盘读写数量等。度量值可以通过对V$ 类型的动态视图中获得,v$视图中的数据是一个相当小的时间间隔内的平均值,一般而言是60秒的期间。通过v$视图可以获得近期的度量值,远期的度量值则可以通过AWR快照获得。 还有一种Oracle收集的统计数据,称之为抽样数据。Oracle10g中新增了抽样数据的取样机制,称之为自动的会话历史记录 ( ASH )。抽样数据由ASH执行完成。ASH抽样所有活跃会话当前状态,抽样数据被收集到内存中,通过V$视图访问。在AWR进行工作载荷取样时,这类数据也被自动搜集。 Oracle10g提供了一种诊断系统性能问题的有力方法:对比法。首先,我们需要建立统计基准线。这个基准线可以采用系统在高效、稳定运行期间的统计数据集合。依据这个基准线集合,在系统出现性能出现问题的情况下,进行对比,发现问题所在。这种方法有效地解决了当我们面对数以千计的数据库性能统计数据而一筹莫展的问题,避免我们陷入统计数据的海洋。 统计基准线的获得通过AWR实现。通过AWR,我们指定度量基准线和保存AWR快照的时间范围或一种类似指定,并把这段期间的统计数据作为统计基准线。显然,这个时间范围指定应慎重选择。最合理的度量基线,应该是在系统正常载荷状态下,具有良好性能状态时,获得的累计统计。这样,在系统遭遇性能障碍时,通过好坏比较得到问题根源。 这里所说的所有统计数据——实时性能数据,或者AWR历史快照数据,我们都可以通过Oracle企业管理器(OEM)查看。不仅如此,企业管理器也能用来捕捉与AWR统计数据相关的操作系统和网络统计的数据。 转载于:https://www.cnblogs.com/dbserver/archive/2010/01/11/1643909.html

Ping命令的作用和参数说明

TTL是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时间内不能被传递到目的地。例如,不正确的路由表可能导致包的无限循环。所以需要在包中设置这样一个值,包在每经过一个节点,将这个值减1,反复这样操作,最终可能造成两个结果:包在这个值还为正数的时候到达了目的地,或者是在经过一定数量的节点后,这个值减为了0。前者代表完成了一次正常的传输,后者代表包可能选择了一条非常长的路径甚至是进入了环路,这显然不是我们期望的,所以在这个值为0的时候,网络设备将不会再传递这个包而是直接将他抛弃,并发送一个通知给包的源地址,说这个包已死。 第二个问题,通过TTL值我们能得到什么 其实TTL值这个东西本身并代表不了什么,对于使用者来说,关心的问题应该是包是否到达了目的地而不是经过了几个节点后到达。但是TTL值还是可以得到有意思的信息的。 每个操作系统对TTL值得定义都不同,这个值甚至可以通过修改某些系统的网络参数来修改,例如Win2000默认为128,通过注册表也可以修改。而Linux大多定义为64。不过一般来说,很少有人会去修改自己机器的这个值的,这就给了我们机会可以通过ping的回显TTL来大体判断一台机器是什么操作系统。如你看到112,可能是初始128,跳了16个节点,或者是初始160,跳了48次。 不同的操作系统,它的TTL值默认值是不相同的。默认情况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。 以我公司2台机器为例 看如下命令 ping 61.152.93.131 Pinging 61.152.93.131 with 32 bytes of data: Reply from 61.152.93.131: bytes=32 time=21ms TTL=118 Reply from 61.152.93.131: bytes=32 time=19ms TTL=118 Reply from 61.152.93.131: bytes=32 time=18ms TTL=118 Reply from 61.152.93.131: bytes=32 time=22ms TTL=118 Ping statistics for 61.152.93.131: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss Approximate round trip times in milli-seconds: Minimum = 18ms, Maximum = 22ms, Average = 20ms ping 61.

懒人笔记-memcache配置(php)

1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装 3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。 4.下载php_memcache.dll,请自己查找对应的php版本的文件 5. 在C:\winnt\php.ini 加入一行 ‘extension=php_memcache.dll’ 6.重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功! memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d uninstall 卸载memcached服务 -u 以的身份运行 (仅在以root运行的时候有效) -m 最大内存使用,单位MB。默认64MB -M 内存耗尽时返回错误,而不是删除项 -c 最大同时连接数,默认是1024 -f 块大小增长因子,默认是1.25 -n 最小分配空间,key+value+flags默认是48 -h 显示帮助 Memcache环境测试: 运行下面的php文件,如果有输出This is a test!,就表示环境搭建成功。开始领略Memcache的魅力把! < ?php $mem = new Memcache; $mem->connect(”127.0.0.1″, 11211);

Matlab 用fread、fwrite实现大文件读写

最近在分析一个35G的大数据文件,猛一看,是不是很吓人啊,不过还好,师兄写文件的格式非常规范,读取数据来也就很方便了,主要是使用了读写文件的两个函数fread和fwrite,下面用matlab简单尝试一下,对于这种文件读取的低级函数,c和matlab功能都是差不多的。 先来看fwrite,最简单的用法如下 %% x = 1:15; dataw = reshape(x, 5, 3); disp(dataw) %% filename = 'test.bin'; hfile = fopen(filename, 'w'); fwrite(hfile, dataw, 'double'); fclose(hfile); fwrite写矩阵,是按列来写的,即先写第一列,再第二列,以此类推。如上面的代码,x为 1 6 11 2 7 12 3 8 13 4 9 14 5 10 15 如果把数据全部读出来,就是 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 稍复杂的写法是,可以跳着写,就是每个数据先跳几个位置,然后再写数据,如上面的5X3矩阵,如果想按行来写,当然最简单的方式是先转置一下再写,但如果数据量非常大,而且还在另一个文件里,总不能先都读取进来,再转置、写,当然这只是一种特殊情况,但跳着写在某些时候确实是好的解决方法,如下实现按行写 %% x = 1:15; dataw = reshape(x, 5, 3); disp(dataw) len = 5;

Vim使用taglist功能

下载 wget http://www.vim.org/scripts/download_script.php?src_id=19574 -O taglist.zip 然后解压taglist.zip到~/.vim/目录下 在vim中使用如下命令切换taglist显示 :TlistToggle 使用Ctrl+w+w在正常窗口与taglist窗口之间切换。 在~/.vimrc中作如下配置 let Tlist_Ctags_Cmd = '/usr/bin/ctags' "设定Linux系统中ctags程序的位置 let Tlist_Show_One_File=1 "不同时显示多个文件的tag,只显示当前文件的 let Tlist_Exit_OnlyWindow=1 "如果taglist窗口是最后一个窗口,则退出vim let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口 let Tlist_Auto_Open=1 "在启动VIM后,自动打开taglist窗口 转载于:https://www.cnblogs.com/long123king/p/3865213.html

yum设置代理

echo "proxy=http://[proxy_url]:8080" >> /etc/yum.conf 转载于:https://www.cnblogs.com/long123king/p/3760562.html

mac下配置服务自动启动

launchctl load plist 启动 launchctl unload plist 停止 报错信息:Dubious ownership on file (skipping) 原因:文件拥有者与执行者不相同 转载于:https://www.cnblogs.com/moonbear/p/3232700.html

关于编程语言的一些思考

***博客已迁移至 http://benjycui.com/ #文章由原博客迁移过来,之前的发表时间为 2012-10-20 08:52 “语言都是差不多的”,大多数程序员都会这样子说。果真如此?还是仅仅是为了息事宁人? 下面先来一个简单的推理: (1)java最新版跟Java1.0相比,一般人都会认同最新版的好 (2)同理,c#最新版比c#1.0好 (3)现在假设“语言都是差不多的”为真 (4)那么java1.0跟c#最新版差不多 (5)同理c#1.0跟java最新版差不多 (6)由(1)(4)得Java最新版比c#最新版好 (7)由(2)(5)得c#最新版比java最新版好 为什么得到了两个完全相反的结论? 我觉得是因为,语言之间其实是各有优点的。当然,语言之间存在差异,并不代表存在最好的语言。 语言是思维的体现: 每个程序员都有自己特别喜欢的一门语言,并且在学习其他语言的时候会觉得难以接受。其实是因为每个程序员的思维都是不一样的,一个程序员所选择的语言其实就是他的思维的体现。 看重性能的c++程序员会觉得python性能低下,但是python程序员却觉得c++的代码难以阅读,不够优雅。 每个程序员开发理念不一样,自然选择了不同的语言。 语言塑造我们的思维: 听说程序员在大概24岁之后,就接受不了新的技术。我认为除了是年龄的原因之外,还因为在多年的使用某一门语言之后,思维已经被固化了。 所以,即使c#是仿java的,但是其中的一些差异还是表现了不同程序员的思维差异。c#程序员会觉得属性很方便,并且无法理解java为什么要这么麻烦的一个一个的写getter、setter。Java程序员会觉得c#的属性这一写法很容易跟字段混淆。 转载于:https://www.cnblogs.com/benjytrys/archive/2013/05/02/3054816.html

Android的Broadcast应用说明一例

程序A的Receiver: receiver = new BroadcastReceiver() { @Override public void onReceive(Context ctx, Intent intent) { Log.i("TestActivity", "===============Broadcast Received:" + intent.getAction()); if (intent.getAction().equals(RESPONSE_ACTION)) { Uri uri = intent.getData(); String location = ""; if (uri != null) { Log.i("TestActivity", "=======================parameter location:" + uri.getQueryParameter("location")); Log.i("TestActivity", "======================= host:" + uri.getHost()); Log.i("TestActivity", "======================= path:" + uri.getPath()); location = uri.getQueryParameter("location"); FileInputStream fis = null; ByteArrayOutputStream bos = null; File file = new File(location); try { fis = new FileInputStream(file);

一步一步学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://terrylee.blog.51cto.com/342737/67258 概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight 2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。 Silverlight中内置了对于HTML、客户端脚本等的支持,本文为如何在Silverlight 2与HTML DOM进行交互第一部分,访问和修改DOM元素。 访问DOM元素 我们先来看一个简单的示例,如何访问HTML DOM。最终完成的效果如下,我们将在界面放置两个div,分别为div1和div2,下面绿色的区域为Silverlight部分,在第一个文本框中输入div的id并点击显示,将在下面显示出对应div上的文本信息。 首先我们需要对测试页做一下修改,因为默认的Silverlight插件所占的高度是100%,修改为200px。 <div style="height:200px"> <asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/TerryLee.SilverlightAccessingHtmlDom1.xap" Version="2.0" Width="100%" Height="200px" /> </div> 同时放置两个div: <div id="div1">这里是第一个div,id为div1</div> <div id="div2">这里是第二个div,id为div2</div> 为了看起来明显起见,给它们定义简单的样式: #div1 { background:#FCE2BC; border:solid 1px #FF9900; width:500px; height:50px; margin-bottom:20px; } #div2 { background:#BCC8FC; border:solid 1px #4769F9; width:500px; height:50px; margin-bottom:20px; } 实现Silverlight的界面布局,使用Canvas,给它的背景定义为浅绿色,XAML如下: <Canvas Background="#D5FCDF"> <TextBlock Text="Silverlight Accessing the HTML DOM"

Windows To Ghost系统封装之必备软件集 - 好压

好压压缩软件(HaoZip)是强大的压缩文件管理器,是完全免费的新一代压缩软件,相比其它压缩软件系统资源占用更少,有更好的兼容性,压缩率比较高。 它提供了对ZIP、7Z和TAR文件的完整支持,能解压RAR、ACE、UUE、JAR、XPI、BZ2、BZIP2、TBZ2、TBZ、GZ、GZIP、TGZ、 TPZ、LZMA、Z、TAZ、LZH、LZA、WIM、SWM、CPIO、 CAB、ISO、ARJ、XAR、RPM、DEB、DMG、HFS等多达44种格式文件这是同类软件无法比拟的。 好压压缩软件的功能包括强力压缩、分卷、加密、自解压模块、智能图片转换、智能媒体文件合并等功能。完美支持鼠标拖放及外壳扩展。 使用非常简单方便,配置选项不多,仅在资源管理器中就可以完成你想做的所有工作,并且具有估计压缩功能,你可以在压缩文件之前得到用ZIP、7Z两种压缩工具各三种压缩方式下的大概压缩率;还有强大的历史记录能;而资源占用相对较少,强大的固实压缩、智能图片压缩和多媒体文件处理功能是大多压缩工具所不具备的。 目前好压的最新版本是2010年10月28日发布的V2.1 正式版 ‍ 软件语言:简体中文软件版本:V2.1 (Build 5278)软件大小:4.83 M更新日期:2010-10-28系统要求:Win7 / XP / Vista / Win2000MD5:180D14260E19755CF7CD0678347C7C28 http://download.haozip.com/uniondown/haozip_tiny.204842.exe 转载于:https://www.cnblogs.com/windowsxp/archive/2012/04/20/Windows-Ghost-haozip.html

开心网倒闭变卖,创始人程炳皓反思的亲笔信全文

http://www.sohu.com/a/107804948_313427 开心网倒闭变卖,创始人程炳皓反思的亲笔信全文 2016-07-27 10:40 还记得开心网吗?记得2009、2010那两年半夜起来“偷菜”的日子吗?靠“偷菜”起家、曾经红极一时的开心网在沉寂多年后有了新动态。2016年7月20日,开心网宣布将自己卖给了一家A股上市公司赛为智能。就在消息公开的第二天,开心网创始人程炳皓宣布离职。 随后,程炳皓在自己的微信公众号上发布文章,描述了自己在开心网的这八年,以及对业务的思考,包括对抗假开心网、与微博微信竞争、“偷菜”等游戏的生命周期等。 而至于最终导致如此结局的原因,他认为既不是假开心网、也不是微博微信的竞争,而在于:一是偷菜停车,也有生命周期;二是熟人社交不是刚需,无法成为支撑一个产品的最大支柱。 开心网创始人程炳皓6000字亲笔信反思:两大败因,三大错误,八大机会没抓住 以下是程炳皓公开信全文: 2008年我和几位新浪的同事创办开心网(北京开心人信息技术有限公司),到现在(2016年)我离开,一共八年,这是我对自己八年的总结和告别。 其实我思想上的总结都还远没有完成,这篇文字总结就还更加缺乏章法,但是我昨天受到众多朋友的热情关心和关注,手机电量很快用光,特别是媒体朋友提出很多问题,只好现在仓促贸然发出了。也许再过几年,我能再做一个开心网总结2.0。 开心网最辉煌的时候,已经被无数次解读(包括我自己的解读),我这里主要从不辉煌角度解读。 2009年,很多人都认为开心网有机会成为一家超级互联网公司,但是令我愧对投资人与员工的是,开心网却从2010年就开始用户活跃度下滑,最后转型成为一家手机游戏公司,不再是一家平台公司,2015年开心人公司利润有大几千万,这是开心人们聪明和奋斗的结晶,但是确实离09年看到的“最好的可能”相去甚远。为什么? 以下就讲一下,我看到的原因,但这肯定不是这个问题的最终答案,这只是我个人做的一个复盘,欢迎指正。 先从人身上找原因,我个人的局限: 我创业前没有全面统管过一条业务线,主要从事产品和技术管理工作,对于销售、市场、投融资、公司战略、公司治理、财务、法律,没有实际经验,有媒体评论说我“不够商务”。 没有重点管理过非产品技术类人员,比如销售、市场、业务拓展,这些人员的管理与技术人员完全不同,对我来讲有一个学习过程。 我喜欢给自己设定过高的目标。没有困难创造困难也要上。 典型的工程师完美主义者天性,对于不熟悉的领域,条件不确定的事情偏保守。 我本性情商很低,也不喜欢合作,更喜欢完全掌控地完成一件事,不喜欢谈判,不喜欢参加各种会议,也许我是轻度的“社交恐惧症”患者。 再下来,是我对业务的思考。 “假开心网”打败了真开心网吗? 当然不。虽然我们遭受了很大的损失,几千万本来应该属于我们的用户被劫持走了,这件事的处理凸显了我在刚创办公司时候商业意识的不成熟,如果此事能够避免,我们应该能够有更多资源和时间,会对公司运营带来很大帮助。尽管如此,我们的主流用户群仍然用真正的开心网,在2011年我们终于迎来法庭最终判决,假开心网关闭。 微博、微信的竞争 是微博、微信打败了开心网吗?我的回答:不是。微博、微信的用户群和我们的用户群很相近,对我们有很大的影响。但是我们的用户活跃度下滑,是产品自身的特性和生命周期导致。微博、微信的出现加速了这个过程,但这不是根本原因。 开放平台 有朋友认为开心网推出开放平台比较晚而且开放也不够,并认为这是开心网用户活跃度下滑的主因。我的意见:批评得很对,但是我不认为这是根本原因。身处互联时代,我们应开放做企业,我们每一个人也都要持开放心态,如果开心网的开放平台建设好,对于开心网毫无疑问会有很大帮助,我们当年这方面动作确实慢了,但是开放平台对于留住用户也只能起到辅助作用。我认为,真正最重要的原因,有两个: 1 偷菜停车,也有生命周期。 社交游戏,和传统游戏看起来有很大不同,乐趣的核心点在“社交”,其实应该称作“游戏社交”可能更合适。其用户遍及男女老幼,因为是横空出世地完全创新,用户一开始得到全新的体验,乐趣极强黏性极强传播极快,但是终究也会有生命周期。 最重要的是,这种社交游戏不像传统游戏,传统游戏可以不停地换新题材、新玩法,一直不停地做下去,而社交游戏的乐趣在于人和人的一种新形式的交互乐趣-善意的玩笑,这种善意的玩笑经历了几次改良创新-从朋友买卖到争车位到偷菜,人们对这种玩笑的笑感被用尽了。用户不是对一款社交游戏失去兴趣,是对所有社交游戏失去兴趣。2011年之后,市场上基本没有纯粹的社交游戏了,有的只是传统游戏加上社交元素。 这是开心网第一个“命门”。之前也有不少人提到,大家给出的解决方案是,“你应该专心做社交”。这就要说下一个产品上的命门,这一个命门,我没有听别人讲过,是我自己的分析,对错与否,看官自己品鉴。 2 熟人社交不是刚需,无法成为支撑一个产品的最大支柱。 论据,除了我们自己一路运营的体会,还包括中国市场的客观状况,事实上,之前除了我们,还有很多家公司致力于“熟人社交”,但是现在基本都已经不是主流产品。 我知道你要说,“微信”,解释是,微信的核心黏性是“通讯”,通讯毫无疑问是最刚的刚需,微信是在通讯这个刚需的支撑下,附属了朋友圈,也许用户花了很多时间在朋友圈,但是朋友圈不是核心黏性。 微博?微博不是“熟人社交”,也许上面有熟人互粉,但那不是主流。陌陌?陌陌当然不是熟人啦,名字都写了。 最后你要说“facebook”,对不起,我不生活在美国,对于美国的社交产品我没有足够的发言权,但是中美两国互联网发展这么多年的历史已经表明,两个国家的互联网产品不是一一对应的关系,关于这一点,我们有很多的经验教训,试举一例,中国市场的农场游戏,社交因素体现在“偷菜”,这也是重要的核心乐趣,但是美国facebook上面最火的农场游戏,社交体现在“帮忙和分享”,我们后来又推出了一系列社交游戏,体现这种“帮忙和分享”,用户的热度远不及“买朋友做奴隶”、 “贴条”,和“偷菜”。 再详细讲一下,我们对于“熟人社交”的体会过程。事实上,开心网刚发布的时候,是一个熟人社交网站,我们一开始就想做一个“好玩”的网站,有一些好玩的小应用,但是没有社交游戏。我找了新浪很多同事来,大家一开始对这种体验很享受,新浪各种新老同事在开心网会师了,甚至有人“说程炳皓真奇怪,他从新浪辞职,却出去后给新浪做了个内部网”,但是一段时间后,活跃度开始下降,感觉是“大家没得聊了”,在各种探索中,我们注意到,我们开发的一些好玩的小应用,比如“动TA一下”“朋友印象”等,用户相对更喜欢。我们就越发沿着这种“好玩”的思路做,直到“朋友买卖”,这应该是中国第一个社交游戏,用户立刻蜂拥而上,我们知道“这回对了”,于是全力开发这种好玩互动的社交游戏,后来表现最好的有“争车位”、“偷菜”,但是其实我们做的远不止这几个。 在09年偷菜热潮中,我们也担心社交游戏的生命周期问题,所以我们一只手做新的社交游戏,另一只手想引导用户去社交。虽然有很多用户是为偷菜而来,但是北京、特别是上海的很多核心用户是有明显的社交行为,我们开发的非游戏应用“转贴”也成功吸引了很多原本只偷菜的用户。 但是随着偷菜等游戏的活跃度下滑,用户社交的活跃度也下滑。 我的体会是,用户上开心网主要目的是偷菜,上来后,因为我们在feed 流里面强推社交信息(照片、日记等),用户也被朋友的照片日记吸引,去参与评论。 但是,当用户已经不想去偷菜的时候,一个人的熟人朋友数目有限,产生的内容和互动数量也越来越少。当时主要还是电脑上网,用户开始缺乏动力去频繁打开开心网去查看是否有朋友的新消息。更加剧这一情况的因素有:老朋友在网上刚见到的惊喜也已经过去,不在一起工作生活的朋友缺乏持久的话题,同事和上司的存在又有一种无形的限制。 这可能就是开心网的另一个“命门”。 综上,如果以上分析成立,那么虽然开心网2008-2009年如烈火烹油,红得发紫,但其实产品上潜藏着巨大危机,而且微博已经在抢我们的用户,那时也刚刚开始移动互联网,用户在未来几年全都要换成移动设备,他在PC上使用的网站不一定延续到手机上,所以留给我们的时间并不多,我们必须要有更多的创新,而且要快,一刻也不能停留。 但这是现在从上帝视角看过去的结论,在各种事情纵横交错之时,我们当年没有看这么清晰,而且,我们犯了“成功者的错误”,这些错误其实我自己创业前经常批评别人,但是轮到自己,一点没有进步。 成功者的错误心态:上帝之选。 做为成功者,我们总是愿意相信自己一定会成功,而友商,一定会失败。我们不愿意真正相信自己的成功其实无比脆弱,随时有可能失败。但是诺基亚从极盛到售出只有不到5年时间,市场、政府、以及我们自身,都随时可能发生我们根本无法预测的变化。 说白了,我们在情势好的时候,弥漫着骄傲情绪,情势差的时候,又迅速转成抓狂情绪。 成功者的错误方法:路径依赖。 成功本来有无数偶然因素,但是我们当年没有认识到这个,我们开始总结,给自己总结了很多光辉的理论,然后说,我们今后就还坚持这么干,扩大战果。 “学我者生,似我者死”,更何况是学自己。 一件事做对了,应该忘记它往前看。再回头一看,就已经不是了。 成功者的错误逻辑:因为我是。。。所以做。。。我们就要。。。 这貌似和亚里士多德三段论一样完美。 我们做了很多新产品,都不脱离“社交”,甚至很多都是“熟人社交”。 其实,身处这个剧变的时代,每隔2-3年一小变,每隔3-5年infrastructure 就全变了,自己之前成功与否,自己是沿着什么路径做的,以及自己打下的那一亩三分地,相比外界,就变得不重要。 成功者的错误心态:一定要超越自己。 一家从高峰开始下滑的公司,背了一个巨大的包袱,过去的成功,可能转化为负资产。一方面,每天都是用户活跃度下滑,每天都有挫败感,士气低落,另一方面,又容易产生“你们看我再憋个大招”这种心态,失去了平常心。所以,一家曾经成功又走下坡的公司,要再起飞,非常的难。有一段时间,我们的一位友商,经常在市场上散布“从来没有起来又下去的公司,再起来过,所以,开心网肯定完蛋了”,说得是有道理的。 现在重新以上帝视角审视2010年之后,开心人这家公司,该怎么做呢? 我们本来有可能抓住哪些机会呢? 1、利用人气的聚集和熟人网络关系,做通讯功能。最好能与微软达成合作,掌控MSN,获得独立开发运营MSN 的权利。--当然与微软达成这样的合作难度非常大。 实际情况:与MSN好像有过接触,记不清了。2010年开发IM,因为对手非常强大(你懂的),所以产品负责人对产品要求很高,没有完成。之后发现Kik,马上推出了我们的类似产品“飞豆”。结局?产品当然有巨大需求,只是赢的是微信。 2、扩展开心网的熟人社交圈子,发展出类似微博的功能。或者,在微博早期与之整合。 实际情况:我们很早就看到Twitter的价值,但我们也看到这个模式的风险,归结到“成功者心态”,我们一开始不想冒风险。

Snippet: Fetching results after calling stored procedures using MySQL Connector/Python

https://geert.vanderkelen.org/2014/results-after-procedure-call/ Problem Using MySQL Connector/Python, you are calling a stored procedure which is also selecting data and you would like to fetch the rows of the result. Solution For this example we create a stored procedure which is executing SHOW SLAVE STATUS. ```python cnx = mysql.connector.connect(user=’scott’, password=’tiger’, database=’mining’) cur = cnx.cursor() cur.execute(“DROP PROCEDURE IF EXISTS slave_status”) proc = “CREATE PROCEDURE slave_status () BEGIN SHOW SLAVE STATUS; END” cur.execute() cur.call(“slave_status”)

基于ArcGIS JS API 4.11实现对FeatureLayer的多变量渲染

文章目录 需求背景需求分析开发过程效果图注意事项参考链接在线示例 需求背景 有一个二维数组,里面包含几万个表示高度的值,现在要把这些高度值在地图上展示出来。可以通过小立方体的方式展现,长宽固定,高用实际值代替。 需求分析 数据量较大,需要考虑性能问题;在三维场景中对点数据(二维数组中的单个值)进行三维符号化 开发过程 最开始的思路是创建类型为Point的Graphic,通过PointSymbol3D进行符号化,在ObjectSymbol3DLayer中设置固定的长宽,高度根据数组里面的具体值对应,主要代码大概如下: var elevArr = [];//模拟二维数组 for (let i=0;i<10;i++) { let rowArr = []; for (let j=0;j<10;j++) { rowArr.push(Math.random() * 1000); } elevArr.push(rowArr); } for (let row=0;row<elevArr.length;row++) { for (let col=0;col<elevArr[row].length;col++) { let locX = 17004630.030532643 + 500 + col*500; let locY = 3875195.620791356 - 500 - row*500; const objectSymbol = { type: "point-3d", // autocasts as new PointSymbol3D() symbolLayers: [{ type: "object", // autocasts as new ObjectSymbol3DLayer() width: 1000, // diameter of the object from east to west in meters height: elevArr[row][col], // height of the object in meters depth: 1000, // diameter of the object from north to south in meters resource: { primitive: "

推荐一个配置linux服务的网站

该网站的各种linux服务的配置都是基于CentOS系统的 基本上各种linux服务都有了 http://www.server-world.info/en/ 转载于:https://www.cnblogs.com/Skyar/p/3582389.html

golang的sort库

1.golang中排序 排序是程序员要考虑的主要算法之一。在不同语言中会实现不同的排序,C默认是对数组进行排序, C++是对一个序列进行排序, Go则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个slice(分片, 类似于数组),或是包含 slice 的一个对象。 golang中的排序主要通过sort库;sort库的排序可以通过插入排序、归并排序、堆排序和快速排序等方法,这些方法被封装在sort包里。 2.golang的sort库的用法 sort包可以队切片进行排序和用户自定义的数据集进行排序。 1)sort库对切片排序 sort包主要针对[]int、[]float64、[]string等切片排序,分别提供了 sort.Ints() 、 sort.Float64s() 和 sort.Strings() 函数, 默认都是从小到大排序。 参考代码如下: package main import ( "fmt" "sort" ) func main() { intList := [] int {2, 4, 3, 5, 7, 6, 9, 8, 1, 0} float8List := [] float64 {4.2, 5.9, 12.3, 10.0, 50.4, 99.9, 31.4, 27.81828, 3.14} stringList := [] string {"a", "c", "b", "d", "f", "i", "z", "

win10系统笔记本电脑如何通过USB连接iphone热点

一开始我单纯的以为iphone无法实现 通过usb连接热点(是真的无知) 后来在网上各种搜教程,结果就是各种仿佛很高端的更改网络适配器,打开“FTP服务器”、“WEB服务器”、“安全web服务器”等等之类的 然后我一顿操作猛如虎 但是结果还是没有任何反应(我的iphone系统为:ios 12.3.1) 然后我就在尝试在win10上下载个iTunes(我一哥们在Microsoft store下载的iTunes 貌似无法自动连接为宽带) iTunes官网下载地址(个人不喜欢在Microsoft store 下载 ):https://www.apple.com/cn/itunes/download/ 进到官网后看见图1框为从Micrsoft store下载的方法 所以如果想直接浏览器下载 点下上图的图框2就行了 人后就变成下图的效果 看到下图的框1变成了Windows Store 然后直接点击 图框2 的立即下载就是64位的(如果下载32位的就点击图框2下方的立即下载) 然后然后。。。。我直接用usb将iphone和电脑连接 连接到电脑时会有一个提示让你选择信任电脑 一定要选择信任才能接着往下操作的 如果没有弹出任何提示的情况下: 但是在我给我 “祖力儿子” 添加iPhone(系统为:ios 12.1.3)的usb热点时 他的手机怎么都不弹出那个信任的选项 后来捯饬了半天才找到那个信任的解决办法: 打开设置→通用 →关于本机→证书信任设置 选择打开 然后手机就会弹出那个 信任电脑得提示的 然后按照下面的方式就可以直接连接到iPhone的usb宽带了 打开手机热点选择仅USB 打开手机热点后iTunes会自动启动打开 稍等片刻电脑就连接上iphone的热点了 而且是宽带的链接方式 所以大家不要再被那些没用的教程误导了!!! 总结:win10电脑通过usb连接到网络—>直接下个iTunes就够了 下iTunes就完了!!! 下iTunes就完了!!! 下iTunes就完了!!!

C#图像画矩形框

//保存127*229的图片_S //File.Copy(imagepath, temppath, true); //拷贝文件 bmp = new Bitmap(imagepath); bmp_S = new Bitmap(bmp, 127, 229); //bmp_S.Save(imagepath_S, ImageFormat.Jpeg); g = Graphics.FromImage(bmp_S); //gp = new GraphicsPath(); //rec = new Rectangle(new Point((total - height) / 2, (total - height) / 2), new Size(width, height)); //gp.AddRectangle(rec); pen = new Pen(Color.Red); pen.Width = penWidth; g.DrawRectangle(pen, new Rectangle(new Point((total - height) / 2, (total - height) / 2), new Size(width, height))); bmp_S.SetResolution(72, 72); //设置分辨率 bmp_S.Save(imagepath_S, ImageFormat.

vscode 函数跳转很慢

# 1. vscode 为什么被选择 * 创建工程及其简单 * 界面舒服 * 因为开源好用的和不好用的插件较多。(量说明一切) # 2.其他编辑器不作为主要编辑器原因 * notepad++ 只编辑一页这是最好的选择,多了我对notepad++插件不大了解,可能也是先入为主的原因。反正就是没花多少时间去研究过。 * sublime 曾经用过免费的,还算可以,印象中是不开源的。 * sourceinsight 使用过叫长一段时间,对于大型工程来说确实在跳转和查找方面比较好用 。 但是界面风格简洁,轻便。可惜没有继续维护了。另外就是创建工程麻烦。在公司遇到专家级别的工程师,问为什么函数之间为什么不很正常的跳转。然后,发现连工程都没建立,也没同步。经验告诉我,工具好不好用,也要看用的人。 * vim 这玩意,我弄了很久,尝试安装很多插件;但就是使用起来各种不顺,各种需求得不到满足。 换台机器部署自己的编辑环境又极度麻烦。 ** 最终,我也不是只使用一种工具,目前使用较多的window环境使用vscode 和notepad++,到linux环境就是vscode+vim 这种搭配方式,使用起来感觉顺畅多了。 # 3. vscode函数跳转很慢 - 也不知道什么原因,vscode函数跳转很慢; 现在公司的电脑和自己的电脑都安装了vscode ,但就不是不知道为什么公司的函数跳转很慢。 - 记录下来,如果有遇到类似问题的,麻烦回复一下,谢谢。 ## 3.1 怀疑点1 插件 - 明天将所以插件去掉,保留C/C++再试试。 ## 3.2 还原点2 公司加密或者后台怕的程序影响跳转,无论如果都先试试。 

超简单 微信开发 分享功能 php,自定义微信分享功能

转载自: https://blog.csdn.net/sh13523149003/article/details/73692699 一:准备设置js 借口安全域名: 这需要使用微信的jssdk,先需要在微信公众号后台进行设置:公众号设置–>功能设置–>JS接口安全域名。 二:前端配置 首先在前端页面引入jssdk 的js 文件 然后进行前端配置: wx.config({ debug: true,//调试模式 appId: '<?php echo $signPackage["appId"];?>',// timestamp: <?php echo $signPackage["timestamp"];?>,//生成签名的时间戳 nonceStr: '<?php echo $signPackage["nonceStr"];?>',//生成签名的随机串 signature: '<?php echo $signPackage["signature"];?>', jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline']// 所有要调用的 API 都要加到这个列表中 }); wx.ready(function() { wx.onMenuShareAppMessage({ //分享给朋友 title: 'aa', // 分享标题,可在控制器端传递 desc: '非常舒适',//分享的描述,可在控制器端传递 link: 'URL', // 分享链接,可在控制器端传递 imgUrl: 'URL', // 分享图标 ,可在控制器端传递 success: function() { // 用户确认分享后执行的回调函数 }, cancel: function() { // 用户取消分享后执行的回调函数 } }); wx.onMenuShareTimeline({ //分享到朋友圈 title: '分享的标题', desc: '分享的描述', link: 'url', // 分享链接 imgUrl: 'url', // 分享图标 success: function() { // 用户确认分享后执行的回调函数 }, cancel: function() { // 用户取消分享后执行的回调函数 } }); }); </script> timestamp: <?

大数据架构如何做到流批一体?

阿里妹导读:大数据与现有的科技手段结合,对大多数产业而言都能产生巨大的经济及社会价值。这也是当下许多企业,在大数据上深耕的原因。大数据分析场景需要解决哪些技术挑战?目前,有哪些主流大数据架构模式及其发展?今天,我们都会一一解读,并介绍如何结合云上存储、计算组件,实现更优的通用大数据架构模式,以及该模式可以涵盖的典型数据处理场景。 大数据处理的挑战 现在已经有越来越多的行业和技术领域需求大数据分析系统,例如金融行业需要使用大数据系统结合 VaR(value at risk) 或者机器学习方案进行信贷风控,零售、餐饮行业需要大数据系统实现辅助销售决策,各种 IOT 场景需要大数据系统持续聚合和分析时序数据,各大科技公司需要建立大数据分析中台等等。 抽象来看,支撑这些场景需求的分析系统,面临大致相同的技术挑战: 业务分析的数据范围横跨实时数据和历史数据,既需要低延迟的实时数据分析,也需要对 PB 级的历史数据进行探索性的数据分析; 可靠性和可扩展性问题,用户可能会存储海量的历史数据,同时数据规模有持续增长的趋势,需要引入分布式存储系统来满足可靠性和可扩展性需求,同时保证成本可控; 技术栈深,需要组合流式组件、存储系统、计算组件和; 可运维性要求高,复杂的大数据架构难以维护和管控; 简述大数据架构发展 Lambda 架构 Lambda 架构是目前影响最深刻的大数据处理架构,它的核心思想是将不可变的数据以追加的方式并行写到批和流处理系统内,随后将相同的计算逻辑分别在流和批系统中实现,并且在查询阶段合并流和批的计算视图并展示给用户。Lambda的提出者 Nathan Marz 还假定了批处理相对简单不易出现错误,而流处理相对不太可靠,因此流处理器可以使用近似算法,快速产生对视图的近似更新,而批处理系统会采用较慢的精确算法,产生相同视图的校正版本。 图 1 Lambda架构示例 Lambda架构典型数据流程是(http://lambda-architecture.net/): 所有的数据需要分别写入批处理层和流处理层; 批处理层两个职责:(i)管理 master dataset (存储不可变、追加写的全量数据),(ii)预计算batch view; 服务层对 batch view 建立索引,以支持低延迟、ad-hoc 方式查询 view; 流计算层作为速度层,对实时数据计算近似的 real-time view,作为高延迟batch view 的补偿快速视图; 所有的查询需要合并 batch view 和 real-time view; Lambda 架构设计推广了在不可变的事件流上生成视图,并且可以在必要时重新处理事件的原则,该原则保证了系统随需求演进时,始终可以创建相应的新视图出来,切实可行地满足了不断变化的历史数据和实时数据分析需求。 Lambda 架构的四个挑战 Lambda 架构非常复杂,在数据写入、存储、对接计算组件以及展示层都有复杂的子课题需要优化: 写入层上,Lambda 没有对数据写入进行抽象,而是将双写流批系统的一致性问题反推给了写入数据的上层应用; 存储上,以 HDFS 为代表的master dataset 不支持数据更新,持续更新的数据源只能以定期拷贝全量 snapshot 到 HDFS 的方式保持数据更新,数据延迟和成本比较大; 计算逻辑需要分别在流批框架中实现和运行,而在类似 Storm 的流计算框架和Hadoop MR 的批处理框架做 job 开发、调试、问题调查都是比较复杂的;

数据分析(8)--matplotlib 数据可视化

数据可视化 基本概念 数据可视化是指借助于图形化的手段,清晰、快捷有效的传达与沟通信息。同时,也可以辅助用户做出相应的判断,更好的去洞悉数据背后的价值。 字不如表,表不如图。 观察号码的频率,每个号码出现了多少次? 文字 08 10 15 20 30 31 33 06 01 09 10 17 21 28 32 13 02 05 08 13 19 21 28 10 03 05 07 14 18 23 25 07 …… …… 表格 图形 通过可视化图表方式,就可以清晰的表达信息。 可视化图形辅助决策 1854 年英国伦敦霍乱病流行时,斯诺博士在绘有霍乱流行地区所有道路、房屋、饮用水机井等内容的城区地图上,标出了每个霍乱病死者的住家位置,得到了霍乱病死者居住位置分布图,发现了霍乱病源之所在:布劳德大街(现布劳维克大街)的公用抽水机。 matplotlib matplotlib是用于Python的绘图库,提供各种常用图形的绘制。例如,条形图,柱形图,线图,散点图等。 安装 pip install matplotlib 导入 根据惯例,使用如下的方式导入: import matplotlib as mpl import matplotlib.pyplot as plt 图形绘制 绘制线图 可以通过matplotlib.pyplot的plot方法进行图形绘制。 plot(y)plot(y, ‘格式’)plot(x, y)plot(x, y, ‘格式’)plot(x1, y1, ‘格式1’, x2, y2, ‘格式2’ …… xn, yn, 格式n) # 如果没有指定横坐标x,则横坐标x会从0开始,自增。(0,1,2,3,4……) # 如果我们只绘制一个值,该值就是一个点,我们需要指定marker来设置标记,否则该点不可见。 # plt.

数据分析(7)-如何使用Python与Hadoop生态系统进行交互(译)

我们都知道hadoop主要使用java实现的,那么如何使用python与hadoop生态圈进行交互呢,我看到一篇很好的文章,结合google翻译和自己的认识分享给大家。 您将学习如何从Hadoop Distributed Filesystem直接加载文件内存等信息。将文件从本地移动到HDFS或设置Spark。 from pathlib import Path import pandas as pd import numpy as np spark 安装 首先,安装findspark,以及pyspark,以防您在本地计算机上工作。如果您在Hadoop集群中关注本教程,可以跳过pyspark install。为简单起见,我将使用conda虚拟环境管理器(专业提示:在开始之前创建虚拟环境,不要破坏系统Python安装!)。 !conda install -c conda-forge findspark -y !conda install -c conda-forge pyspark -y 使用findspark进行Spark设置 import findspark # Local Spark # findspark.init('/home/cloudera/miniconda3/envs/jupyter/lib/python3.7/site-packages/pyspark/') # Cloudera cluster Spark findspark.init(spark_home='/opt/cloudera/parcels/SPARK2-2.3.0.cloudera4-1.cdh5.13.3.p0.611179/lib/spark2/') 进入pyspark shell from pyspark.sql import SparkSession spark = SparkSession.builder.appName('example_app').master('local[*]').getOrCreate() 让我们获得现有的数据库。我假设您熟悉Spark DataFrame API及其方法: spark.sql("show databases").show() ±-----------+ |databaseName| ±-----------+ | __ibis_tmp| | analytics| | db1| | default|

c++四种cast的原理和用途

四种cast c++ 有四种显示类型转换,分别为static_cast, dynamic_cast, const_cast, reinterpret_cast。 static_cast主要用于 1.基本类型的转换,比如int转char 2.类的上行转换,子类的指针或者引用转换为基类(安全) 3.类的下行转换,基类的指针或引用转换为子类(不安全,没有类型检查) dynamic_cast用于类的指针或引用的转换 1.类的上行转换,子类的指针或引用转化为基类(安全) 2.类的下行转换,基类的指针或引用转化为子类 (因为有类型检查所以是安全的,但类型检查需要运行时类型信息,这个信息位于虚函数表中,所以必须要有虚函数) const_cast 主要是用于改变类型的常量属性:常量指针转化为非常量指针;常量引用转化为非常量引用;常量对象转化。为非常量对象 reinterpret_cast用于非关联类型的转换,操作结果是一个指针到其他指针的二进制拷贝,没有类型检查。

QT QMouseEvent 鼠标事件

目录 鼠标事件重载函数 判断鼠标按下 更改鼠标光标形状 鼠标跟踪 鼠标事件重载函数 通常是重定义部件的鼠标事件处理函数来进行一些自定义的操作。 Protected: void mousePressEvent(QMouseEvent *event); //鼠标按下事件 void mouseReleaseEvent(QMouseEvent *event); //鼠标释放事件 void mouseDoubleClickEvent(QMouseEvent *event); //鼠标双击事件 void mouseMoveEvent(QMouseEvent *event); //鼠标移动事件 void wheelEvent(QMouseEvent *event); //鼠标滚轮事件 判断鼠标按下 if(event->button() == Qt::LeftButton) //判断鼠标左键点击 if(event->button() == Qt::RightButton) //判断鼠标右键右键 if(event->buttons() & Qt::LeftButton) //判断鼠标左键按下的同时移动鼠标 if(event->buttons() & Qt::RightButton) //判断鼠标右键按下的同时移动鼠标 更改鼠标光标形状 (在构造函数内添加): QCursor cursor; //设置光标对象 cursor.setShape(Qt::OpenHandCursor); //设置光标形状 setCursor(cursor); //使用光标 鼠标跟踪 pos()函数获取鼠标指针在窗口中的位置,pos().x() 和 pos().y() 获取坐标点。 默认是当按下鼠标按键时移动鼠标,鼠标移动事件才会产生,如果想不按鼠标按键,也可以获得鼠标移动事件,可以构造函数上添加这一行: setMouseTracking(true); //设置鼠标跟踪

element-ui中的upload组件使用总结

element-ui官网 使用upload组件: <el-upload class="upload-demo" ref="uploadFile" :on-change="beforeUpload" :action="uploadUrl" :headers="myHeader" :on-remove="handleRemove" :before-remove="beforeRemove" :limit="1" :auto-upload="false" :on-exceed="handleExceed" > <el-button size="small" type="primary">选择文件</el-button> action: 是请求后端接口的路径 (必填的) header: 是配置请求头的 / 在此处带了token on-change: 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用 on-remove: 是文件列表中移除文件时执行的 before-remove: 删除文件之前执行的,可以用作提示用户二次确认删除 limit: 是上传文件的个数 auto-upload: 是控制是否自动上传的 on-exceed: 上传文件个数超过限制的时候执行的 此处添加的ref是为了在用户点击关闭后清空列表 通过clearFiles方法,这也是element提供的。 addDialogClose(){ this.$refs.ruleForm.resetFields(); this.addClassroomShow = false this.$refs.upload.clearFiles(); } 在使用时最坑的地方就是action属性不能及时响应数据跟新,总是晚一步。 使用了before-upload、on-progress都不行,数据已经更改,但是action里还是旧的。 研究一下午: 将auto-upload属性设置为false, 然后使用了on-change 在on-change钩子中,去判断文件后缀,来确定文件类型,来确定调用不同的接口 然后通过ref属性去执行上传 beforeUpload(file) { if(/\.(mp4|m3u8|rmvb|avi|swf|3gp)$/.test(file.name)) { this.ruleForm.uploadUrl = this.vidoeUploadUrl }else{ this.ruleForm.uploadUrl = this.fileUploadUrl } this.$nextTick(()=>{ this.$refs.uploadFile.submit() }) }, 此时就ok了!