PHP实现站点pv,uv统计(三)
数据分析脚本如下:
//error_reporting(0);
date_default_timezone_set("PRC");
$environment = get_cfg_var('app_flow_develop') ? get_cfg_var('app_flow_develop') : 3;
define('BASEPATH',dirname(dirname(__FILE__)));
switch($environment){
case 1 :
require BASEPATH . DIRECTORY_SEPARATOR . 'conf' . DIRECTORY_SEPARATOR . 'config.product.php';
break;
case 2 :
require BASEPATH . DIRECTORY_SEPARATOR . 'conf' . DIRECTORY_SEPARATOR . 'config.product.php';
break;
default:
require BASEPATH . DIRECTORY_SEPARATOR . 'conf' . DIRECTORY_SEPARATOR . 'config.develop.php';
break;
}
//删除其他的配置项
unset($tjdomain);unset($config);unset($interval);unset($replace_a);
require BASEPATH . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'logger.class.php';
//0//cc : 是否支持写数据到浏览器(cookie,sessionStorage,localStorage,userData)
//1//ck : 是否支持cookie
//2//cl : 浏览器颜色位数
//3//ds : 浏览器分辨率
//4//fl : flash版本
//5//ja : 是否支持java
//6//ln : 浏览器语言
//7//si : 统计id,站点标示
//8//su : 来源url,只取了域名
//9//kd : 关键词
//10//tt : 站点title
//11//cf : m点 1,站点0
//12//uid : 会员id
//13//pt : 平台
//14//ocu : 操作系统
//15//ua : 浏览器类型
//16//tm : 请求时间
//17//ip : 请求ip
//18//u : 站点url
//19//uuid:唯一用户标识
//20//basesu:原始su
//21//baseu:原始u
//22//basekd:原始关键词
//23//u1:一级连接
//24//u2:二级连接
//25//u3:三级连接
//26//u4:四级连接 //获得时间节点
$time = time();
$Ymd = date("Ymd",$time);
$H = date("G",$time);
$i = floor(date("i",$time)/5); //处理昨天的最后一个五分钟区间
if(0 == $i && 0 == $H){
$Ymd = date("Ymd",strtotime('-1 days'));
$H = 23;
$i = 11;
}
//处理今天上一个小时的最后一个五分钟区间
elseif(0 == $i && 0 != $H){
$H--;
$i = 11;
}
//处理上一个五分钟区间
else{
$i--;
} //手动控制脚本的执行目录
if(isset($_SERVER['argv'][1]) && $_SERVER['argv'][1]){
if(isset($_SERVER['argv'][2]) && isset($_SERVER['argv'][3]) &&
$_SERVER['argv'][2] >=0 &&
$_SERVER['argv'][2] < 24 &&
$_SERVER['argv'][3] >=0 &&
$_SERVER['argv'][3] <12)
{
$Ymd = strval($_SERVER['argv'][1]);
$H = strval($_SERVER['argv'][2]);
$i = strval($_SERVER['argv'][3]);
$handd0 = true;
}else{
echo 'parma error';
}
} //设置redis的key与操作目录地址
$LOG_PATH = $LOG_BASE . DIRECTORY_SEPARATOR . $Ymd . DIRECTORY_SEPARATOR . $H . DIRECTORY_SEPARATOR . $i;
$HOUR_PATH = dirname($LOG_PATH);
$REDIS_DAY_KEY = $Ymd;
$REDIS_HOUR_KEY = "{$Ymd}:{$H}"; $log_base = new Logger($LOG_BASE . DIRECTORY_SEPARATOR . 'error.log'); //小时路径下的记录句柄,先检查有没有小时目录,没有的话报错
if(file_exists($HOUR_PATH)){
$log_hour = new Logger($HOUR_PATH . DIRECTORY_SEPARATOR . 'error.log');
}else{
if(isset($handd0) && true === $handd0){
echo $HOUR_PATH . ' is not exists please check the dir and retry';
$log_base -> error($HOUR_PATH . ' is not exists by hand');
}else{
$log_base -> error($HOUR_PATH . ' is not exists ');
}
exit;
}
//如果有日志
//这里的代码可以封装成一个类,当做一种对最小单元的一个处理方法,或者可以换成其他语言的脚本的调用,也方便单独手动处理数据
//优化可以使用popen,proc_open,pcntl等方法多进程来处理
if(file_exists($LOG_PATH)){
//分钟路径下的记录句柄
$log_do = new Logger($LOG_PATH . DIRECTORY_SEPARATOR . 'do.txt');
//切换目录,不然window下报错
chdir($LOG_PATH);
//判断是否完成这个区间
if(!file_exists($LOG_PATH . '/done.txt')){
//生成合并文件
if(!file_exists($LOG_PATH . '/all.log')){
$log_do -> notice(" combine files starts ");
if(PHP_OS == 'WINNT'){
system("copy *.log all.log");
} else {
system("cat *.log >> all.log");
}
//再次判断
if(!file_exists($LOG_PATH . '/all.log')){
$log_hour -> error(" No.{$i} all log combine error");
exit;
}
$log_do -> notice(" combine files ends ");
}
//读取文件写redis缓存
$log_do -> notice(" read all_log starts ");
if($fp = fopen ($LOG_PATH . '/all.log', "r")){
if(flock($fp , LOCK_SH )) {
//初始化
$redis = new Redis();
$re = $redis->pconnect($REDIS_IP,$REDIS_PORT);
if(!$re){
$REDIS_FLAG = FALSE;
}else{
$REDIS_FLAG = TRUE;
//全站新的ip,uv,uid
$uv_new = $uid_new = $ip_new = array();
//u的新uv,su的新uv,kw的新uv
$u_uv = $su_uv = $kw_uv = array(); }
$ii=1;
//记录这段时间的pv
$si_array = $uv_array = $uid_array = $ip_array = $u_array = $su_array = $kw_array = array();
//读取文件,填充数组
while($str = fgets($fp)){
//移除回车符
$str = trim($str,PHP_EOL);
$a = explode('~^~',$str);
if(27 != count($a)){
$log_do -> notice(" No.{$ii} data is bad type ");
continue;
}
//填充数组
if($a[7]){
//处理si,根据si再次初始化数组
//记录每个站点这段时间的pv总数
/*
$si_array(
'站点一'=>10,
'站点二'=>'20'
);
*/
if(isset($si_array[$a[7]])) {
$si_array[$a[7]] += 1;
} else {
$si_array[$a[7]] = 1;
$uv_new[$a[7]] = $uid_new[$a[7]] = $ip_new[$a[7]] = array();
$u_uv[$a[7]] = $su_uv[$a[7]] = $kw_uv[$a[7]] = array();
$uv_array[$a[7]] = $uid_array[$a[7]] = $ip_array[$a[7]] = $kw_array[$a[7]] = $su_array[$a[7]] = $u_array[$a[7]] = array();
$si_array[$a[7]] = 1;
}
//处理uv
if($a[19]){
//记录uv,记录后得到每个站点,每个uuid这段时间的pv数量
/*
$uv_array = array(
'站点一'=>array(
'uuid1'=>10,
'uuid2'=>20,
)
)
*/
isset($uv_array[$a[7]][$a[19]]) ? $uv_array[$a[7]][$a[19]] += 1 : $uv_array[$a[7]][$a[19]] = 1;
//记录每个站点,这段时间的新的uv数量
/*
$uv_new = array(
'站点一'=>array(
'uuid1','uuid2'
)
)
*/
if($REDIS_FLAG){
//不在这个时间段记录的数据里
if(!in_array($a[19],$uv_new[$a[7]])){
$exist = $redis->HEXISTS("{$REDIS_DAY_KEY}:{$a[7]}:UV:HASH",$a[19]);
//不在今天的历史数据里(即新的uuid)
if(!$exist){
$uv_new[$a[7]][]= $a[19];
}
}
}
}
//处理uid
if($a[12]){
//记录uid,记录后得到每个站点,每个uid这段时间的pv数量
/*
$uid_array = array(
'站点一'=>array(
'uid1'=>10,
'uid2'=>20,
)
)
*/
isset($uid_array[$a[7]][$a[12]]) ? $uid_array[$a[7]][$a[12]] += 1 : $uid_array[$a[7]][$a[12]] = 1;
//记录每个站点,这段时间的新的uid数量
/*
$uid_new = array(
'站点一'=>array(
'uid1','uid2'
)
)
*/
if($REDIS_FLAG){
if(!in_array($a[12],$uid_new[$a[7]])){
$exist = $redis->HEXISTS("{$REDIS_DAY_KEY}:{$a[7]}:UID:HASH",$a[12]);
if(!$exist){
$uid_new[$a[7]][]= $a[12];
}
}
}
}
//处理ip
if($a[17]){
//记录ip,记录后得到每个站点,每个ip这段时间的pv数量
/*
$ip_array = array(
'站点一'=>array(
'ip1'=>10,
'ip2'=>20,
)
)
*/
isset($ip_array[$a[7]][$a[17]]) ? $ip_array[$a[7]][$a[17]] += 1 : $ip_array[$a[7]][$a[17]] = 1;
//记录每个站点,这段时间的新的ip数量
/*
$ip_new = array(
'站点一'=>array(
'ip1','ip2'
)
)
*/
if($REDIS_FLAG){
if(!in_array($a[17],$ip_new[$a[7]])){
$exist = $redis->HEXISTS("{$REDIS_DAY_KEY}:{$a[7]}:IP:HASH",$a[17]);
if(!$exist){
$ip_new[$a[7]][]= $a[17];
}
}
}
}
//特殊处理的项
//处理u
if($a[18]){
//处理一级Url
reg_u_common_op(23);
//处理二级Url
reg_u_common_op(24);
//处理三级Url
reg_u_common_op(25);
//处理四级Url
reg_u_common_op(26);
}
//处理kw
if($a[9]){
//记录kw,记录后得到每个站点,每个kw这段时间的pv数量
/*
$kw_array = array(
'站点一'=>array(
'kw1'=>10,
'kw2'=>20,
)
)
*/
isset($kw_array[$a[7]][$a[9]]) ? $kw_array[$a[7]][$a[9]] += 1 : $kw_array[$a[7]][$a[9]] = 1;
//记录每个站点,这段时间kw的新的uv数量
/*
$kw_new = array(
'站点一'=>array(
'kw1'=>array(
'uuid1','uuid2'
)
)
)
*/
if($REDIS_FLAG){
if(!isset($kw_uv[$a[7]][$a[9]]) || !in_array($a[19],$kw_uv[$a[7]][$a[9]])){
$exist = $redis->HEXISTS("{$REDIS_DAY_KEY}:{$a[7]}:{$a[9]}:KW:UV:HASH",$a[19]);
if(!$exist){
$kw_uv[$a[7]][$a[9]][]= $a[19];
}
}
}
}
//处理su
if($a[8]){
//记录su,记录后得到每个站点,每个su这段时间的pv数量
/*
$su_array = array(
'站点一'=>array(
'su1'=>10,
'su2'=>20,
)
)
*/
isset($su_array[$a[7]][$a[8]]) ? $su_array[$a[7]][$a[8]] += 1 : $su_array[$a[7]][$a[8]] = 1;
//记录每个站点,这段时间su的新的uv数量
/*
$kw_new = array(
'站点一'=>array(
'kw1'=>array(
'uuid1','uuid2'
)
)
)
*/
if($REDIS_FLAG){
if(!isset($su_uv[$a[7]][$a[8]]) || !in_array($a[19],$su_uv[$a[7]][$a[8]])){
$exist = $redis->HEXISTS("{$REDIS_DAY_KEY}:{$a[7]}:{$a[8]}:SU:UV:HASH",$a[19]);
if(!$exist){
$su_uv[$a[7]][$a[8]][]= $a[19];
}
}
}
}
}else{
$log_do -> notice(" No.{$ii} data empty si ");
continue;
} $ii++;
unset($a);
}
$log_do -> notice(" read all_log is complete ");
//填充redis
//记录redis记录开始
if($REDIS_FLAG){
$log_do -> notice(" set redis start ");
//记录站点的pv总数
foreach($si_array as $k => $v){
$redis->HINCRBY("{$REDIS_DAY_KEY}:{$k}:QZ:HASH","PV",$v);
$redis->HINCRBY("{$REDIS_HOUR_KEY}:{$k}:QZ:HASH","PV",$v);
}
//记录站点的uv总数
foreach($uv_new as $k => $v){
$uv_num = count($v);
$redis->HINCRBY("{$REDIS_DAY_KEY}:{$k}:QZ:HASH","UV",$uv_num);
$redis->HINCRBY("{$REDIS_HOUR_KEY}:{$k}:QZ:HASH","UV",$uv_num);
//插入当天的uv唯一hash
$flip_uv = array_flip($v);
$redis->HMSET("{$REDIS_DAY_KEY}:{$k}:UV:HASH",$flip_uv);
}
//记录站点的uid总数
foreach($uid_new as $k => $v){
$uid_num = count($v);
$redis->HINCRBY("{$REDIS_DAY_KEY}:{$k}:QZ:HASH","UID",$uid_num);
$redis->HINCRBY("{$REDIS_HOUR_KEY}:{$k}:QZ:HASH","UID",$uid_num);
//插入当天的uv唯一hash
$flip_uid = array_flip($v);
$redis->HMSET("{$REDIS_DAY_KEY}:{$k}:UID:HASH",$flip_uid);
}
//记录站点的ip总数
foreach($ip_new as $k => $v){
$ip_num = count($v);
$redis->HINCRBY("{$REDIS_DAY_KEY}:{$k}:QZ:HASH","IP",$ip_num);
$redis->HINCRBY("{$REDIS_HOUR_KEY}:{$k}:QZ:HASH","IP",$ip_num);
//插入当天的uv唯一hash
$flip_ip = array_flip($v);
$redis->HMSET("{$REDIS_DAY_KEY}:{$k}:IP:HASH",$flip_ip);
}
//记录站点u的pv,uv
foreach($u_uv as $k => $v){
foreach($v as $kk => $vv){
$u_uv_num = count($vv);
$u_pv_num = $u_array[$k][$kk];
$redis->ZINCRBY("{$REDIS_DAY_KEY}:{$k}:U:PV:ZSET",$u_pv_num,$kk);
$redis->ZINCRBY("{$REDIS_HOUR_KEY}:{$k}:U:PV:ZSET",$u_pv_num,$kk);
$redis->ZINCRBY("{$REDIS_DAY_KEY}:{$k}:U:UV:ZSET",$u_uv_num,$kk);
$redis->ZINCRBY("{$REDIS_HOUR_KEY}:{$k}:U:UV:ZSET",$u_uv_num,$kk);
//插入当天的uv唯一hash
$flip_u_uv = array_flip($vv);
$redis->HMSET("{$REDIS_DAY_KEY}:{$k}:{$kk}:U:UV:HASH",$flip_u_uv);
}
}
//记录站点kw的pv,uv
foreach($kw_uv as $k => $v){
foreach($v as $kk => $vv){
$kw_uv_num = count($vv);
$kw_pv_num = $kw_array[$k][$kk];
$redis->ZINCRBY("{$REDIS_DAY_KEY}:{$k}:KW:PV:ZSET",$kw_pv_num,$kk);
$redis->ZINCRBY("{$REDIS_HOUR_KEY}:{$k}:KW:PV:ZSET",$kw_pv_num,$kk);
$redis->ZINCRBY("{$REDIS_DAY_KEY}:{$k}:KW:UV:ZSET",$kw_uv_num,$kk);
$redis->ZINCRBY("{$REDIS_HOUR_KEY}:{$k}:KW:UV:ZSET",$kw_uv_num,$kk);
//插入当天的uv唯一hash
$flip_kw_uv = array_flip($vv);
$redis->HMSET("{$REDIS_DAY_KEY}:{$k}:{$kk}:KW:UV:HASH",$flip_kw_uv);
}
}
//记录站点su的pv,uv
foreach($su_uv as $k => $v){
foreach($v as $kk => $vv){
$su_uv_num = count($vv);
$su_pv_num = $su_array[$k][$kk];
$redis->ZINCRBY("{$REDIS_DAY_KEY}:{$k}:SU:PV:ZSET",$su_pv_num,$kk);
$redis->ZINCRBY("{$REDIS_HOUR_KEY}:{$k}:SU:PV:ZSET",$su_pv_num,$kk);
$redis->ZINCRBY("{$REDIS_DAY_KEY}:{$k}:SU:UV:ZSET",$su_uv_num,$kk);
$redis->ZINCRBY("{$REDIS_HOUR_KEY}:{$k}:SU:UV:ZSET",$su_uv_num,$kk);
//插入当天的uv唯一hash
$flip_su_uv = array_flip($vv);
$redis->HMSET("{$REDIS_DAY_KEY}:{$k}:{$kk}:SU:UV:HASH",$flip_su_uv);
}
}
$log_do -> notice(" set redis is complete ");
}
//记录redis记录结束
//记录统计数据
//记录统计记录开始
$log_do -> notice(" write analyse data starts ");
if($REDIS_FLAG){
file_put_contents($LOG_PATH . '/uv_new.log', var_export(json_encode($uv_new),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/uid_new.log', var_export(json_encode($uid_new),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/ip_new.log', var_export(json_encode($ip_new),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/u_uv.log', var_export(json_encode($u_uv),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/su_uv.log', var_export(json_encode($su_uv),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/kw_uv.log', var_export(json_encode($kw_uv),true), FILE_APPEND);
}
file_put_contents($LOG_PATH . '/uv_array.log', var_export(json_encode($uv_array),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/uid_array.log', var_export(json_encode($uid_array),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/ip_array.log', var_export(json_encode($ip_array),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/kw_array.log', var_export(json_encode($kw_array),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/su_array.log', var_export(json_encode($su_array),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/u_array.log', var_export(json_encode($u_array),true), FILE_APPEND);
file_put_contents($LOG_PATH . '/si_array.log', var_export(json_encode($si_array),true), FILE_APPEND);
//记录统计记录完毕
$log_do -> notice(" write analyse data is complete ");
//释放变量
if($REDIS_FLAG){
unset($ip_new);
unset($uv_new);
unset($uid_new);
unset($u_uv);
unset($su_uv);
unset($kw_uv);
}
unset($uv_array);
unset($uid_array);
unset($ip_array);
unset($kw_array);
unset($su_array);
unset($u_array);
$log_do -> notice(" release var is complete ");
flock ( $fp , LOCK_UN);
} else {
$log_do -> notice(" all.log flock failed ");
}
fclose ( $fp );
}else{
$log_hour -> error(" No.{$i} all.log fopen error ");
exit;
}
//记录完成
$now = date("Y-m-d H:i:s");
$log_do -> notice(" No.{$i} job done at {$now} ");
file_put_contents($LOG_PATH . DIRECTORY_SEPARATOR . 'done.txt', $now . " No.{$i} job is done" . PHP_EOL, FILE_APPEND);
$log_hour -> notice(" No.{$i} job done at {$now} ");
if(isset($handd0) && true === $handd0){
echo " No.{$i} job done at {$now} ";
}
}else{
$log_hour -> notice(" No.{$i} alread done ");
}
}else{
$log_hour -> error(" No.{$i} dir not exist ");
} //处理各级url的通用方法
function reg_u_common_op($u_no){
//引入全局变量
global $a,$u_array,$REDIS_DAY_KEY,$redis,$REDIS_FLAG,$u_uv;
if($a[$u_no]){
//记录u,记录后得到每个站点,每个url这段时间的pv数量
/*
$u_array = array(
'站点一'=>array(
'u1'=>10,
'u2'=>20,
)
)
*/
isset($u_array[$a[7]][$a[$u_no]]) ? $u_array[$a[7]][$a[$u_no]] += 1 : $u_array[$a[7]][$a[$u_no]] = 1;
//记录每个站点,这段时间的u新的uv数量
/*
$u_uv = array(
'站点一'=>array(
'URL一'=>array(
'uuid1','uuid2'
)
)
)
*/
if($REDIS_FLAG){
if(!isset($u_uv[$a[7]][$a[$u_no]]) || !in_array($a[19],$u_uv[$a[7]][$a[$u_no]])){
$exist = $redis->HEXISTS("{$REDIS_DAY_KEY}:{$a[7]}:{$a[$u_no]}:U:UV:HASH",$a[19]);
if(!$exist){
$u_uv[$a[7]][$a[$u_no]][]= $a[19];
}
}
}
}
}
exit;
附上nginx的server配置:
server {
listen ;
server_name 18touch.tongji.com;
index index.php index.html index.htm;
root /home/tongji/webroot; rewrite ^/h\.js$ /js.php last;
rewrite ^/m\.gif$ /hm.php last; include global/restrictions.conf; location ~ \.php$ {
fastcgi_pass php78;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/tongji/webroot$fastcgi_script_name;
include fastcgi_params;
} location ~ //$ {
empty_gif;
fastcgi_pass php78;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/tongji/webroot/hm.php;
include fastcgi_params;
}
}
剩下从redis每日获取昨天的统计数据,然后存储到文本或者mysql。
PS:对目录的操作在win与linux下的函数效果不同,注意文件夹的权限,写文本也有不同。
统计数据从文本返回到php的脚本:
$fp = fopen ('uv_array.log', "r");
while($str = fgets($fp)){
$str = "\$str = " . trim($str,PHP_EOL) .";";
eval($str);
$a = json_decode($str,true);
var_dump($a);exit;
}
PHP实现站点pv,uv统计(三)的更多相关文章
- [svc][op]从历险压缩日志里网站pv uv统计
http://myhoop.blog.51cto.com/5556534/1367523 tomcat日志格式: http://www.cnblogs.com/anic/archive/2012/12 ...
- SHELL pv uv 统计事例
#!/bin/sh #statistics newplive logs SOURCELOGS=$ ];then echo echo "please input file!" ech ...
- 日志分析_统计每日各时段的的PV,UV
第一步: 需求分析 需要哪些字段(时间:每一天,各个时段,id,url,guid,tracTime) 需要分区为天/时 PV(统计记录数) UV(guid去重) 第二步: 实施步骤 建Hive表,表列 ...
- PHP实现站点pv,uv统计(一)
具体步骤分为数据采集脚本,数据收取服务,数据分析脚本,数据存储服务 采集脚本一般有两种形式,一种是简单的页面插入一个图片进行请求,一种是复杂的动态生成js标签,引入一段js(这时采集服务器会网往客户端 ...
- 有关“数据统计”的一些概念 -- PV UV VV IP跳出率等
有关"数据统计"的一些概念 -- PV UV VV IP跳出率等 版权声明:本文为博主原创文章,未经博主允许不得转载. 此文是本人工作中碰到的,随时记下来的零散概念,特此整理一下. ...
- 实时统计每天pv,uv的sparkStreaming结合redis结果存入mysql供前端展示
最近有个需求,实时统计pv,uv,结果按照date,hour,pv,uv来展示,按天统计,第二天重新统计,当然了实际还需要按照类型字段分类统计pv,uv,比如按照date,hour,pv,uv,typ ...
- Redis实战篇(三)基于HyperLogLog实现UV统计功能
如果现在要开发一个功能: 统计APP或网页的一个页面,每天有多少用户点击进入的次数.同一个用户的反复点击进入记为 1 次,也就是统计 UV 数据. 让你来开发这个统计模块,你会如何实现? 如果统计 P ...
- 网站流量分析指标-PV/UV/PR/ip分析及区别
1.什么是pv? PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你 ...
- PV,UV,IP
参加了DTCC归来之后,各大电商技术大牛都会自豪的分享一下自己公司网站的PV,流量等等.当时也是一知半解,回来之后赶紧查了查,也算是扫扫盲. 以下摘自网络中,自己稍稍做了整理,对于PV,流量和带宽的理 ...
随机推荐
- Visual Studio 自定义控件不显示在工具箱
工具=>选项=>Windows窗体设计器=>常规=>AutoToolBoxPopulate=>True
- VS输入法问题
问题描述:启动VS,打开Winform等的界面设计,无法为控件输入中文,另外,运行程序,无法在TextBox等控件中输入中文: 本人的系统环境:Win7旗舰版,VS2008.VS2010和VS2012 ...
- Task 使用 Task以及Task.Factory都是在.Net 4引用的。Task跟Thread很类似,通过下面例子可以看到。
static public void ThreadMain() { Thread t1 = new Thread(TaskWorker); t1.Start(3); } static public v ...
- Linux基础--文件与目录管理
1.目录与路径 1)特殊目录 . 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表『目前使用者身份』所在的家目录 ~account 代表account这个使用者的 ...
- QTableView带可编辑进度条
main文件与上一个例子完全一致,也使用QStandardItemModel,关键是有这句:QStandardItem.setEditable(false); 继承QAbstractItemDele ...
- Rotate Matrix by One
记得有道Amazon的OA题目,好像是给定一个矩阵,让把矩阵的每个元素向右shift一个位置.这道题之前没有好好自己想过.今天正好刷到了rotate matrix,所以正好一块想了. 思路是类似Lee ...
- SQL中的Null深入研究分析
SQL中的Null深入研究分析 虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错. Tony Hoare 在1965年发明了 null 引 ...
- C中调用LUA回调(LUA注册表)
实现原理: 通过将LUA中得回调函数存入LUA注册表中来保存LUA函数,然后在需要回调时从LUA注册表中取出LUA函数进行调用 下面是一些预备知识:(学习两个重要的函数) 原汁原味的英文解释的最透彻, ...
- Java数据结构之排序
1.冒泡排序:时间复杂度为O(n2) 假设是由小到大排序:相邻两个数之间进行比较,较大的数在后面.一次比较过后最大的数排在最后面 如:40.8.15.18.12一次排序后为:8.15.18.12.40 ...
- USACO Section 4.2: Drainage Ditches
最大流的模板题 /* ID: yingzho1 LANG: C++ TASK: ditch */ #include <iostream> #include <fstream> ...