增长黑客这一概念起源于美国互联网行业,最早由 Sean Ellis 提出,已经帮助硅谷多家公司完成产品的快速增长。其中最著名的案例包括 Dropbox,Hotmail,Facebook。近年来,增长黑客的概念传到国内,也引起了众多创业者的关注。
增长黑客本身是一套产品管理理论框架,并不是一套实践框架,如何才能真正地对公司产生价值呢?除了有一个完善的增长团队,还需要有产品作为内容,工具作为执行手段。
增长的精髓是一套体系和方法,它以数据为指引,以实验的方式,系统性地在用户生命周期的各个阶段(包含用户的获取、激活、留存、推荐、变现、回流等),虚招当下性价比最高的机会,在具体的执行上横跨市场、产品、工程、设计和数据等团队,通过快速迭代实验的方式达到目标。
结果可量化、方法可重复、过程可迭代(量化,公式化即模型化,迭代化)
增长流程
根据目标寻找对其影响最大的领域,比如,新用户激活,对领域进行分析,寻找突破点,产生一系统的实验想法与方向,然后进入实验迭代阶段,以一两周为一个周期设计实验,给产生的想法按优先级排序,做开发和上线实验,分析数据结果,再把数据结果应用到下一实验中,在全过程中,关注指标变化趋势。
寻找杠杆
根据目标,在所有领域中,寻找投入最少回报最高的点,设计实验。
实验、流程、文化
实验的长期迭代,固化出流程,流程规范工作方式与思考方式,产生文化。
教育与宣传
跨部门协作,做好教育和宣传工作,提高各部门参与度,赢得更多资源与支持。
方向标:北极星指标
路线图:增长模型
仪表盘:关键指标看板(定量数据)
参考书:用户心理决策地图(定性数据)
定义北极星指标的六个标准
第一步:定义北极星指标
绘制用户旅程,即用户达到北极星指标的步骤
组装增长模型,北极星指标公式化,并将指标向下分解到不可分解为止(分解出指标,根据这些变量指标,找到增长点)
定义关键时间,循序渐进,先抓重点
LTV:用户生命周期价值,即用户在整个生命周期里给企业创造的价值。
ACA:获取一个新客户需要的成本。
认识你的产品特点
了解你的用户群体
列出可能的备选渠道
付费渠道 | 有机渠道 | 其他渠道 |
---|---|---|
小众博客 | 搜索引擎优化 | 公关 |
社交和显示广告 | 内容营销 | 非常规公关 |
线下广告 | 邮件营销 | 已有平台合作 |
搜索引擎营销 | 程序化营销 | 演讲机会 |
联盟 | 社区 | 商务拓展 |
会展 | 病毒传播 | 线下活动 |
销售 |
筛选最初的获取渠道,计算哪种渠道的获客成本最低,效果好
运营、优化和拓展用户获取渠道:表现好的渠道,持续优化,加大投入;表现不好的渠道,尝试改变策略,进行测试。结果始终无法改善的,分析原因,考虑放弃或减少投入
用户推荐好处:获取成本低、获取的用户质量好、转化比例高
用户传播的三个概念:
用户传播的六大类型
衡量用户推荐的万能公式
K因子:病毒系统,平均每个老用户可以带来几个新用户
通过邀请加入的新用户人数 = 潜在的推荐人数(总活跃用户基数接触到邀请机会的比例) 推荐人转化率 分支因子(平均每人发出邀请的数量) 被推荐人的转化率 (被推荐人接受邀请的比例*接受邀请后完成注册的比例)
激活离开不Aha时刻(惊喜时刻):(谁)在(多长时间内)完成(多少次)(什么行为)
关键行为:列举一组可能的关键行为,进行数据分析(定量),对关键行为做筛选(如:对每种可能的行为,分析用户的留存率,留存率高的行为较关键),并采用用户调研(定性)进一步确认关键行为,用户的Aha时刻即为完成关键行为的时刻,将用户往关键时刻上引导。
激活率:新用户在一定时间内完成激活行为(关键行为)的比例
激活漏斗转化率:在追踪新用户注册和激活全过程中,用户完成每一个不走占进入这个步骤总人数的比例
新用户留存指标:新用户在经过较长一段时间(如一个月)后,是否还是该产品的活跃用户
原则一:增强动力
原则二:减少障碍
原则三:适时助推
原则四:私人定制
第一:新用户注册和引导步骤太多,流程太长
第二:没有聚焦到一个关键行为上,想让用户做的事情太多
第三:花太多时间教用户怎么用界面,而没有让用户使用产品
第四:让用户太快完成设置,没有给予足够的教育
第五:新用户注册太顺利,没有设置必要的障碍筛选掉不合格的用户
第六:以“注册完成”为衡量新用户引导的指标,而不是“用户激活”
第七:对每一个用户都统一对待
第八:完全照抄以上介绍的最佳实践,而不进行A/B测试
回归关键行为
发现用户的天然使用周期
绘制用户留存曲线,留存曲线应该最终趋于平缓,如果持续下降,需要分析产品是不是契合市场需求;通过对不同时期的留存曲线对比,判断留存是否有改善;对用户分组(按渠道,按行为,按用户特征)绘制留存曲线,帮助了解驱动留存的不同因素;
用户在一定时间内,平均有几个关键行为和有多少用户同时有超过一种以上的关键行为,区分出超级用户、核心用户、消极用户,引导用户向上迁移
行为 = 动力x能力x触发
给单次行为提供不固定“奖励”
让用户付出适当的努力
增加外在触发条件,触发次数多了逐渐转化为习惯
让一个行为带来更多的行为,完成一个动作,可引出更多的动作
产品改进
新用户引导和教育
目标 | 特点 | 留存工具箱 | |
---|---|---|---|
新用户留存 | Aha时刻 | 动力高、能力低 | 新用户体验、新用户引导、邮件和移动推送 |
中期用户留存 | 继续发现价值习惯形成 | 动力较高、能力中等 | 产品体验、持续引导、邮件和移动推送、促销 |
长期用户留存 | 持续提醒价值 | 动力中等、能力高 | 产品体验、持续引导、邮件和移动推送、忠诚度客户计划、客服体验、新产品、产品升级 |
流失用户留存 | 重新发现价值 | 动力低、能力中等 | 邮件、新产品、产品升级/改进、促销、客服体验 |
增长团队本质是一个以用户和利润增长为目标的产品团队
跨功能的团队:打破产品和市场的隔阂
利用定性和定量的数据分析深入了解用户行为
快速地做产品迭代和测试新的想法,并使用深入的分析来指导行动
产品:是否已经建立了核心价值
文化:是否能够得到领导层的理解和支持
资源:能不能获得需要的资源和工具
流程:有没有想好增长团队如何运作
人员:能不能找到合适的人才
增长产品经理
增长工程师
增长数据科学家/分析师
用户研究
增长设计师
市场渠道专家
独立特区模式
好处:可以从头建立自己的流程,形成自己的文化和基因;公司明确承诺将增长作为重要指标,获得强有力的支持
坏处:容易和其他团队发生冲突
功能主导模式:归入产品团队下,或者归入市场团队下
内部咨询师模式
数据分析 | A/B测试 | 渠道管理/营销自动化 | 项目管理和知识分享 |
---|---|---|---|
用户行为分析:Amplitude、Mixpanel、Kissmetrics、Google Analytics | 综合A/B测试:Optimizely | 邮件:Mailchimp、Intercom、Hubspot、Marketo | 项目管理软件:Asana、Trello、Jira |
数据可视化软件:Tableau、Looker | 综合A/B测试:Leanplum、Apptimize | 移动推送:Appboy、Localytics | 知识库:Confluence、Google Docs |
数据集合:Segment、mParticle | 着陆页A/B测试:Unbounce | 营销渠道归属:Adjust、Full circle | 增长团队综合软件:Growthhackers Projects |
增长流程包括宏观的战略制定和微观的战术执行两个阶段
战略制定阶段首先需要增长团队深入理解公司的商业模式,通过思考和分析找到北极星指标,搭建增长模型。然后根据北极星指标和增长模型制定核心增长目标,并通过指标分解的方式,找到现阶段对核心增长目标影响最大的聚焦领域。接下来,针对聚焦领域进行定性和定量的数据分析,制定初步的增长战略。
战术执行,即增长冲刺,增长冲刺一般以一周或双周为单位,针对某一聚焦领域,以提高某个指标为目的,进行快速迭代实验的过程,具体包含:产生实验想法、给想法按优先级排序、设计和上线实验、分析数据和应用结果几个步骤。
增长规划图是一份连接战略和执行的动态工作文档,它包含:
- 战略部分:总增长目标、某细分增长团队目标、关键子目标已经相应的战略、公司目前的聚焦领域
- 战术部分:针对聚焦领域的实验假设和实验想法
设定增长目标
一般来说,北极星指标就是公司的核心增长KPI。有了正确的增长KPI,还要设定清晰的目标,这个目标需要是一个绝对值,不能是百分比,还需要是一个清晰的数值,不能是模糊的”提高数量“。设定目标的原则是目标需要费点劲才可以完成,但又不是完全没有希望实现。确定目标后,需要反复沟通,使各个团队达成共识。
指标分解:发现增长切入点
指标分解,横向按群组分,做加法,纵向按用户的生命旅程分,做乘法
找到聚焦领域
产生实验想法
优先级排序
设计和开发实验(A/B测试,实验假设:如果我成功了,我预测(实验指标)可以提升(%))
分析数据
应用结果
A/B测试作为一种方法论,在增长的方方面面都有所应用,如:
付费广告A/B测试
应用商店A/B测试
着陆页A/B测试
新用户引导A/B测试
产品功能A/B测试
邮件A/B测试
移动推送A/B测试
应用内消息A/B测试
A/B测试优势
- 量化结果,参照对比
- 限制负面影响,只影响一小部分
- 学习,加强你对产品、用户和渠道的认识
- 文化,成员间产生分析,通过A/B测试实实在在看到结果
A/B测试局限性
- 帮助公司形成战略和愿景,但本身并不是战略方向
- 开发测试比直接上线功能或者创意浪费人力和时间
- 如果测试意在改善的指标是错误的,可能反而损害增长
- A/B测试更适合优化设计,很难通过A/B测试开发出全新的设计,所以面临局部最大化问题
任何事情都是一个实验,通过它,你或者实现增长,或者学到经验
作为一套方法,通过将问题拆解到小的可量化的影响因子,通过优化小的影响因子来达到目标。本质还是在模型和数据,数据提供验证机制,模型将问题分解到可操作层面。所谓文化和流程,都是在人事层面,核心正确,方法科学,工具先进,都未必能成,还依赖外围的人事。但作为个体来应用,可将大目标分而治之,找到快速的验证机制,快速调整行动。
第一性原理 知识从源头探索,这是一个笨办法,也是一个极具困难的挑战。
企业为什么会有使命和愿景?本质上也是应用了“第一性原理”,做企业的源头是“为什么要办这家公司?”这个问题。
学生要想提高学习成绩,改变学习态度,从“第一性原理”来说,首先要思考的问题就是源头问题“我为什么要学习?”
需要注意的是,一个维持性问题,可以不需要用到“第一性原理”。往往是一个很难解决的问题,或者你想有更高的成就,你才可能需要用到“第一性原理”。
Homebrew 是一款自由及开放源代码的软件包管理系统,用以简化 macOS 和 linux 系统上的软件安装过程。它拥有安装、卸载、更新、查看、搜索等很多实用的功能,通过简单的一条指令,就可以实现包管理,十分方便快捷。
Homebrew
主要有四个部分组成: brew
、homebrew-core
、homebrew-bottles
、homebrew-cask
。
名称 | 说明 |
---|---|
brew | Homebrew 源代码仓库 |
homebrew-core | Homebrew 核心软件仓库 |
homebrew-bottles | Homebrew 预编译二进制软件包 |
homebrew-cask | 提供 macOS 应用和大型二进制文件 |
1 | # 查看 brew.git 当前源 |
1 | # 替换各个源 |
1 | # 替换各个源 |
1 | # 重置 brew.git 为官方源 |
1 | ? 列出所有快捷键;按q返回 |
1 | tmux new -s basic 新建会话,basic为会话名称 |
1 | tmux new -s basic -n shell 新建session名字为basic,窗口名字为shell |
1 | " 将当前面板平分为上下两块 |
DFA和NFA反映了正则表达式在应用算法上的根本差异,NFA为表达式主导,DFA为文本主导,有什么区别呢?
表达式主导:
如用正则表达式:to(nite|knite|night) 来匹配文本:tonight,正则表达式中第一个是‘t’,他会重复尝试,知道在匹配文本中找到‘t’为止,之后检查后续文本是否匹配‘o’,如果能,会接着检查选择分支,引擎会依次尝试‘nite’,‘knite’,‘night’这三种可能,直到匹配成功或全部尝试完后匹配失败,在匹配‘nite’时,会想上面一样一次匹配‘n’,‘i’,‘t’,‘e’,如果失败,在尝试另一种可能。表达式中的控制权在不同的元素之间转换,所以称之为“表达式主导”。
文本主导:
DFA引擎在扫描字符串时,会记录当前有效的所有可能匹配,如上例中,当扫描到匹配文本的‘i’字符时,它会记录下两个可能匹配的位置‘nite’中的‘i’和‘night’中的‘ni’,从而把knight淘汰,再扫描匹配文本中的‘g’,这时只有‘night’能匹配,只剩下一种可能,然后依次匹配‘h’和‘t’,引擎发现匹配已经完成,报告成功。它是扫描的字符串中的每个字符都对引擎进行了控制,所以称为“文本主导”。
NFA效率会低于DFA,因为DFA每个字符只会扫描一次,而NFA对同一字符会扫描多次。
]]>优点:
1.静态工厂可自定义名字,见名知意,如
BigInteger(int, int, Random)
与BigInteger.probablePrime
.有时多个构造器会让人无从选择,容易出错。
2.静态工厂不需要每次调用都创建一个对象。对于某些对象可以重复利用的场景,这种方式效率更高。
3.静态工厂可返回方法返回对象的任意子类,基于接口编程。
4.静态工厂可根据输入参数来创建不同的返回对象
5.静态工厂可以仅仅是一个占位符,根据注入的不同服务,返回不同的对象,如JDBC
缺点:
1.如果类中不包含public
或protected
的构造函数,将无法被继承
2.难以区分那些是静态工厂方法,那些是普通的静态方法,通常使用方法名称区分,如of
,from
,valueOf
,getInstance
等
当构造器需要多个参数,而且部分参数可选的时候,通常有几种处理方式:
1.使用构造器重载,默认参数在简单的构造器中设置,简化客户端调用。
缺点:在参数很多的时候,组合的情况很多。代码难写也难读。
2.使用JavaBean的方式,初始化设置属性的默认值,使用set方法来设置必要的参数。
缺点: 会导致不一致的问题,参数没设置完整,对象已经是可用的。另外会让对象变得可变,多线程就得考虑线程的安全
3.使用建造者模式,Builder
使用链式调用,每设置一个参数,返回的是本身,设置完所有的参数,调用build
方法的时候,将构造器传入给要新建的对象,通过构造器设置完参数后,返回。
三种方式:
1.public static final INSTANCE= new Singleton()
,私有化构造器,简单直接
2.私有化属性,私有化构造器,静态工厂返回单例,如果不需要对单例对象加工,也不需要使用范型,也不需要使用suppler,如Singleton::INSTANCE
,则使用第一种方式
3.使用枚举来实现,通常作为最佳实践
一些工具类只包含静态方法,静态变量,不需要被继承和实例化,此时采用私有化构造器来保证其不被实例化和继承。
资源使用依赖注入比使用静态工厂或静态工具类更灵活更容易测试。
不可变对象复用,原生类型的装箱拆箱。
不再引用的对象置为null,绝大部分情况不需要设置,若在作用域以外仍然会引用废弃的对象,才需要设置。自己管理内存或者对象的情况下,需要考虑。
Finalizers
不可预料,危险通常是不必要的。JAVA9不推荐使用Finalizers
,以Cleaners
取而代之,比Finalizers
安全,同样不可预料,影响性能,没有必要使用。因为不知道终结方法何时执行。Finalizers
会吞噬异常,Cleaners
不会吞噬异常。作为安全网或者是终结非关键的本地资源,否则不要使用终结方法。
try-with-resources
代替try-finally
equal
的时候遵守通用约定1.自反性 对于非空对象,x.equal(x)
返回ture
2.对称性 x.equal(y)
则y.equal(x)
x,y为继承关系,容易出现违反对称性,因为调用不同的equal
方法。
3.传递性 x.equal(y)
,y.equal(z)
则x.equal(z)
y为父类,x,z为子类,容易违反传递性,将子对象转换成父对象比较,都相等,子对象里判断了其他属性,导致两个子对象不相等。只要父类不可实例化,就不会违反传递性。
4.一致性 在不修改x,y的情况下,x.euqal(y)
不变,如果依赖了不可靠的资源,比如域名对应ip,就容易违反。
5.任何非空x,x.equal(null)
返回false
我们无法在扩展可实例化的类的同时,即增加新的属性,又保留
equal
的约定。
实现高质量的equal
步骤:
1.使用==
判断是否相同的引用
2.使用instanceof
检验参数的类型是否正确
3.将参数转换成正确的类型
4.检查关键的字段是否一致
5.考虑对称性、传递性、一致性
实现equal
要注意equal
的参数是Object
类型,如果改成其他类型的,就不是重写,而是重载。重写时使用override
注解,重写错类,会提示编译错误。
equal
时,一定要覆盖hashcode
相等的对象,hashcode
一定相等,不相等的对象,hashcode
也可能相等。因此,equal
里用到的关键字段,在hashcode
的计算时,都应该用到,在equal
里没有用到的字段,不要用于hashcode
计算。hashcode
计算规则:
1.初始化一个reuslt值,步骤2循环关键字段
2.根据字段计算c,如果字段是原生类型,则调用Type.hashCode(f)
,如果字段是引用类型,则调用对象的hashCode
,如果是数组,使用Arrays.hashCode
3.result = 31* result + c,重复循环计算关键字段。
toString
clone
Comparable
实现不可变类:
1.不提供任何会修改对象的方法
2.保证类不会被扩展
3.使所有的域都是final
4.使所有的域都成为私有的
5.如果域是可变的,则不让改域能在外部访问,也不要返回可变的域,也不要使用外部传入的可变对象来初始化域
继承破坏了封装。继承其他人编写的具体类时,要有文档说明可以被继承,否则容易出错。只有在确实子类是父类的子类型,采用继承,否则用组合。
虽然默认接口能实现在接口里添加方法,不影响原来的实现。但是不要这么做,因为可能导致运行时的问题。默认方法可用于提取接口实现的公有逻辑,不要用来修改接口。
不要使用常量接口,常量可以使用工具类来实现。
尽量消除,无法消除的使用注解SuppressWarnings("unchecked")
,并注明原因,SuppressWarnings("unchecked")
范围越小越好。
优先使用lamda,lamda由于没有名字和文档,所以表达式应该清晰明了,代码不要超过3行,。大部分使用匿名类的场景都可以使用lamda替换,除非要使用多个函数。
]]>1 | yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm |
1 | sudo adduser dbuser |
df -h
查看SD卡盘符1 | sudo diskutil unmount /dev/disk3s1 |
1 | ctrl+-(shift+ctrl+-):移动光标到上次位置或相反,比如定位一个函数,转到函数定义后想回到函数使用处,则用ctrl+-,若又想回到函数定义处则可以按shift+ctrl+- |
centos61
2 rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
centos71
2 yum install epel-release
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
查看可安装的包1
yum list --enablerepo=remi --enablerepo=remi-php56 | grep php
1 | yum install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof php-soap php-fpm |
1 |
|
1 |
|
1 |
|
1 | mysqldump -uroot -ppassword dbname > dbname-backup-$(date +%Y%m%d).sql |
1 | grant all on dbname.* to root@'localhost' identified by 'pass'; |
1 | drop user user@'%'; |
本文转载自:众成翻译
译者:Alecc
链接:http://www.zcfy.cc/article/1417
原文:https://medium.com/web-development-zone/top-blogs-about-web-design-and-web-development-57706bb620be#.uhbnrozhw
在这篇推文中,我收集使到一些使得网页设计师和开发人员更方便网站建设的站点。这些站点都有精心编写的,明确的,内容充实的的文章,内容包含对CMS之如WordPress讨论,Photoshop工具,CSS和HTML教程代码,对用户体验的想法(UX)和用户界面(UI)的提示、技巧、资源和赠品。
在今天的帖子中,我们将一睹55个最好的网页设计师和开发人员博客和网站。请注意站点不以排名先后论英雄。
Web Designer Depot是全球设计师之间的聚集地,在这里有设计师们分享为来帮助发展设计社区功能而分享的文章和教程。 站点主题包括HTML 5,CSS3,响应式设计,排版,可用性,jQuery,移动应用程序,资源,业务,自由职业者,灵感等。
InstandShift是一个流行于网页设计师和开发人员的社区。有很多关于WordPress,网页设计,CSS,工具,教程,字体,摄影等很多优秀的帖子。
这是由Chris Coyier1人创立最初只涵盖CSS,到现在有11人的团队,涵盖网页设计和开发的各个方面网站。 他们的内容包括文章,视频,代码片段、教程,新闻,基本资料等。
这个网站自2007建立年以来,已经为设计师,开发人员,工程师和博主提供了一系列的文章,教程,推荐的工具,提示和技巧。 他们喜欢写关于插件,工具,桌面和移动应用程序,小工具,天才般的想法等任何令人感兴趣的任何东西。
该网站由Jacob Gube于2008年推出,涵盖了设计和构建网站及应用程序的网站设计和开发的整个流程。 他们发表文章,新闻,教程,指南等等。 该网站主题涵盖的范围从Photoshop到自由职业者和之间的一切。
这个网站由Vitaly Friedman和Sven Lennartz创立,为设计师和开发人员提供了一系列的文章,教程。站点主题包括设计,用户体验设计,代码,WordPress,移动应用程序和设计,图形等。内容涵盖软件,概念,新闻等,也包括CSS,Photoshop,电子商务,插件,网站主题等等。
该网站自2006年成立以来一直致力于国际技术新闻,设计,商业,文化等领域的文章发布。其内容包括入门指南,代码,UX设计,关于交易和课程的链接和新闻,设计活动视频,硬件,软件,评论,即将到来的活动,平面设计等。
Paul Andrew在2007年10月建立了自己的自由职业者站点。现已发展为为一个网页设计杂志站点。 它拥有大量的教程,资源,节省利用的技术,甚至鼓舞人心的艺术。 主题包括网页设计和开发,平面设计,移动开发,广告,设计风格和趋势,技术新闻等。
这是一本专注于商业和设计之间结合的技术杂志站点。它涵盖了广泛的主题,包括电子,UX,平面设计,建筑,时尚,消费产品等等。 在这里的设计师提供见解,意见,提示,新闻等等更多信息。
这个设计网站发布了启发灵感的网页设计文章、布资源和教程。他们专注于设计和收录了网上最伟大的项目。 他们定期发布教读者创造自己设计的新技术的文章,并分享行业的每日新闻。该站点主题包括网站,排版,商业品牌,快捷方式等等。
这是由Chris Spooner建立的设计博客。 他分享一些贴士,资源和灵感,以帮助各阶段教育水平和技能水平的设计师。内容包括教程,文章,视频,新闻和免费资源的链接。主题专注于平面设计,图形软件,排版,模板,标志等。还有一个只供会员的下载的区域。
这个设计博客是由是由网页设计师兼开发人员Manoela Ilic和Pedro Botelho共同搭建完成的。 它开建立之初是想作为实验博客,后面成为一个热衷于分享对网页设计和网站开发的社区。团队成员及其他贡献者一起发布有关最新网络趋势,技术等的文章和教程。站点主题包括教程,赠品,CSS参考目录,在线实验区域,讨论网页设计概念的蓝图,以及包含来自社区的设计和新闻资源的集合。他们还主持有奖问答节目。
本网站是由来自保加利亚瓦尔纳的网站开发人员和设计师团队建立的。该站点文章包括小贴士,教程,赠品,编辑,UI,UX,新闻和在线实验。文章内容涵盖很多代码开发,包括HTML5,CSS3,jQuery,JavaScript和PHP。他们甚至有一个免费的jQuery电子书。
这是一个由Sagi Shrieber和David Tintner创立的在线杂志,主要是针对互动设计和前端开发。 它涵盖设计,代码,赠品,灵感,生产力,素描等各个领域。他们有许多教程和文章,包括Photoshop,CSS,JavaScript,商业,个人生活,免费图标链接,模板,赠品,有趣的网站,评论等等。
这是由由Jake Bresnehan创建和维护一个周刊杂志和博客网站。杂志包括标题,文章,工具,资源,灵感,工作等。杂志和博客都包括关于编程代码(CSS,HTML等)等文章教程。大多数内容在收录在电子杂志中,并通过电子邮件推送给用户这里非常注重代码。
这是JavaScript和HTML5专家David Walsh的博客。 它包含大量的文章和教程,主要侧重于前端技术。站点主题包括代码(CSS,HTML,AJAX,JavaScript等),开发软件,资源链接,网站主题,设计概念,演示,移动端,浏览器等。
这是由Ronald Bien于2008年创建的设计博客。它展示了设计社区里的教程,赠品,灵感,资源等。站点内容包括文章,教程,赠品和WordPress主题。 它有很多的链接到良好的设计示例,免费图标,PSD模板,宣传册设计,标志设计等等。
这个博客包含了许多关于设计和开发的主题。主要包括文章,教程,工具,资源,赠品和灵感等几大块。 涵盖了图形,标志,排版,网页设计,Photoshop,WordPress主题和插件,CSS,Illustrator,jQuery等等。 它有很多贴士,下载链接,评论,收藏等。还有一些提示最佳实践的贴士和广泛适用的主题。
这里是一个专门发布Web UI设计教程网页设计博客。他们还分享免费的供网页设计师和开发人员下载的网站模板和网络资源。 他们讨论网页设计最新趋势和技术方法,以及创建网站UI的最好的方法和技巧。 该博客包含大量的教程和免费资源链接,发展概念和代码教程。 免费资源包括图标和PSD模板。
这个网站的从Raul Taciu的Cluj-Napoca,罗马尼亚和专注于高质量的设计资源是免费的。资源包括独有的PSD文件,还有来自世界各地的免费素材。资源包括模型,UI工具包,图标,文字效果,背景等。文章详细讨论了产品,并提供了下载链接。
这是一个专门用于网页设计和开发的博客,其中包含大量教程和代码片段。该站点类别包括技术,教程,网页设计,网站开发,WordPress,JavaScript,移动开发,排版等等。 文章包括新闻,免费资源,资源链接,主题合集等等。
该站点由Igor Ovsyannykov管理,提供有关设计,商业,创办企业的精神,WordPress,图形,交易和职场自我成长的信息。文章包括教程,灵感,博客,免费资源,新闻,主题,纹理,壁纸,SEO,社交媒体,标志,字体等等。 还有视频教程和免费资源的链接。
这个博客提供了许多文章给设计师和开发人员。站点主题包括工具,赠品,设计理念,灵感,面试,WordPress,主题,插件,方法小贴士,教程等。文章广泛的包含了教程、集合和链接等领域。链接包括CSS动画片段,WordPress主题,图标,排版,优秀的网站设计案例,线框图工具等等。站点的教程包括Photoshop,CSS,Sketch等等。
这个网站由来自巴林的Naeem Noor创建并维护,专门面向于网络开发人员、设计师和编程人员。站点提供了很多工具,资源,代码片段和提示。内容包括博客,CSS生成器,CSS滤镜效果,CSS演示,响应式计算器和视频。它讨论许多方面如博客,服务器,UI设计,WYSIWYG生成器,图标,架构,模板,开发人员的浏览器扩展,资源链接等等。
这个博客来的诞生是来自一个更大的项目,是由布莱恩·威廉姆斯,安迪·兰金和Wynne“流行”威廉姆斯于1999年成立。博客涵盖了设计和各种动效。站点主题包括UX,颜色,可访问性,新闻,事件,实验,实验,品牌管理,APP,游戏,插图,教程等等。
这是一个曾获奖的博客,由来自伦敦的布林威尔逊建立并运营,专注于WordPress相关的技术和资源,给任何对WordPress感兴趣的人提供有用的提示。站点的内容由来自世界各地的网页设计师,程序员和专业创意者提供。站点主题包括网站主题,插件,代码托管,SEO,安全性,性能,教程,提示,博客,系统组件,设计,营销,社交媒体,新闻,周边趣事等等。 尽管建立网站的初衷是专注于WordPress但也包含其他CMS。
这个网站致力于提供一个平台给所有志同道合的设计师一起交流技术和分享灵感。它包括灵感,教程,赠品,资源,平面设计,网页设计和商业活动。 主题包括移动平台,内容管理系统,CSS,jQuery,WordPress主题,工具,资源,图标,培训视频链接,插图,UI,UX,编码,Photoshop等等。
这是Jacques van Heerden建立的在线设计杂志。该网站是通过发布文章,建议,教程,资源和灵感以达到激发艺术家变得更好的目的。站点内容包括许多热门主题和目录,如收藏,免费资源,新闻,访谈,WordPress,新闻,赠品等。文章包括有关品牌,WordPress主题,商业发展,电子商务,徽标,营销的信息,甚至为您提供创意商业提供建议如何选择打印机。
这是由来自德国的Commindo Media GmbH&Co. KG建立的博客。站点的内容专门为Web开发人员和设计师而编写的。站点主题包括网页设计,排版,图形,CSS,JavaScript,Ajax,广告,市场营销,WordPress,电子商务,自由职业者,灵感等等。 文章包括设计教程,编写代码,使用图形程序,SEO,免费资源,卡通,主题,插件,提示,技巧等等。
这是一个为网页设计师和开发人员设计和提供灵感的博客。它每天都有资源推荐,内容包括灵感,文章,教程,赠品,网页设计,WordPress,字体,CSS,图标,摄影,Photoshop,JavaScript,Illustrator,平面设计,信息图表,案例,logo,新闻和更多。
这个网站是由Devesh Sharma创立的。它主要集中在WordPress,包括学习指南、教程方法、插件、新闻、评论、提示和技巧、插件、主题,评论、安全、SEO、初学者指南和代码等。 它包括许多资源的链接,例如工具,代码托管和优惠券。站点文章是由WordPress专业人员写的,内容广泛,面向各个级别的从业人士。
这个网站涵盖网页设计和开发,重点是WordPress,Javascript,CSS,PHP,设计,HTML5和其他各个方面。站点它包括WordPress,Photoshop,编写代码,Linux服务器开发和配置,字体,图形等产品的文章和教程。他们还提供交易和免费资源的链接。内容由专业的设计师和开发人员为其群体所写。
这是一个基于社区的网站,包括博客,设计图库,用户提交的新闻和招聘专区。博客包括工具,图标,主题,代码片段,字体,图形等资源。教程包括Photoshop,网页设计等。站点主题还包括采访,灵感,WordPress,设计师案例,免费资源,排版,UI等。该站点涵盖了所有的网页设计的方方面面。
这个博客有很多关于网页设计和前端开发的教程。它包括许多文章和贴士,如字体设计和优化排版,使用Photoshop的小贴士,推荐书籍的列表,解决常见的设计问题的方法论,使用负空间,WordPress,PHP,HTML,CSS,灵感等。目标受众是从初级到高级的网站开发人员和设计师。
这个博客由Mark Harbottle和Matt Mickiewicz创立。站点提供新颖的想法,概念和新技术等内容,还包括文章、课程、教程、书籍或任何与设计和构建网站相关的内容。网站用户讨论代码(HTML,CSS,PHP,JavaScript和Ruby),移动开发,WordPress,设计,UX,商业运营,以及任何与网络技术相关的内容。
这是一个涵盖网页设计和开发且同时提供了大量的资源的博客。站点主题包括网页设计、灵感、UI、图形、访谈、网络开发、评论和内容管理系统。文章包含免费资源链接,时事新闻,APP教程,工具,字体,图标,矢量图形,WordPress,Drupel,Ghost,编码,电子商务,移动开发,可穿戴设备,排版设计等信息的链接。
这是一个有很多文章的钱打U呢和设计的教程网站。站点类别包括Photoshop,Illustrator,矢量,插图,工具和提示,灵感,新闻,设计,文本效果,CSS,HTML,UX,UI,工作流,设计理论等等。文章针对的是初级阶段,内容十分广泛。还有一些可供订阅的课程。
这个博客来自Happy Cog的创始人Jeffrey Zeldman建立的,主要关注设计,经验体会和代码。站点主题包括流程,设计,前端开发,团队,项目管理,社区,职业,战略,公司和客户关系。文章包括案例研究,教程,方法提示,商业运营和客户关系处理,排版,编码,Photoshop等等。大多数文章是是精心编写和详细的理论研究成果。
这是一个专门为Web开发人员和设计人员分享开源资源的博客。对于设计师,站点有免费的图标,字体,表,股票照片,画笔和设计灵感。对于开发人员,有很多JavaScript和Ajax组件,如插件,菜单,工具提示,图表,轮转图,日历,模态窗等。它还涵盖代码托管,电子商务,社交媒体,工具,安全,统计等等更多。该站点的文章详细和前沿。
此博客提供了一个用于UX和UI设计的资源列表。该站点是由网页设计师策划和维护,包含了大量的网页设计文章和资源。主题设计包括人们趋势,灵感,规范的和不规范的风格指南,工作进程,工作流,工具箱,优秀的和拙劣的网格和排版,动画制作的最佳与最坏方式,设计准则的最佳与最坏遵守,和可访问性的最佳与最坏标准。每个类别都有详细的资源列表。站点主题包括编码入门,最佳实践,灵感,参考,流行趋势,性能,CSS/SASS,SVG,JavaScript,工作流,工具箱和各种库。
UXPin是供网页设计师使用的产品设计平台。他们的博客侧重于各方面的各种平台的用户体验。它包含大量关于用户体验设计,移动端,设计趋势,最佳实践,设计小贴士,交互设计,UI设计,网页设计,元素和模式,过程,UXPin,线框,平面设计,团队协作,可用性,原型,草图,样机,Photoshop等等。该站点的文章都非常实用和详细。
这是一个致力于制作最好的网站布局,以改善用户界面的网站和博客。网站介绍最佳实践,布局,如何合并功能以达到更简洁的设计。大力推荐使用社交途径,来无论何处可以何处响应行动呼吁,来如何使可点击和可选择的不同样式表,来如何推荐一个选择来帮助用户决策,也提供了允许用户取消错误行为的决策,来具体证明明最佳的受众是谁,来显示更强的对比,使用更少的字段,合理显示所有选项等等。站点的信息都很简短,简单,易于理解。
这是一个包含很多文章和教程的网页设计和开发电子杂志。站点目录包括设计,展示,非同寻常的灵感,教程,CSS,资源,工具,UX,移动端,免费资源,可用性,商业,排版,Illustrator,Photoshop,极简主义,工具等。还有很多免费下载的元素,图标,字体,PSD模板等。文章的大小合适阅读,包含和很多的分步细节。
这个博客成立于2008年,是一个面向网页设计师和网页开发人员的网站。主题包括社交网络,新闻和与Web 2.0相关的一切。站点主题包括设计,WordPress,社交媒体,SEO,标志,灵感,教程,免费资源,字体,图标,Photoshop,模板等。教程主要覆盖图形以及重点关注Photoshop。还包括插件、代码(JavaScript和CSS)和Illustrator。
这是世界优秀网页模板站点Template Monster的设计博客。站点主题包括新闻,文章,工具,赠品,灵感,信息图表,WordPress和Joomla。 教程包括文章和视频,并重点关注WordPress,排版,CSS,HTML,jQuery,Photoshop,Illustrator,网络技术,Web开发方法论,以及设计网站和UI元素。
这本网络杂志由Pabini Gabriel-Petit于2005年创立,为UX开发人员提供视野和灵感。它提供了许多有价值的建议,最佳实践,主题观点,以及探索UX设计的战略方面的深层思考的文章。主题包括网页设计,移动端,用户研究,视觉设计,web应用程序设计,设计流程,访谈,评论,内容创建,通信设计,架构,商业,战略等等。
这个博客开始由Justin Mifsud在2011年建立的,出发点是作为一个提升网站可用性的重要性的兴趣交流网站。Justin想提高网页设计师和开发人员在商业和政治网站可用性设计的意识。站点主题包括可用性,指南,测试,用户体验(UX),商业运营,转换,人机交互(HCI),术语,评论,资源和信息架构(IA)。
这是一本2001年开始的同行写的杂志,讨论所有关于设计的东西。站点主题包括交互设计,信息架构,平面设计,甚至商业服务设计。
站点目录包括设计原则,发现,研究和测试,过程和方法,界面,可交付成果和文档,书评,会议和活动,软件和工具,以及工作场所和职业。
这个网站专注于网页设计包含所有东西。站点主题包括赠品,网站模板,WordPress主题,Photoshop,Dreamweaver教程,Illustrator,评论,灵感,网站开发,CSS,HTML,合集,编程,网上兼职,访谈和SEO。该站点涵盖了从移动界面设计到开发电子商务网站开发之间的方方面面。
这是Louis Lazaris的个人博客,作者是一个自由的网络开发人员,杂志站点SitePoint的HTML/CSS内容的管理编辑,和两本关于HTML/CSS的书的作者。博客内容大多是关于HTML、CSS和JavaScript的文章。Louis在他的博客讨论相关的概念,原则和bug。博客也它包括许多文章、教程,CSS基础,屏幕录像,新闻,评论等等。这个博客站点强调的代码和设计的结合。
最初作为一个网页设计展示画廊,现已成为分享网页设计的想法,文章,教程和资源,以帮助网页设计师提升他们技艺的平台。站点内容包括WordPress主题和插件,网站设计的综述,赠品,独家优惠等等。网页设计师可以这里找到很多高品质的资源。
言尽于此,学习之路不止。
Have a nice day!
1 | mount -t cifs //192.168.2.2/share /151.2_share -o username=samba,password=samba,iocharset=utf-8 |
1 | #vim /etc/fstab |
]]>参考
How to mount Windows share on Red Hat Enterprise Linux system using CIFS?
192.168.192.130 vm_c7
1 | yum install gcc make binutils gcc-c++ compat-libstdc++-33elfutils-libelf-devel elfutils-libelf-devel-static ksh libaio libaio-develnumactl-devel sysstat unixODBC unixODBC-devel pcre-devel –y |
1 | groupadd oinstall |
vim /etc/sysctl.conf
,添加内容,执行sysctl -p
,其中kernel.shmmax = 1073741824
为物理内存的一半 1 | fs.aio-max-nr = 1048576 |
vim /etc/security/limits.conf
,添加内容: 1 | oracle soft nproc 2047 |
1 | session required /lib64/security/pam_limits.so |
1 | if [ $USER = "oracle" ]; then |
1 | mkdir -p /data/oracle/product/11.2.0 |
1 | su - oracle |
1 | ORACLE_BASE=/data/oracle |
1 | cp -R /data/oracle/oraclesetup/database/response/ . |
1 | oracle.install.option=INSTALL_DB_SWONLY |
1 | cd /data/oracle/oraclesetup/database/ |
1 | sh /data/oracle/inventory/db_1/orainstRoot.sh |
1 | netca /silent /responseFile /home/oracle/response/netca.rsp |
1 | netstat -tnulp | grep 1521 |
以静默方式建立新库,同时也建立一个对应的实例,vim /home/oracle/response/dbca.rsp
修改配置:
1 | GDBNAME= "ora11" |
执行配置 dbca -silent -responseFile /home/oracle/response/dbca.rsp
ps -ef | grep ora_
lsnrctl status
/data/oracle/product/11.2.0/network/admin/listener.ora
,添加 1 | SID_LIST_LISTENER = |
sqlplus / as sysdba
,执行sqlSQL> select status from v$instance;
/data/oracle/product/11.2.0/bin/dbstart
,将ORACLE_HOME_LISTNER=$1
修改为ORACLE_HOME_LISTNER=$ORACLE_HOME
/data/oracle/product/11.2.0/bin/dbshut
,将ORACLE_HOME_LISTNER=$1
修改为ORACLE_HOME_LISTNER=$ORACLE_HOME
/etc/oratab
文件,将orcl:/data/oracle/product/11.2.0:N
中最后的N改为Y,成为orcl:/data/oracle/product/11.2.0:Y
设置开机启动
1 | su - |
添加内容:
1 |
|
修改权限chmod 755 /etc/init.d/oracle
设置开机启动chkconfig oracle on
vim /etc/sysconfig/network
,分别修改成ceph-node1
,ceph-node2
,ceph-node3
1 | HOSTNAME=ceph-node1 |
在ceph-node1上设置免密码ssh登录
1 | ssh-keygen |
在ceph-node1的机器上修改hosts,vim /etc/hosts
1 | 192.168.57.101 ceph-node1 |
将hosts复制到cehp-node2,ceph-node3上
1 | scp /etc/hosts root@cehp-node2:/ect/hosts |
三台机器分别使用国内的163的yum镜像
1 | mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup |
三台机器分别升级系统
1 | yum update |
三台机器同步时间
1 | ntpdate pool.ntp.org |
添加ceph的yum源,vim /etc/yum.repos.d/ceph.repo
,内容如下:
使用国内ceph镜像,ceph最版本不提供centos6的包,只能安装hammer之前的版本。
1 | export CEPH_DEPLOY_REPO_URL=http://mirrors.163.com/ceph/rpm-hammer/el6 |
在ceph-node1上执行,指定安装1.5.33,安装1.5.34会有问题:
1 | yum install ceph-deploy-1.5.33-0.noarch |
在ceph-node1上安装集群,执行:
1 | mkdir /etc/ceph |
如果报错提示为Error in sys.exitfunc:
,则添加环境变量export CEPH_DEPLOY_TEST=YES
即可。
如果报错提示为No section: 'ceph';
,则执行yum remove ceph-release
在其他机器上安装ceph,在ceph-node1上执行:
1 | ceph-deploy install --release hammer ceph-node1 ceph-node2 ceph-node3 |
在ceph-node1上安装监控,执行:
1 | ceph-deploy mon create-initial |
准备磁盘,测试环境可以直接使用目录,如在三台机器上分别建立3个目录,ceph-node1上建立/var/local/osd0
,后两台依次,然后执行:
1 | ceph-deploy osd prepare ceph-node1:/var/local/osd0 ceph-node2:/var/local/osd1 ceph-node3:/var/local/osd2 |
启用osd
1 | ceph-deploy osd activate ceph-node1:/var/local/osd0 ceph-node2:/var/local/osd1 ceph-node3:/var/local/osd2 |
]]>
1 | npm install -g npm-check-updates |
服务器环境centos6.8,其他的操作系统会不同,请看官方文档。
php的版本必须5.4或5.4以上,安装php,mysql,apache我用操作系统自带的,操作系统若有之前版本php需卸载。
1 | yum install centos-release-SCL |
下载owncloud
1 | wget https://download.owncloud.org/community/owncloud-9.1.0.tar.bz2 --no-check-certificate |
目录权限,执行以下脚本即可。
1 | #!/bin/bash |
安装owncloud
1 | sudo -u apache php occ maintenance:install --database "mysql" --database-name "owncloud" --database-user "root" --database-pass "" --admin-user "admin" --admin-pass "owncloudpasswd" |
配置apache服务。
1 | vim /etc/httpd/conf.d/owncloud.conf |
添加内容:
1 | nameVirtualHost *:80 |
查看日志,执行tail -f /var/log/httpd/cloud.me-error_log
即可。
修改owncloud配置。
1 | vim /var/www/owncloud/config/config.php |
修改overwrite.cli.url
成自己的域名,trusted_domains
添加自己的域名。
开启https。
1 | yum install mod_ssl |
生成证书
1 | openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/httpd/ssl/apache.key -out /etc/httpd/ssl/apache.crt |
导入证书
1 | cd /var/www/owncloud |
添加apache的ssl配置
1 | vi /etc/httpd/conf.d/owncloud-ssl.conf |
内容如下:
1 | LoadModule ssl_module modules/mod_ssl.so |
]]>参考
Owncloud 安装实录(Apache2.4+PHP7+MariaDB10)
How To Create a SSL Certificate on Apache for CentOS 6
https://kerrenortlepp.wordpress.com/2015/03/16/how-to-setup-owncloud-8-for-personal-use-on-centos-7-with-ssl/
1 检查依赖,需要安装gcc-c++
,tcl
1
2yum install gcc-c++
yum install -y tcl
2 下载安装redis1
2
3
4
5wget http://download.redis.io/releases/redis-3.2.1.tar.gz
tar -zxvf redis-3.2.1.tar.gz
cd redis-3.2.1
make&&make install
3 安装完成后/usr/local/bin
下会生成几个可执行文件
命令 | 描述 |
---|---|
redis-server | Redis服务器端启动程序 |
redis-cli | Redis客户端操作工具。也可以用telnet根据其纯文本协议来操作 |
redis-benchmark | Redis性能测试工具 |
redis-check-aof | 数据修复工具 |
redis-check-dump | 检查导出工具 |
4 配置redis,修改daemonize配置项为yes,使Redis进程在后台运行1
2cp redis.conf /etc/
vi /etc/redis.conf
5 启动redis1
redis-server /etc/redis.conf
6 添加开机启动1
echo "/usr/local/bin/redis-server /etc/redis.conf" >>/etc/rc.local
7 配置参数说明
参数 | 说明 |
---|---|
daemonize | 是否以后台daemon方式运行 |
pidfile | pid文件位置 |
port | 监听的端口号 |
timeout | 请求超时时间 |
loglevel | log信息级别 |
logfile | log文件位置 |
databases | 开启数据库的数量 |
save | 保存快照的频率,第一个表示多长时间,第三个表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。 |
rdbcompression | 是否使用压缩 |
dbfilename | 数据快照文件名(只是文件名) |
dir | 数据快照的保存目录(仅目录) |
appendonly | 是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。 |
appendfsync | appendonlylog如何同步到磁盘。三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步 |
打开编辑器,输入内容,保存为fun.hs
1
2
3doubleMe x = x + x
doubleUs x y = doubleMe x + doubleMe y
doubleSmallNumber' x = (if x>100 then x else x+x) + 1
打开命令行,执行:1
2
3
4
5
6
7
8
9
10
11
12ghci> :l fun
ghci> doubleMe 9
9
ghci>doubleUs 10 20
60
ghci>doubleSmallNumber' 10
21
ghci>dou
ghci>doubleSmallNumber' 101
102
拼接,使用++
1 | ghci>[1,2,3] ++ [4,5,6] |
“Hello”等价于[‘H’,’e’,’l’,’l’,’o’]
在头部插入,使用:
1 | ghci>'H':"ello" |
访问列表,使用!!
1 | ghci>"Hello"!!2 |
1 | ghci>5 `elem` |
比较列表,使用>
,<
,<=
,>=
1
2
3ghci>[3,2,1] >
False
其他操作1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41ghci>head
5
ghci>tail
ghci>last
1
ghci>init
ghci>length
5
ghci>null
False
ghci>null
True
ghci>reverse
ghci>take 3
ghci>take 0
ghci>drop 3
ghci>drop 100
ghci>maximum
5
ghci>minimum
1
ghci>sum
15
ghci>product
120
ghci>5 `elem`
True
ghci>6 `elem`
False
ghci>elem 5
True
ghci>elem 6
False
1 | ghci>[1..30] |
1 | ghci>[x*2|x<-[1..10]] |
1 | ghci>fst (1,"hello") |
简单模式匹配
1 | lucky :: Int -> String |
由上到下进行匹配,x
为匹配任何值,执行结果如下:1
2
3
4ghci>lucky 7
"LUCKY NUMBER SEVEN"
ghci>lucky 9
"Default Hello!"
阶乘计算:1
2
3factorial :: Int -> Int
factorial 0 = 1
factorial n = n*(factorial (n-1))
执行结果:1
2ghci>factorial 10
3628800
元组模式匹配1
2addVector :: (Double,Double) -> (Double,Double) -> (Double,Double)
addVector (x1,y1) (x2,y2) = (x1+x2,y1+y2)
执行结果:1
2ghci>addVector (1,2) (3,4)
(4.0,6.0)
列表模式匹配1
2
3head' :: [a]->a
head' [] = error "list can't be empty"
head' (x:_) = x
执行结果:
1 | ghci>head' [1,2,3,4] |
匹配时使用@
引用全部1
2
3firstletter :: String->String
firstletter ""="Empty String,whoops"
firstletter all@(x:_) = "The first letter of " ++ all ++ " is " ++ x
执行结果:1
2ghci>firstletter "Hello"
"The first letter of Hello is H"
检查参数是否为真1
2
3
4
5
6
7
8bmiTell::Double->Double->String
bmiTell weight height
| bmi <= 18.5 = "You're underweight,you emo,you"
| bmi <= 25.5 = "Normal"
| bmi <= 30.0 = "Fat"
| otherwise = "Whale"
where bmi = weight/height^2
运行结果:1
2ghci>bmiTell 70 1.69
"Normal"
where中模式匹配1
2
3
4initials :: String -> String -> String
initials firstname lastname = [f] ++ "." ++ [l]
where (f:_) = firstname
(l:_) = lastname
运行结果:1
2ghci>initials "xiaoyu" "cheng"
"x.c"
where中使用函数1
2
3calBmi::(Double,Double)->Double
calBmi (w,h) = bmi w h
where bmi weight height = weight/height^2
运行结果:1
2ghci>calBmi (70,1.69)
24.508945765204302
letlet
表达式的格式为let <bindings> in <expressions>
。let
中绑定的名字仅对in
部分可见。
1 | ghci>[let square x = x*x in (square 2,square 3,square 4)] |
1 | ghci>(let a=100;b=200;c=300 in a*b*c,let foo="Hey";bar="there" in foo ++ bar) |
1 | ghci>(let (a,b,c) =(1,2,3) in a+b+c)*100 |
let
1 | calcBmis :: [(Double,Double)] -> [Double] |
1 | ghci>calcBmis |
case表达式
case表达式语法结构:
case expression of pattern -> result
pattern -> result
pattern -> result
1 | describeList :: [a] -> String |
执行结果:1
2ghci>describeList []
"The list is empty."
简单递归1
2
3
4maximum' ::(Ord a)=> [a]->a
maximum' []= error "maximum of empty list"
maximum' [x]=x
maximum' (x:xs)=max x (maximum' xs)
执行结果:1
2ghci>maximum [54,2,4,5,6,756,34]
756
replicate1
2
3
4replicate' :: Int -> a -> [a]
replicate' n x
| n <= 0 = []
| otherwise = x:replicate' (n-1) x
执行结果:1
2
3
4ghci>replicate' 10 'x'
"xxxxxxxxxx"
ghci>replicate' 10 8
[8,8,8,8,8,8,8,8,8,8]
take1
2
3
4
5take' :: (Num i,Ord i) => i ->[a]->[a]
take' n _
|n<=0 = []
take' _ [] = []
take' n (x:xs)= x:take' (n-1) xs
运行结果:1
2ghci>take' 2
reverse1
2
3reverse' :: [a]->[a]
reverse' []=[]
reverse' (x:xs) = reverse' xs ++ [x]
运行结果:1
2ghci>reverse' [1,2,3,4,5]
[5,4,3,2,1]
repeat1
2repeat' :: a->[a]
repeat' a = a:repeat' a
执行结果:1
2repeat' :: a->[a]
repeat' a = a:repeat' a
zip1
2
3
4zip' :: [a]->[b]->[(a,b)]
zip' _ [] = []
zip' [] _ = []
zip' (x:xs) (y:ys) = (x,y):zip' xs ys
执行结果:1
2ghci>zip [1,2] ['a','b']
[(1,'a'),(2,'b')]
elem1
2
3
4
5elem' :: (Eq a)=>a->[a]->Bool
elem' a [] = False
elem' a (x:xs)
| a==x = True
| otherwise = elem' a xs
执行结果:1
2ghci>elem' 1
True
快速排序1
2
3
4
5
6quicksort :: (Ord a) => [a]->[a]
quicksort [] = []
quicksort (x:xs) =
let smaller = [a|a<-xs,a<=x]
larger = [a|a<-xs,a>x]
in quicksort smaller ++ [x] ++ quicksort larger
执行结果:1
2ghci>quicksort [2,3,4,5,8,67,4,3,6,5,7,6,7,7]
[2,3,3,4,4,5,5,6,6,7,7,7,8,67]
1 |
|
1 |
|
1 | # 生成测试文件 test.plain |
在win7系统下,中文注释会出现报错:error style.scss (Line 7: Invalid GBK character “\xE5”)
解决方法
1.打开这个文件:C:\Ruby200\lib\ruby\gems\2.0.0\gems\sass-3.4.13\lib\sass\engine.rb
2.在require 'sass/supports'
中添加一行Encoding.default_external = Encoding.find('utf-8')