go语言实现图片合成

go语言写起来真的好嗨哟!

先看效果

image

思路步骤

  • 用到一个第三方库,github.com/nfnt/resize 用于调整大小。
  • 人像图片需要放在相框的后面。
  • 大小以相框为准,尤其是宽度,所以第一步就是把人像宽度变为相框宽度,或者小于相框宽度。
  • 然后合成,主要用到的方法是draw()。
  • 如果你要把go编译打包,部署到linux 你需要执行一下命令!
    1
    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go

全部源码

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

package main

import (
"errors"
"github.com/nfnt/resize"
"image"
"image/draw"
"image/jpeg"
"image/png"
"os"
"strings"
)

func main() {

index := os.Args[2]
imgC := os.Args[1]

///upload/gy/oldpic/5c44b484198c3.jpg
k := "/opt/server/games-server/upload/gy/k" + index + ".png"
imgb, _ := os.Open("/opt/server/games-server" + imgC)
img, _ := jpeg.Decode(imgb)
defer imgb.Close()

wmb, _ := os.Open(k)
watermark, _ := png.Decode(wmb)
defer wmb.Close()

offset := image.Pt(0, 0)
b := watermark.Bounds()
m := image.NewRGBA(b)
imgW := b.Size().X
imgH := b.Size().Y
wd := 1400 / imgW
newImg := ImageResize(img, 1400, imgH*wd)

draw.Draw(m, newImg.Bounds().Add(image.Pt(50, 100)), newImg, image.ZP, draw.Src)
draw.Draw(m, watermark.Bounds().Add(offset), watermark, image.ZP, draw.Over)
imgw, _ := os.Create("/opt/server/games-server" + strings.Replace(imgC, "oldpic", "newpic", -1))
jpeg.Encode(imgw, m, &jpeg.Options{jpeg.DefaultQuality})
defer imgw.Close()
}

// 图片大小调整
func ImageResize(src image.Image, w, h int) image.Image {
return resize.Resize(uint(w), uint(h), src, resize.Lanczos3)
}

// 图片裁剪 暂时没有用
func ImageCopy(src image.Image, x, y, w, h int) (image.Image, error) {

var subImg image.Image

if rgbImg, ok := src.(*image.YCbCr); ok {
subImg = rgbImg.SubImage(image.Rect(x, y, x+w, y+h)).(*image.YCbCr) //图片裁剪x0 y0 x1 y1
} else if rgbImg, ok := src.(*image.RGBA); ok {
subImg = rgbImg.SubImage(image.Rect(x, y, x+w, y+h)).(*image.RGBA) //图片裁剪x0 y0 x1 y1
} else if rgbImg, ok := src.(*image.NRGBA); ok {
subImg = rgbImg.SubImage(image.Rect(x, y, x+w, y+h)).(*image.NRGBA) //图片裁剪x0 y0 x1 y1
} else {

return subImg, errors.New("图片解码失败")
}

return subImg, nil
}

欢迎访问我的Blog: http://yondu.vip

JavaScript之父 Brendan Eich

image

简介

布兰登·艾克(英语:Brendan Eich,1961年7月4日-)美国程序员与企业家,JavaScript主要创造者与架构师,曾任Mozilla公司的首席技术官,并曾短暂担任首席执行官[2]。

生平

布兰登·艾克生于美国加州的森尼维尔市,在圣塔克拉拉大学(Santa Clara University)就读时,最初主修物理学,大三时因兴趣转变转投计算机科学领域,后获取数学与计算机科学学士学位。
1986年获取伊利诺伊大学香槟分校计算机科学硕士学位。

毕业后进入SGI工作,在此工作七年,主要负责操作系统与网络功能。之后他在MicroUnity工作了三年。
1995年4月,任职于网景期间,为网景浏览器开发出JavaScript,之后成为网页浏览器领域应用最广泛的脚本语言之一。
1998年,艾克协助成立Mozilla.org,2003年在美国在线决定结束网景部门营运后,艾克协助成立了Mozilla基金会。

2014年3月24日,艾克晋升为Mozilla公司首席执行官引发同性恋族群抗议,归咎于艾克2008年曾捐助1000美元支持加利福尼亚州8号提案。此事引发在线交友网站OkCupid抵制使用Firefox浏览器,一些Mozilla员工亦要求辞职。Mozilla董事会成员希望他留在公司中扮演不同的角色。

2014年4月3日,艾克宣布从Mozilla离职。艾克在他的个人博客中写道:“Mozilla的使命远超过我们任何一人,无法胜任Mozilla的领导职位”。美国作家安德鲁·沙利文在谈到艾克的离职时说“没有一丝证据表明他曾经在Mozilla中歧视过一个同性恋者”,而这个情节“应该让那些对包容和多元化社会感兴趣的人感到厌恶”。

2015年5月28日,艾克成立Brave软件公司,这是一家互联网安全公司,已经从天使投资者募集了250万美元的早期资金。该公司的联合创始人Brian Bondy曾在Mozilla和可汗学院工作。

2016年1月20日,该公司发布了Brave网页浏览器。2017年5月,Brendan Eich发起的去中心化网页浏览器“Brave”仅30秒就完成了约3千5百万美元的ICO发售。

https://brave.com/

JAVA 程序员必修课

一:常见模式与工具

学习Java技术体系,设计模式,流行的框架与组件,常见的设计模式,编码必备,Spring5,做应用必不可少的最新框架,MyBatis,玩数据库必不可少的组件……
e20d3f3571a4993921a2779aa977f8d8.jpg

二:工程化与工具

工欲善其事必先利其器,选择好的工具,提升开发效率和团队协作效率,是必不可少的:Maven,项目管理,Jenkins,持续集成,Sonar,代码质量管理,Git,版本管理

84451ab86324e1e96463abbfc62298c9.jpg

三:分布式架构

高并发,高可用,海量数据,没有分布式的架构知识肯定是玩不转的,要了解分布式中的,分布式架构原理,分布式架构策略,分布式中间件,分布式架构实战等等内容

16f3a57d783416fb706e46d12e60c305.jpg

四:微服务架构

业务越来越复杂,服务分层,微服务架构是架构升级的必由之路。比如:微服务框架,Spring Cloud,Docker与虚拟化,微服务架构

4aef27ad8da51696872a15dfb685d7b5.jpg

五:性能优化

任何脱离细节的ppt架构师都是耍流氓,向上能运筹帷幄,向下能解决一线性能问题,比如:性能指标体系,JVM调优,Web调优,DB调优
c846830a4f0427a0a5980cffd8a87d23.jpg

六:底层知识

从架构设计,到应用层调优,再深入了解底层原理,扎实的Java基本功才能让自己变为扫地神僧:内存模型,并发模式,线程模型,锁细节

4480f9f892f616494ee17a73b10eb1de.jpg

解决使用react-image-lightbox组件,关闭后元素自动滑动问题(tabindex)

这个问题让你有必要深刻的看看tabindex="-1"的原理。

由于这个问题实在不好描述,那就直接上图。

问题如下

解决后

那我是怎么解决的呢?先来看看下面的使用代码。

测试代码

你可以在github上看到:https://github.com/lihongbin100/use-react-image-lightbox

主要代码

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

import React, { Component } from 'react'
import Lightbox from 'react-image-lightbox'
import 'react-image-lightbox/style.css' // This only needs to be imported once in your app

const images = [
'//placekitten.com/1500/500',
'//placekitten.com/4000/3000',
'//placekitten.com/800/1200',
'//placekitten.com/1500/1500'
]

export default class LightboxExample extends Component {
constructor (props) {
super(props)

this.state = {
photoIndex: 0,
isOpen: false
}
}

render () {
const { photoIndex, isOpen } = this.state

return (
<div>
<div style={{ height: '100px', width: '400px', background: '#ccc' }}>

</div>
<div tabIndex="-1" style={{ height: '1000px', width: '400px', background: '#ddd' }}
onClick={() => this.setState({ isOpen: true })}>
Open Lightbox
</div>

{isOpen && (
<Lightbox
// 该prop解决关闭弹窗后下层元素滑动
reactModalProps={{ shouldReturnFocusAfterClose: false }}
mainSrc={images[photoIndex]}
nextSrc={images[(photoIndex + 1) % images.length]}
prevSrc={images[(photoIndex + images.length - 1) % images.length]}
onCloseRequest={() => this.setState({ isOpen: false })}
onMovePrevRequest={() =>
this.setState({
photoIndex: (photoIndex + images.length - 1) % images.length
})
}
onMoveNextRequest={() =>
this.setState({
photoIndex: (photoIndex + 1) % images.length
})
}
/>
)}
</div>
)
}
}

解决这个问题

这个问题就是tabindex的坑,由于底部高度为1000px的div,会有滑动条,而且用了tabindex=-1,react-image-lightbox 也使用了tabindex=-1,于是当关闭lightBox以后,会把焦点移到底部的div,底部div被获得焦点,于是浏览器把它置顶了。

这个问题官方也有答案,但是我真的是找了一天啊!怪我。

官方解决

来看看这个问题的答案吧:
https://github.com/frontend-collective/react-image-lightbox/issues/60

总结

使用

1
reactModalProps={{ shouldReturnFocusAfterClose: false }}

完美解决,这个属性是react-modal的props。


欢迎访问我的Blog:http://yondu.vip

前端开发利器 - WebStorm高级使用技巧

怎么快速配置一个好用的WebStorm?

以下是我的配置,好用不好用不知道了,你自己感受。

  1. 下载 settings.jar
  2. file > import settings 选择优化的jar包。
  3. 重启一下吧。

快捷键

  • 打开设置:CMD+,
  • 格式化代码:alt+cmd+l

如何快速打开一个项目?

  1. 菜单栏 tools -> Create Command-line launcher

idea-add-cmd.png

  1. 创建 全局命令行,ws 比较简单。

p2

  1. 打开命令行输入 ws app/app/ 是你打开的项目完整目录,就可以瞬间打开了,一个“爽”!

如何还原设置?

  1. 关闭WebStorm
  2. cd ~/Library/Preferences/
  3. rm -rf WebStorm* 这个*视你的WebStorm版本来定。
  4. 搞定,重新启动 WebStorm ,会发现所有的配置全部还原了。

怎样快速按照eslint来设置code style

  1. 新建 .eslintrc 文件,右键选择 Apply Eslint Code Style Rules,搞定。
  2. 当然你也可以开启WebStorm的Eslint自动化校验支持。
  3. Languages & Frameworks > JavaScript > Code Quality Tools > Eslint

安装sizeUp

sizeUp 可以让你解放鼠标,使用键盘快捷键来操作窗口,是你提升macbook使用效率的必备神器。

下载

百度网盘:链接: https://pan.baidu.com/s/1IrPytbDDHtlzkJwAB2AsMg 提取码: 4vnv

遇到文件损坏的问题

使用该命令行: 显示”任何来源”选项在控制台中执行 sudo spctl --master-disable

安装

辅助功能这里需要打钩。
1543031133052.jpg

设置

1543031262360.jpg
最重要的几个设置:

  • 不同屏幕之间的发送
  • 最大化窗口
  • 左右窗口排列

打造一个秒杀系统

大并发,高可用,高一致性。

数据尽量少(序列化,反序列化)

  • 数据库

请求要少

  • 合并css和js
  • 路径要短(socket链接要少),强依赖的服务要靠近。
  • 较少依赖,去掉不必要的弱依赖。
  • 不要有单点。(服务无状态化,配置动态化)

前端的各种库

iu-korean-singer-10-anniversary-concert-teaser.jpg

Javascript 库

  • vue-cropper vue图片裁剪上传插件
  • layabox 与白鹭齐名的h5游戏动画库
  • Animatron
    HTML5 视频编辑平台。video作为 HTML5 的重要特性,很多开发者却仍然搞不清它的发布形式和加载策略,那么在 Animatron 上你可以快速编辑 HTML5 环境下的视频,利用它的自带动画素材库完成有趣的扁平风格卡通动效组件或者视频
  • Google Web Designer
    以视觉设计为核心的代码可扩展工具。用来做布局和设备终端适配测试比较方便,界面很有 AE 的风格
  • HYPE3
    专业级本地 HTML5 设计软件。很早以前就向大家推荐过,基于平行时间线逻辑的 HTML5 可视化设计开发平台,你甚至可以用它做一个脱机的交互演示文稿
    Ember Burger Menu
    汉堡式菜单样式生成器。越来越多的站点在自适时采用汉堡式折叠菜单,而这个网站就可以快速更改这种菜单的具体属性,并引用到你自己的项目中去▼
    https://offirgolan.github.io/ember-burger-menu/
  • Anime
    CSS/JS 动画分享库。像一个在线小商城,有很多开发者自己上传的千奇百怪的 CSS 或者 JS 动画可以参考和引用
  • countUp.js 一个简洁的计数器跳动 js 组件,可以用于在 WEB 完成诸如访问量、分数展示等和数字有关的计数动画
  • SmoothState.js 加载优化。对于首页的启动、回跳进行加载动画优化,这对移动端 H5 营销来说尤其重要
  • mo.jsCSS 动效库。这是一个正在不断开发完善的 库,虽然目前还未开放路径、弹性等控件,但是它的 CSS 形状库已经非常令人惊喜
  • iTyped打字动画。不需要依赖 jQuery 的打字机效果动画,可以调节速度和大小的小巧工具
  • animsition.js
  • granim.js一个骚气的 js 库。用于快速创建 WEB 内的令人叹为观止的渐变动画
  • create.js 一套完整的js动画库,做2d的动画他就足够了,包括 声音加载库:sound.js,预加载库 :preload.js,canvas动画库:ease.js,补间动画库:tween.js
  • greenscok.js 是国外的一套功能强大的动画库,包含大量插件,文档优雅,可视化操作,代码逻辑简洁,支持动画的回放,支持dom动画,svg动画,canvas,webgl,大量的demo库让你惊艳。
    Particles.js— 一个用来在 web 中创建炫酷的浮动粒子的库
  • Three.js — 一个用来在 web 中创建 3d 物体和 3d 空间的库
  • Fullpage.js— 快速实现全屏滚动特性
  • Typed.js — 打字机效果
  • Waypoints.js — 滚动到某个元素位置时触发一个功能
  • Highlight.js — web 语法高亮
  • Chart.js — 使用 JavaScript 创建漂亮的图表
  • Instantclick — 能够明显加速网站加载时间,鼠标 hover 时预加载资源
  • Chartist — 另一个图表库
  • Motio — 一个基于动画和平移的雪碧图库
  • Animstion — CSS 实现动画过渡的 jQuery 插件
  • Barba.js — 流式页面过渡
  • TwentyTwenty — 一个对比图片的可视化 diff 工具
  • Vivus.js — 在 SVG 上绘制动画
  • Wow.js — 滚动时展现动画
  • Scrolline.js — 页面滚动时显示滚动进度
  • Velocity.js — 快速流畅的 JavaScript 动画
  • Animate on scroll — 漂亮的页面滚动元素动画
  • Handlebars.js — Javascript 模板
  • jInvertScroll — 视差滚动
    One page scroll — 又一个页面滚动库
    Parallax.js — 对智能设备方向变化做出响应的视差引擎
  • Typeahead.js — 搜索补全
  • Dragdealer.js — 炫酷拖拽
  • Bounce.js — 创建炫酷的 CSS3 动画
  • Pagepiling.js — 全屏滚动
  • Multiscroll.js — 两列垂直反向滚动
  • Favico.js — 动态 favicon
  • Midnight.js — 固定头部切换效果
  • Anime.js — 动画库
  • Keycode — 获取键盘按键的 JavaScript keycode
  • Sortable — 拖拽插件
  • Flexdatalist — 自动补全
  • Slideout.js — 移动应用侧滑导航
    Jquerymy — 使用 jQuery 实现双向数据绑定
  • Cleave.js — 实时格式化输入内容
  • Page — 客户端单页应用路由
  • Selectize.js — 用来添加 tag 的 Hybrid 选择框
  • Nice select — 创建漂亮的选择框的 jQuery 库
  • Tether — 使用固定定位来创建相关元素
  • Shepherd.js — 为应用创建新手引导
  • Tooltip — tooltip 提示框
  • Select2 — Jquery 选择框插件
  • IziToast — 通知弹窗实现
  • IziModal — 模态框实现

    CSS 库 / 设计相关

  • Animate.css — 动画库
  • Flat UI Colors — 扁平化设计配色
  • Material design lite— 基于 Google material design 的框架
  • Colorrrs — 随机颜色生成器
  • Section separators — CSS 实现区域分割
  • Topcoat — 框架
  • Create ken burns effect — 使用 CSS3 动画实现 Ken burns 特效
  • DynCSS — 给 CSS 添加 function,动态化 CSS
  • Magic animations — CSS3 实现动画特效
  • CSSpin — css spinners 合集
  • Feather icons — Icon 集合
  • Ion icons — Icon 集合
  • Font awesome — Icon 集合
  • Font generator — 组合多个字体创建混合字体
  • On/Off switch — 使用 CSS 创建 on/off 开关、radio 按钮
  • UI Kit — 框架
  • Bootstrap — 框架
  • Foundation — 框架

    好用的产品

  • waitanimate动效速度测试平台。当我们在 WEB 中构建了一些迷你的 PNG 或者 SVG 图标动画时,如何快速确定动画的延时、间隔、速度关系?反复调整和预览着实令工程师头疼。所以这个网站着力解决关键帧百分比的快速计算问题
  • cheatsheet — 可以写在中的所有标签
    • Ghost — 基于 Node.js 的博客平台
  • What runs — 一个用于网站技术分析的 Chrome 插件
  • Learn anything — 一个强大的用于分析某个主题的思维导图

高效开发的工具

vim

sizeUp

简直太好用的MAC桌面管理工具。如何使用?

spotlight

MAC自带的查找神器,当然最应该把他当作切换应用的神器。

网易有道词典

没发现啥别的好用,就这个还可以。

sublime Text

最清凉的text编辑器,还能编辑代码,炸了。但是不推荐大家用这个编码,可视化和编程体验并不好,写点小玩意还可以。

GIPHY

简直太好用的gif图制作器。而且是免费的,直接appstore搜索就可以了。

oh my zsh

你的macbook cmd 不装这个,效率直接降低一半。他还有一堆插件,比如添加alias,兼容Linux命令行,ll也可以用了,当然命令历史记录功能也很好用。就是牛逼!

autojump

配合zsh使用的快递定位到历史记录的目录。用起来就不肯放手。

carbon

生成漂亮的代码展示。

carbon.png

高效使用macbook


1. 硬件提升
笔记本电脑的特点是携带方便,缺点是屏幕太小,因此你首先需要再申请领用一个外接显示器,多一个屏幕会大大减少你切换应用程序的次数,显著提升你的工作效率,别忘了同时申请一个Mini DP转VGA的转接头用于连接显示器。为了配合多显示器,后面会推荐一个软件来管理多显示器窗口。
如果你资金宽裕,可以买个机械键盘和无线鼠标,进一步提升工作效率。

2. 系统设置
2.1 将功能键(F1-F12)设置为标准的功能键
MacBook键盘最上面一排的功能键(F1-F12)默认是系统亮度和声音之类的快捷设置,当MacBook作为你的娱乐电脑时,这样的默认设置是非常方便的,但是对于将MacBook作为工作电脑而且需要频繁使用功能键(F1-F12)的人,最好将功能键(F1-F12)的行为设置为标准的功能键。
首先打开System Preferences,点击Keyboard图标,勾选上Use all F1, F2, etc. keys as standard function keys。以后如果你要调节音量,就按住键盘左下角的fn键再按F11或者F12。

图2.1-1
2.2 设置Trackpad(触摸板)轻触为单击
当你首次使用MacBook,是否会觉得触摸板一点都不顺滑?那是因为你需要做如下设置。
打开System Preferences,点击Trackpad图标,勾选Tap to click选项,现在手指轻轻一碰触摸板,就达到鼠标单击的顺滑效果。
2.3 将Dock停靠在屏幕左边
为什么要将Dock停靠在屏幕左边?MacBook的屏幕是一个长方形,如果你将Dock放在下面,那么屏幕的可用宽度就会减少,另外人眼阅读时的顺序是从左往右,因此Dock放在左边更适合将MacBook作为工作电脑的人。
打开System Preferences,点击Dock图标,
  1. 将图标的Size调到合适大小
  2. 关闭Magnification特效(即鼠标放到Dock上图标放大的效果,此效果干扰注意力)
  3. Position on screen一栏,选择Left
  4. 勾选Minimize window into application icon

图2.3-1
2.4 全键盘控制模式
全键盘控制模式是什么? 举一个例子,如下图所示,我正在写一个文档,此文档还没有保存,也没有文件名,如果不不小心点了关闭按钮,将会弹出一个对话框:

图2.4-1
当前,[Save]按钮处于默认激活状态,按回车将会弹出保存对话框。但是如果我不想保存呢? 只能通过鼠标或者触摸板来移动光标后点击[Don’t Save]来取消保存。那我能不能通过键盘控制光标激活[Don’t Save]按钮呢? 答案是肯定的,做一个简单设置就好。
如图,首先打开System Preferences,点击Keyboard图标,选择Shortcuts这个Tab, 选中All controls

图2.4-2
现在当我再次试图关闭一个未保存的文件时,新弹出的对话框如下,有了些许变化,在[Don’t Save]按钮上多了一个蓝色的外框,当你按键盘上的tab键的时候,蓝色的外框会在3个按钮间切换。 假设现在蓝色的外框在[Don’t Save]按钮上,你按下回车,却发现系统依然进入了保存文件对话框,为什么蓝色的外框不起作用呢?那是因为蓝色的外框选中的按钮是由空格键触发的,当你按下空格键,系统就会不保存文件直接退出。 这样当你不方便使用鼠标和触摸板的时候,可以更快速的和你的MacBook交互。

图2.4-3
2.5 快速锁定屏幕
如果你长时间离开电脑,最好锁定你的屏幕,以防止数据泄露。 那如何快速的锁定你的MacBook呢? 答案是只需要一摸触摸板或者一甩鼠标就可以了。
打开System Preferences,点击Desktop & Screen Saver图标,选择Screen Saver这个Tab,再点击Hot Corners…,在弹出的如下界面里面,右下角选择Put Display to Sleep,点击OK确定。

图2.5-1
再打开System Preferences,点击Security & Privacy图标,在GeneralTab内,勾选Require password[immediately] after sleep or screen save begins

图2.5-2
现在当你离开电脑前时,记得一摸触摸板或者一甩鼠标将光标快速的移到屏幕的右下角,MacBook将立刻进入Screen Saver模式并且需要密码才能进入桌面。
3. 系统常用快捷键
请点击这个文档,学习系统快捷键,适当使用快捷键将会提升你的工作效率。
4. 日常软件推荐
4.1 中文输入法
系统自带的输入法不是很好用,推荐安装搜狗输入法或者RIME输入法。安装完成后,打开System Preferences,选择Keyboard,切换到Shortcuts这个Tab下,勾选Select the previous input source,并点击上述文字后面的空白处,设置快捷键为Ctrl+Space(即如图所示的^Space)。

图4.1-1
4.2 窗口管理软件 – SizeUp
  1. 你是否经常想让某个Word文档占满屏幕的左半部分,旺旺聊天占满屏幕的右半部分,从而一边对着文档一边和小伙伴聊需求?
  2. 终于搞好了外接显示器,你是否经常将某个窗口在笔记本和外接显示器屏幕之间直接来回拖动?
SizeUp快速解决这样的需求,该软件可以永久免费试用,下载安装后打开SizeUp,再打开旺旺,快捷键按下control+option+command + M,则旺旺就会立即进入全屏模式。
然而大部分情况下,你会看到如下这个提示,这是因为SizeUp需要你的授权才能控制窗口。

图4.2-1
直接点击Open System Preferences或者打开System Preferences,点击Security & Privacy图标,在PrivacyTab内,点击Accessibility,然后将SizeUp加到右边的列表里面。(提示:你可能需要先点击右下角的黄色锁,输入密码后才能编辑右边的列表。)

图4.2-2
如果你此时接上了外接显示器,快捷键按下control+option + 方向键右键,则当前左边显示器激活的最前端窗口将被立即发送到右边的显示器。
下面列举一些SizeUp常用的快捷键,更多的快捷键和使用方式请查询其官方网站
control+option+command + M : 使当前窗口全屏
control+option+command + 方向键上键 : 使当前窗口占用当前屏幕上半部分
control+option+command + 方向键下键 : 使当前窗口占用当前屏幕下半部分
control+option+command + 方向键左键 : 使当前窗口占用当前屏幕左半部分
control+option+command + 方向键右键 : 使当前窗口占用当前屏幕右半部分
control+option + 方向键左键 : 将当前窗口发送到左边显示器屏幕
control+option + 方向键右键 : 将当前窗口发送到右边显示器屏幕
4.3 查找文件和应用程序以及无限想象力 – Alfred
如果你曾经使用过MacBook,你应该接触过Spotlight,就是屏幕中间弹出一个长条输入框,你输入文件名或者应用程序名,Spotlight将模糊查找到对应的候选项,按回车快速的打开你需要的文件或程序。
Alfred的能力远远超过了Spotlight, 你可以直接下载免费版安装使用,Alfred另外还提供了更强大的工作流(Workflows)和剪切板(Clipboard)管理等高级功能,需要购买Powerpack。对于日常的操作,免费版已经足够使用了。
因为Alfred可以完全取代Spotlight,下面先删除Spotlight占用的快捷键command + 空格,以供Alfred将来使用。
打开System Preferences,选择Keyboard,切换到Shortcuts这个Tab下,点击Spotlight,取消对应的2个快捷键设置。

图4.3-1
打开Alfred,在菜单栏点击Alfred图标,打开Preferences…

图4.3-2
如下图所示,设置Alfred的快捷键为command + 空格

图4.3-3
现在按下快捷键command + 空格,输入dash,则Alfred不区分大小写的将所有包含dash的应用程序,文档以及历史网址都列出来了,如下图所示,回车打开Dashcommand+2打开本Dashboard,你还可以移动键盘上下键或者光标来选择目标。
图4.3-4
更多关于Alfred的使用方式和无限想象力,请参考官方网站或者网上现有的大量的教程。
下面简单演示一下剪切板管理厂内查人工作流的使用。如下图所示,我使用快捷键打开剪切板管理器,列出来我最近复制过的文本片段,我可以快速的选取这些文本片段或者输入部分字符来查找

图4.3-5
4.4 聪明又美丽的日历 — Fantastical 2
打开Fantastical 2的网站,你一定会被她漂亮的外表所吸引,最可贵的是Fantastical还很聪明,当你在日历里面新建一个提醒的时候,输入如下内容“HTML training at 7:30pm tomorrow alert 5 min”, 则Fantastical会自动将日期设置为明天,然后将开始时间设置为晚上7点半,并且提前5分钟提醒,是不是很聪明?

图4.4-1
4.5 来杯免费咖啡 — Caffeine
今天下午给大老板和重要客户演示PPT,你仿佛看到了升职加薪走上人生巅峰,当你打开MacBook接上投影仪,口若悬河的讲解,突然MacBook进入休眠模式了,画面太美了,我不敢想了。
你应该立刻安装这款免费的良心软件—Caffeine,设置开机启动,点一下状态栏的咖啡杯图标,当咖啡是满的时候,MacBook将不会进入休眠模式,再点一下咖啡杯空了就正常休眠,我默认设置开机启动,咖啡杯保持满满的状态。
4.6 快速切换和打开应用程序 — Manico
MacBook系统默认设置了一个快捷键来显示当前运行中的应用程序,同时按下tab + command,将看到如下图的样式:

图4.6-1
如果你想要却换到Firefox,需要再按一下tab,如果要切换到日历,需要按两下‘tab’,如果一次性打开10几个应用程序,你经常需要按十几下tab才能却换到想要的程序。
Manico专为这个场景而设计,安装好后打开,默认快捷键是按住option,如图所示,此时按下数字7就能快速打开编号为7地图

图4.6-2
另外,推荐设置Manico使用左手边的字母加数字做索引,方便仅仅用左手就能快速切换应用程序。在菜单栏点击Manico图标,打开Preferences…, 在AppearanceTab里面,选择Uses left hand areaUse numeric and alphabet

图4.6-3
4.7 随心所欲的复制粘贴以及无限想象 — PopClip
日常工作中,你有多少次是从一个应用程序复制一段文本然后粘贴到另外一个地方?
有多少次是复制一个网址然后打开浏览器粘贴到地址栏然后回车打开?
有多少次是复制一个名词,然后打开浏览器找到搜索引擎来搜索?
这些重复的操作模式都是可以简化的,你唯一需要的就是PopClip,当你选中一段文字(如下图,选中“当日收益”),PopClip就会弹出来一个快捷操作栏,你可以复制,剪切或者粘贴,更为强大的是,PopClip提供了很多免费的插件,例如使用指定的搜索引擎搜索选中的文字,或者选中英文单词做大小写转换等等。

图4.7-1
需要注意的是,PopClip需要你的授权才能弹出快捷状态栏,直接点击Open System Preferences或者打开System Preferences,点击Security & Privacy图标,在PrivacyTab内,点击Accessibility,然后将PopClip加到右边的列表里面并且勾选前面的checkbook。(提示:你可能需要先点击右下角的黄色锁,输入密码后才能编辑右边的列表。)
4.8 增强资源管理器 — XtraFinder
MacBook自带的资源管理器(Finder)已经可以满足一般的需要,但是当你有大量文件维护操作后,你就需要一个更强大的Finder。XtraFinder完全集成到Finder里面,你根本感觉不出它是一个第三方的应用程序,同时还提供很多增强特性,比如:
像浏览器那样的标签页(Tab)
支持双操作面板(Panel)
增强的全局快捷键,例如新建文件(New File)等
多彩的侧边栏图标
快速在当前文件夹打开终端
快速在当前文件夹新建文件

图4.8-1
4.9 随心所欲的全键盘控制 – Shortcat
在系统设置里面,我介绍了全键盘控制模式,但是此模式只能做简单的按钮控制,无法达到随心所欲的控制。下面介绍一款比较geek的软件,Shortcat帮助你完全使用键盘来控制系统,供有键盘强迫症的同学使用。

图4.9-1
4.10 来杯鸡尾酒 — Bartender
如果你看到这里,相信你已经被我推(hu)荐(you)的安装了一排软件,你的系统状态栏已经人满为患,有时候会因为当前激活的应用程序的菜单比较多挡住你要点击的状态栏图标,这个时候你需要一个酒保来帮你调理一下状态栏,Bartender将是我推荐的最后一个日常使用的App,你可以自定义隐藏某些不常用的状态栏图标,特别适合处女座强迫症。

图4.10-1
4.11 快速进入Shell
go2shell是一个对开发者来说非常有用的app, 使用它可以在Finder里快速进入shell环境.
图4.11-1
安装好以后, 打开Finder, 点击Finder上的图标即可进入terminal:
图4.11-2
4.12 快速录屏–QuickTimePlayer
QuickTime Player是一个自带的录屏软件, 你可以用它来录制视屏,音频,以及屏幕操作. 对于开发者, 可以用它来记录屏幕操作, 做成动态图或视频, 供其它人学习; 对于普通工作者, 可以用QuickTime Player录制PPT讲座视频.
4-12
4.13 好用的截屏工具-Snip
使用过QQ的朋友肯定用过上面的自带截图功能,非常好用, 支持添加圈,点,箭头甚至文字, 只要打开QQ, 任何时候都可以通过Ctrl+Command+a来截图, 但是本人平时不太常使用QQ, 截屏功能又非常常用,怎么办呢? 腾讯很贴心地把QQ里的截图功能完整地拆了出来, 成了一个新的App–Snip.
4-13-1
Snip完整地继承了QQ里截图功能, 设置为开机启动后, 任何时候都可以通过相同的快捷键–Ctrl+Command+a来截图, 此外,快捷键可以手动修改:
4-13-2
5. 开发环境配置
终于到了开发环境配置阶段,在配置开发环境前,建议先将OS X系统升级到最新版,同时去Mac App Store下载最新版的Xcode,然后使用下面的命令安装Xcode command line tools,这将为你安装很多终端下面常用的命令,将来很可能会使用到:
Shell
xcode-select –install
5.1 命令行终端Terminal
在用户界面没有发明前,终端Terminal曾经是计算机的唯一交互方式,就算到了今天,很多服务器仍然只提供终端登陆来操作,作为开发测试运维相关人员,在日常工作中合理使用终端将大大提高工作效率。
5.1.1 替换系统默认Shell — Oh My ZSH!
Bash作为大多数系统默认安装的Shell,大家都多少有所接触,Zsh和Bash类似都是一个Shell,但是Zsh更注重用户体验和与人的交互,OS X默认也安装好了Zsh,然而你想自己从头开始配置一个顺手的Zsh是比较浪费时间的,有人已经帮我们配置好了,这个流行的Zsh配置叫—Oh My ZSH!,直观的效果如下图所示,代码开源在github

图5.1.1-1
切换默认Shell到Zsh
Mac OS X默认已经安装好了Zsh,你可以打开终端,输入zsh –version来确认,如果没有安装,请参考这个文档
打开终端输入下面的命令,切换默认Shell为Zsh:
Shell
chsh -s /bin/zsh
关闭终端重新打开后,你将默认使用zsh作为终端Shell。然而你会发现,终端并没有变得多酷炫,接着往下走,安装Oh My ZSH!
安装Oh My ZSH!
打开终端输入下面的命令:
Shell
sh -c ”$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
耐心等待一会儿,然后你就会发现你的终端变成了彩色的了。

图5.1.1-2
你可以修改终端的Profile,选择深色背景profile,这样就比较炫酷了。如果你对默认的Oh My ZSH的配色不满意,请参考这里找到你喜欢的配色。
5.1.2 替换系统默认终端 — iTerm 2
如果你经常使用终端,那么推荐你使用iTerm 2来替代系统自带的终端。关于iTerm 2的特性,请看这里
这里我只介绍一个小技巧,我想设置一个快捷键假设为F12,在任意场合,我按一下快捷键F12就弹出终端,输入一些命令执行后,再按一下F12终端就自动隐藏,这对经常使用终端的人,例如经常ssh连接服务器的人来说实在太方便了。
设置过程如下:
系统已经默认将F12分配给Show Dashboard,需要先取消这个设置。
打开System Preferences,选择Keyboard,切换到Shortcuts这个Tab下,点击Mission Control,取消对应F12的快捷键。

图5.1.2-1
打开iTerm的Preferences…, 在ProfilesTab里面,点击下面的[+]添加一个新的profile,为什么要新建一个profile?答案是为了定制将来弹出的终端样式和大小等等参数。新的profile假设命名为guake,(注:guake这个名称是为了向Linux下的Guake终端致敬),你可以自己任意起个名称,下面会用到。

图5.1.2-2
再切换到WindowTab下,将StyleScreenSpace这3个值设置和下图一样。

图5.1.2-3
再切换到KeysTab下,设置如下图所示的HotkeyF12。

图5.1.2-4
现在你按下F12,就立即得到一个占满全屏的黑色命令行终端,再按一下F12隐藏终端,非常的方便。
5.2 终端下的命令管理 — Homebrew
Mac App Store你一定非常熟悉了,它可以帮你下载和安装大部分常见的软件。
在终端下,我们也需要一个App Store一样的管理程序,当你需要安装某个终端下的新命令的时候,这个程序可以帮助我们自动下载该命令以及相关的依赖,甚至在下载以后做必要的编译和环境设置。
Homebrew就是这样一款终端下的命令程序包管理器,安装非常简单,复制如下命令在终端下运行,按回车并输入密码后等待安装成功:
Shell
ruby -e ”$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
下面是安装截图:

图5.2-1
curl和wget是命令行下面常用的命令,其中curl已经默认安装在OS X中了,但是wget没有默认安装,下面演示如何使用Homebrew来安装wget。
Shell
brew install wget
下面是运行截图:

图5.2-2
5.3 终端下管理非终端软件 — Homebrew Cask
因为Apple不允许第三方的浏览器进入Mac App Store,如果你想要安装Google Chrome,只能去Google网站下载后运行安装文件。这一类App Store没有的非终端下的软件能不能享受Homebrew一样的命令行安装的便捷性呢?
Homebrew Cask就是这样一款终端下的程序管理器,它扩展了Homebrew,作为Mac App Store的有益补充,方便你快速维护日常软件的安装升级和卸载,复制如下命令在终端下运行,按回车后等待安装成功:
Shell
brew install caskroom/cask/brew-cask
下面是运行截图:

图5.3-1
那如何使用Homebrew Cask来安装Google Chrome呢? 首先使用chrome作为关键字查找一下:
Shell
> brew cask search chrome ==> Partial matches chrome-devtools chrome-remote-desktop-host chromecast google-chrome
上面的命令运行后列出了4个候选项,很明显最后一个google-chrome就是我们要安装的,继续输入
Shell
brew cask install google-chrome
下面只需要稍微等一会儿,最新版的Google Chrome就乖乖的安装在你的MacBook里面了。
5.4 Java开发环境搭建
5.4.1 安装Java和Maven
现在OS X没有默认安装JDK,如果你在终端输入Java,系统会引导你到Oracle网站去下载,然后自己点击下载文件来安装,这个过程一点都不酷,而且不能自动化。现在你有了Homebrew Cask,只要输入如下命令,Java就可以自动安装好啦。
Shell
brew cask install java
现在最近版本的JDK是1.8,Homebrew默认安装最新版软件,如果你要安装非最新版的JDK,那么去oracle网站下载吧,Homebrew的多版本支持不是很好用。
同样的,输入如下命令来安装Maven最新版。
Shell
brew install maven
在开发中,你很可能会碰到这个错误java.security.InvalidKeyException: Illegal key size or default parameters,那是因为美国对出口软件加密算法长度的限制,你需要去如下链接下载补丁包:
JCE Unlimited Policy for JDK 6
JCE Unlimited Policy for JDK 7
JCE Unlimited Policy for JDK 8
补丁替换路径为${java.home}/jre/lib/security/,大约如下所示:
Shell
/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/security
5.4.2 安装版本控制软件 — SmartGit & SmartSVN
如果代码就是生命,版本控制系统就是时光机。Git和Subversion分别是现在最流行的2个版本控制系统,SmartGit和SmartSVN分别是他们的一个第三方客户端,当然他们有很多第三方客户端,我觉得SmartGit和SmartSVN是最好用的。
5.4.3 安装和配置IDE — IntelliJ IDEA
IntelliJ IDEA作为最智能的Java IDE,推荐所有Java开发人员使用,你可以在这里下载安装文件,或者使用如下的Homebrew Cask命令来下载安装:
Shell
brew cask install intellij-idea
打开IDEA,推荐选择Darcula主题,快捷键映射选择I’ve never used IDEA, 一路确认下去进入主界面。
推荐使用版本控制客户端(SmartGit & SmartSVN)下载好源代码后,再使用IDEA导入源代码,原因是如果用IDEA来checkout源代码,一边checkout一边分析代码,对于有多个模块的Maven项目,IDEA动态检测spring框架的配置文件可能会得不到及时而完整的依赖分析。

图5.4.2-1
我们假设项目是基于Maven的,如下图,选择Maven

图5.4.2-2
一路点击[Next]进入主界面,IDEA会帮我们自动检测到依赖的框架,如图IDEA发现我们使用了OSGI和Spring框架,点击[Configure],然后去除OSGI依赖,因为SOFA项目不是完全实现OSGI规范的,勾选Spring配置文件。

图5.4.2-3
IDEA会在你首次导入一个项目的时候建立索引,耐心等待索引建立完成,之后的查找就会非常快速。
5.5 可视化版本控制客户端-SourceTree和Counerstone
5.5.1 SourceTree
SourceTree for mac是经典的可视化Git客户端,支持创建、克隆、提交、push、pull 和合并等操作。SourceTree拥有一个精美简洁的界面,大大简化了开发者与代码库之间的git操作方式,这对于那些不熟悉Git命令的开发者来说非常实用。
5-5-1
Sourcetree for mac不仅仅功能强大、界面美观、操作简洁,而且是一款免费的软件.
5.5.2 CornerStone
CornerStone是Mac OS X系统下非常好用的一款svn工具. 打开后点击左下角+号添加Repositorys.
图5-5-2-1
接着进行一些简单配置即可完成添加:
图5-5-2-2
一个非常好用的小技巧:先复制svn 代码的完整url到剪贴板,然后点击左下角+号,你会发现上图的配置信息大部分已经被自动填好了.
友情提醒:本软件是付费软件,大约100+软妹币。
6. 工具的意义
工欲善其事,必先利其器,工具永远都是用来解决问题的,没必要为了工具而工具,一切工具都是为了能快速准确的完成工作和学习任务而服务。
原文地址:http://xialeizhou.com/?p=71



阿里云ECS:php+nginx+mysql 快速安装脚手架

安装php

yum安装的版本只有5.1,所以手动安装

  1. 百度云下载 php-5.6.16.tar.gz:https://pan.baidu.com/s/1eSxfhXg
  2. tar -xzvf php-5.6.16.tar.gz
  3. 安装 libxml2 : yum install libxml2-devel
  4. 安装 bzip2: yum install bzip2 bzip2-devel
  5. 安装 curl: yum -y install curl-devel
  6. 安装 libpng :yum install libpng libpng-devel
  7. 安装 libmcrypt:yum install libmcrypt libmcrypt-devel
  8. 安装 readline: yum -y install readline readline-devel
  9. 执行下面的配置

    1
    ./configure --prefix=/usr/local/php --with-config-file-path=/etc --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-opcache --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-gettext --enable-mbstring --with-iconv --with-mcrypt --with-mhash --with-openssl --enable-bcmath --enable-soap --enable-pcntl --enable-shmop --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-sockets --with-curl --with-zlib --enable-zip --with-bz2 --with-readline --without-sqlite3 --without-pdo-sqlite --with-pear --with-gd
  10. 复制php-fpm.conf

    1
    cp /opt/lib/php-5.6.28/sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf
  11. php-fpm 全局启动

    1
    cp /usr/local/php/sbin/php-fpm /usr/local/bin/php-fpm

12.启动 php-fpm
13.新建index.php

1
2
<?php
phpinfo();

14.成功

安装nginx

  1. yum 安装 yum -y install nginx
  2. 删除 /etc/nginx/conf.d下所有文件
  3. 配置自己的服务 vim mysite.conf

    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
    server {
    charset utf-8;
    client_max_body_size 128M;
    listen 80;
    server_name www.wexue.top;
    root /opt/server/gmfitness-wx;
    index index.php index.html;

    access_log /opt/log/access.log;
    error_log /opt/log/error.log;

    location / {
    # Redirect everything that isn't a real file to index.php
    try_files $uri $uri/ /index.php$is_args$args;
    }
    #转发
    location /wxnotify {
    proxy_pass http://XXXXX/index.php?g=Restful&m=Vip&a=wxnotify;
    }

    # uncomment to avoid processing of calls to non-existing static files by Yii
    #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
    # try_files $uri =404;
    #}
    #error_page 404 /404.html;

    location ~ \.php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9000;
    #fastcgi_pass unix:/var/run/php5-fpm.sock;
    try_files $uri =404;
    }

    location ~ /\.(ht|svn|git) {
    deny all;
    }
    }
  4. 启动:yum自动安装了nginx的服务,service nginx start

安装mysql

  1. yum安装
    1
    2
    yum -y install mysql-server mysql mysql-devel
    service mysqld start
  1. 开机启动

    1
    2
    chkconfig mysqld on
    chkconfig --list | grep mysql
  2. 密码设置

    1
    mysqladmin -u root password '密码'
  3. 设置全网访问mysql -uroot -p

  • 输入:use mysql;
  • 查询host输入: select user,host from user;
  • 创建host(如果有”%”这个host值,则跳过这一步)
  • 如果没有”%”这个host值,就执行下面这两句:

    1
    2
    mysql> update user set host='%' where user='root';
    mysql> flush privileges;
  • 授权用户

    • 任意主机以用户root和密码pwd连接到mysql服务器
    • 指定IP为(如192.168.1.100)的主机以用户tuser和密码tpwd连接到mysql服务器
      1
      2
      3
      4
      5
      mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
      mysql> flush privileges;

      mysql> GRANT ALL PRIVILEGES ON *.* TO 'tuser'@'192.168.1.100' IDENTIFIED BY '密码' WITH GRANT OPTION;
      mysql> flush privileges;

前端踩坑日记

  1. IE不支滑动条在可滑动的状态下自定义宽度和隐藏,
    解决方法是:子div宽度加20px 父级overflow:hidden
    1. stylus遇到filter怎么写:
      1
      filter unquote('progid:DXImageTransform.Microsoft.Alpha(Opacity=' + round(n * 100) + ')'
  1. IE video元素全屏,不能自定义控制条,解决方案是:
    采用div全屏的方式

    1
    2
    3
    4
    <div>//全屏该div
    <video></video>
    <div class="controls"></div>
    </div>
  2. 使用getBoundingClientRect获取元素的位置,top只是距离窗口上部的距离,必须加上scrollTop才是准确的高度

    1
    2
    3
    4
    var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
    var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
    this.$refs.sliTip.style.top = e.target.getBoundingClientRect().top + scrollTop - 70 + "px";
    this.$refs.sliTip.style.left = e.target.getBoundingClientRect().left + scrollLeft - 65 + "px";
  3. ie支持的渐变
    background: linear-gradient(to bottom, #4e2c8d, rgba(78, 44, 141, 0.0))

  4. IE 浏览器遇到symbol未定义的错误
    解决方法:
    安装babel-polyfill
    npm install --save-dev babel-polyfill
    页面引入:
    <script src="node_modules/babel-polyfill/dist/polyfill.min.js"></script>

  5. vue 中用vue-route 打开一个页面http://ip:port/index/30 在页面中点击一个按钮需要调到http://ip:port/index/40 时,页面不会刷新,不会执行mounted ,可以用下面方法监听$route的变化来解决。

    1
    2
    3
    4
    watch: {
    // 如果路由有变化,会再次执行fetchdata方法
    '$route': 'fetchData'
    },
  6. fixed 浏览器问题

  7. 弹出问题
  8. settimeout 和 setInterval 独立于vue组件,因此在销毁组件的时候需要cleanTimeout 和 cleanInterVal
    代码示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //将所有settimeout 和 setInterval 分别添加到两个数据中,在组件销毁前clean所有
    beforeDestroy: function () {
    //销毁所有setinterval clearTimeout
    for (var i = 0; i < this.timeouts.length; i++) {
    clearTimeout(this.timeouts[i])
    }
    for (var i = 0; i < this.intervals.length; i++) {
    clearInterval(this.intervals[i])
    }
    },
  9. 图片加载失败的时候的缺省图片问题

    1
    2
    3
    4
    5
    6
    7
    8
    //jade
    img(:src="honor.name",@error="errorImgFun")

    //js 图片加载错误替换该图片
    var noImg = require('../../img/index/honor_item_icon.png')
    errorImgFun(e){
    e.target.src = noImg
    },

有最大最小高度的时候使用:absolute 设置最小宽高

  1. vue router 在IE9下无法使用hash的方式跳转
    解决方法
    router-view(:hashbang="true",:history="true")

nodejs 后端开发之 express.js

安装nodejs

安装cnpm

国内npm镜像库,淘宝的cnpm,可以有效的提高下载nodejs包的速度。

npm install -g cnpm --registry=https://registry.npm.taobao.org

安装express

cnpm install express (如果没有权限就加上sudo)
express官网

安装jade

cnpm install jade
jade基本语法和使用方法

安装Express应用生成器

npm install express-generator

新建web项目

express myapp
获得以下目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create : myapp
create : myapp/package.json :npm依赖包
create : myapp/app.js :入口文件
create : myapp/public :静态资源文件
create : myapp/public/javascripts
create : myapp/public/images
create : myapp/routes :路由
create : myapp/routes/index.js
create : myapp/routes/users.js
create : myapp/public/stylesheets
create : myapp/public/stylesheets/style.css
create : myapp/views :模板视图文件目录
create : myapp/views/index.jade
create : myapp/views/layout.jade
create : myapp/views/error.jade
create : myapp/bin
create : myapp/bin/www :服务启动函数

安装第三方js插件包

1
2
cnpm install -g bower
bower install jquery

启动服务器

1
2
3
4
5
启动这个应用(MacOS 或 Linux 平台):
DEBUG=myapp npm start

Windows 平台使用如下命令:
set DEBUG=myapp & npm start

访问地址:http://localhost:3000/

PHP+crontab 完美实现定时任务

PHP由于是顺序执行的脚本语言,多线程编程困难,因此PHP的定时任务相比较JAVA 困难的多,使用Sleep会导致性能极差和系统资源损失,下面我介绍一种高性能,又简单的方式来解决这个问题。

步骤

  1. 编写restful接口,可以用TP这样的框架,或者直接写PHP文件,完成任务逻辑。例如:

    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
    //使用TP框架建立restful接口
    class OauthController extends Controller
    {
    /*
    完成上课提醒
    */
    public function classReminder()
    {
    //查看今天所有课程
    $courses = D("course")->where(array("cday" => date("Y-m-d")))->select();

    foreach ($courses as $course) {
    $cstime = strtotime($course['cstime']);
    $currtime = time();
    $cc = $cstime - $currtime;
    if ($cc < 60 * 60 && $cc > 5 * 60) {
    $ucc = D("user_card_course")->where(array("courseid" => $course["id"]))->select();

    foreach ($ucc as $uc) {
    $re = D("wxmsg")->where(array("userid" => $uc["userid"], "courseid" => $course["id"], "type" => "上课提醒"))->find();
    if ($re) {
    echo "发送过了";
    continue;
    }
    $user = D("oauth_user")->find($uc["userid"]);
    $this->sendTemMsgForClassReminder($user["openid"], $course["id"], $uc["userid"]);
    }
    }
    }
    }
    }
  2. linux添加定时任务,crontab -e 编辑任务

    1
    2
    3
    4
    #每晚2点备份mysql
    0 2 * * * /opt/mysqlBack/bkMysql.sh
    #每15分钟(每小时的 0 15 30 45 分启动),访问接口,并将日志输出到log
    */15 * * * * wget http://localhost/classreminder >/opt/server/gmfitness-schedule/classreminder.log 2>&1
  3. wq!保存。

成功!

Openlayers开发热图

简介:热力图采用PostGis数据库存储地图和人流点数据,通过Geoserver服务发布,前端采用OpenLayers引入并展现完成。

##开发流程图

详细说明

Postgis数据准备

the_geom用于存储坐标信息

企业客户地图:

  • WGS84
  • Postgis 文件
  • monitor库

人流定位数据:

  • 存入Postgis,坐标系:EPSG:4326 该表只存储5分钟内的定位数据,每5分钟刷新一次,并删除之前5分钟的数据
  • 一个企业客户占一个表,一个表里含有多个楼层
  • monitor库
    表示例:
id province_id city_id enterprise building floor the_geom postion_time
1 116 11602 zhongshanyiyuan ZS1 F1 0101000020E6100000000000C0E9D369410000000028F75141 2016-08-08 10:00:00

AP点位数据

存入Postgis,坐标系:EPSG:4326
表示例:
|ft_id|by|fl_id|ft_name_cn|ft_name_en|ft_type|py_type|c_time|u_time|u_flag|the_geom|
|—|
||| ZH0000110100100001| XH1-B1-AP-001||||||| 0101000020E61000001C29C7744A655E405CC51EBF08794340|

新建Geoserver图层

Alt text
Alt text
Alt text

发布WMS服务 style sld

发布地图

Alt text)

发布AP点位

Alt text)

发布人流热图

Alt text)

热图样式设置

一 环境部署
正常部署geoserver,本次版本是2.6
下载地址:http://geoserver.org/release/stable/
另外要下载
Extensions的wps扩展插件。
解压wps,将jar包放进geoserver部署的web-INF/lib中,重启geoserver。

二 生成热力图的样式文件heatmap.sld

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?xml version="1.0" encoding="ISO-8859-1"?>  
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>Heatmap</Name>
<UserStyle>
<Title>Heatmap</Title>
<Abstract>A heatmap surface showing population density</Abstract>
<FeatureTypeStyle>
<Transformation>
<ogc:Function name="gs:Heatmap">
<ogc:Function name="parameter">
<ogc:Literal>data</ogc:Literal>
</ogc:Function>
<ogc:Function name="parameter">
<ogc:Literal>weightAttr</ogc:Literal>
<ogc:Literal>jan_je</ogc:Literal>
</ogc:Function>
<ogc:Function name="parameter">
<ogc:Literal>radiusPixels</ogc:Literal>
<ogc:Function name="env">
<ogc:Literal>radius</ogc:Literal>
<ogc:Literal>100</ogc:Literal>
</ogc:Function>
</ogc:Function>
<ogc:Function name="parameter">
<ogc:Literal>pixelsPerCell</ogc:Literal>
<ogc:Literal>10</ogc:Literal>
</ogc:Function>
<ogc:Function name="parameter">
<ogc:Literal>outputBBOX</ogc:Literal>
<ogc:Function name="env">
<ogc:Literal>wms_bbox</ogc:Literal>
</ogc:Function>
</ogc:Function>
<ogc:Function name="parameter">
<ogc:Literal>outputWidth</ogc:Literal>
<ogc:Function name="env">
<ogc:Literal>wms_width</ogc:Literal>
</ogc:Function>
</ogc:Function>
<ogc:Function name="parameter">
<ogc:Literal>outputHeight</ogc:Literal>
<ogc:Function name="env">
<ogc:Literal>wms_height</ogc:Literal>
</ogc:Function>
</ogc:Function>
</ogc:Function>
</Transformation>
<Rule>
<RasterSymbolizer>
<!-- specify geometry attribute to pass validation -->
<Geometry>
<ogc:PropertyName>geom</ogc:PropertyName></Geometry>
<Opacity>0.6</Opacity>
<ColorMap type="ramp" >
<ColorMapEntry color="#0000FF" quantity="0" label="nodata" opacity="0"/>
<ColorMapEntry color="#00FFFF" quantity="0.02" label="nodata"
opacity="0"/>
<ColorMapEntry color="#00FF00" quantity=".1" label="nodata"/>
<ColorMapEntry color="#FFFF00" quantity=".5" label="values" />
<ColorMapEntry color="#FF0000" quantity="1.0" label="values" />
</ColorMap>
</RasterSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>

weightAttr标签指定权重字段,在这里我设置weightAttrz权重字段名称为jan_je。colormap中的热力图符号和范围设置,也是可以改和设置的。
<ogc:PropertyName>geom</ogc:PropertyName></Geometry>这里是指定渲染的图形字段,查看数据库空间数据表的图形字段名称,如果是geom就写geom,如果是the_geom就写the_geom,根据自己数据库中图形字段名称来。在geoserver>style中发布这样的一个sld文件。

Openlayers装载图层

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
41
42
43
44
45
46
 var baseServer = "http://geoserver地址/geoserver/gcks/wms";
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
projection: 'EPSG:900913',
center: [13541202.790897895,4709549.109971935],
zoom: 19
})
});
//人流定位数据图层
var layer1 = new ol.layer.Image({
visible: true,
source: new ol.source.ImageWMS({
ratio: 1,
url: baseServer,
serverType: "geoserver",
params: {
FORMAT: 'image/png',
VERSION: '1.1.0',
LAYERS: 'gcks:mod_heatmap_5mins',
STYLES: ''
}
})
});
//地图数据图层
var layer2 = new ol.layer.Image({
visible: true,
source: new ol.source.ImageWMS({
ratio: 1,
url: baseServer,
serverType: "geoserver",
params: {
FORMAT: 'image/png',
VERSION: '1.1.0',
LAYERS: 'gcks:fl_info_1',
STYLES: ''
}
})
});
map.addLayer(layer1);
map.addLayer(layer2);

最终展示效果:
Alt text)

数据工程师—java京东面试题

京东总部的位置有点捉急,周围荒芜人烟,位于一片农田之中,2016年末,刘强东开始将京东定义为一个技术型驱动的公司,开始打造众多的技术团队,技术氛围不错,但是面试官有些木讷。。。

面试题目

  • 多线程:executor原理 线程池 全解

    • Executor,Executors,ExecutorService,CompletionService,Future,Callable
    • Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
    • public static ExecutorService newFixedThreadPool(int nThreads)
      创建固定数目线程的线程池。
    • public static ExecutorService newCachedThreadPool()
      创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
    • public static ExecutorService newSingleThreadExecutor()
      创建一个单线程化的Executor。
    • public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
      创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
    • ExecutorService与生命周期
    • ExecutorService扩展了Executor并添加了一些生命周期管理的方法。
    • 一个Executor的生命周期有三种状态,运行 ,关闭 ,终止 。Executor创建时处于运行状态。当调用ExecutorService.shutdown()后,处于关闭状态,isShutdown()方法返回true。这时,不应该再想Executor中添加任务,所有已添加的任务执行完毕后,Executor处于终止状态,isTerminated()返回true
    • 如果Executor处于关闭状态,往Executor提交任务会抛出unchecked exception RejectedExecutionException
    • 使用CallableFuture返回结果
    • Future<V>代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞。FutureTask<V>实现了Future<V>Runable<V>Callable代表一个有返回值得操作。
    • CompletionService
      在刚在的例子中,getResult()方法的实现过程中,迭代了FutureTask的数组,如果任务还没有完成则当前线程会阻塞,如果我们希望任意字任务完成后就把其结果加到result中,而不用依次等待每个任务完成,可以使CompletionService。生产者submit()执行的任务。使用者take()已完成的任务,并按照完成这些任务的顺序处理它们的结果 。也就是调用CompletionService的take方法是,会返回按完成顺序放回任务的结果,CompletionService内部维护了一个阻塞队列BlockingQueue,如果没有任务完成,take()方法也会阻塞。修改刚才的例子使用CompletionService:
  • hashmap实现原理,hashtable和hashmap区别,为什么hashmap效率高不安全,concurrenthashmap 为什么线程安全,怎样实现的.

在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。

详细介绍:
hashmap原理全解
hashtable原理全解

  • 手写单例模式示例,单链表倒序排列

    • 单例模式的几种写法:详解点击:单例模式的七种写法
      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
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      //写法一:懒加载,线程不安全
      public class Singleton {
      private static Singleton instance;
      private Singleton (){}

      public static Singleton getInstance() {
      if (instance == null) {
      instance = new Singleton();
      }
      return instance;
      }
      }
      //写法二:懒加载,线程安全
      public class Singleton {
      private static Singleton instance;
      private Singleton (){}
      public static synchronized Singleton getInstance() {
      if (instance == null) {
      instance = new Singleton();
      }
      return instance;
      }
      }
      //写法三:不能懒加载
      public class Singleton {
      private static Singleton instance = new Singleton();
      private Singleton (){}
      public static Singleton getInstance() {
      return instance;
      }
      }
      //写发四:写法三的变种
      public class Singleton {
      private Singleton instance = null;
      static {
      instance = new Singleton();
      }
      private Singleton (){}
      public static Singleton getInstance() {
      return this.instance;
      }
      }
      //写法五:静态内部类
      public class Singleton {
      private static class SingletonHolder {
      private static final Singleton INSTANCE = new Singleton();
      }
      private Singleton (){}
      public static final Singleton getInstance() {
      return SingletonHolder.INSTANCE;
      }
      }
      //写法六:双重校验
      public class Singleton {
      private volatile static Singleton singleton; //保证变量值统一
      private Singleton (){}
      public static Singleton getSingleton() {
      if (singleton == null) {
      synchronized (Singleton.class) {
      if (singleton == null) {
      singleton = new Singleton();
      }
      }
      }
      return singleton;
      }
      }
  • 单链表倒序排列

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    /** 
    * java 实现单链表的逆序
    * @author Administrator
    *
    */
    public class SingleLinkedReverse {

    //定义单链表,每个节点包含数据和下一个节点的地址
    class Node {
    int data;
    Node next;

    public Node(int data) {
    this.data = data;
    }
    }

    public static void main(String[] args) {
    SingleLinkedReverse slr = new SingleLinkedReverse();
    //定义两个链表
    Node head, tail;
    //新建一个链表头结点
    head = tail = slr.new Node(0);
    //新建一个长度为10的链表tail
    for (int i = 1; i < 10; i++) {
    Node p = slr.new Node(i);
    tail.next = p;
    tail = p;
    }
    //tail返回到头节点0 此时head在头结点
    tail = head;
    //循环链表
    while (tail != null) {
    System.out.print(tail.data + " ");
    tail = tail.next;
    }

    head = reverse(head);

    while (head != null) {
    System.out.print(head.data + " ");
    head = head.next;
    }
    }

    /* 核心算法
    前后交换位置
    */
    private static Node reverse(Node head) {
    Node p1, p2 = null;
    p1 = head;

    while (head.next != null) {
    p2 = head.next;
    head.next = p2.next;
    p2.next = p1;
    p1 = p2;
    }
    return p2;
    }
    }
  • 接口和抽象类区别,特点 答案全解

    1. 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
    2. 抽象类要被子类继承,接口要被类实现。
    3. 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
    4. 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
    5. 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
    6. 抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
    7. 抽象类里可以没有抽象方法
    8. 如果一个类里有抽象方法,那么这个类只能是抽象类
    9. 抽象方法要被实现,所以不能是静态的,也不能是私有的。
    10. 接口可继承接口,并可多继承接口,但类只能单根继承。
  • static 特点 执行顺序

    1. 父类的 static 语句和 static 成员变量

    2. 子类的 static 语句和 static 成员变量

    3. 父类的 非 static 语句块和 非 static 成员变量

    4. 父类的构造方法

    5. 子类的 非 static 语句块和 非 static 成员变量

    6. 子类的构造方法

  • sql的执行顺序SQL Select语句完整的执行顺序: 

    1. from子句组装来自不同数据源的数据;
    2. where子句基于指定的条件对记录行进行筛选;
    3. group by子句将数据划分为多个分组;
    4. 使用聚集函数进行计算;
    5. 使用having子句筛选分组;
    6. 计算所有的表达式;
    7. 使用order by对结果集进行排序。
    8. select 集合输出。
  • having
    在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

    1
    2
    3
    4
    SELECT Customer,SUM(OrderPrice) FROM Orders
    WHERE Customer='Bush' OR Customer='Adams'
    GROUP BY Customer
    HAVING SUM(OrderPrice)>1500
  • innodb myisam的区别 和原理 答案全解

  • 两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

  • 作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,如果数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是首选。

  • arraylist linkedlist区别
  • 大概的区别
    1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
      1. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
      2. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
  • ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:
  1. 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。

  2. 在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。

  3. LinkedList不支持高效的随机元素访问。

  4. ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了

###10. 基本请求类型

HTTP协议中共定义了八种方法或者叫“动作”来表明对Request-URI指定的资源的 不同操作方式,具体介绍如下:

  • OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*’的请求来测试服务器的功能性。
  • HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
  • GET:向特定的资源发出请求。
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
  • PUT:向指定资源位置上传其最新内容。
  • DELETE:请求服务器删除Request-URI所标识的资源。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。

  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

  • 响应状态码
    全解
    301和302的区别

  • 302重定向是暂时的重定向,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。 SEO 302好于301,但容易被劫持。
  • 301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。不会发生url劫持
  • 微服务什么概念
    微服务是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说API应该是重点。
    WiKi

chrome web devtool技巧

console

  • copy(x)

    是一个很有用的工具函数方便你将任何东西拷贝到系统的粘贴板暂存。
    给copy函数传入一个没有格式的JSON,会返回格式化的结果。

  • Eager evaluation

    选择该选项可以自动联想你所输入的变量的值,并自动打印出来。

  • debug()

    在执行到某个函数的时候暂停,你可以使用debug函数。debug(fn)接收一个函数作为参数,当每次该函数被调用时,Debugger就会在该函数的第一行中断执行。

  • 暂停UI在Hover状态下的展示结果

    • 打开sources面板
    • 显示tooltip
    • 使用快捷键来暂停脚本执行(将鼠标停留在暂停的图标上查看快捷键 cmd+\ )
    • 回到Elements面板,然后像通常一样去检查元素。

source

通用性面试技巧

面试技巧

形象和谈吐

  • 略正式。
  • 说话幽默,看着对方。
  • 回答问题到细节,避免面试官追问。
  • 要面试官的微信,对于不懂的问题,回去准备发给他。

关键问题

为什么离开公司?

  • 太喜欢你们公司
  • 没有成长空间

自己的缺点?

  • 急性子,为了做事推进,不太估计别人的感受。
  • 对做的事情要求太高,team有时压力会比较大。

自己的优点?

  • 善于学习,高效学习,刻意练习,研究能力。
  • 有韧性。
  • 喜欢研究底层和新的技术,比如go语言。

为什么换工作比较勤?

  • 公司给不了我理想工作环境和状态。
  • 我理想的工作环境和状态。

为什么转前端?

  • 转了以后发现自己做的更好。
  • 学习能力强

你有什么问题?

  • 一线经理还在写代码吗?不懂技术细节怎么带团队。
  • 你觉得你们公司有什么不好的地方吗?
  • 我能帮贵公司做点什么?能不能给我些资料,我先了解下。
  • 面试官对你的评价,指出你的不足和需要改进的地方。

提现自己的能力

  • 死磕某个事
  • 坚持很久的事
  • 逆境不放弃
  • 面对压力,承担责任
  • 严谨细心,对自己做的产品自信
  • 面对诱惑,不浮躁