安卓端的微信使用的是一个自带的专用浏览器,应该是一个精简版的qq浏览器。然后就造成了我们一系列蛋疼的问题,各种不兼容。而ios端的微信无疑问用的是内置safari浏览器,不管是canvas运算还是类似todataurl这样对运算能力要求比较高的API,在上面的实现都挺流畅的。

作者:陈秋鑫
链接:https://www.zhihu.com/question/23595715/answer/36213456
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
背景:关于PHP的异步回调啥的,其实PHP这种语言的运行机制想优雅实现是不可能的,有一个叫swoole的扩展实现这个队列的处理是很不错的,之前有张宴兄弟写过一个叫https的队列处理(基于libevent),后面有韩天峰兄弟写的swoole,更注重了异步IO实现对CPU的IO的吃满(基于自己编写的epoll加队列链表内存分配一堆东西,反正我是看过没看明白有空再研究),但是,作为swoole的粉丝兼顾问,异步问题在PHP业界的一个需求量还是蛮大的,尤其是日志异步写、url访问、邮件异步发、跨机房db特殊的小同步、审核异步队列、框架底层对接口访问排查错误的db和cache接口查询及返回,这些目前对于大并发网站都是需要异步来解决的,但是异步归异步,回调这块也实现异步回调(真大并发想知道结果可能阻塞了PHP进程产生进程等待异步返回而新来的连接没法及时处理的php-fpm进程性雪崩),在实际运用中常规处理办法是开一个新的端口,下面的swoole也是开了新的端口来处理,于httpsqs不同在于swoole可以把简单的curl啥的逻辑也可封装里面,在httpsqs里只是纯队列,一个投递进来,再起一个php的daemon进行读取队列,因为如果真是繁忙,导致异步处理返回慢,这个等待也是太漫长,我觉得看具体业务而看要不要等待,在实际中异步和队列大都用于抛数据以及解耦,swoole在这块不光有了异步还有异步回调,所以,最大限度的解决了上面这些场景,先抄一篇文章再说,有空再研究研究其实现,假如能看懂的话:-),异步回调这块如果有明白的可以留言给我,谢谢。
————————————————————————————————————————————————————————————————————————
关于异步任务队列

用户打开了我们的网站。他要做的就是勾选需要发邮件的代理商列表,然后把结算邮件发出去。
假如我们需要发1封邮件,我们写个函数执行即可。考虑到网络可能会稍微有点延迟,但是是可以接受的,用户会乖乖等你的网页发完邮件了再关闭网页。
假如我们要发布10封邮件,用一个for循环,循环10遍执行发邮件操作。这时候,也许10倍的网络延迟会让用户稍微有点不耐烦,但勉强可以等吧。
假如要发100封邮件,for循环100遍,用户直接揭竿而起,什么破网站!
但实际上,我们很可能有超过1万的邮件。怎么处理这个延迟的问题?
答案就是用异步。把“发邮件”这个操作封装,然后后台异步地执行1万遍。这样的话,用户提交网页后,他所等待的时间只是“把发邮件任务请求推送进队列里”的时间。而我们的后台服务将在用户看不见的地方跑。
在实现“异步队列”这点上,有人采用mysql表或者redis来存放待发送的邮件,然后,每分钟定时读取待发送列表,然后处理。这便是定时异步任务队列。但当前提交的任务要一分钟后才能执行,在某些实时性要求应用场景里还是不快。有些场景要求,只有一提交任务,便马上执行,但用户不需要等待返回结果。
在云平台SAE和BAE上,都有taskqueue服务来解决上面的问题。而如果是自己假设服务器,则如何解决?本文将探讨用php扩展swoole实现实时异步任务队列的方案。

安装swoole

pecl 安装:
pecl install swoole

看命令行提示,如果它提示说没有写php.ini,则自己手动在PHP.ini后面加上:
extension = "swoole.so"

服务端

在打算放置脚本的目录(你也可以自行新建)新建Server.php,代码如下:


由于服务端是异步、常驻内存的,因此必须通过命令行来启动。在命令行执行以上代码以启动服务
php Server.php
执行完毕后关闭命令行窗口即可。服务会在后台以守护进程运行

客户端

启动服务后,让我们看看如何调用服务。新建测试文件Client_test.php
代码如下:


在上面代码中,url即为任务所在地址,param为所需传递参数。
保存好代码,在命令行或者浏览器中执行Client_test.php,便实现了异步任务队列。你所填写的URL,将会在每次异步任务被提交后,以HTTP GET的方式异步执行。

查看与关闭

swoole好像没有很便捷的关闭方式。所以只能直接通过关闭进程来关闭。
查看命令:
ps -ef | grep php
结束单个进程:
kill -9 {进程号}
结束所有进程的命令:
killall -9 php

摘自第七星尘的博客:http://blog.star7th.com/2016/01/1905.html
实践发现,ubunut16.0.4里面的chromium没法设置代理的,而是采用了下面这个办法进行命令行设置:
在受支持的桌面环境中运行Chromium时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。
但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man chromium-browser。

=========================================================================================
先安装再代理 ,安装后可以google: http://jackxiang.com/post/8703/

受支持的桌面环境中运行Chromium时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。
但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man chromium-browser。


安装好google-chrome(或者chromium也行)后,我们发现浏览器的设置中,代理配置功能失效,显示为:

在受支持的桌面环境中运行google-chrome时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。

但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man google-chrome。

2、关闭该google-chrome,并重新从命令行启动,加入一个参数:

jackX@thinkpad:~$ google-chrome --proxy-server="socks5://localhost:8787"
chromium-browser --proxy-server="socks5://localhost:8787"

值得注意的是,由于我平常windows环境下使用的代理工具为:chrome+SwitchyOmega插件+MyEntunnel,配置是SSH+socks5,所以一开始没有在–proxy-server参数中指定socks5,导致启动后代理失效。(可通过google-chrome –help了解详细参数)

chrome成功启动后,打开百度输入“ip”,可显示我的代理服务器IP,说明代理成功启用。
[root@jackX ~]# vi /etc/sudoers
在 /etc/sudoers 中添加:
Defaults editor=/usr/bin/vim, env_editor
即可将默认编辑器设置为 vim。
apt-get install vim
root@jack:~# which vim
/usr/bin/vim
[root@jackX ~]# update-alternatives --config editor
有 4 个候选项可用于替换 editor (提供 /usr/bin/editor)。

  选择       路径              优先级  状态
------------------------------------------------------------
* 0            /bin/nano            40        自动模式
  1            /bin/ed             -100       手动模式
  2            /bin/nano            40        手动模式
  3            /usr/bin/vim.basic   30        手动模式
  4            /usr/bin/vim.tiny    10        手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:3
update-alternatives: 使用 /usr/bin/vim.basic 来在手动模式中提供 /usr/bin/editor (editor)
From:http://blog.longwin.com.tw/2008/10/ubuntu-debian-modify-default-edit-2008/
chrome和firefox都没法使用Flash:

sudo apt-get install software-center

http://tieba.baidu.com/p/4395787288
ubuntu 17.04是gnome桌面环境的话,用鼠标左键选中区域,然后滚轮按下就可以黏贴刚才内容
在ubuntu下,选择文本会自动复制,按中键即可粘贴,这个是不用设置的,不过是中键,很不错
背景:ubuntu 17.04不是出了嘛,可是secureCRT没有,于是,得安一个,网上全是x64位的,我这又是32位的,找了好久终于找到一个OK的。
http://www.xue163.com/333/1654/3332691.html
DownLoad: http://download.csdn.net/download/since1988/8287101

请注意,那个下面的这些码贴上只是想让其显示并单项输入,以达到破解的目的:
root@jackX:/home/jackxiang/下载# sudo perl securecrt_linux_crack.pl /usr/bin/SecureCRT
crack successful

License:

  Name:    xiaobo_l
  Company:  www.boll.me
  Serial Number:  03-15-097355
  License Key:  AC81ET 9RKAWY 6WP69G 8EQ1JB ABCM3D K4E85M D3WG57 RGFWT2
  Issue Date:  08-16-2015



====================================================================
jackxiang@jack:~/下载$ ls
scrt-7.3.1-685.ubuntu13.i386.deb  securecrt_linux_crack.pl
jackxiang@jack:~/下载$ sudo dpkg -i scrt-7.3.1-685.ubuntu13.i386.deb
[sudo] jackxiang 的密码:
正在选中未选择的软件包 scrt。
(正在读取数据库 ... 系统当前共安装有 174871 个文件和目录。)
正准备解包 scrt-7.3.1-685.ubuntu13.i386.deb  ...
正在解包 scrt (7.3.1-685) ...
正在设置 scrt (7.3.1-685) ...
正在处理用于 gnome-menus (3.13.3-6ubuntu3) 的触发器 ...
正在处理用于 desktop-file-utils (0.22-1ubuntu5) 的触发器 ...
正在处理用于 bamfdaemon (0.5.3~bzr0+16.04.20160415-0ubuntu1) 的触发器 ...
Rebuilding /usr/share/applications/bamf-2.index...
正在处理用于 mime-support (3.59ubuntu1) 的触发器 ...
jackxiang@jack:~/下载$ which SecureCRT
/usr/bin/SecureCRT
jackxiang@jack:~/下载$ sudo perl securecrt_linux_crack.pl /usr/bin/SecureCRT
crack successful

License:

  Name:    xiaobo_l
  Company:  www.boll.me
  Serial Number:  03-15-097355
  License Key:  AC81ET 9RKAWY 6WP69G 8EQ1JB ABCM3D K4E85M D3WG57 RGFWT2
  Issue Date:  08-16-2015


jackxiang@jack:~/下载$ SecureCRT &
更改yum源为aliyun

[1] 首先备份/etc/yum.repos.d/CentOS-Base.repo

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

[2] 进入yum源配置文件所在文件夹

[root@localhost yum.repos.d]# cd /etc/yum.repos.d/

[3] 下载aliyun的yum源配置文件,放入/etc/yum.repos.d/(操作前请做好相应备份)

[root@localhost yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-6.repo

如果下载163的yum源配置文件

[root@localhost yum.repos.d]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo

[4] 运行yum makecache生成缓存

[root@localhost yum.repos.d]# yum makecache

[5] 更新系统

[root@localhost yum.repos.d]# yum -y update
背景:最近研究一下rpmbuild打的mysql最新包出现初始化mysql-5.7.12时的数据库错误,[ERROR] COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1',再涉及到mysql的密码问题居然放error.log里了。
1)init database and set password:
[root@localhost bin]#./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
2016-04-21T03:26:22.900370Z 0 [ERROR] COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
2016-04-21T03:26:22.900452Z 0 [ERROR] Aborting
2)try directly start mysql server display:
[root@localhost bin]# ./mysqld_safe  
./mysqld_safe: line 541: /data/mysql/mysqld_safe.pid: No such file or directory
awk: (FILENAME=- FNR=1) warning: error writing standard output (Broken pipe)
2016-04-21T03:26:28.773480Z mysqld_safe Logging to '/data/logs/mysql/error.log'.
2016-04-21T03:26:28.814486Z mysqld_safe Starting mysqld daemon with databases from /data/mysql
2016-04-21T03:26:28.957913Z mysqld_safe mysqld from pid file /data/mysql/mysql.pid ended

so,tail -f ,tail -f /data/logs/mysql/error.log


乍一看,是字符编码问题,着实在my.cnf配置文件上面设置了字符编码如下:      


再启动,出现新的报错:

可能是目录的权限问题,继续在rpmbuild里写上权限....
chmod -R mysql.mysql /data/logs/mysql /data/mysql

[root@localhost bin]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql  
[root@localhost bin]#

日志跟踪,敬告没有Error:
2016-04-21T03:45:21.971611Z 1 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.971676Z 1 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.971712Z 1 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.971745Z 1 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2016-04-21T03:45:21.972041Z 1 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.


立即启动mysqld_safe:
[root@localhost bin]# ./mysqld_safe
2016-04-21T03:47:08.025776Z mysqld_safe Logging to '/data/logs/mysql/error.log'.
2016-04-21T03:47:08.075873Z mysqld_safe Starting mysqld daemon with databases from /data/mysql

tail -f /data/logs/mysql/error.log 端口成功启动:
2016-04-21T03:47:08.542210Z 0 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.7.12-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution


[root@localhost bin]# ./mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

重新初始化mysql用户名及密码:
[root@localhost bin]# ./bin/mysql_install_db --basedir=. --datadir=/data/mysql --user=mysql
2016-04-21 13:18:24 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
2016-04-21 13:18:24 [ERROR]   The data directory needs to be specified.
之前版本mysql_install_db是在mysql_basedir/script下,5.7放在了mysql_install_db/bin目录下,且已被废弃。

shell>./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
******mysql5.7会生成一个初始化密码,而在之前的版本首次登陆不需要登录。(我前面用的是root启动的):
[root@localhost bin]# ./mysqld_safe --user=mysql    
2016-04-21T05:24:34.317097Z mysqld_safe Logging to '/data/logs/mysql/error.log'.
2016-04-21T05:24:34.463814Z mysqld_safe Starting mysqld daemon with databases from /data/mysql

这帮孙子现在是在抽风么,网上查到这密码放哪儿是一个折腾呐,那最新版本的放哪儿了?
MySQL 5.6 中,mysql_install_db 在数据库创建的时候提供选项来生成 random password。
MySQL 5.7.4 中,可以跳过 -skip-random-password 选项来默认生成随机密码。
MySQL 5.7.5 中,还是默认生成随机密码,但是选项修改为 –insecure

摸索下看:


tail日志时发现,mysql-5.7.12最新版本的密码放在error.log里面了,我去:


[root@localhost bin]# ./mysqld_safe --user=mysql &
[1] 18730

2016-04-21T05:36:56.824891Z 0 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.7.12-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution

连接成功,这个新版本的msyql还真TM费劲呐:
[root@localhost ~]# mysql -uroot -p
Enter password: 7EEgNltAA1;/
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12-log

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

强制要求你修改密码:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> SET PASSWORD = PASSWORD('123456');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create database jackTestDB;
Query OK, 1 row affected (0.00 sec)


不要密码初始化数据库的参数,参考自:https://dev.mysql.com/doc/refman/5.7/en/data-directory-initialization-mysqld.html

[1] 59478
无密码连接一下看:
[root@localhost bin]# ./mysql -uroot   //果然不需要密码就进去了
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12-log Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \q

直接mysql也成:[root@localhost x86_64]# mysql
进入后密码:SET PASSWORD = PASSWORD('123456');

[root@localhost bin]# ./mysql -uroot
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
mysql> SET PASSWORD = PASSWORD('******');
Query OK, 0 rows affected, 1 warning (0.00 sec)
从另一个终端登录看下,不行了,说明直接就修改了,也就是说不用flushprivilege:
[root@localhost bin]# ./mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)


首次参考:http://www.bubuko.com/infodetail-1173208.html


背景:我想从一台远程机器上的一个用户上的文件拷贝到我的机器上来,可我不想用root拷贝,想新增加一个用户来拷贝,如何实现无 Permission denied,拷贝过来呢?
现象:权限不够,(如下:test这个目录是我加的一个test用户生成的)
/home/test/rpmbuild/RPMS/x86_64 这个我想scp下面的rpm包,我不是root,怎么样能实现拷贝?
[root@localhost x86_64]# scp rpm@192.168.101.***:/home/test/rpmbuild/RPMS/x86_64/mysql-5.7.12-160420134244.el6.x86_64.rpm /data/www/yum/centos/6/x86_64
rpm@192.168.101.227's password:    Permission denied
问题:test是我建立的一个test用户。假如test用户的密码我忘记了(我用root修改了下test的密码,再用test用户拷贝没有问题,正常),但我有root。
试图:我还是想用rpm这个专有用户来拷贝。
权限:
[root@localhost ~]# ls -l /home/ |grep test
drwx------. 3 test          test          4096 Mar 18 19:18 test
rpm用户进不了这个目录
办法: rpm的用户组改成 test
id test
uid=539(test) gid=539(test) groups=539(test)
xiangjiwu - IEG(33757)  17:11:42
usermod -G test,rpm rpm

rpm的用户组改成 test,实践如下:
[root@localhost x86_64]# id test
uid=539(test) gid=539(test) groups=539(test)
[root@localhost x86_64]# usermod -G test,rpm rpm
[root@localhost x86_64]# id rpm
uid=540(rpm) gid=540(rpm) groups=540(rpm),539(test)
不做下面的权限,也是一样会报权限错误的: Permission denied
chown -R test:rpm /home/test  //给test目录递归上rpm组,下面这一步也不可缺少。
chmod -R 750 /home/test   //用户7,属组5(4+1),读取+执行。
修改后权限如下:
[root@localhost x86_64]# ls -l /home/ |grep test
drwxr-x---. 3 test          rpm           4096 Mar 18 19:18 test

再拷贝,也就成功了:


总结:三个步骤实现,一个不能少,一个是入组,一个是给目录加上组的可读权限:


最后,感谢PHPers@南极里的xiangjiwu - IEG兄弟,Thanks~

斧正:
xiangjiwu - IEG(337**)  17:41:32
rpm用户加到test组了, 那 /home/test就不用改组,直接chmod -R 750 /home/test 就行了。
背景:写PHP扩展很麻烦,有用c写也有用c++写都麻烦,且难调错,有没有没一个框架实现,从框架看也就是输入和输出,以字符串char*传入,json输出,就很简单了,这儿介绍一个:Zephir提供了一种类似php的高级语言语法的方式,来自动生成扩展的c语言代码,使编写php扩展变得非常的简单。
阅读全文
背景:像unix或linux下的mysql和php-fpm都有一个xxx.sock文件,它是干嘛的呢?可以研究一下它。
  管道由于只能实现具有亲缘进程的进程间通信,使用受到了很大的限制,命名管道解决了这一问题。但是,无论是管道还是命名管道,都只能实现单向通信(在只创建一个管道的情况下)。
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。这里所指的使用套接字实现进程间通信,是由将通信域指定为PF_UNIX来实现的。该函数的形式如下:
int socket(int domain, int type, int protocol);
socket函数中的domain参数用于指定通信域,domain参数取PF_UNIX时,表示创建UNIX域的套接字。使用PF_UNIX域的套接字可以实现同一机器上的不同进程间的通信。
调用bind函数实现了套接字与地址(这里是文件名)的绑定。bind函数的具体信息如下:
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
其参数my_addr为指向结构体sockaddr_un的指针,该结构体的定义如下:
    #define UNIX_PATH_MAX 108
    struct sockaddr_un {
    sa_family_t     sun_family;     /*PF_UNIX或AF_UNIX */
    char    sun_path[UNIX_PATH_MAX];        /* 路径名 */
    };
在该结构体中,sun_family为AF_UNIX。sun_path是套接字在文件系统中的路径名。
Unix域套接字是通过套接字API实现的简单的协议族。实际上它并不代表一个网络协议;它只能连接到同一台机器上的套接字。它提供了灵活的IPC机制。它的地址是它所在的文件系统的路径名,创建之后套接字就和路径名绑定在一起。用来表示Unix域地址的套接字文件能够使用stat()但是不能通过open()打开,而且应该使用套接字API对它进行操作。
Unix域套接字是面向连接的,每个套接字的连接都建立了一个新的通讯信道。服务器可能同时处理许多连接,但对于每个连接都有不同的文件描述符。这个属性使Unix域套接字能够比命名管道更好的适应IPC任务。

server.c


send.c


gcc server.c -o server
gcc send.c -o send

[root@iZ25dcp92ckZ sock]# ./server
Bind is ok
有client启动后server响应如下:
Recv: Counter is 1
Recv: Counter is 2
Recv: Counter is 3
Recv: Counter is 4

[root@iZ25dcp92ckZ sock]# ./send
Send: Counter is 1
Send: Counter is 2
Send: Counter is 3
Send: Counter is 4

最后,还发现那个设备文件server.sock 不能直接cat去读取,只能stat:
[root@iZ25dcp92ckZ sock]# cat server.sock
cat: server.sock: 没有那个设备或地址
[root@iZ25dcp92ckZ sock]# stat server.sock    
  文件:"server.sock"
  大小:0               块:0          IO 块:4096   套接字
设备:ca01h/51713d      Inode:16282       硬链接:1
权限:(0755/srwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2016-04-18 14:11:20.878641353 +0800
最近更改:2016-04-18 14:11:20.878641353 +0800
最近改动:2016-04-18 14:11:20.878641353 +0800
创建时间:-
实践摘录自:http://www.cnblogs.com/hnrainll/archive/2011/12/03/2274973.html
他说:“人之为学,心中思想,口内谈论,尽有百千义理,不如身上行一理之为实也”,“读书无他道,只须在‘行’字著力”(《颜习斋先生言行录》卷上)
在参加腾讯实习生2016面试时,有两道问题自己没有想清楚也思考的不是很明白,面试结束时后悔没有问正解是什么,回来后在搜索引擎上也没有搜到相关的问题。

第一道:"在多线程环境下,有大量并发, 有一个百万次出现一次bug, 如何调试这个bug。"

第二道是面试官给我的试卷上面的。"有一个类指针,指向类实例化的对象,在程序的运行过程中,这个类指针指向的对象崩溃了,这个类指针的虚函数表被破坏了,如何定位这个问题?"

所以,我想问下这两道题目该怎么回答, 谢谢谢谢!!!


知乎网友洋耗子答曰:

因为这些都是假设性问题,所以一般都只能说排查问题的思路:

问题一:

1:其实100万分之一的几率并不算很低。一个繁忙一点的服务,每秒一万个请求是很正常的(如果业务简单,还能更高)。所以百万分之一的复现概率,相当于在压力测试下几分钟就能出一次了。所以在道理上,如果有服务以这个几率出现bug,让它上线本身就是测试部门的失职。

2:反过来说,既然几分钟就能复现,那就在测试环境里压就好了,想怎么改就怎么改,想怎么打log就怎么打log。

3:假定测试环境的压测真的没出来,真的线上出现这样的问题(例如说压测的用例没有覆盖到)。首先考虑的是回滚服务到旧版,以确保正常业务不出问题。然后在线上环境提取某台机,用类似tcpcopy这样的软件导一份数据到测试环境中,来测试这个有问题的版本。这时候,既然是测试环境,你想怎么办都行(不影响线上服务)。

4:到了真正去分析bug了,那首先确定bug的类型。例如说如果能core dump的话相对好办一些,因为可以从core dump大概能看出或者猜出一些东西来。而如果并不core dump,而只是导致数据错乱的话,那就要做数据出入口的校验等。

5:在各顶级模块的入口出口打log,定位发生bug时所在的模块,然后逐步收敛。

6:确定这些模块以及关联影响的模块,单独提取这些模块出来,进行测试或者code review,最终确定问题。

问题二:

1:这类bug,一般都涉及越界操作。

2:一般这类bug,大多数都是可以通过静态code review解决的。既然知道是那个类,盯着用到这些类的实例的地方就行(包括这些类实例的前后几个对象,因为有可能是它们越界)。

3:一些工具,例如valgrind、purify之类的,也有可能有帮助(不一定肯定有用,但一般还是挺有用的)。

朋友!你也别纠结了,因为这两题答不出,拿不到实习不是你的错。
背景:T60P装了一个win10后安装一个secureCRT后,用tab时出现win10的默认系统声音,如何关掉?
把鼠标放电脑桌面空白处右键,然后点击弹窗下方的“个性化”进入个性化设置。
在个性化设置窗口点击“主题”选项进入主题设置。
在主题设置界面点击主题相关的设置下的“高级声音设置”进入声音设置界面。
在声音设置页面,点开声音方案下小长框右侧的展开符号“∨”,进入声音方案选项。
在展开的声音方案中点选“无声”,然后进行下一步确认操作。

选好声音方案后,先点击右下角的“应用”,再“确定”。此刻Win10系统提示音就关闭了。


图文:http://jingyan.baidu.com/article/d71306352f095b13fdf47591.html
先进入设置,再进入到系统 – 通知和操作 – 选择在任务栏上显示哪些图标.如何进入到设置有两种方法:
方法一:
(1)打开Win10开始菜单,即可在左下角看到“Settings(设置)”,点击即可打开“设置”应用。

方法二:
点击屏幕右下角任务栏托盘区中的“通知中心”图标打开“通知和操作中心”,在其中即可看到类似于Windows Phone“通知 + 操作中心”里的“All Settings(所有设置)”按钮。
点击即可打开“设置”应用。


进入设置后,再依次进入“系统 – 通知和操作”,点击“选择在任务栏上显示哪些图标”,把“通知区域始终显示所有图标”设置为“开”,这时你会发现下面的具体每个应用图标的设置状态都变成灰色不可设置,同时屏幕右下角的通知区域(系统托盘)中会显示所有的应用图标,向上箭头状的“隐藏”按钮也不见了,原来隐藏的图标都显示出来了。
如果你觉得所有的图标显示出来没有必要,那么也可以不把“通知区域始终显示所有图标”设置为“开”,只需把下面想要显示图标的应用(例如QQ)设置为“开”即可。这样设置为“开”图标就会显示在通知区域,而其它没必要显示的图标还是被隐藏起来。


在使用Windows10系统的过程中,突然发现屏幕右下角的任务栏通知区域的声音、网络、输入法、时钟、电源、操作中心等系统图标中的一个或几个不见了。

Win10任务栏通知区域的音量、网络、输入法图标不见了怎么办?参看:http://www.windows10.pro/win10-volume-network-input-method-icon-disappeared/
背景:在打php7.0.2下的apcu扩展包时,出现 Installed (but unpackaged) file(s) found,这块是因为它不光生成了.so外,还有一些涉及到.h的头文件在里面,可用于c开发,而我们只运行PHP不做开发,也就没有必要打进去,如果有必要则把它的文件及目录全路径写进%files里去,这儿我们就直接在install里删除掉这个目录下的所有文件及可,两种方法任取一个吧,都有实践且成功生成rpm无错误提示,如下。

方法一,来个保留文件且不报but unpackaged的PHP的igbinary扩展情况(视具体情况是删除还是添加选一个即可):
现象:RPM build errors:
    Installed (but unpackaged) file(s) found:
   /usr/local/php/include/php/ext/igbinary/igbinary.h
添加成功解决办法如下:
%files
%defattr(-,root,root,-)
%{php_extdir}/igbinary.so
# 防止出现:error: Installed (but unpackaged) file(s) found错误。                                                                                            
/usr/local/php/include/php/ext/igbinary/igbinary.h

生成的rpm包里有前面在%files里添加的这个文件,如下:
rpm -qpl /home/test/rpmbuild/RPMS/x86_64/igbinary-php55-1.2.1-160418145033.el6.x86_64.rpm
/usr/local/php/ext/igbinary.so
/usr/local/php/include/php/ext/igbinary/igbinary.h

假如想删除上面rpm包里的igbinary.so的igbinary.h文件,也就在install里把这个文件删除即可:


再次编译生成的rpm包里也就没有了那个.h文件如下:
[root@localhost SPECS]# rpm -qpl /home/test/rpmbuild/RPMS/x86_64/igbinary-php55-1.2.1-160418145849.el6.x86_64.rpm
/usr/local/php/ext/igbinary.so


方法二,下面是直接删除的解决办法,实践OK(视具体情况是删除还是添加选一个即可):




也就不报错了,也就解决了这个包不放到里面去且不用修改rpmbuild的配置,也不报错了,如下:
Wrote: /home/test/rpmbuild/RPMS/x86_64/apcu-php70-5.1.3-160418143835.el6.x86_64.rpm
rpm -qpl /home/test/rpmbuild/RPMS/x86_64/apcu-php70-5.1.3-160418143835.el6.x86_64.rpm      
/usr/local/php/ext/apcu.so

======================================================================================
编译打包apcu:
rpmbuild -ba php-7.0.5-extension-apcu-5.1.3.spec
出现如下报错提示,扩展代码编译打包出现如下提示:


阅读全文
背景:在网上找一个开要自启动的shell代码放上去后,直接添加服务提示service redis does not support chkconfig,后加上下面两行O了。

加上两行就好了,如下:
[root@localhost SOURCES]# /sbin/chkconfig --add redis
[root@localhost SOURCES]# chkconfig --list|grep redis
redis           0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@localhost SOURCES]# /sbin/chkconfig redis on
[root@localhost SOURCES]# chkconfig --list|grep redis
redis           0:off   1:off   2:on    3:on    4:on    5:on    6:off


阅读全文
因为老是出现好像刚连接时出现行数没有对齐,得ctrl+l一下才能修改到正确的地方,估计是和字体有关系,此次再次实践注意一下:
1)全局设置:Options - Global Options - Terminal - Appearance - Maximumcolumns - 256,并勾选上show horizontal scroll bar。
2)session设置:Options - Session Options - Terminal -Emulation - Logical Columns设置成255,勾选上Retain size and font,Logicalrows设置成42(刚好满屏)、Scrollbackbuffer设置成5000(这样纵向滚动屏就可以缓存更多内容,但占内存),另外Terminal - Appearance - Window -选上Show horizontal scroll bar,然后重新连接。
=============================================================================================

经常会碰到这种问题,在LINUX上使用isql命令加-w 500参数连到SYBASE数据库中做select查询的结果老是显示混乱.很是郁闷,由于我是在SecureCRT连入到LINUX的,在网上也没有找到合适的答案,PUTTY倒是看到有解决的方法.可惜SecureCRT没找到.
   今天无意中发现SecureCRT也有设置的地方,可惜不好传图片,就文字说明一下吧
   设置方法
   当你用SecureCRT建好一个连接后,在这个连接上点右键,再点 Properties (或直接按快捷键 ALT+ENTER) ,这时再点 Emulation 在右边的 Size 下的 Logical 栏中输入列宽的大小,像我的Windows屏幕是 1024*768的, 在这里我输入了500,然后再选中 右边单选项Onresize 中的 Retain size and font ,选好后再点OK,连接到 Linux ,这时屏幕下方会有一个滚动条,呵呵.再用
   isql -w 5000 -Usa -P -SSERVER 连到sybase 查询一条命令试试
  1> sp_helpdb
  2> go
     呵呵.是不是很漂亮了,再也不会混乱了..

来自:http://blog.chinaunix.net/uid-310409-id-2439822.html
阅读全文
今天svn提交发现错误
#cd /home/svn/app/
# svn up
Summary of conflicts:
  Skipped paths: 1
Skipped 'http://justwinit.com/application/controllers/admin/main.phpl'
At revision 5073.
Summary of conflicts:
  Skipped paths: 1
Skipped 'http://justwinit/index.html'
U    /xxxxxx/index.html

处理方式:
#cd /home/svn/app/
#mkdir /root/bak
#mv /home/svn/app/* /root/bak/
#svn revert .
#svn up



如果还是不可以,出绝招:
svn remove --force filename
svn resolve --accept=working  filename
svn up

我的解决办法是直接把那些有问题的删除掉:
cd domain目录根下直接删除:
rm -Rf application/controllers/admin/main.php
再次svn up一下即可。

From:http://www.fulingjiang.cn/linux/78.html

解决办法:
svn resolve --accept  working 文件名
注:用svn resolve --accept  theirs-full 文件名
提示:svn: warning: Tree conflicts can only be resolved to 'working' state; 文件名 not resolved
༒࿈背༙྇景༙྇:࿈༒STR_TO_DATE(str,format) 这是DATE_FORMAT()函数的反函数。它需要一个字符串str和一个格式字符串格式。STR_TO_DATE()返回一个DATETIME值。

开发要求,获取当月佣金,主要卡在了sql对datetime 类型的判断

先后用过4种方法如下

1.select sum('price') from rrr_order_level where active_time < "2015-09-30 00:00:00";

2.select sum('price') from rrr_order_level where timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00') > 0

3.select sum('price') from rrr_order_level where active_time < '$EndDate' and active_time > '$BeginDate'"

4.select sum('price') from rrr_order_level where active_time between '2015-09-01 00:00:00' and '2015-09-30 00:00:00';


数据库如上

分析错误,mysql不知道对应的年月日,无法比较,采用

select sum(price) from rrr_order_level where active_time >= STR_TO_DATE('2015-09-01 00:00:00','%Y-%m-%d %H:%i:%s') and active_time <= STR_TO_DATE('2015-09-30 00:00:00','%Y-%m-%d %H:%i:%s');

完美解决问题!
༒࿈背༙྇景༙྇:༒࿈这༙྇个༙྇༒࿈还༙྇是༙྇༒࿈0༙྇༒࿈9༙྇༒࿈年༙྇༒࿈开༙྇始༙྇༒࿈兴༙྇起༙྇,༒࿈现༙྇在༙྇༒࿈火༙྇起༙྇来༙྇༒࿈了༙྇。࿈༒࿈༒࿈༒࿈༒࿈༒࿈༒࿈༒࿈༒࿈༒࿈༒࿈༒

GitHub是一个免费托管开源代码的Git服务器,如果我们不想公开项目的源代码,又不想付费使用,那么我们可以自己搭建一台Git服务器。首先你需要一台client和一台server。client可以是windows系统,利用git bash或者cywin类似的软件来执行指令,也可以是ubuntu等linux系统,server可以是本地搭建的服务器,也可以是云服务器。例如:阿里云服务器,对大学生有很大的优惠,非常划算!(没有任何的利益关系)

1.在本机上安装openssh

在linux client上安装ssh服务,如果是windows的安装git for windows

sudo apt-get install openssh-server

可以查看ssh服务是否开启

ps -e | grep ssh

2.在server上创建一个git用户

sudo adduser git

3.在server上安装git

sudo apt-get install git-core

4.在server上初始化仓库

cd /home/git/

git init --bare myRep.git

5.通过git clone命令进行克隆远程仓库

git clone git@{your server ip}:/home/git/myRep.git

这里都必须知道server上git用户的登入密码。
分页: 16/248 第一页 上页 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 下页 最后页 [ 显示模式: 摘要 | 列表 ]