mysql 之 sql_mode

sql_mode 之影响:

  1.  sql_mode=’ansi’; 则当插入时,如果数据超长,则截断插入;有时候,这不是我们想要的

总结:

  • sql_mode=’TRADITIONAL’; 可以避免很多不必要的意外;

    TRADITIONAL 等价于 下面一系列标准的集合
  • 注意: 与innodb_strict_mode的区别

实际应用:

  1. 可以直接在 /etc/my.cnf 中修改sql_mode,如下:(需要重启mysql)
  2. 如果不方便重启mysql,则可以在执行sql语句前进行回话级别的设置,如下:

    (每次连接后都需要执行,比较麻烦;对于长连接的场景,该设置的花费可以忽略)
  3. 设置全局sql_mode:

    注意:
    1) 需要有超级权限
    2) 对当前session无效;要么退出再进来,要么再设置一下当前回话的sql_mode
    3)  该设置重启mysqld就没了,最好在my.cnf 中写一下

参考资料:

小米2刷机体验

首先, 刷机程序是windows程序,为此特地找了个windows的笔记本,虽然刷机过程还算比较快,但是,放下那个dell的windows,拿起mac,立马感觉舒服了好多。

刷机教程: http://www.miui.com/shuaji-393.html

如果第三步没有看到自己的手机,很可能是没有安装对应的USB驱动,设备管理器中有一个设备是带叹号的,参考: http://jingyan.baidu.com/article/e4511cf32d40e82b855eaf5e.html

到现在刷机完成已有半小时了,手机依然停留在开机的MI字界面,估计是刷坏了;让他起着吧,我先睡觉去

早上醒来,发现居然起来了,MIUI7的界面,????????

很快我就把一些主要的配置弄好了,然后,我这个小米2 的老毛病又犯了:屏幕触摸没反应,按键中只有一个重启功能有效,郁闷。。。。

 

sshd 之登录用户限制

问题:

linux机器配置了ldap验证,但是,又不期望ldap中所有用户都能登录,只是想用ldap中的密码,你们有一种办法就是通过pam_listfile.so 来实现,第一次配置非常顺利,立马就生效了;后来不小心执行了authconfig-tui ,配置文件就被重新生成了,手动添加的配置就没有了,再次添加就傻X了,怎么也不生效,都快哭了,如下图/etc/pam.d/password-auth 的一部分,因为/etc/pam.d/sshd include了这个文件,就直接在这里添加了,下图是正确的配置,错误的配置为:第5行写在了第6行的下面;

或者第5行直接添加在/etc/pam.d/sshd 文件中也可以,但是要写到 auth include password-auth 之前,否则也是不生效

暂且不知道原因,浪费了很多时间,555555555555

更正: 图中的 item=ruser 应该为 item=user

docker 之centos7虚拟机

想用docker安装一个centos7虚拟机,类似传统虚拟机那种;但是遇到一个问题,systemctl 启动服务的时候报错如下:

centos7默认使用systemd,其实 /usr/sbin/init 软连接的就是systemd,如果不用这个初始化,则目录: /run/systemd/system/ 是没有的; 也就是说,对于centos7,如果要想当做传统虚拟机来用,则首先要运行systemd进行初始化,而且需要超级权限,如此一来,宿主机将会感觉很不安全,如: 虚拟机可以直接修改宿主机时间。当启动的时候不适用超级权限来执行/usr/sbin/init ,虽然也能执行,但是依然不能使用systemctl来启动服务

结论: 在搞定该问题之前,暂不提供centos7的docker虚拟机

docker 容器资源管理

缘起

想用docker容器来做传统虚拟机的事情,但是从docker的api接口来看,如果限制容器的资源使用情况,需要在创建容器时指定,如: 内存、cpu等;一旦创建,将无法修改。

但是,资源限制本身就是运行时的事情,何故必须在创建时指定而且无法修改呢?比如:我创建一个容器允许使用4G内存,但是过了一段时间,我想将内存限制调整到8G,难道真的不行吗?

docker api似乎真做不到。

我们知道资源限制是通过cgroup实现的,其实可以跳过docker,直接调整cgroup也应该是可以的; 可以通过mount来查看各子系统都mount到哪里了。

如:

修改内存限制:

注意: 1. 如果容器已经使用了4g内存,修改为2g时会失败,错误如下:

2. 把占用内存多的进程先杀掉,让内存使用回归到合理值后,再降低内存配额是可以的

不过,有些东西目前还没发现如何修改,如: hostname

 

docker容器不同于真正的虚拟机,直接使用top、free等命令看到的是整个宿主机的资源使用状况,而无法知道本容器的资源限制和使用情况,可以借助一些监控软件:

http://www.tuicool.com/articles/nuE7b2E

参考资料:

php 之 xhprof

参考资料:http://blog.aboutc.net/profiling/17/php-profiler-xhprof

这里不说别的,只记录一个小有意思的事情:

由于所谓的PHP内存泄漏,在程序跑上几分钟后就耗尽内存而退出,据说xhprof很是厉害,可以分析是哪个函数占用了太多内存;由于xhprof没有现成的环境,配置起来花费了一些功夫,最后发现,是pdo_mysql的execute占用了90%+的内存,天哪,用了N多年的东西突然有问题了?冥思苦想,夜不能寐。

突然间,想到一个其他的办法,就是在每段代码前后添加memory_get_usage()来检查是否内存使用有发生变化,如果没有变化,则这部分代码没有问题;如果有变化,则这部分代码有问题;(注意:如果这部分代码有函数调用,则函数调用不应该有大的返回值,如果有自己看着处理);就这样,通过二分法一步一步排查,终于发现,小朋友为了提高性能,使用类的静态变量数组cache了sql查询的结果,这个cache没有大小限制。

然后回到xhprof分析的结果,可以想象,之所以xhprof认为pdo_mysql的execute有问题,是因为这些内存都是该函数申请的,你说pdo_mysql 冤不冤?

javascript 之文件下载

一般来讲,浏览器中下载文件都是一个链接给浏览器,下载进度有浏览器来显示;比较先进一些的实现就是通过js不断地循环请求服务器端,来获取下载的百分比。

最近发现一个网站(https://mega.nz/#F!nJR3BTjJ!N5wZsncqDkdKyFQLELU1wQ )在下载文件时,并没有立即调出文件保存对话框,而是直接在网页中显示下载进度,直到下载完毕才弹出文件保存对话框,点击保存就完成了。觉得很新鲜,研究了一下,是通过blob实现的; 关于blob的学习:百度: js blob

文亮同学提到了: URL.createObjectURL  ,稍后再研究这个东西

关于VPN的纠结

需求

公司内网需要搭建一个VPN服务,这是一个非常常见的功能性需求;为了安全,要求VPN登录时使用动态口令,这是一个非常合理的非功能性需求。

探索

VPN服务比较多,如: L2TP/PPTP/OPENVPN/SSLVPN 等等; 但是支持动态口令的VPN就找不到了;不过,有些VPN支持pam,如:openvpn; 由于vpn代码比较多,编译也比较麻烦,未敢擅自修改;但是openldap的代码看了下不太复杂,于是,通过修改ldap中的验证逻辑,实现了openvpn + pam_ldap的动态口令验证功能。

突然有一天,发现xx宽带连接公司的vpn总是失败,电话询问xx客服,得知根据国家xxxx规定,xx宽带不允许使用vpn。后来发现,其实也不完全禁止,或许是具体实现封杀的技术问题,有时候还是可以使用openvpn的; 尽管如此,关于无法使用vpn的事情总会发生的,还得想其他办法。

据说shadowsocks很有名气,能否借助这个实现呢?尤其openvpn其实也是走某个指定端口的应用层面的服务;搜了一下,果然有: https://github.com/shadowsocks/shadowsocks/wiki/Connect-to-OpenVPN-over-Shadowsocks (点进去才发现,该项目已被我star多时了)

不过,这个有两个问题:

  1. 对于不懂技术的同事来讲,使用起来有点儿难度,需要配置shadowsocks客户端(如果能写个包装器,把shadowsocks和openvpn包装起来就方便多了)
  2. 如果要shadowsocks到公司内部,也必然要考虑到同样的验证问题,就是:shadowsocks需要支持动态口令; 还好这个修改起来应该不太复杂,应该比修改openldap要简单的多吧!

 

参考资料:

  1. http://hyspace.io/posts/2015/08/22/%E7%BA%AA%E5%BF%B5shadowsocks/
  2. https://ericfu.me/fight-with-greatwall-conclusion/

 

vpn自动安装脚本(配置过程太酸爽)

 

site-to-site vpn : http://ostolc.org/category/vpn.html