0%

一、辨题:

辩题“奇葩星球新规定:给做好事的人发红包,你支持吗?”

二、关于辨论

本人非专业辨手,只是看了这期节目,觉得很多人聊的都不在点子上,一时兴起,写篇博客吧。

对于这个辨题,我觉得非常同情正方辨手。因为这本应该是被反方碾压的辨题,虽然很努力也曾经一度领先,但最终还是功败垂成,也正常。

反方辨手我觉得詹青云和肖骁说的都不错。但他们有一个特点(我这非专业人士评论仅代表个人观点),都是在纠结这个问题本身的正确与否,用讲故事、抓某一个点,甚至是煽情来鼓劲观众投票,而忽略了最重要的一点:这件命题的逻辑。同时做为反方三辨也没有抓住对方的弱点来进行反驳。

Read more »

Q:为什么要搞定BOSS?

A:为了获得【BOSS的认可】,获得更多机会。

那么如何搞定BOSS呢,从“波波羊”老师的公开课分享里,整理的如何搞定BOSS五大要素:

1、会做事

  • 凡事有结果
  • 做事有章法
  • 过程有交待

2、会沟通

  • 能主动沟通
  • 有沟通的逻辑,推荐三本书《MBA轻松学逻辑》、《金字塔原理》、《结构思考力》

3、会想事

  • 愿意想办法
  • 能深入思考

4、想进步

  • 有进取欲望
  • 敢于担担子

5、会做人

  • 懂尊重老板
  • 不要怼老板
  • 大场合,学会站队

  1. 做一个分享课题,你一定要深入了解它,不要仅仅去为了分享而去写分享。
  2. 开头可以通过一两句话把这次分享的起因、背景、目的说清楚,不要你开始了大家却晕着,因为你跟大家信息是不对等的。
  3. 重点、关键地方多讲,无关地方少讲,对于别人的疑问不要避重就轻。
  4. 避免一句话重复说(重点提示例外),会给人感觉你无话可说。
  5. 关键点要做出一个适当的举例,便于同事可以快速的了解使用情景,最好能配合流程图说明。
  6. 纯技术分享不结合实际业务使用场景和耍流氓一样。
  7. 不要有官方的就是最好的思想,因为他也是人写的。
  8. 技术分享讲座毕竟是要大家花时间来听的,必须让大家有所得,让大家感兴趣,能让大家互动起来。
  9. 掌控好时间 一小时为好。

1.背景知识

1.1. 前提知识点:

关键词:ngx_http_realip_moduleHAProxy反向代理出口IP 还有nginx中的几个变量:

  • remote_addr 代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP,除非代理将你的IP附在请求header中一起转交给web服务器。

  • X-Forwarded-For(简称XFF) X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。 XFF的格式为:

X-Forwarded-For: client, proxy1, proxy2

XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。(注意:如果未经严格处理,可以被伪造) 如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求。列表中并没有 IP3,IP3 可以在服务端通过 Remote Address 字段获得。我们知道 HTTP 连接基于 TCP 连接,HTTP 协议中没有 IP 的概念,Remote Address 来自 TCP 连接,表示与服务端建立 TCP 连接的设备 IP,在这个例子里就是 IP3。Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。但是在正常情况下,web服务器获取Remote Address只会获取到上一级的IP,本例里则是proxy3 的 IP3,_这里先埋个伏笔_。

  • X-Real-IP 这又是一个自定义头部字段,通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端,这个要看经过代理的层级次数或是是否始终将真实IP一路传下来。(注意:如果未经严格处理,可以被伪造
Read more »

今天要装一个包endroid/qrcode,可是死活装不上。 composer require 安装的时候一直报

[InvalidArgumentException] Could not find package endroid/qrcode at any version for your minimum-stability (stable). Check the pac kage spelling or your minimum-stability

然后新composer init一个空项目就能装上了。然后开始分析我的现有项目的composer.json文件。 最后发现是之前使用了国内的composer镜像,加上了一个配置

1
{ "repositories": [ { "packagist": false }, { "type": "composer", "url": "http://packagist.phpcomposer.com" } ] }

之前只把后一段给删了,没有删前一段。把前一段的“packagist”: false 也删了就好了。

无论是使用VPN还是其它代理方式,很多时候我们不希望暴露自己的真实IP,且一直以来我们认为VPN是安全的,所有流量都会走VPN。 但最近暴露出一个WebRTC特性,会暴露我们的真实IP。适用浏览器:chrome,firefox. safari则没有问题。 只需要一段js代码就可以获取我们的真实IP。一旦被想时时监控别人的人知道并使用此方法钓鱼,便可直接获得原始IP。这简直太恐怖了。 看来以后如果重装系统,第一件事儿把cnnic证书删除后,第二件事儿就是禁用WebRTC. 有一个插件可以方便的禁用WebRTC, 插件下载 Firefox可在浏览器上输入:about:config。之后搜索:media.peerconnection.enabled。找到它后双击,将其改成 false 即可。 原理可以参考一下这里:https://github.com/diafygi/webrtc-ips

这是phpExcel类中的方法。今天查到了,记录一下备忘。

1
public static function stringFromColumnIndex($pColumnIndex = 0)
2
    {
3
        //  Using a lookup cache adds a slight memory overhead, but boosts speed
4
        //  caching using a static within the method is faster than a class static,
5
        //      though it's additional memory overhead
6
        static $_indexCache = array();
7
 
8
        if (!isset($_indexCache[$pColumnIndex])) {
9
            // Determine column string
10
            if ($pColumnIndex < 26) {
11
                $_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex);
12
            } elseif ($pColumnIndex < 702) {
13
                $_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)) .
14
                                              chr(65 + $pColumnIndex % 26);
15
            } else {
16
                $_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex - 26) / 676)) .
17
                                              chr(65 + ((($pColumnIndex - 26) % 676) / 26)) .
18
                                              chr(65 + $pColumnIndex % 26);
19
            }
20
        }
21
        return $_indexCache[$pColumnIndex];
22
    }

将列的数字序号转成字母使用:

1
PHPExcel_Cell::stringFromColumnIndex($i); // 从o开始

将列的字母转成数字序号使用:

1
PHPExcel_Cell::columnIndexFromString('AA');

Yii框架一定要慎用Dao的delete,一不小心它生不成条件的话,就变成了整表删除。 可以用ActiveRecord的deleteByAttributes或deleteAll方法相对不容易写错。 deleteByAttributes用法如下:

MyClass::model()->deleteAllByAttributes(array(
    'phone_number'=>$phoneNumber,
));

或者第一个参数为空,使用第二个条件参数

MyClass::model()->deleteAllByAttributes(array(),'`phone_number` = :phone_number',array(
    ':phone_number'=>$phoneNumber,
));

或者使用deleteAll():

MyClass::model()->deleteAll('`phone_number` = :phone_number',array(
    ':phone_number'=>$phoneNumber,
));

再来一个带in条件的

$condition = new CDbCriteria();
$condition->addCondition('status=:status');
$condition->params = array(':status'=>1);
$condition->addInCondition('user_id',array(100111,100221,100221));
User::model()->deleteAll($condition);

Dao带in条件的示例

Yii::app()->db->createCommand()
->delete('mw_user', array('and', 'user_id=:user_id', array('in', 'position_id', array(1,2,3))),array(':user_id'=>121111));

但是请慎用DAO的delete,当你的条件写错一点,它将无法生成where条件,同时sql语句中也没有了where,但还不一定报错,结果就成了没有where的delete,结果会是整表被删除了。

困扰了我一天的问题。首先是Mongodb副本集。查php的Mongo扩展手册把副本集搞定。然后又是长整型时间的问题。 存进mongo的是java的长整型时间戳。而php是弱类型语言,且php的时间戳是11位。目前还是10位的阶段。转换成java的时间戳需要在后面补零。

// 生成java时间戳

1
$time = (string)$time.'000';
2
$time = (int)$time;

但是查询结果根本没有数据。把框架的Mongo用Debug打印出查询语句,没有问题。把查询语句直接在shell里查也没问题。但就是没数据。 后来打开Mongo的日志,调整级别为5,这样会记录查询语句。参照这里。 发现我所查询的时间都变成了负数:“_{ $gt: -154503944 }_” 然后万能的google找到了答案。php的长整型需要使用MongoInt64这个类来转换一下。虽然你在php中输出结果是一样的,但查询起来就不一样了。那么在上面的语句后面再加上一句就对了。

// 必须的一步,将长整形使用MongoInt64转换成64位整型

1
$time = new MongoInt64($time);

Mongo扩展的类参考在这里:http://www.php.net/manual/en/mongoint64.construct.php