|
1 2 3 4 5 6 7 8 |
public string HmacSha256(string message, string key) { var encoding = new ASCIIEncoding(); var keyByte = encoding.GetBytes(key); var sha256 = new HMACSHA256(keyByte); var messageBytes = encoding.GetBytes(message); return Convert.ToBase64String(sha256.ComputeHash(messageBytes)); } |
View Details
我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应用程序池-->右击-->高级设置-->打开如下图-->在加载用户配置文件选择true 3.如果以上两个方案都不能解决问题,就有可能是加载证书时没有给定证书存储标识 解决方法:在加载证书方法时使用以下方法,请注意第三个参数 X509Certificate2 cer = new X509Certificate2(cerPath, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); req.ClientCertificates.Add(cer); from:http://www.2cto.com/weixin/201602/489552.html
View Details由于谷歌商店国内访问不了,即使访问得了,国内许多安卓机也没有google play的框架,还是安装不了google商店的应用。想用安卓机开发啊,找度娘,终于在csdn的下载上,找到了个可用的~ Apk下载 csdn:http://download.csdn.net/download/yyh352091626/9176197
View Details当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能, 但是面对一个复杂的SQL语句,找到一个优化的索引组合对人脑来讲,真的不是一件很简单的事。 好在SQLSERVER提供了两种“自动”功能,给你建议,该怎么调整索引 第一种是使用DMV 第二种是使用DTA (database engine tuning advisor) 数据库引擎优化顾问 这篇文章主要讲第一种 从SQL2005以后,在SQLSERVER对任何一句语句做编译的时候,都会去评估一下, 这句话是不是缺少什么索引的支持,如果他认为是,他还会预估,如果有这麽一个索引 他的性能能提高多少 SQLSERVER有几个动态管理视图 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记录了当前数据库下所有的missing index的信息,他针对的是SQLSERVER从启动以来所有运行的语句, 而不是针对某一个查询。DBA可以看看,哪些表格SQLSERVER对他是最有“意见”的 以下是这个DMV的各个字段的解释: 1、index_handle:标识特定的缺失索引。该标识符在服务器中是唯一的。index_handle 是此表的密钥 2、database_id :标识带有缺失索引的表所驻留的数据库 3、object_id :标识索引缺失的表 4、equality_columns:构成相等谓词的列的逗号分隔列表 即哪个字段缺失了索引会在这里列出来(简单来讲就是where 后面的筛选字段), 谓词的形式如下:table.column =constant_value 5、inequality_columns :构成不等谓词的列的逗号分隔列表,例如以下形式的谓词:table.column > constant_value “=”之外的任何比较运算符都表示不相等。 6、included_columns:用于查询的涵盖列的逗号分隔列表(简单来讲就是 select 后面的字段)。 7、statement:索引缺失的表的名称 比如下面这个查询结果 那么应该创建这样的索引
|
1 |
1 CREATE INDEX idx_SalesOrderDetail_test_ProductID_IncludeIndex ON SalesOrderDetail_test(ProductID) INCLUDE(SalesOrderID) |
在ProductID上创建索引,SalesOrderID作为包含性列的索引 注意事项: 由 sys.dm_db_missing_index_details 返回的信息会在查询优化器优化查询时更新,因而不是持久化的。 缺失索引信息只保留到重新启动 SQL Server 前。如果数据库管理员要在服务器回收后保留缺失索引信息, 则应定期制作缺失索引信息的备份副本 sys.dm_db_missing_index_columns(index_handle) 返回与缺少索引(不包括空间索引)的数据库表列有关的信息,sys.dm_db_missing_index_columns 是一个动态管理函数 字段解释 index_handle:唯一地标识缺失索引的整数。 sys.dm_db_missing_index_groups 返回有关特定缺失索引组中包含的缺失索引(不包括空间索引)的信息 sys.dm_db_missing_index_group_stats 返回缺失索引组的摘要信息,不包括空间索引 这个视图说白了就是预估有这麽一个索引,他的性能能提高多少 有一个字段比较重要: avg_user_impact: 实现此缺失索引组后,用户查询可能获得的平均百分比收益。该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。 就是说,增加了这个缺失索引,性能可以提高的百分比 下面是MSDN给出的示例,缺失索引组句柄为 2
|
1 2 3 4 5 6 7 8 9 10 |
1 --查询提供缺失索引的数据库、架构和表的名称。它还提供应该用于索引键的列的名称 2 USE [AdventureWorks] 3 GO 4 SELECT migs.group_handle, mid.* 5 FROM sys.dm_db_missing_index_group_stats AS migs 6 INNER JOIN sys.dm_db_missing_index_groups AS mig 7 ON (migs.group_handle = mig.index_group_handle) 8 INNER JOIN sys.dm_db_missing_index_details AS mid 9 ON (mig.index_handle = mid.index_handle) 10 WHERE migs.group_handle = 2 |
示例代码:
|
1 2 3 4 5 6 |
1 USE [AdventureWorks] --要查询索引缺失的数据库 2 GO 3 SELECT * FROM sys.[dm_db_missing_index_details] 4 SELECT * FROM sys.[dm_db_missing_index_groups] 5 SELECT * FROM sys.[dm_db_missing_index_group_stats] 6 SELECT * FROM sys.[dm_db_missing_index_columns](1) --1 :1是根据dm_db_missing_index_details查出来的 |
[…]
View Details今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库实例里有多个数据库 现象 他说是这几天才出现的,而且在每天的某一个时间段才会出现CPU占用高的情况 内存占用不太高,只占用了30个G CPU占用100% 排查方向 一般排查都是用下面的脚本,一般会用到三个视图sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests
|
1 2 3 4 5 |
USE master GO --如果要指定数据库就把注释去掉 SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb' SELECT COUNT(*) FROM [sys].[dm_exec_sessions] WHERE [session_id]>50 |
看一下当前的数据库用户连接有多少 然后使用下面语句看一下各项指标是否正常,是否有阻塞,这个语句选取了前10个最耗CPU时间的会话
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
SELECT TOP 10 [session_id], [request_id], [start_time] AS '开始时间', [status] AS '状态', [command] AS '命令', dest.[text] AS 'sql语句', DB_NAME([database_id]) AS '数据库名', [blocking_session_id] AS '正在阻塞其他会话的会话ID', [wait_type] AS '等待资源类型', [wait_time] AS '等待时间', [wait_resource] AS '等待的资源', [reads] AS '物理读次数', [writes] AS '写次数', [logical_reads] AS '逻辑读次数', [row_count] AS '返回结果行数' FROM sys.[dm_exec_requests] AS der CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb' ORDER BY [cpu_time] DESC |
如果想看具体的SQL语句可以执行下面的SQL语句,记得在SSMS里选择以文本格式显示结果
|
1 2 3 4 5 6 7 8 |
--在SSMS里选择以文本格式显示结果 SELECT TOP 10 dest.[text] AS 'sql语句' FROM sys.[dm_exec_requests] AS der CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest WHERE [session_id]>50 ORDER BY [cpu_time] DESC |
模拟了一些耗CPU时间的动作 还有查看CPU数和user scheduler数和最大工作线程数,检查worker是否用完也可以排查CPU占用情况
|
1 2 3 4 |
--查看CPU数和user scheduler数目 SELECT cpu_count,scheduler_count FROM sys.dm_os_sys_info --查看最大工作线程数 SELECT max_workers_count FROM sys.dm_os_sys_info |
查看机器上的所有schedulers包括user 和system 通过下面语句可以看到worker是否用完,当达到最大线程数的时候就要检查blocking了 对照下面这个表 各种CPU和SQLSERVER版本组合自动配置的最大工作线程数 CPU数 32位计算机 64位计算机 <=4 256 512 8 288 576 16 352 704 32 480 960
|
1 2 3 4 5 6 7 8 |
SELECT scheduler_address, scheduler_id, cpu_id, status, current_tasks_count, current_workers_count,active_workers_count FROM sys.dm_os_schedulers |
如果SQLSERVER存在要等待的资源,那么执行下面语句就会显示出会话中有多少个worker在等待 结合[sys].[dm_os_wait_stats]视图,如果当前SQLSERVER里面没有任何等待资源,那么下面的SQL语句不会显示任何结果
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
SELECT TOP 10 [session_id], [request_id], [start_time] AS '开始时间', [status] AS '状态', [command] AS '命令', dest.[text] AS 'sql语句', DB_NAME([database_id]) AS '数据库名', [blocking_session_id] AS '正在阻塞其他会话的会话ID', der.[wait_type] AS '等待资源类型', [wait_time] AS '等待时间', [wait_resource] AS '等待的资源', [dows].[waiting_tasks_count] AS '当前正在进行等待的任务数', [reads] AS '物理读次数', [writes] AS '写次数', [logical_reads] AS '逻辑读次数', [row_count] AS '返回结果行数' FROM sys.[dm_exec_requests] AS der INNER JOIN [sys].[dm_os_wait_stats] AS dows ON der.[wait_type]=[dows].[wait_type] CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest WHERE [session_id]>50 ORDER BY [cpu_time] DESC |
比如我当前执行了查询SalesOrderDetail_test表100次,由于表数据非常多,所以SSMS需要把SQLSERVER执行的结果慢慢的取走, 造成了ASYNC_NETWORK_IO等待
|
1 2 3 4 |
USE [AdventureWorks] GO SELECT * FROM dbo.[SalesOrderDetail_test] GO 100 |
问题源头 经过排查和这几天的观察情况,确定是某些表缺失索引导致,现在在这些表上增加了索引,问题解决
|
1 2 3 4 5 6 |
select * from t_AccessControl --权限控制表权限控制 select * from t_GroupAccess --用户组权限表用户组权限 select * from t_GroupAccessType --用户组权限类表用户组权限类 select * from t_ObjectAccess --对象权限表对象权限 select * from t_ObjectAccessType --对象权限类型表对象权限类型 select * from t_ObjectType --对象类型表对象类型 |
查询CPU占用高的语句
|
1 2 3 4 5 6 7 8 9 10 11 |
SELECT TOP 10 total_worker_time/execution_count AS avg_cpu_cost, plan_handle, execution_count, (SELECT SUBSTRING(text, statement_start_offset/2 + 1, (CASE WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset END - statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS query_text FROM sys.dm_exec_query_stats ORDER BY [avg_cpu_cost] DESC |
查询缺失索引
|
1 2 3 4 5 6 |
SELECT DatabaseName = DB_NAME(database_id) ,[Number Indexes Missing] = count(*) FROM sys.dm_db_missing_index_details GROUP BY DB_NAME(database_id) ORDER BY 2 DESC; |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECT TOP 10 [Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) , avg_user_impact , TableName = statement , [EqualityUsage] = equality_columns , [InequalityUsage] = inequality_columns , [Include Cloumns] = included_columns FROM sys.dm_db_missing_index_groups g INNER JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle INNER JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle ORDER BY [Total Cost] DESC; |
定位问题后,新建非聚集索引
|
1 2 3 4 5 6 7 |
CREATE NONCLUSTERED INDEX IX_t_AccessControl_F4 ON dbo.t_AccessControl ( FObjectType )include([FUserID], [FAccessType], [FAccessMask]) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO drop index IX_t_AccessControl_F4 on t_AccessControl |
CPU占用恢复正常 总结 从多次历史经验来看,如果CPU负载持续很高,但内存和IO都还好的话,这种情况下,首先想到的一定是索引问题,十有八九错不了。 注意文章开头贴出的客户机器负载情况图
View Details作者Jeff Standen,有着21+年经验的软件开发者。 首先开发spike解决方案——这是我早期敏捷/极限编程所养成的习惯之一。spike解决方案是一次性原型,可以帮助你在投入大量时间和精力之前验证你是否走对路。 区别就在于原型,因为你遵循这样一个规则,在你完成研究之后,你最终会扔掉“spike”代码。所以允许你偷工减料,迅速行动,因为它不会出现在产品或代码审查中。 此方法有助于迅速发现设计的哪些部位尚不明确,而不必过早地尝试架构或设计决策。 致力于小而连贯代码块的版本控制——通过类似CVS/Subversion,每次提交都直接发送到服务器。做部分文件的提交并不简单。 随着Git的出现,只提交较大文件的若干行代码变得很容易,并且可以在push到远程代码仓库之前先本地rebase/merge提交。 有一次,我在工作于更大功能的时候,采用了小型增量提交,我的工作效率直线上升。这样做能够清空我的大脑以便于面对更重要的事情。 经常写代码——最近,我正工作于:一个基于Web的企业协作和自动化平台(PHP / MySQL),一个基于云的实时指标聚合器和使用循环哈希(Node.js/ Redis)的API,一个面向iOS app商店(Swift/ SpriteKit)的棋盘游戏,专门的基于URL的cronjob可替代基于web的SaaS服务(JAVA),等等。 用过大量框架和语言有助于我的抽象和算法思维。 我从工具,如Eclipse RCP、Tapestry和Hibernate中学到了很多伟大的经验教训,并用到我的PHP项目里。尤其是在2000年初,在有Java特征的企业生态系统用于PHP存在之前。我从Unity3d/C#学到了很多关于网络和面向消息的架构。 如果我只坚持单一平台和社区的话,就永远不会知道这些概念。 编写简单的代码——我以前习惯于写复杂的代码以作为对自己的挑战。而现在的挑战是要编写优雅且简单的代码——到一种每个人都觉得他们也能做到的地步(即使他们不能)。简单代码通常来自于若干次复杂代码的迭代。 引用Antoine de Saint Exupéry的话就是:“不是没有什么可添加,而是没有什么可消减的时候,才算是达到了完美。” 这也使得我们在长时间休止之后返回项目,以及鼓励其他人参与进来变得容易多了。 最后优化——我们很容易掉入试图比用户或计算机更聪明,并且预优化各种边缘情况的陷阱。关注帕累托法则(80%的效果来自于20%的工作)。写代码,运行代码,当必要的时候专注于最大的瓶颈。这也支持保持代码库的简单。 说“不要首先优化代码”并不意味着“编写粗糙的代码”。代码总是应该精益和优雅,没有必要画蛇添足,不要将一整天的时间用在挤压剩下的10%,但其实已经能够工作良好的一些东西上。不但工作效率会下降,而且还会引进更多复杂性,解决方案变得不那么可归纳,等等。 着眼于“最重要的事情优先”——总是有一些项目领域比其他的更有趣或更具挑战性。工作于那些有趣的东西总是比工作于那些必要的东西更有诱惑。 在攻克重要部分时,将有趣部分作为一种调剂,也就是说,两者都做一点也是可以。 因此,光从这一点上说,将大的问题分解成小问题的理念是不言自明的。每个人都懂。所以,我会通过计分若干“quick wins”来开启我的一天,这能让我更有冲劲和更专注(“quick wins”可以是任何东西,包括有趣又小型的挑战),然后我会首先冲向“最重要的事情”。 了解全栈——当我刚开始干这一行的时候,没有什么比等别人做完他们那部分东西,然后我才能继续我那部分工作更糟糕的了(设计师,后端人员,前端人员,数据库人员,服务器人员,等等)。 于是,当我2000年创办自己的软件开发公司的时候,我做了一个明智的决定,那就是涉猎全栈。我知道我不可能擅长所有东西,也不可能是最后唯一对所有一切负责的人,但我想要做终端到终端的原型,因为我没有耐心看过程。 每当我需要的东西触碰到我不懂的领域时,我会研究它。于是乎,我学会了服务器管理,数据库管理,设计,前端/后端开发,云架构等。 通过了解其他领域是做什么的,我才能写出包含它们需要的代码。 当然,其中的一些要点似乎并不是所谓的“小习惯”,但我向你保证,它们是小变化历经20年时间导致的结果。重要的行为变化并没有意义,更多的是关于我是如何频繁地练习这门技术(在过去10年时间中每年大概4000-5000个小时)。 所以,我的做法更像是去回答这个问题:“什么样的小习惯会导致更糟糕的软件和低效的生产力?”,然后反过来。 作者Ed Prentice,软件工程师 时间是宝贵的,所以要尽可能地节省时间。尽可能自动化。一旦时间成为一种商品,那么你可以实现下一个伟大的创新。 使用功能强大的IDE(如vim),并将其配置能为你做尽可能多的事情。力争单个命令Build/Test/Deploy/Run。 如果你发现自己常做某件事情,那么可以让它们在一个按键下发生,或者一次点击下发生。或者更好的是,让它们自动发生。 了解键盘快捷键和UNIX命令行。几乎所有的IDE都可以让你运行复杂的编译命令,甚至任意的终端命令——不但强大,并且可以为你节省大量的时间。 提问题,然后提更多的问题。如果有什么你不明白的事情发生了,那就问为什么。然后走开,研究替代方案,并提出来。一直问问题直到你可以详细地给下一个问为什么的开发人员解释。我时常感到奇怪为什么会有这么多开发人员不知道为什么,仅仅是因为觉得“它总是/曾是这样”。 通过提供更好的替代解决方案挑战现状——并且制定步骤实现。如果你的测试不完整,或每天/每周运行一次——那么成为本地的Continuous Integration大师——目的是为了有利于你的团队,并实现它。一旦你使用它并且它可以帮助你更好工作的话,那么让你的团队也使用它。 不要只是挑战别人,挑战自己。从来没有写过web应用程序?那么写一个。从未用过Python?用Python劫持无人飞行器。 拥有一些东西。创造一些东西。没有必是非要做技术项目,可以是一个事件,例如聚会或编程马拉松,也可以是一个游戏,一个网站,一个博客。 教一些东西。Java,公开演讲,写作,下棋,vim,网球。 成为一个杰出的人。拿到一个垃圾类/组件?修复好它。编写代码的正确途径。不在代码中走捷径。做出明智的决策,向你周围的人说明为什么你要做这个决定的利弊。总是改善代码。制定不需要花费1小时的待办事项表?Just Do It。 浏览你熟悉的Stack Exchange的话题——例如你喜欢的语言。当你发现什么新的东西的时候,尽快末位淘汰相关知识。知道C语言?什么是分支预测?这篇文章会告诉你——你要做的就是学习。 浏览你不熟悉的Stack Exchange的话题——好好学习,天天向上。 学会沟通。书面文字,呈现展示,解决问题,小却激烈的小项目,大型团队,小型团队。 文档化你的所有过程。你可以回头查阅你为什么做这些事情,以及依赖原先的解决方案去解决碰到的相似问题。这还有助于捕捉你可能会忘记的思维过程和关键的信息片段。我经常通过日志来回顾前几天的工作。 在你写之前文档化你的代码。使用系统图,类层次结构,流程图表,以展示说明你的代码将如何工作。如果有人提出建议——是的,他们会提出来的——那么你可以进行修改,这比已经写好了代码再去修改要容易得多。这是另一个我很少看到有人会做但却有着最负面影响的事情。 特定化。为新的东西制作图表,向大家展示。收集尽可能多的细节。确保每个人同意这个图表。如果有人提出了建议,那就补充/添加更正到图表。保持图表更新。 知道潜意思的偏见和男性特权。了解你是哪种MBTI和人格类型,并且更重要的是,要知道如何与其他性格类型更好地互动。了解情商。每个人都是不一样的,你需要知道如何与他们进行最有效和最有建设性的交互。 定期为团队做一些事情。带饼干。教魔术。培育一点文化,并鼓励其他人也这样做。赞美其他人的贡献。一支有凝聚力的团队是很难被击败的。 学习如何与人合作。我个人非常喜欢《The Pragmatic Programmer》的“stone snop”。 理解和使用别人的代码。如果你正在实现自己的XML解析器或或csv阅读器或git hook,那么你就是在重新发明轮子。 一旦你写了代码,并且它是有效的,通过测试的,那么回过头去整理一下吧。重新运行测试。再整理。每个类都应该有单一的职责,每个函数都应该只做一件事情。在大多数情况下,函数应该小于20行代码的长度。使用自文档的函数名和变量名。花时间整理你的代码以后将会10倍地回报给你和你的团队。 参与其中。承担责任。如果事情有不对的地方,那就解决它。如果最后期限临近了又想出了一个解决方案,那让其他人尽快知道。任何人都可以做到这一点,即使是最初级的开发人员。这要求对项目的蓝图,方向和截止期限有着大局观的认识——参与进来。保存好每天的工作内容! 和团队分享学到的经验教训(在适当的时候)。指出Java中finally块内部抛出异常的时候发生了什么?和大家一起分享。 出处:码农网 英文原文:What little habits made you a better software engineer? from:http://www.oschina.net/news/75725/habits-to-be-better-programmer
View Details|
1 2 3 4 5 6 7 8 9 |
string txt = @"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIQAAAARCAMAAAArMfRlAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACZFBMVEX////61s/+9vTxkn7wiHP5zsXtblX4yb/sZkv++Pftb1b4y8H74NrueGD+9/XyloTxjXn4y8LvhG7//v7+9fP619D2uKz86uf1saTtcVjsalDqXUDsak/qWz/98vD0qpvrYETvgGrvg23vgWvqWj3ud1/1r6H1sqT629T5z8frZEn3w7n++vrsbVT7497//v3vgWv50Mf4xrz2t6vqWz74ysH73dfrYUX2u6/3vrP1rZ/saU7ufWb1sKLsZ0zwinXvf2jtb1XrYkb1s6btcFf//PvueGHznYzsbVP4xbvynYvqXUHuemPvhW/97+z749785uHufGX85N/73df62NH50MjrX0P3wLTvgmz2ua362NHtcln61c7rX0L85uL51Mz//PzqXD/zoZH+9PL98e74ycDsbFLrYEX2t6rvgGnufGXtdVzudl72uq7ymYfxkn/wh3HzpJTrZkvvg27xlYLxkH3wiXX86ub85eH97ur98/HsaE7udl7rY0jsaE32uq73vLHymoj//f397er5zcTzn4797+3tcVj508vsa1L4yL72vLD0qpv+9/b3w7jwhnHrZEjuemL0qJn86OTzno32taj3vrL74dv739n739rqXkLsa1H+8/H3wrf73tj2tajrZUr4zMPue2Txk4D3wLXwjHj++ff0pZX50sr3wrf3wbbtc1v1saPzpJTtdV3wh3LwhXDzopL/+/ryl4X2tqn74dzvfmjxjnvueWL1r6H1s6Xxj3v86OT++vn4x7398O75zcT1tKf3v7T86eXwjHj0q5z0ppbwi3f97uv85ODtdFv4xLry8julAAAAAWJLR0QAiAUdSAAAA41JREFUSMfVlPtbTEEYx9+2Op1yqLRa02XjNCnataxuK2pbhYguIqRsRCKEdS1JS5RyTyQUIRa5leu63/1TZs6Zczbxk/U8Ht8f5jvv2dl5P+eddw7Afy8fzd/by9ePyVcK/TkyBPDyb4FBo0AYPUYOgkNU+ZAwdGyYd4m14zxzPlwnKZwkHo9QRCRCKCqaDHqAmAkTxVgcJ4riJLIwXiBKmCwIUxIBDMapXr69adp0D4RZdjP/SyVmJCUD6HHK8IX+qWRGINJC1B0sSPaZ6UaOm6WB2RERGenxoDpRJtaBxopQlm2O6iBk56gQ3FxJ86TEofO1EBaUaKDz3AUL8/z8FmErOavFFCKfVCJ8glBAIQoDRkIUYbk2S5KKAZbiqYqTR2nLCISkNOMwzyz5fSWWrwBYiUsJ1CoSleXq9eV4tV6vt9OFtCuiKkLWEIi1SZUjIdaxRirJouP6RMUBCqo2KBDJGcM8t1rZYuOmGkmbNpJg8xb71pm127Ra7fZQCrHD4diJdzkcjt2Mdk+ZfBwJNhLsLY1CaOI+S101l1G/1rx/EUINtYYDNXTbmkbFwV54UCdDNKX4WYe5M5pdsMCAQBoekhs20jra5ns4gbwlL0HUi2I1ziONKTZJEM1HdskQRxvo2bWEKZWw17Wa0+l2qdNXyMmPKQ5tR9oliOMnTp46XelxgGWs3c7gM/JZ2OedBZOzgy92QmIwg6A61+k5t/OlFtaYF7pMALrSFu5iXLd0HMgiQQB3aWQlLpclAIVw4g4tfaI40ZRxCkQLx10x9/RevdYO0HfdSZ7dqCqQIDiqiu10RDT1zVhBuR2Gsj3y/5sa+hlEch2Njbdut0i9cFzxxnSXKxtn3+nE7dI/FAfIqSj6qRIL716g0T2SbwDg/gOlEg8f4UgLq0SJP6m+v02+otcfs4341QyiPJpsuber+DyeTBoP5ytOV9FKCCy5oEIM2uwjjgNg1m71O2JiEP1xa+a2DT0pV65RPJflkCH668NA95TjevLaGQR0GBE6eRbgWV1VasNsj6sQ2eQTiHoVB3j+guV7iYvc7pxXvNvt5gc1MVsG6oOa4LXT2fMGKt8OOfIhqxF6azPfPQTeupWpi0BAbCt4KZPrKJsZBlwu14z3Q+SS7ghc/OFjMi3HJ1H83Az5o+gNuveODF/6NNCZoqqbPPr6TfvH6WV9P+Hta3ivblf5v0ZQ9QOnhO0Euy9VSAAAAABJRU5ErkJggg=="; var tmpArr = txt.Split(','); byte[] bytes = Convert.FromBase64String(tmpArr[1]); using (MemoryStream ms = new MemoryStream(bytes)) { ms.Write(bytes, 0, bytes.Length); var img = Image.FromStream(ms, true); img.Save("demo.png"); } |
摘自:http://www.itnose.net/detail/6387947.html
View Detailsbase64的形式为“data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0。。。。”; 当接收到上边的内容后,需要将data:image/png;base64,这段内容过滤掉,过滤成:“iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0。。。”;然后进行保存。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
app.post(<span class="hljs-string">'/upload'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(req, res)</span></span>{ <span class="hljs-comment">//接收前台POST过来的base64</span> <span class="hljs-keyword">var</span> imgData = req.body.imgData; <span class="hljs-comment">//过滤data:URL</span> <span class="hljs-keyword">var</span> base64Data = imgData.replace(<span class="hljs-regexp">/^data:image\/\w+;base64,/</span>, <span class="hljs-string">""</span>); <span class="hljs-keyword">var</span> dataBuffer = <span class="hljs-keyword">new</span> Buffer(base64Data, <span class="hljs-string">'base64'</span>); fs.writeFile(<span class="hljs-string">"image.png"</span>, dataBuffer, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(err)</span> </span>{ <span class="hljs-keyword">if</span>(err){ res.send(err); }<span class="hljs-keyword">else</span>{ res.send(<span class="hljs-string">"保存成功!"</span>); } }); }); from:https://segmentfault.com/a/1190000005364299 |
总结整理时下流行的浏览器User-Agent大全 此文章转至:http://www.360doc.com/content/12/1012/21/7662927_241124973.shtml 用于学习 一、基础知识篇: Http Header之User-Agent User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标 识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的 UA来判断的。UA可以进行伪装。 浏览器的UA字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识版本信息。但各个浏览器有所不同。 字串说明: 1、浏览器标识 出于兼容及推广等目的,很多浏览器的标识相同,因此浏览器标识并不能说明浏览器的真实版本,真实版本信息在 UA 字串尾部可以找到。 2、操作系统标识 3、加密等级标识 N: 表示无安全加密 I: 表示弱安全加密 U: 表示强安全加密 4、浏览器语言 在首选项 > 常规 > 语言中指定的语言 5、渲染引擎 显示浏览器使用的主流渲染引擎有:Gecko、WebKit、KHTML、Presto、Trident、Tasman等,格式为:渲染引擎/版本信息 6、版本信息 显示浏览器的真实版本信息,格式为:浏览器/版本信息 浏览器User-Agent的详细信息 PC端: safari 5.1 – MAC User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50 safari 5.1 – Windows User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 […]
View DetailsGoogle Project Zero 黑客 Tavis Ormandy 报告在流行密码管理工具 LastPass 中发现了一个高危0day 漏洞,允许恶意网站完整访问用户的账号。漏洞已经报告给了 LastPass,细节没有披露。巧合的是另一位安全研究人员 Mathias Karlsson 也报告了 LastPass 的一个类似漏洞,目前还不清楚两个漏洞是否相同。 Karlsson 在其博客上描述了他的发现:LastPass的密码自动填写功能存在bug,允许恶意网站欺骗 LastPass 相信它是另一个网站比如Twitter,窃取用户登录凭证。Karlsson建议用户关闭自动填写功能。LastPass称它已经修复了漏洞,漏洞主要影响 Firefox 用户。 相关链接 Lastpass 的详细介绍:请点这里 Lastpass 的下载地址:请点这里 from:http://www.oschina.net/news/75639/lastpass-0day-bug
View Details