Python 常用库

thbcm阅读(221)

GUI 图形界面

1.wxpython

  Python 下的 GUI 编程框架,与 MFC 的架构相似

 下载地址:http://wxpython.org/download.php

2. PyQt

  用于 Python 的 QT 开发库

  下载地址:http://www.riverbankcomputing.com/software/pyqt/download

Web 框架

1. Django

开源 web 开发框架,它鼓励快速开发,并遵循 MVC 设计

下载地址: http://www.djangoproject.com/

2. web2py

一个小巧灵活的 Web 框架,虽然简单但是功能强大

下载地址:http://web2py.com/

科学计算

1. Matplotlib

用 Python 实现的类 matlab 的第三方库,用以绘制一些高质量的数学二维图形

下载地址:

http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.1.0/

2. SciPy

基于 Python 的 matlab 实现,旨在实现 matlab 的所有功能

下载地址:http://pypi.python.org/pypi/scipy/

3. NumPy

基于 Python 的科学计算第三方库,提供了矩阵,线性代数,傅立叶变换等等的解决方案

下载地址:http://pypi.python.org/pypi/numpy/

网页处理

1. BeautifulSoup,强大的容错功能

网页处理非常强大的包

http://www.crummy.com/software/BeautifulSoup/

2. PyQuery,在 Python 中如网页的  jQuery 一样处理文档

下载:https://pypi.python.org/pypi/pyquery

文档:https://pythonhosted.org/pyquery/

其他

1. MySQLdb

用于连接 MySQL 数据库

下载地址:http://pypi.python.org/pypi/MySQL-python/

2. PIL

基于 Python 的图像处理库,功能强大,对图形文件的格式支持广泛

下载地址:http://effbot.org/zone/pil-index.htm

3. PyGame

基于 Python 的多媒体开发和游戏软件开发模块

下载地址:http://www.pygame.org/download.shtml

4. sh 系统管理

sh 可以让你像执行函数一样执行 shell 终端命令

下载地址:https://pypi.python.org/pypi/sh

5. pickle (cPickle)

6. json

7. random

8. datetime

特别介绍

1. cx_Freeze

方便简洁的打包工具,可跨平台!

下载地址:http://cx-freeze.sourceforge.net/

2. psyco

脚本的执行效率多少有点差强人意,虽然优化起来并不是难事,但如果有简单的方法,近乎不用修改源代码,那当然值得去关注一下。psyco 的神奇在于它只需要在代码的入口处调用短短两行代码,性能就能提升 40% 或更多,真可谓是立竿见影!

如果你的客户觉得你的程序有点慢,敬请不要急着去优化代码,psyco 或许能让他立即改变看法。psyco 堪称 Python 的 jit,有许多潜力可以挖掘,如果剩下来给你优化性能的时间已经不多,请马上去阅读它的手册,有许多招儿轻松优化性能。

以上呢就是一些 python 常用的第三方库

推荐好课:Python机器学习实战Python3进阶:数据分析及可视化

android 的主流壳特点

thbcm阅读(252)

1. 爱加密加固:

爱加密加固一般有两个 Application 入口类,为 SuperApplication 和 NativeApplication,壳的入口点为com.shell.SuperApplication,assets 目录下有 ijiami.dat、ijiami2.dat、ijiami.ajm,壳的 so 为 libexec.so 和 libexecmain.so,它们可能在 libs 目录或 assets 目录中。

2. 梆梆加固:

Assets 目录下有 secData0.jar,libs 目录下为 libSecShell.so、libSecShell_x86.so、libSecShell_art.so 等,壳为com.secshell.shellwrapper.SecAppWrapper。

3. 360 加固:

Assets 目录下常有:libjiagu.so\libjiagu_ls.so\libjiagu_x86.so\libjiagu_art.so 等,壳的 application 常为 com.stub.StubApp,以前版本可能为 com.stub.stubxxxx,壳的入口为 com.stub.stub01.Stub01。

4. 阿里云加固:

Assets 目录下为 libdemolishdata.so,libs 目录下为 libdemolish.so,壳的入口点一般为原入口点,但方法都是抽取并 native 的。

5. 腾讯乐固:

Libs 目录常为:liblegudb.so、libshella-2.10.2.3.so、mix.dex,壳的入口点为 com.tencent.StubShell.TxAppEntry。

6. 百度加固:

Assets 目录和 libs 目录经常有:libbaiduprotect.so、libbaiduprotect_x86.so、libbaiduprotect_art.so、baiduprotect1.jar 等,壳的入口点为 com.baidu.protect.StubApplication。

7. 娜加加固:

Libs 目录一般拥有 libddog.so、libcdog.so、libfdog.so 等。

8. 顶象加固:

此加固并不常见,一般 libs 目录有个 libjni.so 或 libsec.so,入口点为原入口点,也是全 native 的,但全是在 so 里就利用 arm 编写了对应方法。

.net反编译神器 你值得拥有!

thbcm阅读(223)

1、Reflector 

       Reflector是最为流行的.Net反编译工具。Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使·NET程序员眼前豁然开朗,因为这个免费工具可以将·NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。

       但遗憾的是后面的版本收费了。

2、ILSpy

     ILspy是一款非常优秀的.net平台反编译软件,使用ILspy,可以轻松的反编译C#及VB程序,软件本身是C#程序,是一款开源软件。

3、de4dot

     de4dot是一款C#编写的基于GPLv3协议的一个开源的.net反混淆脱壳工具,是目前.net下非常不错的一款反编译工具。支持Dotfuscator,.NET Reactor,MaxtoCode,SmartAssembly,Xenocode等10多个反混淆工具。

 

4、JustDecompile

       JustDecompile是Telerik公司推出一个免费的.net反编译工具,支持插件,与Visual Studio 集成,能够创建Visual Studio project文件。JustDecompile与Reflector相比的话,个人更喜欢JustDecompile,因为他免费,而且对于一些C#动态类型的反编译效果比较好,对于某个第三方程序集,如果它缺乏文档,或者是一个bug 或性能问题的根源,反编译往往是最快捷的解决方案。Telerik已经将 Reflexil、程序集编辑器(assembly editor)和 De4Dot 等插件集成到了JustDecompile中。

5、DnSpy

       dnSpy是一款开源的基于ILSpy发展而来的.net程序集的编辑,反编译,调试神器。
主要功能:1、程序集编辑;2、反编译器;3、调试工具;4、Tabs及tabs分组;5、提供多主题。

 

6、dotPeek
      JetBrains dotPeek 是JetBrains公司发布的一款免费的.NET反编译器。反编译来源生成项目之后,用户不需要离开dotPeek就能够浏览项目文件。

7、.Net脱壳工具NETUnpack

      脱壳工具NETUnpack,可以脱去DotNetReactor等加的壳,非常强悍。

8、.Net查壳工具DotNet Id

       DotNet Id是一款net的查壳工具。DotNet Id官方最新版可以查是哪些软件保护加密或混淆处理的:MaxToCode .Net Reactor Rustemsoft Skater Goliath Obfuscator PE Compact Spices Obfuscator Themida   Dotfuscator Xenocode Smart Assembly CliSecure   Phoenix Protector CodeVeil。

9、Simple Assembly Explorer 
      Simple Assembly Explorer(简称SAE)是一款专业的.Net程序解密分析必备工具,由于国内知道它的不多,所以只有英文版本,没有进行汉化,Simple Assembly Explorer可以为您探索和分析.NET程序集,用来反编译最好不过了。

推荐好课:ASP.NET 教程vb.net 教程

2020年全球程序员工资排行榜出炉:亚洲仅1家公司上榜,字节跳动高薪实锤

thbcm阅读(237)

近日 Levels.fyi 发布了《软件工程师薪资 2020 年度报告》可以查看全球收入最高的公司、位置和趋势。

Levels.fyi 创建于 2017 年,其使命是帮助人们做出更好的职业决策。迄今为止已经收集了有关工资、福利、水平等的最准确的公共数据。仅今年 Levels.fyi 的薪水数据集就增加了一倍以上,并且在全球 1,200 多个城市中分布了 50,000 多个数据点。

下面的工资数据仅反映了过去一年收入的年薪中位数,包括工资、股份和奖金。尽管这些数据是针对软件工程师的,但收入最高的公司和地点通常担负着技术角色。与往常一样,工资和工资水平取决于多种因素,包括面试表现、过往经验、谈判等。此处的工资数据适用于工资最高的科技公司和地区-可能无法反映其他行业的工资。

一、入门级工程师

通常为 0-2 年的经验。

排名 公司 总部 职位 收入
1 来福车(Lyft)——打车应用 美国·旧金山 T3 $230,000
2 罗布乐思(Roblox)——世界最大的多人在线创作游戏 美国·圣马特奥 IC1 $222,000
3 Stripe——互联网企业的线上支付处理商 美国·旧金山 L1 $213,000
3 爱彼迎(Airbnb)——全球民宿短租公寓预订平台 美国·旧金山 L3 $213,000
4 领英(LinkedIn)——全球知名职场社交平台 美国·森尼韦尔 软件工程师 $200,000
5 DoorDash——三个华人创办的外卖公司 美国·旧金山 E3 $199,000
6 罗宾侠(Robinhood)——美国交易平台 美国·门洛帕克 L1 $197,000
7 推特(Twitter)——美国社交网络及微博客服务的公司 美国·旧金山 软件工程师 $195,000

应届毕业生或几乎没有行业经验的人员。开发和维护团队中负责处理中低端工作。一般需要从经验丰富的团队成员那里获得指导和支持。

二、初级工程师

通常为 2-5 年以上的经验。

排名 公司 总部 职位 收入
1 爱彼迎(Airbnb)——全球民宿短租公寓预订平台 美国·旧金山 L4 $295,000
2 拼趣(Pinterest)——图片社交平台 美国·旧金山 L4 $294,000
3 Box——美国的云存储服务提供商 美国·红杉市 高级软件工程师 $290,000
3 来福车(Lyft)——打车应用 美国·旧金山 T4 $290,000
3 领英(LinkedIn)——全球知名职场社交平台 美国·森尼韦尔 高级软件工程师 $290,000
4 Stripe——互联网企业的线上支付处理商 美国·旧金山 L2 $287,000
5 Databricks——提供基于 Spark 的云服务 美国旧金山 L4 $278,000
6 DoorDash——三个华人创办的外卖公司 美国·旧金山 E4 $265,000
7 字节跳动(ByteDance)——中国北京的一家信息科技公司 中国·北京 2-1 $260,000

负责开发并一些中等难度的项目。可能领导一个小型团队或项目。能够指导工程师,提供技术指导,代码审查,设计并端到端交付小型项目。影响力通常直接影响团队。在许多公司中,这被认为是“职业级别”,因为您可以将职业生涯的其余时间都花在此级别上,而不会因为不被晋升而被逐出。

三、高级工程师

通常有 5 年以上的经验。

排名 公司 总部 职位 收入
1 领英(LinkedIn)——全球知名职场社交平台 美国·森尼韦尔 资深软件工程师 $ 461,000
2 网飞(Netflix)——在线影片租赁提供商 美国·洛斯盖图 高级软件工程师 $ 455,000
3 拼趣(Pinterest)——图片社交平台 美国·旧金山 L5 $ 450,000
4 Stripe——互联网企业的线上支付处理商 美国·旧金山 L3 $ 420,000
5 爱彼迎(Airbnb)——全球民宿短租公寓预订平台 美国·旧金山 L5 $ 418,000
6 罗宾侠(Robinhood)——美国交易平台 美国·门洛帕克 L3 $ 412,000
7 字节跳动(ByteDance)——中国北京的一家信息科技公司 中国·北京 2-2 $ 400,000

通常,公司中只有不到 30% 的员工处于此级别。预计将领导并拥有复杂的技术计划。开始设定团队的愿景和未来方向。对组织内多个相关团队的影响。根据公司的规模和期望,角色更多地转向设计而不是实现。

四、主管工程师

通常有10年以上的经验。

排名 公司 总部 职位 收入
1 Stripe——互联网企业的线上支付处理商 美国·旧金山 L4 $ 590,000
2 脸书(Facebook)——世界排名领先的照片分享站点 美国·门洛帕克 E6 $ 563,000
3 爱彼迎(Airbnb)——全球民宿短租公寓预订平台 美国·旧金山 L6 $ 550,000
4 亚马逊(Amazon)——美国最大的一家网络电子商务公司 美国·西雅图 首席SDE $ 540,000
5 Snap Inc.(SNAP)——公司的旗舰产品 Snapchat (阅后即焚) 美国·威尼斯 L5 $ 538,000
6 英伟达(Nvidia)——以设计智核芯片组为主的无晶圆(Fabless)IC半导体公司 美国·圣克拉拉 IC6 $ 511,000
7 字节跳动(ByteDance)——中国北京的一家信息科技公司 中国·北京 3-1 $ 493,000

这个级别比以前的级别更令人垂涎。一般来说,公司里只有不到 10% 的员工达到这个水平。影响跨越组织。委托业务关键项目和设置一个组织或多个组织的技术远景。负责对组织内的技术设计进行评审并提供反馈。日常敲代码的工作很少甚至没有。角色高度依赖于组织和公司的需求,定义松散。可以完全自主操作。

五、首席工程师

此级别代表公司中一小部分人。因此,某些公司可能没有足够的数据点要列出。

排名 公司 总部 职位 收入
1 脸书(Facebook)——世界排名领先的照片分享站点 美国·门洛帕克 E7 $ 895,000
2 Snap Inc.(SNAP)——公司的旗舰产品 Snapchat (阅后即焚) 美国·威尼斯 L7 $ 830,000
3 谷歌(Google)——全球最大的搜索引擎公司 美国·山景城 L7 $ 758,000
4 拼趣(Pinterest)——图片社交平台 美国·旧金山 L6 $ 590,000
5 软营(Salesforce)——客户关系管理(CRM) 软件服务提供商 美国·旧金山 架构师 $ 525,000

通常有15年以上的工作经验。通常一家公司只有不到3% 的员工达到这个水平。规模较小的公司可能没有这个级别的个人。影响遍及整个公司,有时甚至是整个行业。可以完全自主操作。

作为唯一上榜的中国科技公司——字节跳动(ByteDance),全称北京字节跳动科技有限公司,成立于2012年3月,地址位于北京市海淀区知春路甲48号。独立研发的“今日头条”客户端,通过海量信息采集、深度数据挖掘和用户行为分析,为用户智能推荐个性化信息,从而开创了一种全新的新闻阅读模式。抖音、西瓜视频等产品也是其旗下产品。

字节跳动的产品、运营、技术,综合实力非常强,更没有明显短板。可以说目前国内,乃至世界范围内战斗力最强悍的团队之一。这么强的公司能不上榜吗?

以上就是W3Cschool编程狮为你整理的《2020年全球程序员工资排行榜》,关于只有1家中国公司上榜,你怎么看?

关于HTML条件注释你可能不知道的一些事儿

thbcm阅读(225)

最近经常看到类似这样的 HTML 代码片段,很多前端开发人员应该都熟悉:

1 <!--[if lt IE 7]> <html class="ie6"> <![endif]-->
2 <!--[if IE 7]> <html class="ie7"> <![endif]-->
3 <!--[if IE 8]> <html class="ie8"> <![endif]-->
4 <!--[if gt IE 8]><!--> <html> <!--<![endif]-->

  这段代码包含了一些条件注释,它会根据浏览器的不同选择性地给<html>标记添加(或不添加)一个包含浏览器版本信息的 class属性。具体来说,对于IE5-IE8,<html>标记会增加一个 class 属性,属性值由IE的版本来决定。对于 IE9、较 IE9 更高的IE版本以及非 IE 浏览器,<html>保持原样。这样,我们就可以针对 IE5-IE8 这些老式浏览器来编写只对它们生效的 CSS 代码,比如:

1 .foo { color: red;}

2 .ie6 .foo { color: yellow;} 3 .ie7 .foo { color: blue;}

进一步地,我们就可以避免类似这样的 CSS hack:

1 /***** 选择器(Selector) Hacks ******/
2 .foo { color: red;}
3 * html .foo { color: yellow; } 
4 *:first-child+html .foo { color: blue; } 
5 6 /***** 属性(Attribute) Hacks ******/
7 .foo { color: red; *color: blue; _color: yellow;} 

 使用“HTML条件注释”来避免 CSS hack,这是一种目前比较流行而且比较安全稳定的技术。这种技术的代码有很多版本,再介绍一个比较有意思的,来自于 HTML5 Boilerplate:  

1 /***** 选择器(Selector) Hacks ******/ 2 .foo { color: red;} 3 * html .foo { color: yellow; }  4 *:first-child+html .foo { color: blue; }  5 6 /***** 属性(Attribute) Hacks ******/ 7 .foo { color: red; *color: blue; _color: yellow;}

   文章写到这里,我感觉,写了这么多,全是大家可能都知道的事儿。其实,这篇文章的主题,不是讨论条件注释和 CSS hack 孰优孰劣,也不是讨论哪种条件注释方案最好,我想讲一些条件注释技术实现代码的细节。

  我们聚焦文章的第一段示例代码。看这段代码的第一行:

<!--[if lt IE 7]> <html class="ie6"> <![endif]-->

就算我们没有条件注释的知识,凭字面我们也能大概猜出这行代码的作用:在 IE6 或更低版本的浏览器中,这行注释会被解析成<html class=”ie6″>。在其他IE浏览器(IE7-9)中,它会被解析成空。在非IE浏览器中,毫无疑问,它会被当做我们所熟知的一般 HTML 注释,它会被忽略。事实上,浏览器的确是这样做的。

  在IE条件注释的概念体系中,一共有两种条件注释类型。这种条件注释的类型被称作 downlevel-hidden。它的语法是这样的:

<!--[if expression]> HTML <![endif]-->

语法的细节说明可以查看文章结尾的参考资源。

  在将要讨论语法怪异的第四行代码之前,让我们先思考一个问题。凭借现有的 HTML 条件注释的特性,我们能够实现“IE9、较IE9更高的 IE 版本以及非 IE 浏览器中,<html>保持原样”这一目标吗?

1 <!--[if gt IE 8 | !IE]> <html> <![endif]-->2 ...3 </html>

这样可以吗?不可以。IE9 浏览器中,注释条件为真,代码会解析为<html>。但是,IE10 以及非IE浏览器中,这行代码会被忽略,这会导致 HTML 文档缺少起始<html>标记。从高亮的HTML上,我们可以明显地看出来。特别强调一下,微软已经宣布,IE10 不再支持条件注释。

  凭借现有的 HTML 条件注释的特性,我们没有办法实现我们的目标。怎么办?

  在 IE 条件注释的概念体系中,还有另外一种条件注释类型叫 downlevel-revealed,它的语法(具体语法细节请查看文章结尾的参考资源)是这样的:

<![if expression]> HTML <![endif]>

很幸运,我们可以利用 downlevel-revealed 类型的条件注释来实现之前的目标。

<![if gt IE 8]> <html> <![endif]>

  对于这行代码浏览器的解析是这样的:在 IE9 中,浏览器会识别出这是一段条件注释,并且条件为真,所以这段代码会解析为<html>。在IE8-IE5中,注释的条件为假,故解析为空。在 IE10 以及非 IE 浏览器中,<![if gt IE 8]> 以及 <![endif]>会被当做无法识别的标签,整条代码最终被解析为<html>。感谢微软,我们的目标实现了。

  但是,这段代码,是无法通过(X)HTML验证的。为了能够通过通过(X)HTML验证,我们可以使用一种改进的语法,代码可以修改为:

<!--[if gt IE 8]--> <html> <!--[endif]-->

 我们增加了4个 –,这使得代码看起来非常的怪异,这与downlevel-hidden类型有点差别,但它能被IE5-IE9识别为条件注释别并处理。对于改进过的代码,IE5-IE8的解析方式不变。IE10以及非IE浏览器会把<!–[if gt IE 8]–>  <!–[endif]–>当作一般注释来解析,最终结果不变。但是,IE9出问题了:注释条件仍然为真,解析结果却变成了–> <html>。我们再次改进一下语法,代码可以修改为:

<!--[if gt IE 8]<!--> <html> <!--[endif]-->

 我们只是增加了一个 <! 。 对于再次改进过的代码,IE5-IE8的解析方式不变。IE10以及非IE浏览器会把<!–[if gt IE 8]<!–>  <!–[endif]–>当作一般注释来解析,最终结果不变。IE9的问题被修复了。

   至此,我们所得到这行代码,其实就是示例中的第四行代码。

  嗯,这行怪异的代码的由来原来是这样的。

八个方面理解 seo (搜索引擎)

thbcm阅读(249)

一、什么是 seo?

seo 翻译过来就是搜索引擎优化,它是一种通过分析搜索引擎的排名规律,了解各种搜索引擎怎样进行搜索、怎样抓取互联网页面、怎样确定特定关键词的搜索结果排名的技术。

搜索引擎采用易于被搜索引用的手段,对网站进行有针对性的优化,提高网站在搜索引擎中的自然排名,吸引更多的用户访问网站,提高网站的访问量,提高网站的销售能力和宣传能力,从而提升网站的品牌效应。

二、如何进行 seo 优化

1、提高页面加载速度

能用 css 解决的不用背景图片,背景图片也尽量压缩大小,可以几个 icons 放在一个图片上,使用 background-position 找到需要的图片位置。

这种就是常说的雪碧图或者叫精灵图。

可以减少 HTTP 请求数,提高网页加载速度。

2、结构、表现和行为的分离

另外一个重要的拖慢网页加载速度的原因就是将 css 和 JS 都堆积在 HTML 页面上,每次看到有人直接在页面上编写 CSS 和 JS 我都觉得很别扭。

通过外链的方式能大大加快网页加载速度的,css 文件可以放在 head 里,JS 文件可以放置在 body 的最下方,在不影响阅读的情况下再去加载 JS 文件。

3、优化网站分级结构

在每个内页加面包屑导航是很有必要的,可以让蜘蛛进入页面之后不至于迷路,有条件的话,最好能单独加个 Sitemap 页面,将网站结构一目了然地展示在蜘蛛面前,更有利于蜘蛛抓取信息。

4、集中网站权重

由于蜘蛛分配到每个页面的权重是一定的,这些权重也将平均分配到每个 a 链接上,那么为了集中网站权重,可以使用”rel=nofollow”属性,它告诉蜘蛛无需抓取目标页,可以将权重分给其他的链接。

5、文本强调标签的使用

当着重强调某个关键词需要加粗表示,选用 strong 标签比使用 b 标签要更有强调作用。

6、a 标签的 title 属性的使用

在不影响页面功能的情况下,可以尽量给 a 标签加上 title 属性,可以更有利于蜘蛛抓取信息。

7、图片 alt 属性的使用

这个属性可以在图片加载不出来的时候显示在页面上相关的文字信息,作用同上。

8、H 标签的使用

主要是 H1 标签的使用需要特别注意,因为它自带权重,一个页面有且最多只能有一个 H1 标签,放在该页面最重要的标题上面,如首页的 logo 上可以加 H1 标签。

推荐好课:SEO基础知识教程SEO初学者必备知识常用SEO引擎优化工具SEO 教程

Hadoop高可用搭建超详细

thbcm阅读(258)

Hadoop高可用搭建超详细

实验环境

master:192.168.10.131
slave1:192.168.10.129
slave2:192.168.10.130
操作系统ubuntu-16.04.3
hadoop-2.7.1
zookeeper-3.4.8

安装步骤

1.安装jd

  • 将jdk安装到opt目录下
tar -zvxf jdk-8u221-linux-x64.tar.gz
  • 配置环境变量
vim etc/profile
#jdk
export JAVA_HOME=/opt/jdk1.8.0_221
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source etc/profile

2.修改hostname

分别将三台虚拟机的修改为master、slave1、slave2

vim  /etc/hostname

3.修改hosts映射,并配置ssh免密登录

  • 修改hosts文件,每台主机都需进行以下操作
vim /etc/hosts
192.168.10.131 master
192.168.10.129 slave1
192.168.10.130 slave2
  • 配置ssh免密
    首先需要关闭防火墙
1、查看端口开启状态
sudo ufw status
2、开启某个端口,比如我开启的是8381
sudo ufw allow 8381
3、开启防火墙
sudo ufw enable
4、关闭防火墙
sudo ufw disable
 5、重启防火墙
 sudo ufw reload
 6、禁止外部某个端口比如80
 sudo ufw delete allow 80
 7、查看端口ip
 netstat -ltn

集群在启动的过程中需要ssh远程登录到别的主机上,为了避免每次输入对方主机的密码,我们需要配置免密码登录(提示操作均按回车)

ssh-keygen -t rsa

将每台主机的公匙复制给自己以及其他主机

ssh-copy-id -i ~/.ssh/id_rsa.pub root@master
ssh-copy-id -i ~/.ssh/id_rsa.pub root@slave1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@slave2

4.设置时间同步

  • 安装ntpdate服务
apt-get install ntpdate
  • 修改ntp配置文件
vim /etc/ntp.conf

# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift

# Enable this if you want statistics to be logged.
#statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

# Specify one or more NTP servers.

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst

# Use Ubuntu's ntp server as a fallback.
#pool ntp.ubuntu.com

# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details.  The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions>
# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

# Needed for adding pool entries
restrict source notrap nomodify noquery


# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
# 允许局域网内设备与这台服务器进行同步时间.但是拒绝让他们修改服务器上的时间
#restrict 192.168.10.131 mask 255.255.255.0 nomodify notrust
#statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

# Specify one or more NTP servers.

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst

# Use Ubuntu's ntp server as a fallback.
#pool ntp.ubuntu.com

# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details.  The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions>
# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

# Needed for adding pool entries
restrict source notrap nomodify noquery


# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
# 允许局域网内设备与这台服务器进行同步时间.但是拒绝让他们修改服务器上的时间
#restrict 192.168.10.131 mask 255.255.255.0 nomodify notrust
restrict 192.168.10.129 mask 255.255.255.0 nomodify notrust
restrict 192.168.10.130 mask 255.255.255.0 nomodify notrust

# 允许上层时间服务器修改本机时间
#restrict times.aliyun.com nomodify
#restrict ntp.aliyun.com  nomodify
#restrict cn.pool.ntp.org nomodify 

# 定义要同步的时间服务器
server 192.168.10.131 perfer
#server times.aliyun.com iburst prefer    # prefer表示为优先,表示本机优先同步该服务器时间
#server ntp.aliyun.com iburst
#server cn.pool.ntp.org iburst

#logfile /var/log/ntpstats/ntpd.log    # 定义ntp日志目录
#pidfile  /var/run/ntp.pid    # 定义pid路径

# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255

# If you want to listen to time broadcasts on your local subnet, de-comment the
# next lines.  Please do this only if you trust everybody on the network!
#disable auth
#broadcastclient

#Changes recquired to use pps synchonisation as explained in documentation:
#http://www.ntp.org/ntpfaq/NTP-s-config-adv.htm#AEN3918

#server 127.127.8.1 mode 135 prefer    # Meinberg GPS167 with PPS
#fudge 127.127.8.1 time1 0.0042        # relative to PPS for my hardware

#server 127.127.22.1                   # ATOM(PPS)
#fudge 127.127.22.1 flag3 1            # enable PPS API
server 127.127.1.0
fudge 127.127.1.0 stratum 10

  • 启动ntpd服务,并查看ntp同步状态
service ntpd start  #启动ntp服务
ntpq -p        #观察时间同步状况
ntpstat         #查看时间同步结果
  • 重启服务,与master主机时间同步
/etc/init.d/ntp restart
ntpdate 192.168.10.131

5.安装hadoop至/opt/data目录下

  • 在/opt目录下新建Data目录
cd /opt
mkdir Data
  • 下载并解压hadoop至/opt/data目录
wget https://archive.apache.org/dist/hadoop/common/hadoop-2.7.1/
tar -zvxf hadoop-2.7.1.tar /opt/data
  • 配置环境变量
# HADOOP
export HADOOP_HOME=/opt/Data/hadoop-2.7.1
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
export HADOOP_YARN_HOME=$HADOOP_HOME

6.修改hadoop配置文件

文件目录hadoop-2.7.1/etc/hadoop

  • 修改hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8.0_221
  • 修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns1/</value>
    </property>
    
<!-- 指定hadoop临时目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/Data/hadoop-2.7.1/tmp</value>
    </property>
    
<!-- 指定zookeeper地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>slave1:2181,slave2:2181</value>
    </property>
    
<!--修改core-site.xml中的ipc参数,防止出现连接journalnode服务ConnectException-->
    <property>
        <name>ipc.client.connect.max.retries</name>
        <value>100</value>
    <description>Indicates the number of retries a client will make to establish a server connection.</description>
    </property>
</configuration>
  • 修改hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
   <property>
      <name>dfs.nameservices</name>
      <value>ns1</value>
   </property>

<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
   <property>
      <name>dfs.ha.namenodes.ns1</name>
      <value>nn1,nn2</value>
   </property>

<!-- nn1的RPC通信地址 -->
   <property>
      <name>dfs.namenode.rpc-address.ns1.nn1</name>
      <value>master:9820</value>
   </property>

<!-- nn1的http通信地址 -->
   <property>
      <name>dfs.namenode.http-address.ns1.nn1</name>
      <value>master:9870</value>
   </property>

<!-- nn2的RPC通信地址 -->
   <property>
      <name>dfs.namenode.rpc-address.ns1.nn2</name>
      <value>slave1:9820</value>
   </property>

<!-- nn2的http通信地址 -->
   <property>
      <name>dfs.namenode.http-address.ns1.nn2</name>
      <value>slave1:9870</value>
   </property>

<!-- 指定NameNode的日志在JournalNode上的存放位置 -->
   <property>
      <name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/ns1</value>
   </property>

<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
   <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/opt/Data/hadoop-2.7.1/journal</value>
   </property>

<!-- 开启NameNode失败自动切换 -->
   <property>
      <name>dfs.ha.automatic-failover.enabled</name>
      <value>true</value>
   </property>

<!-- 配置失败自动切换实现方式 -->
   <property>
      <name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
   </property>

<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
   <property>
      <name>dfs.ha.fencing.methods</name>
      <value>
      sshfence
      shell(/bin/true)
     </value>
   </property>

<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
   <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/root/.ssh/id_rsa</value>
   </property>

<!-- 配置sshfence隔离机制超时时间 -->
   <property>
      <name>dfs.ha.fencing.ssh.connect-timeout</name>
      <value>30000</value>
   </property>
   
   <!--配置namenode存放元数据的目录,可以不配置,如果不配置则默认放到hadoop.tmp.dir下-->
   <property>
      <name>dfs.namenode.name.dir</name>
      <value>/opt/Data/hadoop-2.7.1/data/name</value>
   </property>
   
   <!--配置datanode存放元数据的目录,可以不配置,如果不配置则默认放到hadoop.tmp.dir下-->
   <property>
      <name>dfs.datanode.data.dir</name>
      <value>/opt/Data/hadoop-2.7.1/data/data</value>
   </property>
   
    <!--配置复本数量-->
   <property>
      <name>dfs.replication</name>
      <value>2</value>
   </property>
   
   <!--设置用户的操作权限,false表示关闭权限验证,任何用户都可以操作-->
   <property>
      <name>dfs.webhdfs.enabled</name>
      <value>true</value>
   </property>
   
</configuration>
  • 修改mapred-site.xml
将文件名修改为mapred-site.xml
cp mapred-queues.xml.template mapred-site.xml


<configuration>
    <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
    </property>

</configuration>
  • 修改yarn-site.xml
<configuration>
<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>   
<value>mapreduce_shuffle</value> 
</property>

<!--配置yarn的高可用-->
<property>   
<name>yarn.resourcemanager.ha.enabled</name>   
<value>true</value> 
</property>

<!--执行yarn集群的别名-->        
<property>   
<name>yarn.resourcemanager.cluster-id</name>   
<value>cluster1</value> 
</property> 

<!--指定两个resourcemaneger的名称-->
<property>  
<name>yarn.resourcemanager.ha.rm-ids</name>   
<value>rm1,rm2</value> 
</property> 

<!--配置rm1的主机-->
<property>   
<name>yarn.resourcemanager.hostname.rm1</name>   
<value>master</value> 
</property> 

<!--配置rm2的主机-->
<property>   
<name>yarn.resourcemanager.hostname.rm2</name>   
<value>slave1</value> 
</property>      
                         
<!--配置2个resourcemanager节点--> 
<property>   
<name>yarn.resourcemanager.zk-address</name>   
<value>slave1:2181,slave2:2181</value> 
</property>        
                       
<!--zookeeper集群地址-->
<property>    
<name>yarn.nodemanager.vmem-check-enabled</name>    
<value>false</value>    
<description>Whether virtual memory limits will be enforced for containers</description>
</property>

<!--物理内存8G-->  
<property>    
<name>yarn.nodemanager.vmem-pmem-ratio</name>    
<value>8</value>             
<description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
</property>
</configuration>
  • 修改slave
master
slave1
slave2

7.zookeeper集群安装配置

  • 下载并解压zookeeper-3.4.8.tar.gz
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
tar -zvxf zookeeper-3.4.8.tar.gz /opt/Data
  • 修改配置文件
#zookeeper
export ZOOKEEPER_HOME=/opt/Data/zookeeper-3.4.8
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin

进入conf目录,复制zoo-sample.cfg为zoo.cfg

cp zoo-sample.cfg zoo.cfg
  • 修改zoo.cfg
dataDir=/opt/Data/zookeeper-3.4.8/tmp  //需要在zookeeper-3.4.8目录下新建tmp目录

server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
  • 在tmp目录中创建myid文件
vim myid 

1     //其他主机需要修改该编号  2,3

8.启动集群

  • 格式化master主机namenode。/etc/hadoop目录下输入该命令
hadoop namenode -format
  • 将Data目录拷贝到其他两台主机上
scp -r /opt/Data root@slave1:/opt
scp -r /opt/Data root@slave2:/opt
  • 启动zookeeper,所有节点均执行
hadoop-daemon.sh start zkfc
  • 格式化zookeeper,所有节点均执行
hdfs zkfc -formatZK
  • 启动journalnode,namenode备用节点相同(hadoop-2.7.1目录下执行)
hadoop-daemon.sh start journalnode
  • 启动集群
start-all.sh
  • 查看端口
netstat -ntlup  #可以查看服务端占用的端口
  • 查看进程jps


  • Web查看集群情况
    (namenode节点ip地址:9870)

推荐好课:Hadoop 教程

解决location.hash跨域iframe自适应问题

thbcm阅读(221)

页面域关系:

主页面 a.html 所属域A:www.taobao.com

被 iframe 的页面 b.html 所属域B:www.alimama.com,假设地址:https://www.w3cschool.cn/

实现效果:

A域名下的页面 a.html 中通过 iframe 嵌入B域名下的页面 b.html,由于 b.html 的宽度和高度是不可预知而且会变化的,所以需要 a.html中的iframe 自适应大小.

问题本质:

js 对跨域 iframe 访问问题,因为要控制 a.html 中 iframe 的高度和宽度就必须首先读取得到 b.html 的大小,A、B不属于同一个域,浏览器为了安全性考虑,使js跨域访问受限,读取不到 b.html 的高度和宽度.

解决方案:

引入代理代理页面 c.html 与 a.html 所属相同域 A,c.html 是A域下提供好的中间代理页面,假设 c.html 的地址:www.taobao.com/c.html,它负责读取 location.hash 里面的 width 和 height 的值,然后设置与它同域下的 a.html 中的 iframe 的宽度和高度.

代码如下:

a.html 代码

首先 a.html 中通过 iframe 引入了 b.html

<iframe id=”b_iframe” height=”0″ width=”0″ src=”https://www.w3cschool.cn/” frameborder=”no” border=”0px” marginwidth=”0″ marginheight=”0″ scrolling=”no” allowtransparency=”yes” >

</iframe>

b.html代码

<script type=”text/javascript”>

var b_width = Math.max(document.documentElement.clientWidth,document.body.clientWidth);

var b_height = Math.max(document.documentElement.clientHeight,document.body.clientHeight);

var c_iframe = document.getElementById(”c_iframe”); //liehuo.net

c_iframe.src = c_iframe.src+”#”+b_width+”|”+b_height; //https://www.w3cschool.cn/#width|height”

}

</script>

<!–js读取b.html的宽和高,把读取到的宽和高设置到和a.html在同一个域的中间代理页面车c.html的src的hash里面–>

<iframe id=”c_iframe” height=”0″ width=”0″ src=”https://www.w3cschool.cn/” style=”display:none” ></iframe>

c.html代码

<script type=”text/javascript”>

var b_iframe = parent.parent.document.getElementById(”b_iframe”);

var hash_url = window.location.hash;

var hash_width = hash_url.split(”#”)[1].split(”|”)[0]+”px”;

var hash_height = hash_url.split(”#”)[1].split(”|”)[1]+”px”;

b_iframe.style.width = hash_width;

b_iframe.style.height = hash_height;

</script>

a.html 中的 iframe 就可以自适应为 b.html 的宽和高了.
其他一些类似 js 跨域操作问题也可以按这个思路去解决

盘点 Github 上的高仿 app 项目

thbcm阅读(263)

学技术的,多多少少都仿过出名的产品。

一来,可以练练手,二来对知识点能查漏补缺。

更重要的一点是能给你带来及时的正反馈,让学习的过程不那么枯燥。

今天给大家介绍 GIthub 上几个仿造大厂的 app 项目。

高仿微信

iOS 版:

   Github 地址:https://github.com/nacker/LZEasemob3

  

  

界面截图:

Android 版:

   Github 地址:https://github.com/GitLqr/LQRWeChat

  

  

界面截图:

高仿 youtube

iOS 版:

   Github 地址:https://github.com/aslanyanhaik/youtube-iOS

  

  

界面截图:

Android:

   Github 地址:https://github.com/TeamNewPipe/NewPipe

  

  

界面截图:

高仿网易云音乐

iOS 版:

   Github 地址:https://github.com/QuintGao/GKAudioPlayerDemo

  

  

界面截图:

Android:

   Github 地址:https://github.com/aa112901/remusic

  

  

界面截图:

高仿Bilibili

iOS 版:

   Github 地址:https://github.com/MichaelHuyp/Bilibili_Wuxianda

  

  

界面截图:

Android:

   Github 地址:https://github.com/HotBitmapGG/bilibili-android-client

  

  

界面截图:

高仿微博

iOS 版:

   Github 地址:https://github.com/sam408130/DSLolita

  

  

Android:

   Github 地址:https://github.com/wenmingvs/WeiBo

  

  

界面截图:

作 者: 水哥,首发: GitHubClub

numpy 相关函数使用

thbcm阅读(212)

np.where

首先强调一下,where()函数对于不同的输入,返回的值是不同的。

1、当数组是一维数组时,返回的值是一维的索引,所以只有一组索引数组;

2、当数组是二维数组时,满足条件的数组值返回的是值的位置索引,因此会有两组索引数组来表示值的位置,下面举例说明:

import numpy as np
a=np.reshape(np.arange(20),(4,5))

a
array([[ 0,  1,  2,  3,  4],
      [ 5,  6,  7,  8,  9],
      [10, 11, 12, 13, 14],
      [15, 16, 17, 18, 19]])

b = np.where(a>10)
b
(array([2, 2, 2, 2, 3, 3, 3, 3, 3], dtype=int64), array([1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))
b[0][:]
array([2, 2, 2, 2, 3, 3, 3, 3, 3], dtype=int64)
b[0]
array([2, 2, 2, 2, 3, 3, 3, 3, 3], dtype=int64)
b[1]
array([1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64)

a是一个二维数组,b就是返回的索引,索引分为行索引和列索引两个部分,b[0]是行索引,b[1]是列索引。

np.tile

他的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组.例子:

import numpy as np
a = [1,2,3]
b  = np.tile(a, (1, 4))
b
array([[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]])
b  = np.tile(a, 4)
b
array([1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3])
d  = np.tile(a, (2, 4))
d
array([[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
       [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]])

从上面的例子我们可以看到,其中 b = np.tile(a, (1, 4))生成的是一个二维数组,而b = np.tile(a, 4)生成的是一个一维数组,都是把a重复4次。

联系我们