月度归档:2014年11月

关于windows的自带日历被流氓软件修改

在这个流氓软件披着免费软件外衣的时代,以百度,360,腾讯,金山为代表的软件厂商,为了争夺用户,在用户电脑上烽烟四起,活生生把用户电脑当成战场。对于这种软件,我是保持见一个杀一个的态度!今天给大家介绍的是百度的时光日历,在我完全不知情的情况下,把我的windows任务栏的日历程序替换成流氓软件,虽然样子还可以,但是对不起,我电脑不容许流氓软件的存在,不过这伙比起前几天金山的那个ksdefserver.exe要厚道的多,在控制面板的“程序和功能”里面提供了卸载程序,直接去那里删除就可以啦~

流氓软件,百度时光日历

三星840ssd降速问题

前阵子爆发的840evo降速问题三星已经出了新的固件修复,我以为和840series无关,但今天看了一下我的840series,真是惨不忍睹,记得刚买的时候稳定在200mb左右(工作在SATA II下),在网上一搜,好多人也在说这个问题,不过好在有消息称三星正在修复这个掉速bug

Samsung 840 Series SSD

修改mysql的root密码

前阵子把开发环境的root密码忘记了,下面记录一下在windows的找回方法,linux不知道是否适应
1. 关闭mysql服务
2. 用命令行启动mysql(mysqld –skip-grant-tables)
3. 用任意用户名登录mysql,无需密码
4. use mysql;
update User set password=PASSWORD(‘新密码’) where user=’root’;
FLUSH PRIVILEGES;

什么是ksdefserver.exe,如何删除

今天不小心点了一个金山的更新,结果就在进程中发现ksdefserver.exe这货,看意思是kingsoft defense server(金山防御服务器),于是去找卸载程序,果然不出所料,程序没有提供任何卸载方法!!!

停用方法:
控制面板 -> 管理工具 -> 服务 -> DefSrv -> 将启动种类设置成无效即可

卸载方法:
还是到服务里面停掉DefSrv,然后到C:\Program Files (x86)\kingsoft\中把“ksdef”目录给删掉即可

注:DefSrv是我找了半天才找到的,这个服务金山故意没有任何说明,也没有标注kingsoft或者ks名称,可见根本就是提高用户发现和删除成本。

让Sublime Text支持中文

1. 安装Package Control
下载 http://sublime.wbond.net/Package%20Control.sublime-package
将它放到%AppData%\Roaming\Sublime Text 2\Installed Packages里面
重启Sublime Text
至此已经安装上Package Control

2. 安装GBK Encoding Support和ConvertToUTF8
在Sublime Text中按Ctrl+Shift+P
在弹出的输入框中输入Install Package
大概等1秒钟后在新弹出的输入框中输入“ConvertToUTF8”回车安装
重复上述步骤在Package Control输入框中查找“GBK Encoding Support”回车安装

重启Sublime Text即可,以上说的是Sublime Text 2的安装过程,Sublime Text 3不知道是否能通用

将xml文件转换为php数组

数组的key是xml标签名,使用“_c”访问子标签,使用“_v”访问标签内容,使用“_a”访问标签属性

function xml2array(&$string) {
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parse_into_struct($parser, $string, $vals, $index);
xml_parser_free($parser);

$mnary=array();
$ary=&$mnary;
foreach ($vals as $r) {
$t=$r[‘tag’];
if ($r[‘type’]==’open’) {
if (isset($ary[$t])) {
if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array());
$cv=&$ary[$t][count($ary[$t])-1];
} else $cv=&$ary[$t];
if (isset($r[‘attributes’])) {foreach ($r[‘attributes’] as $k=>$v) $cv[‘_a’][$k]=$v;}
$cv[‘_c’]=array();
$cv[‘_c’][‘_p’]=&$ary;
$ary=&$cv[‘_c’];

} elseif ($r[‘type’]==’complete’) {
if (isset($ary[$t])) { // same as open
if (isset($ary[$t][0])) $ary[$t][]=array(); else $ary[$t]=array($ary[$t], array());
$cv=&$ary[$t][count($ary[$t])-1];
} else $cv=&$ary[$t];
if (isset($r[‘attributes’])) {foreach ($r[‘attributes’] as $k=>$v) $cv[‘_a’][$k]=$v;}
$cv[‘_v’]=(isset($r[‘value’]) ? $r[‘value’] : ”);

} elseif ($r[‘type’]==’close’) {
$ary=&$ary[‘_p’];
}
}

_del_p($mnary);
return $mnary;
}

// _Internal: Remove recursion in result array
function _del_p(&$ary) {
foreach ($ary as $k=>$v) {
if ($k===’_p’) unset($ary[$k]);
elseif (is_array($ary[$k])) _del_p($ary[$k]);
}
}

// Array to XML
function ary2xml($cary, $d=0, $forcetag=”) {
$res=array();
foreach ($cary as $tag=>$r) {
if (isset($r[0])) {
$res[]=ary2xml($r, $d, $tag);
} else {
if ($forcetag) $tag=$forcetag;
$sp=str_repeat(“\t”, $d);
$res[]=”$sp<$tag"; if (isset($r['_a'])) {foreach ($r['_a'] as $at=>$av) $res[]=” $at=\”$av\””;}
$res[]=”>”.((isset($r[‘_c’])) ? “\n” : ”);
if (isset($r[‘_c’])) $res[]=ary2xml($r[‘_c’], $d+1);
elseif (isset($r[‘_v’])) $res[]=$r[‘_v’];
$res[]=(isset($r[‘_c’]) ? $sp : ”).”\n”;
}

}
return implode(”, $res);
}

// Insert element into array
function ins2ary(&$ary, $element, $pos) {
$ar1=array_slice($ary, 0, $pos); $ar1[]=$element;
$ary=array_merge($ar1, array_slice($ary, $pos));
}

关于No Launcher activity found! The launch will only sync the application package on the device!错误

开发android的时候,由于初始化项目没有让ide给我建立默认activity,所以从layout到activity都是一个个手写的,但是在打包的时候报出了如下错误

No Launcher activity found!
The launch will only sync the application package on the device!

看网上很多资料说是因为AndroidManifest.xml文件的application标签中的activity没有指定LAUNCHER,如下代码




但是我加上了还是有这种错误,不过只是打包的时候有错,到了模拟器上还是可以运行的,不过不是自动打开的,而是需要自己找到app图标打开,所以很诧异,为什么说找不到启动的activity却可以手动打开呢,找了半天才发现,原来我是在bin目录下的AndroidManifest.xml里面修改的,并不是在项目目录下AndroidManifest.xml……赶紧改了项目目录下的AndroidManifest.xml,不过搞不懂为什么要两个目录放同样功能的文件。

[转]bash shell快捷键学习

Ctrl-A 相当于HOME键,用于将光标定位到本行最前面

Ctrl-E 相当于End键,即将光标移动到本行末尾

Ctrl-B 相当于左箭头键,用于将光标向左移动一格

Ctrl-F 相当于右箭头键,用于将光标向右移动一格

Ctrl-D 相当于Del键,即删除光标所在处的字符

Ctrl-K 用于删除从光标处开始到结尾处的所有字符

Ctrl-L 清屏,相当于clear命令

Ctrl-R 进入历史命令查找状态,然后你输入几个关键字符,就可以找到你使用过的命令

Ctrl-U 用于删除从光标开始到行首的所有字符。一般在密码或命令输入错误时常用

Ctrl-H 删除光标左侧的一个字符

Ctrl-W 用于删除当前光标左侧的一个单词

Ctrl-P 相当于上箭头键,即显示上一个命令

Ctrl-N 相当于下箭头键,即显示下一个命令

Ctrl-T 用于颠倒光标所在处字符和前一个字符的位置。(目前不知道有什么作用,哪位朋友知道?)

Ctrl-J 相当于回车键

Alt-. 用于提取历史命令中的最后一个单词。你先执行history命令,然后再敲击此快捷键若干下,你就懂了!

Alt-BackSpace 用于删除本行所有的内容,基本上和Ctrl-U类似。

Alt-C 用于将当前光标处的字符变成大写,同时本光标所在单词的后续字符都变成小写。

Alt-L 用于将光标所在单词及所在单词的后续字符都变成小写。

Alt-U 用于将光标所在单词的光标所在处及之后的所有字符变成大写。

ps:使用bind -P命令可以查看所有键盘绑定。

ps2:Alt快捷键较少使用,因为常常和编辑器冲突

关于wear leveling count

最近想要入手两块SSD为我的新电脑组RAID,因为三星850PRO比840PRO贵了不少,但是参数差不多,就差了一下,原来差的最大的是寿命,850PRO的P/E值高达6000,840PRO的是3000,而840的仅有1000……赶紧回家看到笔记本那块840,察看S.M.A.R.T,找P/E值找不到,发现原来是“wear leveling count(平均抹写储存区块次数)”,当前值是一个百分数,当达到0%的时候,说明SSD已经耗光厂商设定的磨损限度,但是这个值经过网上磨损消耗测试发现很保守,也就是说这个值就算到达0%也是可以用,但是无法保证安全,所以当这个值到达0的时候,就是时候更换SSD硬盘了。RAW VALUE就是当前的P/E的次数了,用这个“wear leveling count”的值乘以SSD的总容量就近似等于“TOTAL LBA WRITTEN”的值,但是我不明白为什么“TOTAL LBA WRITTEN”的值大于三星官方的Samsung Magician工具所给出的写入总字节数。。。

ssd840-20141110

MySQL排序(order by)分租(group by)中的数据

有时候在使用MySQL的时候会要寻找按日期分组,并且要求分组的数据是最新的那一条,对于下面这条常见SQL语句

select * from [TABLE] where id>100 group by date having count(*)>10 order by date

MySQL会先执行from [TABLE],也就是找表,然后执行where id>100,再执行group by date,在执行having count(*),然后才执行select,最后执行order by date

通过这个可以看出如果我想要找每天最新的一条数据(order by date),那么是不可能实现的,因为order by是在group by之后执行的,所以排序的数据是经过group by分组之后的数据。

解决方案有两种
1.在group by分组前排序好
select * from (select * from [TABLE] group by date desc) t group by t.date

2.使用substring_index和group_concat函数
select * from [TABLE] where id in(select substring_index(group_concat(id order by date desc),’,’,1) from [TABLE] group by date ) order by date desc

但无论从难易程度还是效率(测试数据200W+)上来说,使用分组钱排序的方法要好于使用substring_index和group_concat函数