Mac osX 配置Maven环境

我使用镜像网站下载maven,目前版本3.6.0

https://maven.apache.org/download.cgi?Preferred=http%3A%2F%2Fmirrors.tuna.tsinghua.edu.cn%2Fapache%2F

解压到你的目录下,然后打开iTerm开始配置:

vim ~/.bash_profile

export M2_HOME=这里是你maven解压后的路径

export PATH=$PATH:$M2_HOME/bin

保存修改后的bash_profile文件,然后 source ~/.bash_profile

接下来就可以使用 mvn -v 来看下配置是否成功了。

centos安装ngxtop

nginx受众很大,可以监控的工具很多,但是对简单粗暴的想知道直观数据的我们来说,ngxtop不可错过。

在centos中yum还不能安装,所以还是人肉安装吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
######
wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
tar zxvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py build
python setup.py install
######
wget https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#md5=3823d2343d9f3aaab21cf9c917710196
tar zxvf pip-7.1.2.tar.gz
cd pip-7.1.2
python setup.py install
######
pip install ngxtop

接下来就可以使用了:

ngxtop [options]
ngxtop [options] (print|top|avg|sum) <var>
ngxtop info

一些通用选项:

  • -l : 指定日志文件的完整路径 (Nginx 或 Apache2)
  • -f : 日志格式
  • –no-follow: 处理当前已经写入的日志文件,而不是实时处理新添加到日志文件的日志
  • -t : 更新频率
  • -n : 显示行号
  • -o : 排序规则(默认是访问计数)
  • -a …, –a …: 添加表达式(一般是聚合表达式如: sum, avg, min, max 等)到输出中。
  • -v: 输出详细信息
  • -i : 只处理符合规则的记录

一些内置变量:

  • bodybytessend
  • http_referer
  • httpuseragent
  • remote_addr
  • remote_user
  • request
  • status
  • time_local

 

创业团队的招聘与留人

招人

如何破除招人困局

在互联网一片红火的大背景下,BAT公司会经常组织各种“英才计划”来抢夺精英,可见现在想招到合适的人才越来越困难。对创业公司来说,去各大招聘网站花钱发布JD(职位描述),期待“盘亮条顺会来事儿”且要求不高的才子愿意踏进这滩“泥潭”,这事就和矮矬穷逆袭白富美一样不大靠谱。当然不排除富有理想、有抱负、不愿背负“金手铐”、笃定创业路的佳人,但毕竟凤毛麟角、可遇不可求。因此总体而言,现在对创业公司来说也许是最好的圈钱时代,但同时也是最坏的招人时节——通过传统招聘网站社招这条路,不大行得通。

两年前,我们曾经在创新工场的校园招聘中吸引到三四个不错的青年才俊,分别来自中科院、北大、北航等院校,好不容易克服心理障碍给了我自认为对应届生来说已非常不错的薪酬,但转眼他们便被网易、腾讯、微软等公司用重金强势瓜分。背靠创新工场这棵大树,凭借它在学生中的辐射效应,我们尚且如此,那些没有名气和背景、缺乏资金、只有梦想的创业公司更难以获得青睐——走校园招聘这条路,也很难走得通。

因此,创业公司需要探索其他招人路径。

动用团队的人脉来寻找人才。这是平时的慢工细活,无法一蹴而就。公司技术合伙人平日就需注意拓展在技术圈的人脉,居安思危,就像小时候都读过的蚂蚱和蚂蚁的寓言故事,不要等到过冬(需要招人)时才想起储存粮食(拓展人脉)。

当然,拓展技术人脉并不是见面交换名片“打个哈哈”那么简单的事,否则这事交给负责商务拓展的人就足够,不用劳烦本来就不很善于言辞、很难自来熟的技术合伙人。因为工程师都是桀骜的,他们拜服于技术水平、技术视野、项目能力,而非三寸不烂之舌。虚的东西他们也许表面迎合,但内心会有自己冷静的判断,或许很难产生认同感。唯有技术相关的讨论,甚至真枪实弹的代码,才能戳中他们的G点。工程师往往先对人认可,然后才会对项目认可。而这种对人的认可,在一次次交往中,才能逐渐形成。

曲线救国,聘用实习生来达到获取人才的目的。通过在水木社区等学校论坛中发布信息吸引大三下学期或者研二的学生,然后利诱之。一般大公司在实习生层面都有公司制定的统一标准,人家能给120/天,你就给150/天;人家给150/天,你就200/天。一个月算下来并不多太多但能捞得一块璞玉。其实学生找实习和找工作的心态是不同的:去大公司实习意味着一个萝卜一个坑,施展不了才华,学不到太多,但去创业公司,只要技术老板靠谱,就能获得很多成长;学生找工作则求稳、求高薪,成长性方面有人考量不多,毕竟走向社会面临房子、车子等很实际的生活压力。只要肯下功夫,就能找到不错的苗子。

人和人之间就怕没有交集,有交集后一些事会好办很多。实习生一旦开始工作,如果技术合伙人重视并加以培养,通过手把手教带出感情、通过做项目让其认识到公司伟大的愿景,那么实习期结束,一份合理的薪水将其留下的概率要远远大于一份高额薪水拿下一个校招学生的概率。

其他还有一些路子,比如尝试一些新出现的招聘平台,使用LinkedIn和心仪的人“眉来眼去”等。总之,技术合伙人要把自己的技术魅力和人格魅力全方位使用,招人困局才能够逐渐破解。

面试是个技巧活

招人时面试是个技巧活。如何在最短的时间里对面试者有最全面的了解,这非常考验面试官的能力。初期团队规模还小时,技术合伙人当仁不让是面试的把关者。

面试的目的是收获人才,而非展示“我比你强”的优越感。有些面试官以将对方问倒,甚至激怒对方为荣,还美其名曰为“压力测试”。我不喜欢这种做法——我希望面试时尽可能让对方展现其最大的能力。所以一开始我会将氛围轻松化,然后问一些基础性的问题及简历中感兴趣的点,一点点发问、深挖。基础性的问题不大容易靠作假和背题就能涵盖,即使碰巧背到了,再给一些上下文问得细一些,就能露出端倪。比如很多应试者难以讲清楚lock-free、wait-free的概念和应用场景,即使勉强讲出来,再让其描述如何做一个lock-free的queue,他也多半会卡住(甚至不大会反问我使用的场景,在我提示只用实现single producer single consumer lock-free queue后,也无法继续下去)。在我看来,基础扎实大于工作经验。因为工作经验是可以混出来的。

面试时多些开放性的问题,多让面试者进行场景的描述,然后据此提后续补充问题。比如:你解决过的最困难的问题是什么?如果让你来做XXX,会怎么考虑?

面试时还不要忘记给面试者机会展示自己真正的实力——有时面试官的问题对面试者来说可能是偏门。问得差不多,在心里有初步定论后把话语权抛给对方:“刚才问了不少问题,有没有哪些是自己的强项但问题没有涉及的?可否分享下?”

最后别忘了笔试。毕竟招来的人是来做事而不是侃侃而谈的。我一般会给出简单的题目(包括一个项目),让对方回去尽最快速度完成。完成的代码要求健壮、有测试例;项目还需要在Heroku上能部署出一个可运行的版本。什么?没接触过Heroku,那正好是考察学习能力的机会……

我不喜欢在纸上做出的笔试。白板上我也只看伪码和架构图。真正的代码要用计算机写出来,能运行、有输入输出、有测试。拿到交出的代码后,我会先看测试例是否充分,是否考虑到各种边界条件、exception、corner case,然后手动输入几组测试数据,看是否crash,之后才看代码。代码写得逻辑是否正确、是否干净整洁、是否健壮、是否有注释、是否符合PEP8(针对Python)等。

只要面试官有足够的创造力,笔试能够玩出很多“花活儿”。我一般不会让面试者当场做题,而是请他们回去完成。这样做出于三方面考虑:

  1. 现场笔试时间有限;
  2. 选择一些对方可能没用过的library让其在项目中使用,考察学习能力;
  3. 如果对方最终没有提交代码,不是他对公司不感兴趣,就是能力有限。如果对方做得很棒,又能对自己的代码细节解释清楚,会是很好的团队成员。

如果最终只有一个招人名额,但有多个面试者都很不错,举棋不定时选那位思维最清晰缜密的人,怎么判断思维清晰缜密?

  • 表达能力——把一件事情说清楚明白的能力;
  • 写作能力(现在很多人都会写博客,博客里的文章能反映出来写作能力)。

留人
招聘只是获得人才的第一步,接下来就是尽可能长时间地留住人才,为公司所用。能留住人的第一要务当然是公司有足够的吸引力,比如公司业务蒸蒸日上,收入水涨船高;或者不赚钱但处在开疆辟土、攻城略地的阶段;再不济起码要有各种故事、各种预期以及可能的美好未来。如果这些都不具备,所有可能的利好还都出尽,那留得住人只能靠创始人的人品了。

人品

创业团队和一般公司的团队不同,创业公司创始人的人品可以有非常强的感召力。

有个很俗的段子说“男人四大铁”,虽然粗俗,但却在理。2011年我离开Juniper创业时,即使我跟自己的团队振臂一呼谁愿意一起走?绝对没人愿意。因为公司的同事相敬如宾,合作再愉快也总隔着层纱——写个邮件还要琢磨着我用惊叹号是不是过分了,要不要“补个妆”,发个笑脸?所以经理人品再好,感召力也一般。而创业团队则不同,一起编码到半夜、吵需求吵到面红耳赤、打飞盘打到咬牙切齿——这和“男人四大铁”段子里说的一起同过窗、一起扛过枪有几分神似。也许以后男人四大铁还会加一个:一起创过业。

这也是为什么那些人品不错的创业者,即便在山穷水尽时还有人不离不弃。人品代表了很多方面,我前老板Frank曾说NetScreen的成功,“财散人聚”是其中一条重要原因。这里财散人聚就体现出人品的一个方面:不贪。创始人如果戒贪、弃嗔、不痴、摆低姿态、不轻慢别人(不慢)、做事坚决果敢(不疑),那就是人品好,别人也愿意跟随。

提供发挥和成长的空间

在提供合理报酬的前提下,员工为什么会留在某个团队?无非是个人发挥和成长的空间。对社招的工程师来说,发挥的空间很重要;对应届生或实习生来说,重要的则是快速成长的空间。了解这种诉求并正确应对,才能为留住人打下良好基础。

如果在大公司待过,就会发现在大公司有不少有能力但郁郁不得志的青年才俊。只要给个舞台逼出潜能,做事都是顶呱呱。可惜戴着“金手铐”锐气被磨尽,天天在邮件群里、会议堆里穿梭,以至于迷失了自己。这样的人如果不慎被你捡个漏,加盟了你的创业公司,那么让其充分发挥能力,找到适合他的舞台非常重要。很多公司都说要为员工提供“没有天花板的舞台”,但其实真正做到的没几个。

应届生和实习生往往是等待雕琢的璞玉,需要下大力气培养。很多创业团队认为“时不我待”没空培养,其实未必。我的亲身体验是:他们学习的热情是非常高的,为了完成一件事,可以不惜代价。

给应届生或实习生培训时,工作相关的内容不要有所保留。有句话说得好:如果缺乏必要的帮助,员工的失败是老板的失败。我一般会从架构讲起,使用哪些组件,这么选择(或妥协)的原因何在,然后一点点过渡到代码。要强调的是平日里要不厌其烦地回答他们的问题,哪怕问题显得非常“naive”——take it easy,因为“人不naive枉少年”啊。

有人担心实习生若掌握太多公司核心代码,实习完就走人,这是杞人忧天。且不说进公司都要签NDA(Non Disclosure Agreement,保密协议),就算没有NDA,一家创业公司还挣扎在生死线上,“核心”是什么也未必清晰,实在没必要忧虑这些不着调的方面。信任是双向的,人事任用上必须用人不疑,包括对实习生。当然,必要的权限措施是需要的——但那是针对不同的角色,不是针对某个人。

一旦实习生进入状态,提供一份合理的薪酬,他们毕业后留下来的概率会非常大。毕竟,你有好几个月的时间展示个人魅力、公司愿景、所做产品的价值。如果这样都留不下,那就算提高薪酬强留,也没多大意义。

进行情感投入

感情是个微妙的东西,很多时候是能够起决定性的因素。没事找个员工一起喝杯咖啡闲聊,谈谈人生、理想、读书等,就是为感情银行里注入新的投资。作为一个老板,最好能够对团队里每个人(或重要员工)的家庭、情感、生活等有较细致的了解。都说感情一半是处出来的,一半是聊出来的。虽然大家朝夕相处,一起写代码,一起Debug,一起Hackathon,但没有深入聊过的感情总是“欠临门一脚”,无法坐实。

情感投入可以说是细水长流,是基金定投。这份投入必须是发自内心、不计回报的。遇到重大变故也无须打出感情牌——人对了,投入够了,该有的就会有;否则,即使打出感情牌,也无济于事,还可能伤了相互的心。

是什么让我们上网如此艰难……

14年5月27日,谷歌搜索开始在中国被干扰,部分用户访问出现异常,而根据谷歌自己的统计数据,谷歌自5月31日开始被中国“完全屏蔽”,谷歌所有产品均无法从中国访问。

或许我们不能上推,上脸,上2B也就算了,就连Google也如此艰难,也着实坑坏了许多实实在在的用户。

废话不多说,各路神仙也早已各显神通,然而不是大神的诸位小白只能抱团自救,这里提供一个方式。

打开网站  http://www.tm-sp.com/  注册用户,激活后进入

t1

激活账户就进入网站了

t2

 

至于抽奖获取金币,是为了开通VIP账户使用大家可以自行选择,对于 SSH的方式这里不介绍了,可以网上搜搜,这里说的是客户端方式。

点击 办理7天金牌会员  菜单,使用2金币获取7天使用权限,这个不难吧,推荐两个用户就有了,再不济,点一下抽奖 -。-#

然后活的金牌会员的资格,这个时候就能使用客户端了。http://pan.baidu.com/s/1eQqvpAi

下载,解压双击run.bat(该客户端为Windows客户端,需要其他的客户端可能需要自行联系站长了)

t3

输入你的用户名密码就能登录了,选择线路,点击穿越 ~~~

t4

目前就两个线路,自己选一个吧

t5

可以x掉最小化。

然后自行安装Firefox 浏览器,打开 FF

点击右侧菜单,选项

t6

高级 ——  网络 —— 设置

t7

手动配置代理—— socks主机  填写  127.0.0.1   端口 7216     选择 socks v5

点击确定,开始你的穿越之旅吧!

t8

OK  让我们看看效果 Google 回来了

t9

 

如果你觉得 DNS不够爽,可以在地址栏输入 about:config

然后进入配置选项,搜索   network.proxy.socks_remote_dns   将其设置为 true

在试试效果!

t10

 

或许还能有其他的菜单,期待大家发现:)

20140623163440

新语言Swift耗时4年完成开发

苹果新编程语言Swift耗时4年完成开发

 

1. 苹果新编程语言Swift,从开始研发到最终发布仅用了不足4年时间。该语言背后的创造者为苹果开发者工具部门总监Chris Lattner,根据其在博客上的表述,Swift的底层架构大多由其一人开发完成,而开发期间,仅少数内部人士对此项目知晓。

 

2. 与其他编程语言一样,Swift受益于其他语言那些来之不易的开发经验。Xcode Playgrounds功能是Chris的最爱,也是Swift为苹果开发工具带来的最大创新。该功能提供了不可思议的互动效果,能让Swift代码在编写过程中实时的编译和显示

 

3. Chris强调,Playgrounds的功能很大程度是受到了Bret Victor的理念以及其他一些互动系统的启发。而将编程变得更加平民化和有趣,Chris认为这有助于苹果吸引到下一代的程序员们,甚至让大学重新制定计算机科学专业的课程内容。

 

亚马逊或将在6月18日发布3D智能手机

 

1. 根据亚马逊在其网站上公布的视频,亚马逊邀请媒体和客户参加6月18日在其西雅图总部举行的发布会,将有“新设备面世”。在视频中,演员对于能够抓住从屏幕上脱离的东西感到惊讶。

 

2. 该视频似乎暗示,新款智能机将配备一块能够追踪用户眼球移动,并显示准3D图像的屏幕。这是亚马逊扩大硬件规模计划的一部分,该公司近期还发布了Fire TV机顶盒。

 

3. 另外有消息称亚马逊的这款手机还将支持全新的手势操作方式,拿着手机倾斜一下,手机界面上就会出现隐藏的信息、菜单或者按键。

 

传Twitter与Soundcloud就收购展开谈判

 

1. 据《金融时报》报道,一直有消息称Twitter在考虑收购Soundcloud或Spotify等在线音乐服务商,以进一步促进旗下平台业务的增 长。而据三位知情人士透露,Twitter为实现在平台上整合音乐服务的目的,已开始权衡相关收购交易是否值得去动用十多亿美元资金来完成。

 

2. Twitter在其移动应用上曾做过一些尝试,如Twitter Music,一款旨在鼓励用户更多去讨论音乐,并帮助发现音乐的应用——但该应用却未能获得市场认可,最终在今年3月被宣布下架。

 

3. Twitter另外一个考虑收购的对象是Spotify。该公司以在线音乐播放服务为主要业务,截至去年末时的市场估值为40亿美元,与潘多拉相当。不过据知情者回报,Twitter目前并未与此两家公司展开过谈判。

 

苹果Lightning数据接口将可代替耳机插口

 

1. 苹果的MFi(Made-For-iPhone/iPad/iPod)项目,已悄然推出新规格,允许厂商制造通过Lightning接口与iOS设备相连 接的头戴式耳机,从而取代通常的3.5mm耳机插口。

 

2. 使用Lightning数据线传输音频有几大优点。苹果表示,Lightning耳机可通过苹果设备充电(即使设备处于睡眠状态),这有助于降低内置电池的成本。它还可以通过内置电池或外部电源为苹果设备供电。这使用户可以边听音乐边为设备充电。Lightning耳机也将能够接收固件更新。

 

3. 苹果将为Lightning耳机设定两种配置。据苹果描述,标准版将使用最精简的元件,与Lightning耳机模块支持的数字模拟转换器配对。进阶版则同时配置数字信号处理器和数字模拟转换器,并具备数字音频处理功能,如自动消除噪音。

 

博通退出手机基带业务,英特尔联发科或成接盘者

 

1. 美国公司博通近日也对外宣布将放弃其手机基带芯片业务,寻求出售或者关闭。由于放弃这部分业务可以为公司每年节省7亿美元支出,博通股价在周二的美股交易日中一度上涨超过10%。

 

2. 手机芯片行业竞争激烈早已不是什么新鲜事,但博通手机基带业务的退出再次为这个行业敲响了警钟。此前,芯片企业德州仪器宣布因毛利率过低退出竞争手机芯片市场,转而专注其他市场。现在,博通公司以同样的理由宣布退出。

 

3. 就今后行业竞争格局来看,高通、联发科、展讯将会形成三足鼎立的局面。其中,高通在高端市场,联发科在中高端市场,展讯在中低端市场。

 

微软拿出Permacoin,欲与比特币进行竞争

 

1. 微软研究院和马里兰大学,联合出版了一本白皮书,描述了比特币采矿所用的资源可以被重新利用,或者更确切地说,产生一个新的数字货币-Permacoin 。

 

2. 当用户把从巨大的数据池下载的数据存储归档的时候,就会产生Permacoin。挖掘permacoin将较少依赖计算能力,更多地依赖存储空间。Permacoin算法会检测存储的数据,然后根据可用性和凝聚力,用户将被授予一定数量的permacoin。

 

3. Permacoin虚拟货币整个想法是,存储公开的档案数据,对全人类有益,硬件和存储投资将在真实世界产生价值,这种价值的产生是通过在一个去中心化广泛分布的系统中保护和分发数据来实现。

Apple Swift入门教程

1   简介

今天凌晨Apple刚刚发布了Swift编程语言,本文从其发布的书籍《The Swift Programming Language》中摘录和提取而成。希望对各位的iOS&OSX开发有所帮助。

Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来是的编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。

Swift已经存在了多年。Apple基于已有的编译器、调试器、框架作为其基础架构。通过ARC(Automatic Reference Counting,自动引用计数)来简化内存管理。我们的框架栈则一直基于Cocoa。Objective-C进化支持了块、collection literal和模块,允许现代语言的框架无需深入即可使用。(by gashero)感谢这些基础工作,才使得可以在Apple软件开发中引入新的编程语言。

Objective-C开发者会感到Swift的似曾相识。Swift采用了Objective-C的命名参数和动态对象模型。提供了对Cocoa框架和mix-and-match的互操作性。基于这些基础,Swift引入了很多新功能和结合面向过程和面向对象的功能。

Swift对新的程序员也是友好的。他是工业级品质的系统编程语言,却又像脚本语言一样的友好。他支持playground,允许程序员实验一段Swift代码功能并立即看到结果,而无需麻烦的构建和运行一个应用。

Swift集成了现代编程语言思想,以及Apple工程文化的智慧。编译器是按照性能优化的,而语言是为开发优化的,无需互相折中。(by gashero)可以从”Hello, world”开始学起并过渡到整个系统。所有这些使得Swift成为Apple软件开发者创新的源泉。

Swift是编写iOS和OSX应用的梦幻方式,并且会持续推进新功能的引入。我们迫不及待的看到你用他来做点什么。

2   Swift入门

一个新语言的学习应该从打印”Hello, world”开始。在Swift,就是一行:

println("Hello, world")

如果你写过C或Objective-C代码,这个语法看起来很熟悉,在Swift,这就是完整的程序了。你无需导入(import)一个单独的库供输入输出和字符串处理。全局范围的代码就是用于程序的入口,所以你无需编写一个 main() 函数。你也无需在每个语句后写分号。

这个入门会给出足够的信息教你完成一个编程任务。无需担心你还不理解一些东西,所有没解释清楚的,会在本书后续详细讲解。

Note

作为最佳实践,可以将本章在Xcode的playground中打开。Playground允许你编辑代码并立即看到结果。

3   简单值

使用 let 来定义常量, var 定义变量。常量的值无需在编译时指定,但是至少要赋值一次。这意味着你可以使用常量来命名一个值,你发现只需一次确定,却用在多个地方。

var myVariable = 42
myVariable = 50
let myConstant = 42

Note

gashero注记

这里的常量定义类似于函数式编程语言中的变量,一次赋值后就无法修改。多多使用有益健康。

一个常量或变量必须与赋值时拥有相同的类型。因此你不用严格定义类型。提供一个值就可以创建常量或变量,并让编译器推断其类型。在上面例子中,编译其会推断myVariable是一个整数类型,因为其初始化值就是个整数。

Note

gashero注记

类型与变量名绑定,属于静态类型语言。有助于静态优化。与Python、JavaScript等有所区别。

如果初始化值没有提供足够的信息(或没有初始化值),可以在变量名后写类型,以冒号分隔。

let imlicitInteger = 70
let imlicitDouble = 70.0
let explicitDouble: Double = 70

Note

练习

创建一个常量,类型为Float,值为4。

值永远不会隐含转换到其他类型。如果你需要转换一个值到不同类型,明确的构造一个所需类型的实例。

let label = "The width is "
let width = 94
let widthLabel = label + String(width)

Note

练习

尝试删除最后一行的String转换,你会得到什么错误?

还有更简单的方法来在字符串中包含值:以小括号来写值,并用反斜线(“”)放在小括号之前。例如:

let apples = 3
let oranges = 5     //by gashero
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

Note

练习

使用 () 来包含一个浮点数计算到字符串,并包含某人的名字来问候。

创建一个数组和字典使用方括号 “[]” ,访问其元素则是通过方括号中的索引或键。

var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"

var occupations = [
   "Malcolm": "Captain",
   "Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"

要创建一个空的数组或字典,使用初始化语法:

let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()

如果类型信息无法推断,你可以写空的数组为 “[]” 和空的字典为 “[:]”,例如你设置一个知道变量并传入参数到函数:

shoppingList = []   //去购物并买些东西 by gashero

4   控制流

使用 if 和 switch 作为条件控制。使用 for-in 、 for 、 while 、 do-while 作为循环。小括号不是必须的,但主体的大括号是必需的。

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScores += 3
    } else {
        teamScores += 1
    }
}
teamScore

在 if 语句中,条件必须是布尔表达式,这意味着 if score { ... } 是错误的,不能隐含的与0比较。

你可以一起使用 if 和 let 来防止值的丢失。这些值是可选的。可选值可以包含一个值或包含一个 nil 来指定值还不存在。写一个问号 “?” 在类型后表示值是可选的。

var optionalString: String? = "Hello"
optionalString == nil

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

Note

练习

改变 optionalName 为 nil 。在问候时会发生什么?添加一个 else 子句在 optionalName 为 nil 时设置一个不同的值。

如果可选值为 nil ,条件就是 false 大括号中的代码会被跳过。否则可选值未包装并赋值为一个常量,会是的未包装值的变量到代码块中。

switch 支持多种数据以及多种比较,不限制必须是整数和测试相等。

let vegetable = "red pepper"
switch vegetable {
case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
    let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?"
default:    //by gashero
    let vegetableComment = "Everything tastes good in soup."
}

Note

练习

尝试去掉 default ,看看得到什么错误。

在执行匹配的情况后,程序会从 switch 跳出,而不是继续执行下一个情况。所以不再需要 break 跳出 switch 。

可使用 for-in 来迭代字典中的每个元素,提供一对名字来使用每个键值对。

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}

Note

练习

添加另一个变量来跟踪哪个种类中的数字最大,也就是最大的数字所在的。

使用 while 来重复执行代码块直到条件改变。循环的条件可以放在末尾来确保循环至少执行一次。

var n = 2
while n < 100 {
    n = n * 2
}
n

var m = 2
do {
    m = m * 2
} while m < 100
m

你可以在循环中保持一个索引,通过 “..” 来表示索引范围或明确声明一个初始值、条件、增量。这两个循环做相同的事情:

var firstForLoop = 0
for i in 0..3 {
    firstForLoop += i
}
firstForLoop

var secondForLoop = 0
for var i = 0; i < 3; ++i {
    secondForLoop += 1
}
secondForLoop

使用 .. 构造范围忽略最高值,而用  构造的范围则包含两个值。

5   函数与闭包

使用 func 声明一个函数。调用函数使用他的名字加上小括号中的参数列表。使用 -> 分隔参数的名字和返回值类型。

func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")

Note

练习

去掉 day 参数,添加一个参数包含今天的午餐选择。

使用元组(tuple)来返回多个值。

func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
}
getGasPrices()

函数可以接受可变参数个数,收集到一个数组中。

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(42, 597, 12)

Note

练习

编写一个函数计算其参数的平均值。

函数可以嵌套。内嵌函数可以访问其定义所在函数的变量。你可以使用内嵌函数来组织代码,避免过长和过于复杂。

func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}   //by gashero
returnFifteen()

函数是第一类型的。这意味着函数可以返回另一个函数。

func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

一个函数可以接受其他函数作为参数。

func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}

func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)

函数实际是闭包的特殊情况。你可以写一个闭包而无需名字,只需要放在大括号中即可。使用 in 到特定参数和主体的返回值。

numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
    })

Note

练习

重写一个闭包来对所有奇数返回0。

编写闭包时有多种选项。当一个闭包的类型是已知时,例如代表回调,你可以忽略其参数和返回值,或两者。单一语句的闭包可以直接返回值。

numbers.map({number in 3 * number})

你可以通过数字而不是名字来引用一个参数,这对于很短的闭包很有用。一个闭包传递其最后一个参数到函数作为返回值。

sort([1, 5, 3, 12, 2]) { $0 > $1 }

6   对象与类

使用 class 可以创建一个类。一个属性的声明则是在类里作为常量或变量声明的,除了是在类的上下文中。方法和函数也是这么写的。

class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

Note

练习

通过 “let” 添加一个常量属性,以及添加另一个方法能接受参数。

通过在类名后加小括号来创建类的实例。使用点语法来访问实例的属性和方法。

var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()

这个版本的 Shape 类有些重要的东西不在:一个构造器来在创建实例时设置类。使用 init 来创建一个。

class NamedShape {
    var numberOfSides: Int = 0
    var name: String

    init(name: String) {
        self.name = name
    }   //by gashero

    func simpleDescription() -> String {
        return "A Shape with \(numberOfSides) sides."
    }
}

注意 self 用来区分 name 属性和 name 参数。构造器的生命跟函数一样,除了会创建类的实例。每个属性都需要赋值,无论在声明里还是在构造器里。

使用 deinit 来创建一个析构器,来执行对象销毁时的清理工作。

子类包括其超类的名字,以冒号分隔。在继承标准根类时无需声明,所以你可以忽略超类。

子类的方法可以通过标记 override 重载超类中的实现,而没有 override 的会被编译器看作是错误。编译器也会检查那些没有被重载的方法。

class Square: NamedShape {
    var sideLength: Double

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
    }

    func area() -> Double {
        return sideLength * sideLength
    }

    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)."
    }
}

let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()

Note

练习

编写另一个 NamedShape 的子类叫做 Circle ,接受半径和名字到其构造器。实现 area 和 describe 方法。

属性可以有 getter 和 setter 。

class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }

    var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
    }

    override func simpleDescription() -> String {
        return "An equilateral triangle with sides of length \(sideLength)."
    }
}

var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength

在 perimeter 的 setter 中,新的值的名字就是 newValue 。你可以提供一个在 set 之后提供一个不冲突的名字。

注意 EquilateralTriangle 的构造器有3个不同的步骤:

  1. 设置属性的值
  2. 调用超类的构造器
  3. 改变超类定义的属性的值,添加附加的工作来使用方法、getter、setter也可以在这里

如果你不需要计算属性,但是仍然要提供在设置值之后执行工作,使用 willSet 和 didSet 。例如,下面的类要保证其三角的边长等于矩形的变长。

class TriangleAndSquare {
    var triangle: EquilaterTriangle {
    willSet {
        square.sideLength = newValue.sideLength
    }
    }

    var square: Square {
    willSet {
        triangle.sideLength = newValue.sideLength
    }
    }

    init(size: Double, name: String) {
        square = Square(sideLength: size, name: name)
        triangle = EquilaterTriangle(sideLength: size, name: name)
    }
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
triangleAndSquare.square.sideLength
triangleAndSquare.triangle.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.triangle.sideLength

类的方法与函数有个重要的区别。函数的参数名仅用与函数,但方法的参数名也可以用于调用方法(除了第一个参数)。缺省时,一个方法有一个同名的参数,调用时就是参数本身。你可以指定第二个名字,在方法内部使用。

class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes times: Int) {
        count += amount * times
    }
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)

当与可选值一起工作时,你可以写 “?” 到操作符之前类似于方法属性。如果值在”?”之前就已经是 nil ,所有在 “?” 之后的都会自动忽略,而整个表达式是 nil 。另外,可选值是未包装的,所有 “?” 之后的都作为未包装的值。在两种情况中,整个表达式的值是可选值。

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength

7   枚举与结构

使用 enum 来创建枚举。有如类和其他命名类型,枚举可以有方法。

enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescrition() -> String {
        switch self {
        case .Ace:
            return "ace"
        case .Jack:
            return "jack"
        case .Queen:
            return "queen"
        case .King:
            return "king"
        default:
            return String(self.toRaw())
        }
    }
}
let ace = Rank.Ace  //by gashero
let aceRawValue = ace.toRaw()

Note

练习

编写一个函数比较两个 Rank 的值,通过比较其原始值。

在如上例子中,原始值的类型是 Int 所以可以只指定第一个原始值。其后的原始值都是按照顺序赋值的。也可以使用字符串或浮点数作为枚举的原始值。

使用 toRaw 和 fromRaw 函数可以转换原始值和枚举值。

if let convertedRank = Rank.fromRaw(3) {
    let threeDescription = convertedRank.simpleDescription()
}

枚举的成员值就是实际值,而不是其他方式写的原始值。实际上,有些情况是原始值,就是你不提供的时候。

enum Suit {
    case Spades, Hearts, Diamonds, Clubs
    func simpleDescription() -> String {
        switch self {
        case .Spades:
            return "spades"
        case .Hearts:
            return "hearts"
        case .Diamonds:
            return "dismonds"
        case .Clubs:
            return "clubs"
        }
    }
}
let hearts = Suit.Hearts    //by gashero
let heartsDescription = hearts.simpleDescription()

Note

练习

添加一个 color 方法到 Suit 并在 spades 和 clubs 时返回 “black” ,并且给 hearts 和 diamounds 返回 “red” 。

注意上面引用Hearts成员的两种方法:当赋值到 hearts 常量时,枚举成员 Suit.Hearts 通过全名引用,因为常量没有明确的类型。在 switch 中,枚举通过 .Hearts 引用,因为 self 的值是已知的。你可以在任何时候使用方便的方法。

使用 struct 创建结构体。结构体支持多个与类相同的行为,包括方法和构造器。一大重要的区别是代码之间的传递总是用拷贝(值传递),而类则是传递引用。

struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \
        (suit.simpleDescription())"
    }
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

Note

练习

添加方法到 Card 类来创建一桌的纸牌,每个纸牌都有合并的rank和suit。(就是个打字员的活二,by gashero)。

一个枚举的实例成员可以拥有实例的值。相同枚举成员实例可以有不同的值。你在创建实例时赋值。指定值和原始值的区别:枚举的原始值与其实例相同,你在定义枚举时提供原始值。

例如,假设情况需要从服务器获取太阳升起和降落时间。服务器可以响应相同的信息或一些错误信息。

enum ServerResponse {
    case Result(String, String)
    case Error(String)
}

let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")

switch success {
case let .Result(sunrise, sunset):
    let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
case let .Error(error):
    let serverResponse = "Failure... \(error)"
}

Note

练习

给 ServerResponse 添加第三种情况来选择。

注意日出和日落时间实际上来自于对 ServerResponse 的部分匹配来选择的。

TunnelierPortable+SSH使用教程

准备工具

1.TunnelierPortable

2.Chrome浏览器

3.Chrome 的插件 Proxy Switchy

提供下载

1.TunnelierPortable 

2.Chrome浏览器

3.Chrome 的插件 Proxy Switchy

安装软件

这个没有什么好说的,TunnelierPortable 下一步,下一步就行啦,Proxy Switchy只需要在 chrome安装完成后将解压出来的Proxy Switchy!_1_6_3.crx拖到chrome就提示安装了,让我们看一看样子吧:)

BT

ps

 

配置软件

TunnelierPortable 配置:

在login选项卡内填写服务器的地址,端口号,用户名,形式为password密码,并选中保存密码

t1

 

在Services选项卡选中SOCKS代理转发功能,填写地址为本地的127.0.0.1,端口号为1080

t2

 

 

在Options选项卡中将 On Login 中的功能全部点掉(这个是在登录的时候启动桌面等窗口,我们用不到)

t3

 

然后点击登录,就可以看到成功信息了。

接下来是配置 proxy,点击chrom浏览器的灰色小地球,然后点击Options

p1

 

进去后设置一下,比较简单,参考

p2

 

然后点击保存即可,在chrome点击小地球,选择你的配置

p3

然后你会发现,小地球亮了:)接着就能看效果了

twitter

 

哈哈,如果你看不到,试着修改一下你的DNS服务器为 8.8.8.8

dns

 

 

或许我们应该借鉴什么?!团购业者亲历:作为一个糯米团老人,我服美团

我是2011年2月14日情人节那天加入团购业窝窝团的,之后去了24券,24券倒闭后又去了糯米网,经历了三家团购网站,见证了团购业的是是非非,在今天离开团购行业,应该留点文字下来,以后好回忆和学习。

朦胧期
2011年刚加入窝窝团的时候,正是徐茂栋徐总接手窝窝团大力开始发力的时间,徐总运用了他当时在凯威点告(分众无线)的方法拿着钱全国各地的收购当地的团购网站,并开大价钱取挖人,我在福州入职,在福州的时候窝窝团就收购了当地团购网站百客团,之后我被派去厦门扩展,厦门又收购了当地的闪团,之后去了九江,又去了江阴,在江阴把拉手网的人几乎都挖过来了,在江阴之前当经理的月薪3000多的在窝窝团给一万,当销售主管的之前工资2000多的在窝窝团给7000元。而我美名其约扩展经理月薪才2500元。所以当时窝窝团的很多老员工都有想法,此时应该是窝窝团大力搅局市场的时候,窝窝团全国要招聘员工人数达到5000多,借着这股大动作,也顺利排进团购前三名。
这个阶段是我在团购行业的朦胧期,不知道哪家团购网是最好的,哪家以后可以做到第一,感觉业绩都差不多,团购的东西很多商家都一样。 我只有心里想窝窝团这样干应该是不好吧,这么多人,这么高工资,成本太大了吧。我之前公司关门就是成本没控制好,当时估计是美国的纽交所上市是不看盈利,只看规模,所以当时窝窝团可以下这么大的血本去挖人去开括市场,当时还有一个市场搅局者是高朋网,高朋应该是一个奇葩,当时也是高薪到处去挖人,高薪挖人不是奇葩,奇葩的是跟商家合作毛利既然要30%。有的甚至更高。我觉得高朋的领导的脑袋是进水了。也难怪有那么好的老爹腾讯也搞不起来。
洗牌期
7月份,由于我想调去海口窝窝团当销售主管(在窝窝团称销售总监),但是海口那边已经没有这个位置了,让我当销售。于是我就去了24券当营销经理。这时候的24券也开始了跟窝窝团类似的步伐,大力招聘销售,贴钱烧钱,24券在海口站的员工最高达到40多人,目标是要招80人。但是其他网站的销售最多10多个,糯米还不多10个。 为了抢占市场份额,当时跟奥斯卡合作,电影院给的合作价是23元,24券卖18元,一单贴5元。卖了8000多张。亏了将近4万多。这样的扩张和烧钱方法,24券在11月份的时候就顶不住了,开始不给商家结款,之后托太久了,很多商家发现不对劲了,开始到公司搬东西,威胁员工,全国各地爆发了太多这样的事情。之后可以想象24券关门。
这个阶段是团购的洗牌期,很多团购网都被洗出去了,像团宝网,24券,还有很多大大小小的网站都出局了,但是具体谁能当第一,还没有很明确的看出来,只是前三的份额越来越集中。
24券关门后 2011年12月份我开始加入了糯米网,任职高级客户经理,也就是销售,底薪比别的销售高点。这时候的我开始真正的开始跑市场,开始真正的去扫街、去陌拜。这段时间其实更充实、更有干劲,虽然自己的职位从创业的时候总经理,到窝窝团的扩展经理,到24券的营销经理,到现在的销售。但是我的口袋是越来越鼓得,在糯米大家还是很实干,糯米的员工应该是最少的,老总连个办公室都没有,每天做在沙发上跟我们办公,经常干到12点。总体来说在糯米还是收获很多。在糯米干了两年,期间取了老婆,生了儿子,买了房子,买了车子,剩了点票子。虽然房子不大,车子很小,票子很少,但是也是五子登科,所以还是得感谢糯米网。
与美团的差距
其实在2012年的时候海口的糯米网和美团的市场份额都差不多。但是经过有一次万达全国院线跟美团合作,那一次是转折点,当时美团的业绩一下子就涨了很多。之后的2013年美团开始实施了很多战术来开市场。而我们糯米网却从上到下一点反应都没有,所以造成了糯米网每个月的业绩都是3亿左右,美团却蹭蹭的往上涨。
当时美团的战术我现在回想起来有这几个方面:
针对客户方面:
第一:很多品类都可以退款,比如摄影类美团可以退款,糯米不可以退款。所以很多摄影单子在美团卖的非常好,而我们都卖不动。我们销售一直反应,可是那些运营跟石头一样回答这是公司的规定。
第二、美团当时几乎不做全国类的物流单,所以页面很整洁,客户体验比较好,而我们糯米当时很多全国物流单都占据了很多位置。并且物流单的客户体验都非常的差,当时我记我们糯米自己的员工买了物流类的产品都非常失望。
第三 、专注做本地服务类, 所以美团上的商家非常多,特别是餐饮商家比我们多了一倍。我想为什么很多人喜欢去淘宝买东西,因为淘宝什么都有,几乎要什么上淘宝都能找的到。而大家上团购网就是找吃喝玩乐的,所以听到很多身边的人都知道美团网,都会说你们糯米网的东西太少。
针对商家方面:
第一:针对大客户餐饮商家,美团0毛利合作政策,当时海口很多大客户餐饮商家比如拾味馆都是先找我们糯米0毛利合作,但是我们糯米坚持高大上政策“没有毛利不合作”,我们销售一直反应这种商家合作是会对我们带来很多客户和流量的,可是我们上头的运营老总坚持没有毛利不合作。而这时候美团跟这些商家合作唯一要求独家,不能跟糯米合作。致使我们是失去了大量的优质客户。 从而失去了许多流量,这样导致同样的单子在美团和糯米同时上,我们的销量差美团好多倍。
第二:不断升级技术后台,
a、比如跟商家合作延期,我们之前跟商家合作到期时都要重新拿个延期合作的合同去商家那边盖章,而美团直接就可以商家后台电脑上操作了。我们估计是落后了4个月才推出美团一样的功能。
b、商家打款,美团最快推出了一周一结,之后更推出商家自己就可以提款。而我们在商家结款方式上又落后了几个月。
c、美团推出跟商家签个合同,以后再上大单子就不用再签合同。以后再电脑上直接就可以操作上单,而我们糯米上个单子签个合同,再上个单子在去签个合同,浪费大量的时间和物流成本。这个是落后了将近大半年我们才推出。
针对销售团队方面
第一、美团早早就开始以商家数和上单量,以及新增餐饮商家数等考核,而我们糯米之前一年从来没有过这方面的考核,不然你上多少单子,做多少业绩,都没关系。导致我们很多老员工不管努不努力,每月都做那些业绩,很少增长,也不会淘汰。而美团做不好就走了,战斗力强,而我们糯米是一年以后才实施。实施这些后团队销售队伍才开始又活力。可惜有点晚了
第二、美团销售团队分组,分组PK。有竞争。我们海口糯米一年以后才施行。
针对竞争对手方面
第一:美团联手拉手排糯米,美团只要跟商家合作都排糯米网,如果商家还想上团购就让他上拉手,总之排糯米网。 美团这招让我们糯米销售开发新单受阻,而美团不断壮大,等美团撞大后又踹开拉手,直接跟商家搞独家合作。现在美团在海口的市场几乎占据了 70%的市场
美团上述的那些战术在运用的时候,我们糯米永远被动接受,跟着屁股后面挨打,真心想问下当时我们的糯米的运营总监是干什么吃的。
如今离开团购行业,唯一的遗憾就是当初没有加入美团,未来5到10年在020领域肯定是属于美团的。在美团身上学到极致的精神,真正的要为客户,合作伙伴,以及我们员工着想才能真正的做到第一。
写下这篇文章页是为了回忆自己三年来的感悟。也为了把自己的想法跟大家分享。
最后跟大家保证我不是美团的托。
from:虎嗅网

pptp vpn打造远程办公

公司需要远程服务器提供办公服务,但是办公区从地理位置不再一起,有没有米拉专线,那就只能搞虚拟局域网了。

vpn拨号是个不错的选择。正好手上有N台服务器和vps :)

首先检测服务器是否支持pptp,因为是自主的,所以应该不存在这方面的问题

modprobe ppp-compress-18 && echo ok

如果打印出来OK 那就Next ——》

cat /dev/net/tun

cat: /dev/net/tun: 文件描述符处于错误状态

我们可以开始了,这里提供一个一键安装shell吧,就不用那么费劲了,环境centos  32/64bit  我的环境是centos 58 64bit

wget   http://public-static.qiniudn.com/pptpd/pptpd.sh

sh pptpd.sh

安装完成没有报错就OK了,接下来就是拨号吧:我本地是win7

右击网络,属性,开始创建连接

v1

 

 

选择连接到工作区

v2

 

 

 

然后使用VPN来连接吧

v3

 

go on 填写你的VPN的IP地址

v4

下一步,填写用户名密码

v5

 

 

点击连接

v6

 

稍安勿躁,马上就好!

v7