酷派大神F1联通版救砖

1、安装MTK手机刷机驱动(包含64位)
64位驱动要选:DPInst64.exe
2、打开SP_Flash_Tools中的
flash_tool.exe
3、
在flash_tool中选择:下载
a.download-agent在SP_Flash_Tools目录下
b.载入scatter loading file,文件在救砖包里面

关键环节来了:
拔出电池,盖上后盖,按住音量上,不放手,插上数据线,不要放手,等到刷机工具出现黄色进度条了,放手开始刷机

修改SSH端口

1、编辑
vi /etc/ssh/sshd_config
找到#Port 22一段,这里是标识默认使用22端口,修改为如下:
Port 22
Port 50000
这样SSH端口将同时工作与22和50000上
然后保存退出

2、重启
执行/etc/init.d/sshd restart

3、注意事项
如果设置了iptables,请在iptables中修改打开相应端口

20160118-20160119

0118
1、集合竞价砸盘,但是开盘后5分钟没有看到恐慌反而修复形态
2、缩量,基本不打算交出廉价筹码
3、不能纯看量,因为这个时候场外资金是一点一点进程的。

0119
一致的喊空说明大家都在等一个多空转换开关,要是真的看空,会很沉默。
(这句话的情景应该是在下跌很多以后)

jQuery 1.9以上 on 无效的解决办法

jquery 1.9以上无法使用live,所有live功能合并到on中

$(selector).on(event,childSelector,data,function,map)

今天写代码的时候遇到一个奇怪的问题,append新元素到对象以后,新元素无法注册事件。

<ul>
<li><a class="btn btn-default"><i class="icon icon-add"></i> 复制</a></li>
</ul>
<script>
$(document).ready(function(){
$('.btn').on('click',function(){
ul= $(this).parents('ul');
ahref = $(this).parents('li').clone();
ul.append(ahref);
});
});
</script>

原因就在于是复制后的btn动态加载的元素,而使用上面的方法不能绑定动态加载元素的事件。修改后可以使用:

<script>
$(document).ready(function(){
$(document).on('click','.btn',function(){
ul= $(this).parents('ul');
ahref = $(this).parents('li').clone();
ul.append(ahref);
});
});
</script>

keydown、keypress、keyup的区别

用户在使用键盘时会触发键盘事件。目前,对键盘事件的支持主要遵循的是DOM0级。

在英文输入法下,所有浏览器都遵循以下三个事件:

keydown: 当用户按下任意键时触发,而且按住不放的话,会重复触发此事件。
keypress: 当用户按下字符键时触发,而且按住不放的话,会重复触发此事件。按下Esc键也会触发这个事件,Safari3.1之前的版本按下非字符键时也触发。
keyup: 当用户释放键时触发。
在中文输入法下,浏览器之间则表现得不一致,主要情况如下:

IE,Chrome,Safari:触发keydown和keyup, 不触发keypress。
Firefox:首次按下按键时触发keydown,不触发keypress。在停止输入法并改变文本框内容(如按下回车或者空格键)后会触发keyup。
Opera:keydown, keypress和keyup都不触发。
PS : 只有在触发keyup事件才能获得修改后的文本值。
所有元素都支持以上三个事件,一般情况下只有在文本框时才经常用到。

键盘事件的触发过程具体是这样的: 在用户按下键盘上的一个字符键时,首先会触发keydown事件,然后是keypress事件,最后是keyup事件。其中,keydown和keypress事件是在文本框发生变化之前被触发;而keyup在文本框发生变化之后被触发。如果用户按下一个键不放,就会重复触发keydown和keypress事件。在用户按下一个非字符键时,首先触发keydown事件,然后就是keyup事件。如果用户按下一个键不放,就会重复触发keydown。

当我们监听这三个事件时,最想得到的数据信息就是键码(keyCode)和字符编码(charCode)了。

键码(keyCode)

在发生keydown和keyup事件时,event对象的keyCode属性会包含一个代码,keyCode属性的值就是小写字母或数字对应的ASCII码(点击这里查看ASCII码表),在程序中可通过如下代码来获得keyCode值:

//EventUtil是一个封装的对象,用来处理跨浏览器事件
var textbox = document.getElementById('myText');
EventUtil.addHandler(textbox,'keydown',function(event){
event = event || window.event;
alert(event.keyCode);
});

以下是keydown和keypress事件存在的一些特殊情况:

在FF和Opera中,按分号键时keyCode值为59,但IE,Chrome和Safari则返回186
在Safari3之前的版本中,上、下、左、右箭头和上翻(PageUp)、下翻(PageDown)键返回大于63000的值。
字符编码(charCode)

在发生keypress事件时,FF、Chrome和Safari的event对象都支持一个charCode属性,charCode属性的值就是按下的字符键对应的ASCII编码,这个属性在按下非字符键或发生keydown和keyup事件时值为0;IE和Opera则是在keyCode中保存字符键的ASCII编码。所以,要想跨浏览器获得字符编码,代码如下:

//获取字符编码
var getCharCode = function(event){
var charcode = event.charCode;
if(typeof charcode == "number" &amp;&amp; charcode != 0){
return charcode;
}else{
//在中文输入法下 keyCode == 229 || keyCode == 197(Opera)
return event.keyCode;
}
};

这个方法首先检查charCode属性是否包含数值(在不支持这个属性的浏览器中,值为undefined),在判断是否等于0(兼容keydown和keyup事件),如果条件成立,则返回改值,否则返回keyCode的值。之前的例子获取字符编码如下:

var textbox = document.getElementById('myText');
EventUtil.addHandler(textbox,'keydown',function(event){
event = event || window.event;
alert(getCharCode(event));
});

在得到了字符编码后,可以使用String.fromCharCode()将其转换为实际的字符。

键盘事件的应用

1、 过滤输入——屏蔽某些字符的输入

达到的效果:只能输入数字,输入其他字符没有反应。不屏蔽辅助输入的按键,如退格键,方向键,复制,粘贴等。

原理很简单:在文本框修改前,获取字符编码,判断合理性,不成立则阻止键盘的默认事件。看起来很简单,但由于浏览器的兼容问题,实现起来还是有点难度。代码如下:

var handler= function(e){
e = e || window.event;
var charcode = typeof e.charCode == 'number' ? e.charCode : e.keyCode;
var re = /\d/;
//FF和safari3.1以前版本会对方向键、退格键、删除键触发keypress事件 charcode &gt; 9 可修复此Bug
//!e.ctrlKey 不屏蔽Ctrl+C,Ctrl+V
if(!re.test(String.fromCharCode(charcode)) &amp;&amp; charcode &gt; 9 &amp;&amp; !e.ctrlKey){
//阻止默认事件
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
}
};
EventUtil.addHandler(textbox,'keypress',handler);
//监听粘贴事件
EventUtil.addHandler(textbox,'paste',function(e){
e = e || window.event;
var clipboardData = e.clipboardData || window.clipboardData;
if(!/^\d*$/.test(clipboardData.getData('text'))){
//阻止默认事件
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue = false;
}
}
});

在这个例子的基础上加以修改和调整,就可以应用于放过或屏蔽任何输入文本框的字符。

很遗憾,还有一个bug未能解决,就是在中文输入法时keypress事件失效问题。

针对中文输入法的Bug,目前找到的解决办法是:在文本框加入属性style=”ime-mode:disabled” IE和FF下可禁用输入法;在Chrome,Safar下可为文本框添加keydown事件,判断event.keyCode是否等于299,是的话就阻止keydown默认事件,这种方法对IE也有效。而对于Opera则没有找到解决办法。

swoole笔记(草稿)

第一部分:服务器
一、结构流程图
二、什么是reactor
三、异步和阻塞
四、worker和task_worker
五、主要方法
1、主进程方法
swoole_server::__construct
swoole_server->set
swoole_server->start
swoole_server->reload
swoole_server->shutdown
swoole_server->stats

2、主进程和客户端之间
swoole_server->close
swoole_server->send
swoole_server->sendfile
swoole_server->sendto
swoole_server->sendwait

swoole_server->exist
swoole_server->connection_info
swoole_server->connection_list
swoole_server->heartbeat

3、worker之间通信
swoole_server->sendMessage
swoole_server->finish task_worker和worker之间通信

4、主进程和worker之间
swoole_server->bind
swoole_server->task
swoole_server->taskwait

5、定时器
swoole_server->tick
swoole_server->after
swoole_server->clearTimer

6、其他
swoole_set_process_name
swoole_get_mysqli_sock
swoole_version
swoole_strerror
swoole_errno
swoole_get_local_ip

六、回调函数
1、主进程内的回调函数:
onStart
onShutdown
onMasterConnect
onMasterClose
onTimer

2、管理进程内的回调函数

onManagerStart
onManagerStop

3、Worker进程内的回调函数

onWorkerStart
onWorkerStop
onConnect
onClose
onReceive
onTimer
onFinish

4、task_worker进程内的回调函数

onTask
onWorkerStart

第七:扩展服务器
1、HttpServer
2、WebSocket

第二部分:服务端
第三部分:进程管理

PHP中的子进程和消息队列

原文:http://blog.csdn.net/baidu_zhongce/article/details/49151689

本文将介绍PHP子进程的使用,使用linux消息队列机制来达成进程间的协作,最后用一个简单的例子来类比具体应用方案。

1. 子进程

1.1 创建子进程

int pcntl_fork ( void )

按照php官方的说明,pcntl_fork()函数会创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。

fork之后,操作系统会复制一个与父进程近似的子进程,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,只有对于fork调用的返回会在父子进程中产生区别(见上)。简单理解就是fork之后,会产生一个新的子进程执行之后的代码。

至于哪一个进程最先运行,这与操作系统平台的调度算法有关,而且这个问题在实际应用中并不重要,对于父子进程协同运作,我们将介绍消息队列的使用。

1.2 结束子进程
当子进程处理完自己的任务,需要直接结束时,我们直接关闭该进程即可:

int posix_getpid ( void )

使用该函数,返回进程 id 号,为整型(integer)。在子进程中,该函数返回的即是子进程的进程号。

bool posix_kill ( int $pid , int $sig)

传递sig信号给pid对应的进程,关闭这个进程。sig参数可以百度“PHP信号管理”扩展阅读,这里我们使用简单的SIGTERM为终止进程用的软件终止信号。而pid使用刚刚介绍的获取进程id的函数即可获取。

2. 消息队列

2.1 创建消息队列

int ftok ( string $pathname , string $proj)

将一个可访问的文件路径名转换为一个可供 shmop_open() (此函数用于生产共享内存空间,即我们的消息队列)和其他系统VIPC keys使用的整数,proj参数必须是一个字符串,这个参数其实就是读写方式,一般使用a即可。

使用该函数,我们就可以简单生成一个消息队列用的键值。

resource msg_get_queue ( int $key [,int $perms = 0666 ] )

msg_get_queue()会根据传入的键值(即使用上一个函数获取的)返回一个消息队列的引用。如果linux系统中没有消息队列与键值对应,msg_get_queue()将会创建一个新的消息队列。
函数的第二个参数需要传入一个int值,作为新创建的消息队列的权限值,默认为0666。这个权限值与linux命令chmod中使用的数值是一致的。

该函数的返回值是一个用于访问消息队列的句柄。

2.2 发送消息

bool msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize [, bool$blocking [, int &$errorcode ]]] ) 

queue对应消息队列的句柄。
msgtype涉及到接收消息时候的操作,如果msgtype=0,接收消息队列的第一个消息;大于0接收队列中消息类型等于这个值的第一个消息;小于0接收消息队列中小于或者等于msgtype绝对值的所有消息中的最小一个消息。最后的message是传递的消息。
serialize参数来指定是否需要将消息变量进行序列化,序列化后我们就可以存放结构更为复杂的变量。
blocking参数用来指定在队列满后msg_send的动作,当blocking为true时,msg_send会挂起,等待消息队列中有足够的空间放置消息时再次发送消息。而如果blocking为false则在发现队列满后不执行send直接结束。
errorcode 使用引用方式获取错误代码。

2.3 接受消息

bool msg_receive ( resource $queue , int $desiredmsgtype ,int &amp;$msgtype , int $ maxsize, mixed &amp;$message [, bool $unserialize =true [, int $flags = 0 [, int &amp;$errorcode ]]] )

同样是非常长的一个函数,参数涉及到:
queue对应消息队列的句柄。

desiredmsgtype定义和发送用的msytype类似,只是0表示消息队列中的首个消息会被接受。

msgtype接受到消息的类型

maxsize接受消息的最大长度,如果消息长度超过这个限制,那么获取消息就会失败。

message消息本身,使用引用的方式获取值。

unserialize为true的情况下,不会对收到的信息进行二值化,也就是可以收到其他php脚本发来的数组或是复杂结构;为false的情况下,返回的将是字符串。

Flags函数的处理方式:
MSG_IPC_NOWAIT,直接返回,如果失败则返回一个MSG_ENOMSG的整数。
MSG_EXCEPT,使用后当desiredmsgtype大于0 时,可获取第一条不为desiredmsgtype的消息。
MSG_NOERROR如果消息超过了最大长度,会进行截断并不返回错误。

3. 实例
介绍了这么多函数,其实根本就不知道该怎么用,这里设计了一个比较贴近生产环境的流程:

在父进程中,我们创建了5个子进程来一起处理任务,例子中是简单的echo,实际中可能是统计某日的数据,或者是计算用户答案是否正确。之后每个子进程会不断读取消息队列中的消息,在处理到一定数量的消息后,结束这个子进程。而父进程在创建完子进程后,只需要不断的在消息队列中写入需要处理的任务即可。

< ?php
$message_queue_key= ftok(__FILE__, 'a');
$message_queue= msg_get_queue($message_queue_key, 0666);

$pids= array();
for( $i = 0; $i &lt; 5; $i++) {
$pids[$i] = pcntl_fork();
if ($pids[$i]) {
echo "No.$i child process wascreated, the pid is $pids[$i]\r\n";
} elseif ($pids[$i] == 0) {
$pid = posix_getpid();
echo "process.$pidstart\r\n";
$count = 0;
do {
msg_receive($message_queue, 0,$message_type, 1024, $message, true, MSG_IPC_NOWAIT);
echo "process.$pid dealmessage{$message}\r\n";
$count++;
if($count == 5) {
break;
}
sleep(1);
} while (true);
echo "process.$pid end\r\n";
posix_kill($pid, SIGTERM);
}
}
for( $i = 0; $ i&lt; 25; $i++) { msg_send($message_queue, 1,rand(1000,10000)); } 
?>

利用PHP操作Linux消息队列完成进程间通信

原文:http://www.cnblogs.com/TechZi/archive/2010/07/23/1783342.html
当我们开发的系统需要使用多进程方式运行时,进程间通信便成了至关重要的环节。消息队列(message queue)是Linux系统进程间通信的一种方式。

关于Linux系统进程通信的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/

关于Linux系统消息队列的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/
PHP的sysvmsg模块是对Linux系统支持的System V IPC中的System V消息队列函数族的封装。我们需要利用sysvmsg模块提供的函数来进进程间通信。先来看一段示例代码_1:

< ?php
 
$message_queue_key = ftok(__FILE__, 'a');
 
$message_queue = msg_get_queue($message_queue_key, 0666);
var_dump($message_queue);
 
$message_queue_status = msg_stat_queue($message_queue);
print_r($message_queue_status);
 
//向消息队列中写
msg_send($message_queue, 1, "Hello,World!");
 
$message_queue_status = msg_stat_queue($message_queue);
print_r($message_queue_status);
 
//从消息队列中读
msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);
print_r($message."\r\n");
 
msg_remove_queue($message_queue);
 
?>  

这段代码的运行结果如下:

resource(4) of type (sysvmsg queue)
Array
(
    [msg_perm.uid] => 1000
    [msg_perm.gid] => 1000
    [msg_perm.mode] => 438
    [msg_stime] => 0
    [msg_rtime] => 0
    [msg_ctime] => 1279849495
    [msg_qnum] => 0
    [msg_qbytes] => 16384
    [msg_lspid] => 0
    [msg_lrpid] => 0
)
Array
(
    [msg_perm.uid] => 1000
    [msg_perm.gid] => 1000
    [msg_perm.mode] => 438
    [msg_stime] => 1279849495
    [msg_rtime] => 0
    [msg_ctime] => 1279849495
    [msg_qnum] => 1
    [msg_qbytes] => 16384
    [msg_lspid] => 2184
    [msg_lrpid] => 0
)
Hello,World!

可以看到已成功从消息队列中读取“Hello,World!”字符串

下面列举一下示例代码中的主要函数:

ftok ( string $pathname , string $proj ) 
    手册上给出的解释是:Convert a pathname and a project identifier to a System V IPC key。这个函数返回的键值唯一对应linux系统中一个消息队列。在获得消息队列的引用之前都需要调用这个函数。
 
msg_get_queue ( int $key [, int $perms ] )
    msg_get_queue()会根据传入的键值返回一个消息队列的引用。如果linux系统中没有消息队列与键值对应,msg_get_queue()将会创建一个新的消息队列。函数的第二个参数需要传入一个int值,作为新创建的消息队列的权限值,默认为0666。这个权限值与linux命令chmod中使用的数值是同一个意思,因为在linux系统中一切皆是文件。
 
msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize [, bool $blocking [, int &$errorcode ]]] )
    顾名思义,该函数用来向消息队列中写数据。
 
msg_stat_queue ( resource $queue ) 
    这个函数会返回消息队列的元数据。消息队列元数据中的信息很完整,包括了消息队列中待读取的消息数、最后读写队列的进程ID等。示例代码在第8行调用该函数返回的数组中队列中待读取的消息数msg_qnum值为0。
 
msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize , mixed &$message [, bool $unserialize [, int $flags [, int &$errorcode ]]] ) 
    msg_receive用于读取消息队列中的数据。
 
msg_remove_queue ( resource $queue ) 
msg_remove_queue用于销毁一个队列。

示例代码_1只是展示了PHP操作消息队列函数的应用。下面的代码具体描述了进程间通信的场景

< ?php
 
$message_queue_key = ftok(__FILE__, 'a');
$message_queue = msg_get_queue($message_queue_key, 0666);
 
$pids = array();
for ($i = 0;  $i < 5; $i++) {
        //创建子进程
        $pids[$i] = pcntl_fork();
 
        if ($pids[$i]) {
                echo "No.$i child process was created, the pid is $pids[$i]\r\n";
        } elseif ($pids[$i] == 0) {
                $pid = posix_getpid();
                echo "process.$pid is writing now\r\n";
 
                msg_send($message_queue, 1, "this is process.$pid's data\r\n");
                posix_kill($pid, SIGTERM);
        }
}
 
do {
        msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT); 
        echo $message;
 
        //需要判断队列是否为空,如果为空就退出
        //break;
} while(true)
 
?>

运行结果为:

No.0 child process was created, the pid is 5249
No.1 child process was created, the pid is 5250
No.2 child process was created, the pid is 5251
No.3 child process was created, the pid is 5252
No.4 child process was created, the pid is 5253
process.5251 is writing now
this is process.5251's data
process.5253 is writing now
process.5252 is writing now
process.5250 is writing now
this is process.5253's data
this is process.5252's data
this is process.5250's data
process.5249 is writing now
this is process.5249's data

这段程序每次的运行结果都会不同,这正说明了多进程的异步性。从结果也能看出消息队列FIFO特性。

以上便是我研究的一点心得。接下来将会继续研究PHP利用信号、socket等进行进程间通信的方法。