利他才能利己


  • 首页

  • 标签

  • 归档

  • 搜索

小小篮球队

发表于 2017-04-29 | 分类于 随笔 |

1

篮球, 我最喜欢的一项体育运动, 大学的业余时间基本都”泡”在球场, 压根不知道什么是累.

毕业后的第一份工作, 做的比较开心, 大家年龄相仿, 兴趣相投.

小小的团队, 没有任何纷争, 大家互相学习, 氛围及其融洽.

每个周五我们几个人都会提前下班去打一场篮球, 完事后, 一起喝点小酒, 那日子甭提有多他NND的惬意.

公司解散后, 大家各奔东西, 事过境迁, 各有各的工作和生活, 聚在一起的日子也是少之又少, 以前的日子只能怀念了.

人总需要一些非工作之外的兴趣, 整天围绕着工作, 早晚都会疯掉.

有些人喜欢泡泡图书馆, 有些人喜欢打打游戏, 有些人喜欢跑跑步, 有些人喜欢唱唱歌…

不管怎么样, 你需要某种爱好, 来润色一下你的生活, 我选择了篮球运动.

下面, 来说说篮球队中典型的几种人, 大家结合自己的工作和生活, 思考一下吧~

单打独斗

篮球运动是一项集体运动, 需要每个人发挥自己应有的水平, 才能发挥团队的力量.

有些人喜欢单打独斗, 完全不考虑团队中其他成员的感受, 只要球到了他手中, 其他人只能看他的表演, 任凭你喊破嗓子, 他也不会理你.

这种人, 其实是有一定能力的人, 不然也不会也不可能这么做, 只是他们觉得凭一己之力就可以让大家高正无忧了, 自己没有思考过这样做是不是最合适的.

久而久之, 大家看着他的”表演”, 再也不想发挥了, 单打独斗的人慢慢的也累了, 最后大家都身心疲惫, 球队被对方轻而易举地打败.

“指挥官”

球队中有一种人, 自己不努力, 总是喜欢颐指气使, 经常听到他们说这样的话:

你快点跑呀, 积极点…
死死地防着他, 不要让他进攻, 快…
你传球给我呀, 让你别着急, 好了吧, 输了吧…
输了, 都怪你…

听到这些话, 再好脾气的人估计都难以接受, 脾气不好的直接开始打他了吧!

这种人最不受待见, 也最遭人唾骂, 这种人在实际工作中, 可能是你的领导.

偷懒的

篮球运动的确很消耗体力, 如果在万箭齐发的时刻, 有人故意掉链子, 那将是功亏一篑.

大家在打球的时候, 都在为”荣誉”而战, 但是偏偏有人会使点小心眼, 能少跑一步就少跑一步, 能放对方走就放对方走, 绝对不伤害对方一毛一线. 明明可以稍微努力一下, 就可以拿到篮板, 偏偏让对方比自己还矮小的轻而易举的拿走了篮板.

要知道比自己矮小的那个人, 只是努力的跳了一下.

球场上虽然不是让你拼个你死我活, 不要求你全力以赴, 但是尽力而为总是要有的, 这是一种态度.

在实际工作中, 这种”队友”比比皆是, 但是不一定遭人恨, 有些还是很招人喜欢的, 毕竟他们没有抢你的功劳, 处处让着你, 没有他们的这些所谓的付出, 哪能衬托出你的光芒.

鼓励你的

上面说的都是一些”负能量”, 大家一笑而过吧.下面说点正能量的.

在球队中, 还有一种这样的人, 他会察言观色, 觉得你累了, 就告诉大家: “我们应该节奏慢一点, 缓冲一下.”,

当你手感不好的时候, 他会告诉你, 没事, 多来几次就好了, 不要有压力.

当你防守遇到困难时, 他会默默的给你补防, 给你接力, 最大程度的给你信心.

当大家士气不高的时候, 他会站出来投几个漂亮的球, 抑或给对方一个完美的盖帽, 并且鼓励大家不要放弃, 给大家信心, 做大家坚固的后盾.

这种人除了自己有一定的能力外, 还能顾全大局, 并且可以帮助队友, 帮助团队渡过难关, 确实难得.

渴望进步的

球队中, 存在一些新人, 或者是渴望自己能投出漂亮弧线球的人, 他们比不上那些资历老且经验丰富的前辈, 但是他们内心有一份信念: “我要变强!”.

这种人, 跟你讨论球技, 虚心向你学习一切可以提高球技的方法, 即使在观众席上, 他们也能聚精会神的观看, 自己领悟其中的奥妙. 只要你约他出来打球, 他都在第一时间出现在球场, 因为他不想放弃学习的机会.

久而久之, 这些人会变得越来越厉害, 通过不断的学习和摸索, 有了一套自己的打法, 步伐稳健, 再也不是那种接球不稳, 传球频频失误的”毛头小子”了.

这种人, 值得我们去挖掘和鼓励, 如果你正好是那个资历老且经验丰富的前辈, 就传授”真经”给他们吧.
对于你来说, 有人愿意跟你学习, 跟你分享, 也是美事一桩.

何乐而不为呢?

最后

不管你遇到什么样的队友, 如果你愿意, 请胸怀宇宙(当然不是 孙连城 那种啊).

万事万物皆有联系, 愿你能偶尔放下手中的工作, 去选择和爱上另一种乐趣.

五一放假了, 祝大家节日快乐!

iOS: 应用内打开 AppStore

发表于 2017-04-15 | 分类于 iOS |

应用场景

我们的 App 需要在 AppStore 上面打开某个 App 或者游戏, 目的最常见的有:

1.评分评论.
2.推荐下载(App 或者游戏).

很多开发者知道打开 AppStore 只需要一句代码:

1
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itunes app url"]];

这样就很简单的打开 AppStore 了, 但是产品经理问了, 能在我们应用内打开 AppStore 吗?

你当时懵逼了吗?

不要懵逼, 以后只要遇到类似这种问题, 你就问产品经理哪个 APP 这样做了?
然后, 他就给你看别人家的效果, 你就理直气壮地说: “别人可以做到的, 我们也可以做到!”.

应用内打开 AppStore 也很简单.
在 iOS6之后, 苹果已经给我们提供了 SKStoreProductViewController, 大家看一下文档, 你就笑了.

1
2
SKStoreProductViewController
/* View controller to display iTunes Store product information */

应用内打开 AppStore

这里我以在应用内打开 微信 为例子.

效果图如下:
1

从效果图可以看出, 用户在自己的应用内打开 AppStore 后, 不仅可以下载或者打开微信, 还可以直接评论评分, 简直爽(也难怪产品经理这么干).

那我们说一下如何实现上面的效果.

实现方案和步骤

1.包含头文件 #import <StoreKit/StoreKit.h>

2.实现 SKStoreProductViewControllerDelegate

具体代码:

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
- (void)openAppFromAppStore:(NSString *)appid
{
if (nil == appid || appid.length <= 0) {
return;
}

// 加个 loading

SKStoreProductViewController *store = [[SKStoreProductViewController alloc] init];

store.delegate = self;

NSDictionary<NSString *, id> *parameters = @{SKStoreProductParameterITunesItemIdentifier: appid};

[store loadProductWithParameters:parameters completionBlock:^(BOOL result, NSError *error) {

// 结束 loading

if (error) {

NSLog(@"error %@ with userInfo %@", error, [error userInfo]);

// 提示用户发生了错误

// 或者通过 URL 打开 AppStore App.

// NSString *url = @"https://itunes.apple.com/in/app/wechat/id414478124?mt=8";

//[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
else {

[self presentViewController:store animated:YES completion:^{
}];
}
}];
}
/// 用户点击取消会执行该方法
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController
{
[viewController dismissViewControllerAnimated:YES completion:^{

}];
}

调用(@”414478124” 是 微信 的)方式:

1
[self openAppFromAppStore:@"414478124"];

修改 AppStore 的导航栏

产品经理说, 既然你已经实现了上面的功能, 看看能不能把 AppStore 的导航栏改一个牛逼的颜色, 就像上面的大红色.

~

可以, 干!

直接上代码:

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
- (void)openAppFromAppStore:(NSString *)appid
{
if (nil == appid || appid.length <= 0) {
return;
}

// 加个 loading

// 导航栏上面的文字和图片颜色变了
[[UINavigationBar appearance] setTintColor:[UIColor greenColor]];

// 导航栏的大红色出来了
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];

[UINavigationBar appearanceWhenContainedIn:[SKStoreProductViewController class], nil];

SKStoreProductViewController *store = [[SKStoreProductViewController alloc] init];

store.delegate = self;

NSDictionary<NSString *, id> *parameters = @{SKStoreProductParameterITunesItemIdentifier: appid};

[store loadProductWithParameters:parameters completionBlock:^(BOOL result, NSError *error) {

// 结束 loading

if (error) {

NSLog(@"error %@ with userInfo %@", error, [error userInfo]);

// 提示用户发生了错误

// 或者通过 URL 打开 AppStore App.
}
else {

[self presentViewController:store animated:YES completion:^{
}];
}
}];
}

注意事项

1.打开 SKStoreProductViewController 目前只能使用 present 方式, 不可以使用 push 的方式.

否则会报错:

1
2
//Terminating app due to uncaught exception 'SKUnsupportedPresentationException',
//reason: 'SKStoreProductViewController must be used in a modal view controller'

2.加入 loading

在应用内打开 AppStore, 为了不让用户傻等(网络不好的时候, 打开很慢), 可以加入 loading, 缓解一下用户急躁的心情.

找合伙人, 不易

发表于 2017-03-26 | 分类于 随笔 |

早在高中时期, 读过 <三言> 中的 <警世通言>, 第一章写的是 俞伯牙摔琴谢知音, 讲的是钟子期和俞伯牙的故事.

读完之后, 整个人都觉得难受, 心理有说不出的滋味, 眼泪竟夺眶而出.

流传的这首诗, 可以感受下.

摔碎瑶琴凤尾寒,子期不在对谁弹!
春风满面皆朋友,欲觅知音难上难。
势利交怀势利心,斯文谁复念知音!
伯牙不作钟期逝,千古令人说破琴。

自己工作之后, 对 欲觅知音难上难 这句话尤为赞同.

年少轻狂的你, 藏着要改变世界的心, 残酷的现实会抹去你凸起的棱角, 岁月和环境会让你变得越发不安.

不安的世界, 让你茫然.

于是, 点上一支烟, 回顾折腾的人生, 笑叹: 别人笑我太疯癫, 我笑他人看不穿.

可惜, 我们不是唐寅, 没有这份洒脱和奔放, 毕竟时代也大相径庭.

~ 好了, 回到现实中来.

刚毕业, 你会把主要精力放在如何把工作做好, 维持自己的生计上面, 如果能跟身边的大牛学到一些专业知识, 再苦再累, 你都是开心的.

渐渐地, 你发现知识(专业的和非专业的知识)真是要活到老学到老, 永无止境, 无法像武侠片里面演得那样移花接木, 斗转星移. 呜呼, 脚踏实地的做好本职工作, 顺便能拓展一下自己的交际圈, 扩大自己的知识面, 还是很有必要的.

各行各业都有非常突出的人才, 很多时候, 我们只能望洋兴叹.

如果你能遇到一个肯与你分享和交流, 或者是愿意将自己的实践分享给你的人, 那你算是上辈子积了大德了. 阿弥陀佛!

我把这样的人称之为 恩人, 也算是 知音.

以前, 很多朋友会问如果将来自己开公司, 是否愿意接受现在的自己, 我的回答是一定接受. 如果还有人问这个问题, 我会另外再追加一个问题:

如果你开公司, 你是否愿意接受和你现在一起工作的同事?或者说你是否愿意让他成为你的合伙人?

这些问题, 看似玩笑, 实则很现实很残酷, 一旦你决定要去做成某件事情, 立志要实现自己的抱负和理想的时候, 你的立场会和其他人千差外别.首先要考虑的是要和谁一起共谋事, 才能真正的帮到自己, 并且也能帮到别人.因为选择是双向的, 能找到和你一拍即合的人, 也确实不易.但愿任何一个渴望成功并付出行动的人, 能找到自己的合伙人, 找到自己的知音.

真正的成功者, 不是沉浸在多少人让你成功的喜悦中, 而是你让多少人和你一起分享了成功的喜悦的人.

说到这里, 本人只是想说明白一个道理, 送给即将或者已经在职场奋斗的人:

踏踏实实的做事并没有错, 但是找到值得 “托付终身” 的人确实不易, 你现在能做的只有用知识来武装自己, 让自己变强.

在职场中, 你会遇到很多让你不爽的人或者事. 记住, 要做到 对事不对人, 不要太委屈自己, 大丈夫能屈能伸, 该出手时就出手, 没有什么大不了.

如果真的觉得有些人或者有些事不值得你浪费时间, 就离它们远点. 惹不起但可以躲得起, 你说呢?

酌一壶小酒, 老夫聊发少年狂!

让自己变强

发表于 2017-03-10 | 分类于 随笔 |

当你读到这篇文章的时候, 我其实还不知道『怎么让自己变强』.
具体说, 就是没有一套让你或者让他变强的武林秘籍.

只能结合自己经历的事, 分享给大家, 希望能感同身受!

这几天加班加地有点猛, 浑然不知周末轮回了.
心理总是在念叨, 好久没有在公众号涂鸦了, 手痒痒了.
趁今晚回来早(22:30回到家), 就动笔了.

『让自己变强』, 这句话说着很简单, 但不是任何人都能意识到这几个字带来的力量.

在「明朝那些事儿」中有这么一段:

我们经常会产生一个疑问,那就是怎样才能获得其他国家及其人民的尊重,在世界上风光自豪一把,其实答案很简单——国家强大。

看到这里, 感触颇深.

在团队中成长

团队成长的主观条件是团队的成员要成长, 不然团队哪里来的成长.

如果你是作为一个团队或者小组的负责人, 会面临各种各样的问题, 比如需要跟团队以外的部门谈合作, 需要跟老板汇报工作, 还要处理内部的问题等等诸如此类!

我觉得安邦需安内, 也就是说要先搞定团队内部的各种事物, 人是比较复杂的感情动物, 你不好也不能控制别人的情绪. 所以, 需要对事不对人!你不能说, 你看他长得不好看, 就知道工作做不好类似的话.

这样一说, 基本两个人就结下了梁子.迟早会爆发.

首先, 要给团队成员希望, 让大家都认识到有统一的目标.

其次, 让每个人给出工作和实行计划, 制定自己的考核目标.对做出突出贡献的成员奖励, 每个人都需要得到尊重, 而奖励是最大的尊重.

最后, 加强与团队成员之间的沟通, 互相帮助, 让大家能够相互信任和鼓励, 良好有效的沟通, 事半功倍.

作为团队负责人, 肯定希望手下的人各个骁勇善战, 百战百胜, 但是现实中很难做到, 其实也没有必要.
西游记告诉我们, 唐僧带领的团队才是最好的团队.

少埋怨多给予帮助

每个人生活和工作的环境不一样, 在不同的地点不同的时间面对不同的事情, 都会有不同的看法.

世界上任何一种选择, 都是命中注定的, 没有人能强迫你去做出任何错误的选择, 除了你自己.

在自己所处的环境中, 要么你能改变环境使其来适应自己, 要么就离开这个自己不适应的环境, 不要去抱怨.

唉声叹气, 不仅仅影响自己的工作效率和生活质量, 还会影响到别人.
成天在抱怨, 觉得谁谁都不行, 自己才是最牛逼的, 日行见久, 你就是那个充满负能量的人, 当别人觉悟到的时候, 就会离你而去, 岂不咎由自取?!我想这也是微信朋友圈只有点赞没有非点赞的原因吧!

如果觉得自己的同事或者朋友有所欠缺, 就想办法去帮助他, 鼓励他, 把你认为一些好的方式和方法传授给他. 说不定哪天因为你的一句话或者一个方法, 他就走上人生巅峰了, 哈哈!

从现在开始, 忘记埋怨, 给予别人更多的帮助和鼓励.

培养自己的专注力

专注力, 是一个很神奇的东西.

如果一个人没有专注力, 很难再有所突破, 据说牛顿是在做梦的时候, 发明了很多折磨广大青少年的牛顿定律的.

每个人在自己的行业上, 多少都有短板. 有短板是情有可原的, 但是首先你得认识到自己的短板, 然后再指定计划去突破他.

要想进步, 必须面对自己的不足.

比如, 工作上需要你学会某种技术, 如果在某个时间点, 你没有学会, 可能就会丢掉饭碗, 你就会不顾一切的去学习, 直到学会会用为止. 这个过程, 你就是在专注这件事情, 回头想想咬咬牙, 还是可以办到的, 没有什么大不了的.

每天给自己一点时间, 专注去做一件事情, 坚持下来, 你会发现, 学习和进步就是 feel feel 倍儿爽.

最后分享给大家一句话:

不能改变别人的时候, 试着改变一下自己或许就能把事情变通了.

Tomcat8 配置 HTTPS

发表于 2017-02-15 | 分类于 Server |

博客 [Tomcat8 域名配置] 介绍了如何在本地配置 Tomcat8 的域名以及通过域名来访问对应的资源.

今天继续跟大家分享如何配置 Tomcat8 的 HTTPS (单向认证), 本篇博客的主要内容如下:

1.配置 Tomcat 的 HTTPS.
2.通过 HTTPS + ip 的方式来访问资源.
3.通过 HTTPS + 域名 的方式来访问资源.

配置要求

1.安装了 JDK, 并配置了其相关的环境变量.可参考 Mac 配置 JDK1.8.

2.安装了 Tomcat8, 并配置了其相关的环境变量.可参考 Mac 配置 Tomcat8.

生成证书

获取证书可以去购买, 这里是在本地机器搭建, 使用 JDK 自带的工具 keytool 生成即可.

打开 mac 终端, 执行:

1
keytool -v -genkey -alias tomcat -keyalg RSA -keystore ~/Desktop/tomcat.keystore

紧接着, 会出现一些让你输入信息的交互信息, 第一个是让你输入 密钥库密码(口令), 我输入的是 1234567, 其他信息可以任意输入内容, 在最后一步, 问你生成的 密钥口令 和 密钥库的口令 是否相同, 如果相同就直接回车, 我这里是直接回车的, 即密码相同, 都是 1234567.

这样就生成了所谓的证书.

配置 HTTPS

通过修改 server.xml 来配置.

将 tomcat.keystore 文件复制到 Tomcat 的 conf 目录.

修改 server.xml 文件, 增加一个 Connector, 内容如下:

1
2
3
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"  
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="conf/tomcat.keystore" keystorePass="1234567"/>

注意, keystoreFile 是证书文件, keystorePass 是密码, 这里配置一定要正确.

配置 HTTPS + IP

配置一个虚拟主机, 修改 server.xml 文件, 增加 Host:

1
2
3
4
<Host name="192.168.1.103" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false"  xmlNamespaceAware="false">
<Context path="" docBase="test" debug="0" reloadable="true" crossContext="true"/>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="tot_log." suffix=".txt" timestamp="true"/>
</Host>

配置 name=”192.168.1.103” 是你本机的 ip 地址.

这个在博客 [iOS: 聊聊 UIWebView 缓存] 中有详细的介绍, 这里不再赘述.

启动 Tomcat, 进行测试.

这里需要到 Tomcat 的 bin 目录下, 执行:

1
sudo startup.sh

启动成功后, 打开浏览器, 输入: https://192.168.1.103:8443/test.html, 这个时候, 会弹出如下的警告(提示不安全):
1

直接点击 Advanced 后再点击 Proceed to 192.168.1.103:8443(unsafe) 处理即可看到页面内容.

配置 HTTPS + 域名

修改 server.xml, 增加 Connector:

1
2
3
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"  
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="conf/tomcat.keystore" keystorePass="1234567"/>

修改 server.xml, 增加 Host:

1
2
3
4
<Host name="www.mark.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false"  xmlNamespaceAware="false">
<Context path="" docBase="test" debug="0" reloadable="true" crossContext="true"/>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="tot_log." suffix=".txt" timestamp="true"/>
</Host>

修改 /etc/host 文件, 增加:

1
127.0.0.1 www.mark.com

启动 Tomcat, 在 bin 目录, 执行:

1
2
shutdown.sh
sudo startup.sh

启动成功后, 打开浏览器, 输入 https://www.mark.com:8443/test.html, 如果弹出警告, 可以像如上处理来显示页面内容.

如果你这里配置失败了, 请修改一下端口号, 如将 8443 改为 8433.
重启 Tomcat 在试一下.

参考

Apache 官方文档: ssl-howto

Tomcat8 域名配置

发表于 2017-02-13 | 分类于 Server |

博客 [Mac 配置 Tomcat8] 介绍了在 Mac 下安装和启动 Tomcat.

接下来介绍, 如何在本地配置 Tomcat8 的域名.

网上有很多关于 Tomcat 如何配置单域名或者多域名的文章, 很多都是翻译或者复制别人的, 根本没有实践过, 害人不浅!

结合自己的实践, 把配置的整个过程分享给大家, 希望能帮到你.

下面进入正题.

修改端口

在 Tomcat 的安装(其实是解压的)目录 /conf 下有 server.xml 文件.

将下面内容:

1
2
3
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

修改为:

1
2
3
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

添加 web 项目

这一步主要是为了后面测试.

很简单, 在 Tomcat 的安装目录 webapps 下面新建 test 文件夹, 里面创建一个 html 文件即可.
这里将其命名为 test.html.

test.html 内容见后面的附录即可.

配置域名

增加虚拟主机配置.还需要修改 server.xml 文件.

在 server.xml 文件中, 在标签 和 之间增加下面的内容:

1
2
3
4
<Host name="www.mark.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false"  xmlNamespaceAware="false">
<Context path="" docBase="test" debug="0" reloadable="true" crossContext="true"/>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="tot_log." suffix=".txt" timestamp="true"/>
</Host>

其中, www.mark.com 是我自己任意取的一个域名, docBase=”test” 是指向上面新建的 test 目录.

配置域名解析

由于部署在本地, 需要修改 host.

修改 /etc/host 文件, 需要 sudo 权限:

1
sudo vim /etc/host

增加如下内容:

1
127.0.0.1 www.mark.com

验证配置

这一步, 验证配置是否生效.

启动 Tomcat, 这里的操作比较特殊, 需要 sudo 权限来启动 Tomcat, 否则会报下面的错误:

1
2
org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-nio-80"]
java.net.SocketException: Permission denied

因为, 只有 root 用户才可以使用 1024 以下的端口号.

正确姿势:

cd 进入 Tomcat 的 bin 目录

1
cd ~/Tomcat/bin

执行:

1
sudo startup.sh

成功后, 打开浏览器, 输入 http://www.mark.com/test.html, 即可看到页面内容.

配置另一个域名

可以配置另外的一个域名, 比如 www.ithome.com, 即多增加一个虚拟主机配置.

在 server.xml 增加:

1
2
3
4
<Host name="www.ithome.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false"  xmlNamespaceAware="false">
<Context path="" docBase="test" debug="0" reloadable="true" crossContext="true"/>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="tot_log." suffix=".txt" timestamp="true"/>
</Host>

配置 DNS, 同理修改 etc/host 文件:

1
127.0.0.1 www.ithome.com

可以看出, 在浏览器输入 http://www.ithome.com/test.html 和 http://www.mark.com/test.html 效果是一样的.

附录

test.html 文件内容

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
<p>
<em>Sample</em> text</p>
<p>
Now I input another line, with fancy<u><strong><em>styles</em></strong>
</u>.</p>
<p>
<em>Sample</em> text</p>
<p>
Now I input another line, with fancy <u><strong><em>styles</em></strong>
</u>.</p>
<p>
mark.zhang is an itman.
</p>
<style>
.button {
background-color: #4CAF50;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 86px;
margin: 50px 200px 100px 300px;
cursor: pointer;
border-radius: 15;
}
</style>
<p>
<button type="button" onclick="myFunction()" class="button">Try it</button>
</p>
<script>
function myFunction() {
alert("Blog: www.veryitman.com");
};
</script>

ATS: HTTPS 认证

发表于 2017-02-08 | 分类于 iOS , 网络协议 |

简介

在 ATS: HTTP/HTTPS 协议介绍 中介绍了一些关于 HTTP/HTTPS 的概念以及相关的基本知识。

今天来聊聊关于 HTTPS 的认证方式和过程。

说 HTTPS 认证前,我们先了解一下几个相关概念。

关于加密的几个概念

1. SSL 协议加密方式

SSL 既用了对称加密,也用了非对称加密。

在建立传输链路时, SSL 首先对对称加密的密钥使用公钥进行非对称加密,链路建立好之后,SSL 对传输内容使用对称加密。

下面是两种加密方式的对比:

1.1、对称加密

对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥,这种方法在密码学中叫做 对称加密算法,对称加密算法使用起来简单快捷,密钥较短,且破译困难,除了数据加密标准(DES),另一个对称密钥加密系统是国际数据加密算法(IDEA),它比 DES 的加密性好,而且对计算机功能要求也没有那么高。
IDEA 加密标准由 PGP(Pretty Good Privacy)系统使用。

该加密方式,速度快,可加密内容较大,用来加密会话过程中的消息。

1.2、非对称加密

1976年,美国学者 Dime 和 Henman 为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”。
相对于 对称加密算法 这种方法也叫做 非对称加密算法。
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey). 公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

该加密方式,速度较慢,能提供更好的身份认证技术,用来加密对称加密的密钥。

2. 数字证书

一种文件的名称,好比一个机构或人的签名就好比一个公司的公章一样,能够证明这个机构或人的真实性,其中包含的信息,用于实现上述功能。

CA 证书(即数字证书)是由 CA(Certification Authority,证书颁发机构)机构发布的数字证书。其内容包含电子签证机关的信息、公钥用户信息、公钥、签名和有效期。这里的公钥是服务端的公钥、签名是指用 hash 散列函数计算公开的明文信息的信息摘要,然后采用 CA 的私钥对信息摘要进行加密,加密完的密文就是签名。 即 证书 = 公钥 + 签名 +申请者和颁发者的信息。 客户端中因为在操作系统中就预置了 CA 的公钥,所以支持解密签名(因为签名使用 CA 的私钥加密的)。

我们为什么需要 CA 认证机构颁发证书?

HTTP 协议被认为不安全是因为传输过程容易被监听者勾线监听、伪造通信方以及窃取网络通信内容,而 HTTPS 协议主要解决的便是网络传输的安全性问题。

我们假设不存在认证机构,任何人都可以制作证书,这带来的安全风险便是经典的 中间人攻击(Man-in-the-MiddleAttack,简称 “MITM攻击”)问题。

推荐大家看看 网络世界背后的“功臣”——CA 认证 这篇文章。

3. 加密和认证

加密是指通信双方为了防止敏感信息在信道上被第三方窃听而泄漏,将明文通过加密变成密文,如果第三方无法解密的话,就算获得密文也无能为力。

认证是指通信双方为了确认对方是值得信任的消息发送或接受方,而不是使用假身份的非法者,采取的确认身份的方式。

只有同时进行了加密和认证才能保证通信的安全,因此在 SSL 通信协议中这两者(加密和认证)都被使用。

加密一般使用 对称加密算法 和 不对称加密算法,最常见的算法非对称加密就是 RSA 加密算法。

4. 消息摘要

这个技术主要是为了避免消息被篡改,消息摘要也称之为数字摘要。

消息摘要是把一段信息通过某种不可逆的算法,得出一串字符串。这个字符串就是消息的摘要,如果消息被篡改(发生了变化),那么摘要也一定会发生变化,当然了如果两个不同的消息生成的摘要是一样的,那么这就叫发生了 碰撞。好的摘要算法是没有人能从中找到 碰撞 或者说极度难找到。

消息摘要的算法主要有 MD2、MD4、MD5、SHA-1、SHA-256、RIPEMD128、RIPEMD160 等,在证书领域,一般都是用 SHA(安全哈希算法)。消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。

数字证书、加密和认证、消息摘要三个技术结合起来,就是在 HTTPS 中广泛应用的证书(certificate),证书本身携带了加密/解密的信息,并且可以标识自己的身份,也自带消息摘要。

HTTPS 认证方式

分为单向和双向认证。

单向认证

单向认证较简单,只需要客户端校验服务端的证书的合法性即可。换句话说,只需要客户端验证 SSL 服务器身份,不需要服务端验证 SSL 客户端身份。 也就是说单向认证不需要客户端保存 CA 证书即单向认证 SSL 协议不需要客户拥有 CA 证书。

该认证过程使用下面的流程图来表示:
1

双向认证

双向认证和单向认证原理基本一致,但是需要双方都校验对方的证书的合法性。换句话说, 要求服务器和客户端双方都有证书,客户端需要校验服务端,服务端也需要校验客户端。 也就是说双向认证需要客户端、服务端都要保存证书。

该认证过程使用下面的流程图来表示:
1

这里总结一下双向通信的流程🤦‍。

第1步:客户端向服务端发起请求

这个过程主要做了下面两件事情:

①、客户端生成随机数 R1 发送给服务端;

②、告诉服务端自己支持哪些加密算法;

第2步:服务器向客户端发送数字证书

①、服务端生成随机数 R2;

②、从客户端支持的加密算法中选择一种双方都支持的加密算法(此算法用于后面的会话密钥生成);

③、服务端把证书、随机数 R2 和会话密钥生成算法,一起发给客户端;

第3步:客户端验证数字证书

①、验证证书的可靠性,先用 CA 的公钥解密被加密过后的证书,能解密则说明证书没有问题,然后通过证书里提供的摘要算法对数据进行摘要计算,然后通过自己生成的摘要与服务端发送的摘要比对,比对如果一致表示通信内容没有被修改;

②、验证证书合法性,包括证书是否吊销、是否到期、域名是否匹配,通过后则进行后面的流程;

③、获得证书的公钥、会话密钥生成算法、随机数 R2(服务端生成的);

④、客户端生成第三个随机数 R3;

⑤、根据会话秘钥算法使用 R1、R2、R3 生成会话秘钥;

⑥、用服务端证书的公钥加密随机数 R3 并发送给服务端;

第4步:服务器得到会话密钥

①、服务器用私钥解密客户端发过来的随机数 R3;

②、根据会话秘钥算法使用 R1、R2、R3 生成会话秘钥;

第5步:客户端与服务端进行加密会话

①、客户端发送加密数据给服务端,客户端加密数据后发送给服务端。

②、服务端响应客户端,服务端用会话密钥解密客户端发送的数据,然后用会话密钥把响应的数据加密发送给客户端;

③、客户端用会话密钥解密服务端响应的数据;

从上面可以看出,前4步属于双方的通信握手过程,第5步才进行真正的通信。在握手的过程中使用了 非对称加密 主要用于生成后续通信的密钥,在后续的数据通信中使用了 对称加密。

随机数的产生

不管是单向认证,还是双向认证,都有随机数的产生和发送,其中 R1、R2 都是明文传输,只有 R3 是加密传输的。

R1:Client Random,是由客户端产生的随机数;

R2:Server Random,是由服务端产生的随机数;

R3:是客户端产生的且使用密钥加密的随机数,也称之为 Premaster secret;

主密钥(Master Secret)是由预备主密钥 Premaster secret 即 R3、R1 和 R2 通过 PRF(PredoRandomFunction,伪随机数函数) 函数生成的(不过在 TLS 1.3 中,不再使用 PRF 这种算法了,而是采用更标准的 HKDF 算法来进行密钥的推导),后续客户端、服务端使用的 会话密钥 则是由主密钥根据一定的算法生成的。另外要注意的是,会话密钥也会变的,只是在当前某个会话中它是不变的另外建立会话后它又改变了。

随机数的产生流程图:
1

无论是单向认证还是双向认证都会生成三个随机数即上述流程中的 R1、R2、R3,根据三个随机数创建一个对称加密的秘钥。前两个随机数可以被抓包拿到,但第三个随机数已经使用非对称加密算法加密过,所以最终生成的秘钥是保密的。对称秘钥的安全靠第三个随机数的不可破解来保证。理论上来说,只要服务器的公钥足够长,那么 R3(也被称之为 Premaster secret) 可以保证不被破解。但是为了足够安全,可以考虑把握手阶段的算法从默认的 RSA 算法改为 Diffie-Hellman 算法(简称 DH 算法)。

我们思考一个问题:为何需要生成3个随机数,1个不行吗?

1、并不是每个主机都能产生完全的随机数,有很多产生的随机数只是弱随机数而已如范围小可能被猜测,这样就不安全了;

2、用 3 个随机数一起生成密钥能使得伪随机数更接近随机;

大家可以看看 TLS 中的密钥计算 这篇文章,里面详细的讲解了随机数生成的原理以及不同 TLS 版本生成会话密钥的差异。

推荐

推荐在线流程图工具:

ProcessOn.

推荐博文:

1、图解SSL/TLS协议

2、HTTPS的七个误解(译文)

3、对称加密和非对称加密介绍和区别

4、你连HTTPS 原理没搞懂,还给我讲“中间人攻击”

本文中参考了上面文章的部分内容,感谢以上文章作者们。

ATS: HTTP/HTTPS 协议介绍

发表于 2017-02-06 | 分类于 iOS , 网络协议 |

苹果在2017年要求 App 必须支持 HTTPS,不过, 这个要求,,最后又被苹果自己延期了。我只能说,苹果的开发哥哥们真会玩…
但是不管怎么说,作为一名合格的程序员还是有义务和责任了解并理解 HTTPS 整个通信过程以及原理的。

该系列博客介绍 iOS 上面的 ATS 以及相关的 HTTPS 知识,分为两篇来分享。

本篇是第一篇,第二篇:ATS: HTTPS 认证 。

今天先简单了解一下 HTTPS 以及相关的知识。

相关名词

先了解一下相关的常用名词。

1.HTTP

HyperText Transfer Protocol,超文本传输协议。

2.HTTPS

Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议。

3.SSL

Secure Socket Layer,安全套接字层。

4.TLS

Transport Layer Security,传输层安全.其前身就是 SSL.

5.ATS

App Transport Security,应用传输安全。

协议介绍

HTTP

HTTP 全称是 HyperText Transfer Protocol,即超文本传输协议,是互联网上使用最广泛的一种协议,所有 WWW 文件必须遵循的标准。

HTTP 协议传输的数据都是未加密的, 也就是明文的,因此使用 HTTP 协议传输隐私信息非常不安全。默认使用 TCP 端口 80.

HTTPS

安全的超文本传输协议,Hyper Text Transfer Protocol over Secure Socket Layer,网景公式设计了 SSL(Secure Socket Layer) 协议用于对 HTTP 协议传输的数据进行加密,保证会话过程中的安全性。

HTTPS 协议默认使用 TCP 的 443 端口。

拆分 HTTPS

SSL 协议加密方式

SSL 协议即用到了对称加密也用到了非对称加密(公钥加密),在建立传输链路时,SSL 首先对对称加密的密钥使用公钥进行非对称加密(主要用于证书校验,这里指的证书是CA认证机构颁发的证书也就是常说的数字证书),链路建立好之后,SSL 对传输内容使用对称加密。

1、对称加密(通信双方使用同一个密钥解密)
速度高,可加密内容较大,用来加密会话过程中的消息。

2、非对称加密(通信双方使用不同密钥解密或者解密)
加密速度较慢,但能提供更好的身份认证技术,用来加密对称加密的密钥。

HTTP+SSL

HTTPS,可以看做是 HTTP+SSL,所以我们应该把重点在 SSL 上面。

HTTPS

在 HTTP 基础上提出的一种安全的 HTTP 协议,因此可以称为安全的超文本传输协议。

HTTP 协议直接放置在 TCP 协议之上,而 HTTPS 提出在 HTTP 和 TCP 中间加上一层加密层。

从发送端看,这一层负责把 HTTP 的内容加密后送到下层的 TCP,从接收方看,这一层负责将 TCP 送来的数据解密还原成 HTTP 的内容。

SSL(Secure Socket Layer)

是 Netscape 公司设计的主要用于 WEB 的安全传输协议.
它在 HTTPS 协议栈中负责实现上面提到的加密层.

一个 HTTPS 协议栈大致是这样的:
1

TLS

HTTPS,也称作 HTTP over TLS.

TLS (传输层安全, Transport Layer Security) 的前身是 SSL,TLS 1.0 通常被标示为 SSL 3.1,TLS 1.1 为 SSL 3.2,TLS 1.2 为 SSL 3.3.

苹果 ATS (App Transport Security),要求支持 HTTPS 的 TLS 版本最低为 V1.2.

下图描述了在 TCP/IP 协议栈中 TLS(各子协议)和 HTTP 的关系:
1

其中 Handshake protocol,Change Ciper Spec protocol 和 Alert protocol 组成了 SSL Handshaking Protocols.

SSL 和 TLS 的发展历史:

1994年,NetScape 公司设计了 SSL 协议(Secure Sockets Layer)的 1.0 版,但是未发布。

1995年,NetScape 公司发布 SSL 2.0 版,很快发现有严重漏洞。

1996年,SSL 3.0 版问世,得到大规模应用。

1999年,互联网标准化组织 ISOC 接替 NetScape 公司,发布了 SSL 的升级版 TLS 1.0 版。

2006年和2008年,TLS 进行了两次升级,分别为 TLS 1.1 版和 TLS 1.2 版.最新的变动是2011年 TLS 1.2 的修订版。

TLS 1.3 改动会比较大,目前还在草案阶段。

HTTP 和 HTTPS 区别

HTTPS 和 HTTP 的区别主要为以下四点:

1、HTTPS 协议需要到 CA 申请证书,一般免费证书很少,需要交费,费用越高那么安全性会越好,所谓一分价钱一分货在这里被体现的淋漓尽致。

2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SLL/TLS 加密传输协议(非对称加密)。

3、HTTP 和 HTTPS 不同的连接方式,用的端口也不一样,前者是 80,后者是 443.

4、HTTP 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议更加安全。

RN: Yarn

发表于 2017-02-05 | 分类于 ReactNative |

React Native 正式版已经更新到 0.41.1 了.

最近使用 react-native-cli 来创建 React Native 工程, 提示如下信息:

1
2
3
This will walk you through creating a new React Native project in /Users/mark/workspace/mzProjs/ReactNative/LatestRN
Installing react-native...
Consider installing yarn to make this faster: https://yarnpkg.com

其实 Yarn 也一直在更新, 最新版本 v0.20.0.

官网对应的有中文版本和中文文档, 可以 点此进入.

Yarn 简介

一句话介绍:

A new package manager for JavaScript

Yarn 是一个依赖管理工具,它能够管理你的代码,并与全世界的开发者分享你的代码.

Yarn 是高效、安全和可靠.

1.高效: 使用了缓存, 可以很快的获取已经 download 的包.
2.安全: 在代码被执行之前,会使用CheckSum算法验证每一个依赖包的完整性.
3.可靠: 在不同平台(windows/mac/linux)只要是同一份配置文件, 执行结果是一样的.

还有很多特性:

1
2
3
4
5
6
7
8
9
10
11
12
Offline Mode
If you've installed a package before, you can install it again without any internet connection.
Deterministic
The same dependencies will be installed the same exact way across every machine regardless of install order.
Network Performance
Yarn efficiently queues up requests and avoids request waterfalls in order to maximize network utilization.
Same Packages
Install any package from npm and keep your package workflow the same.
Network Resilience
A single request failing won't cause an install to fail. Requests are retried upon failure.
Flat Mode
Resolve mismatching versions of dependencies to a single version to avoid creating duplicates.

Yarn 能够让你使用其他开发者开发的代码,让你更容易的开发软件.

代码是通过依赖包 (有时也被称为组件). 在每一个依赖中会定义一个 package.json 文件,用来描述这个依赖包中所有要被分享的代码.

Yarn 是开源的, 点击 Github 了解更多.

对比 npm 和 yarn, 可以阅读文章:
Yarn vs npm: Everything You Need to Know

中文版:
译 Yarn vs npm: 你需要知道的一切

安装 Yarn

具体安装的教程, 可以参考官网的 安装教程.

在 MacOS 上面使用 Homebrew 安装很方便, 两个命令即可完成.

下面具体说说操作步骤.

强烈开发同事购买一个 VPN, 这个年头没有 VPN, 日子不好过.

1.更新 brew

1
brew update --verbose

最后加上参数 --verbose, 不然等待的过程很煎熬, 没有任何提示信息.

2.安装 yarn

1
brew install yarn

在安装过程中, 如果提示如下信息:

1
2
3
4
5
Please note by default only English locale support is provided. If you need
full locale support you should either rebuild with full icu:
`brew reinstall node --with-full-icu`
or add full icu data at runtime following:
https://github.com/nodejs/node/wiki/Intl#using-and-customizing-the-small-icu-build

可以重新安装已经安装的 node, 执行命令:

1
brew reinstall node --with-full-icu

在执行上面安装命令的时候, 如果卡住不动或者很久, Ctrl+C 终止当前的操作, 重新操作一遍即可.

安装成功后, 可以查看安装的版本信息, 执行

1
yarn --verbose

会显示如下信息:

1
2
3
4
5
yarn install v0.20.0
verbose Performing "GET" request to "https://yarnpkg.com/latest-version".
[1/4] 🔍 Resolving packages...
success Already up-to-date.
✨ Done in 0.29s.

使用 brew 安装 Yarn 后, 不需要设置环境变量.

Yarn 与 React Native

在 React Native 0.37 版本中已经加入了对 Yarn 的支持.

可以在 React Native 的官方的这篇 Blog 找到更多信息.

用 Yarn 创建 React Native 工程

既然 RN 已经支持了 Yarn, 那么就可以使用 Yarn 来管理和创建 RN 工程了.

使用 Yarn, 必须满足几个条件:

1.react-native-cli 的版本不能小于 1.2.0 版本.
2.React Natvie 必须是 0.37 及以上的版本.

1
react-native init MZLatestRN

当你安装好 Yarn 后, 执行上面的命令可以出现提示信息:

1
2
3
This will walk you through creating a new React Native project in ~/workspace/Projs/ReactNative/MZLatestRN
Using yarn v0.20.0
Installing react-native...

可以看出, RN 会使用 Yarn 来创建工程.

其中, ~/workspace/Projs/ReactNative 是我本地的工作目录. MZLatestRN 是要创建的 RN 工程名称.

如果你的网络好的话, 大概1分钟就可以创建成功.

工程目录:
1

可以看出多了 yarn.lock 文件.

Yarn 还在茁壮成长, 希望它越来越好, 更多的使用和工作原理可以参考 官方 Doc, 介绍的很详细.

安装 PHP 遇到的问题

发表于 2017-02-02 | 分类于 Server |

简介

在博客 PHP 开发准备 介绍了安装并部署 PHP 程序到 Nginx.

今天分享在安装中遇到的问题和其他工具的安装, 以及常用的操作, 包括 MySQL, Nginx 等.

pecl 安装

PEAR 是 PHP 扩展与应用库(PHP Extension and Application Repository) 的缩写。它是一个 PHP 扩展及应用的一个代码仓库,简单地说,PEAR 就是 PHP 的 CPAN.

PECL (PHP Extension Community Library),PHP 的扩展库,它提供了一系列已知的扩展库,由 C++ 等其他语言编写而成,以 .so 形式出现,.so 为共享库, 是 shared object, 用于动态连接的, 和 dll 差不多,为比 PEAR 更快,但是与 PEAR 不同的是,PECL 需要在服务器上配置并被注册到主机中.

最直接的表述: PEAR 是 PHP 的上层扩展,PECL 是 PHP 的底层扩展.

下面说如何安装 pecl 和 pear.

1.下载 pear

1
curl -O http://pear.php.net/go-pear.phar

2.安装 pear

1
sudo php -d detect_unicode=0 go-pear.phar

3.执行以上命令后会进行安装过程,会有一些配置选项

输入1,回车,配置 pear 路径为:/usr/local/pear
输入4,回车,配置命令路径为:/usr/local/bin

4.回车两次,其他让其默认,安装完成.

5.可以通过命令检查 pear 是否安装成功

1
pear version

或者执行:

1
pecl version

可以看到类似信息:

1
2
3
PEAR Version: 1.10.1
PHP Version: 5.6.27
Zend Engine Version: 2.6.0

常用操作

MySQL 操作

基本操作:

1
2
3
4
mysql.server start #启动
mysql.server stop #停止
mysql -u root -p #用 user 和 pwd 连接
php-fpm 相关操作

1.运行 php-fpm

1
sudo php-fpm -D

2.关闭 php-fpm

1
sudo killall php-fpm

3.查看 php-fpm 运行状态

1
sudo lsof -Pni4 | grep LISTEN | grep php

可以看到 (fpm 默认在 9000 端口)

1
2
3
4
php-fpm  84200   root  8u  IPv4 0x91959c43a1ea5abd  0t0  TCP 127.0.0.1:9000 (LISTEN)
php-fpm 84201 _www 0u IPv4 0x91959c43a1ea5abd 0t0 TCP 127.0.0.1:9000 (LISTEN)
php-fpm 84202 _www 0u IPv4 0x91959c43a1ea5abd 0t0 TCP 127.0.0.1:9000 (LISTEN)
php-fpm 84203 _www 0u IPv4 0x91959c43a1ea5abd 0t0 TCP 127.0.0.1:9000 (LISTEN)

4.php-fpm 开机启动

1
2
ln -sfv /usr/local/opt/php56/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php56.plist

Nginx

1.测试配置是否有语法错误

1
nginx -t

2.启动 nginx

1
sudo nginx

3.重新加载配置|重启|停止|退出 nginx

1
nginx -s reload|reopen|stop|quit

4.开机启动:

1
2
ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist

5.nginx 监听 80 端口:

1
2
sudo chown root:wheel /usr/local/Cellar/nginx/1.6.0_1/bin/nginx
sudo chmod u+s /usr/local/Cellar/nginx/1.6.0_1/bin/nginx

常用目录

因为使用了 Homebrew 安装的 PHP, 配置文件的目录不是常规的 /etc

这里有几个目录需要知道, 如下:

1
2
3
/private/etc
/usr/local/etc/php/5.6
/usr/local/var/www

遇到问题

1.执行 sudo php-fpm -D 报 php56-intl/intl.so 加载问题

warning 的内容大致如下:

1
2
3
4
5
6
7
8
9
NOTICE: PHP message: PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/opt/php56-intl/intl.so' - dlopen(/usr/local/opt/php56-intl/intl.so, 9): image not found in Unknown on line 0
<br />
<b>Warning</b>: PHP Startup: Unable to load dynamic library '/usr/local/opt/php56-intl/intl.so' - dlopen(/usr/local/opt/php56-intl/intl.so, 9): image not found in <b>Unknown</b> on line <b>0</b><br />
Unknown(0) : Warning - PHP Startup: Unable to load dynamic library '/usr/local/opt/php56-intl/intl.so' - dlopen(/usr/local/opt/php56-intl/intl.so, 9): image not found
[31-Dec-2016 22:40:38] NOTICE: PHP message: PHP Warning: PHP Startup: mcrypt: Unable to initialize module
Module compiled with build ID=API20131226,NTS
PHP compiled with build ID=API20131226,NTS,debug
These options need to match
in Unknown on line 0

解决方案: 执行下面的命令, 即可解决.方案来源 Github.

1
brew reinstall --build-from-source php56-intl

2.执行 sudo php-fpm -D 报 PHP Startup: mcrypt: Unable to initialize module

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
31-Dec-2016 22:56:51] NOTICE: PHP message: PHP Warning:  PHP Startup: mcrypt: Unable to initialize module
Module compiled with build ID=API20131226,NTS
PHP compiled with build ID=API20131226,NTS,debug
These options need to match
in Unknown on line 0
<br />
<b>Warning</b>: PHP Startup: mcrypt: Unable to initialize module
Module compiled with build ID=API20131226,NTS
PHP compiled with build ID=API20131226,NTS,debug
These options need to match
in <b>Unknown</b> on line <b>0</b><br />
Unknown(0) : Warning - PHP Startup: mcrypt: Unable to initialize module
Module compiled with build ID=API20131226,NTS
PHP compiled with build ID=API20131226,NTS,debug
These options need to match

解决方案:

1
brew reinstall --build-from-source php56-intl

3.连接 mysql

使用 mysql -u root -p 连接 mysql, 提示 Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock 错误.

解决方案: 启动 mysql

1
mysql.server start

重新连接即可.

<1…161718…20>

193 日志
16 分类
163 标签
© 2024 veryitman