作者归档

Navicat linux版 无限试用

其实navicat的linux版就是windows程序包了一层“绿色版”的wine。
本质还是windows程序,网上一搜一大把的破解无限试用的文章都是重置试用期。
也就是通过删除system.reg和user.reg清空注册表。简单暴力。
但是缺点也明显,就是每次重置后之前保存的mysql连接配置等等也都没了。
其实稍微勤快点就能找到详细点的注册表key。

无损重置试用期方法:
1.丢掉它自带的“绿色版wine”,直接用本机安装的wine运行Navicat.exe
2.保存注册表配置:

REGEDIT4

[-HKEY_CURRENT_USER\Software\Classes\CLSID]

[-HKEY_CURRENT_USER\Software\PremiumSoft\Data]

3.等过了试用期之后,关闭Navicat,打开wine的regedit,点开菜单“注册表(R) – 倒入注册表文件(I)…”然后选择之前的注册表配置文件,确定。

4.再打开Navicat,试用期重置了,而且之前的配置都还在。

 

我是Linux 11.2.6(64-bit),理论上讲win版也通用,就是不知key是不是这个。

当然如果你不缺钱的话还请支持正版。

linux chrome地址栏卡出翔

Excessive call for SkFontConfigInterfaceDirect::matchFamilyName from OmniboxResultView
故障描述中说,为了渲染地址栏的弹出菜单,每当你输入一个字符, matchFamilyName() 方法就会被调用 100 到 200 次! 同时 comment 30 给出了真正的问题根源:
Google Chrome UI 的缺省字体继承自 Gnome 桌面设置(而不是 chrome://settings/)。
地址栏弹出框的缺省字体也是继承自 Gnome 桌面设置。
字体名称的标准名称和本地化名称不相同导致了 Skia 缓存无法命中。
Skia 缓存无法命中导致 fontconfig 频繁被调用,而该调用非常消耗 CPU 时间!

所以我把fedora默认的Sans换成DejaVu Sans(无本地化名称),chrome又飞起来了

谁动了我的时区

之前测试部门一直反馈,安装了某包之后系统的时间会被修改,原因是系统的时区被修改了,时间戳没有变。

可是我测试从来没有发生过这样的问题,总怀疑是某个cron或者系统监控修改了时区,查了半天还是没有找到。

于是给测试部说将时区有问题的机器重装,放几天看看会不会被修改。过了3天,一切正常。
只好开始查找是谁修改了时区。

现有的线索就是时区被修改了,/etc/localtime这个文件被修改了。
最初的想法是安装一下systemtap,监控那个进程动了这个文件。然后在安装systemtap之后发现时区已经被修改。测试了2台机器都是这样。原因很明显是哪个rpm动了手脚。
既然是rpm问题,不外乎两个原因

rpm安装时直接覆盖了文件
rpm中的脚本修改了这个文件

如果是第一个比较好找原因,如果是第二种,那就耗费点体力。所幸的是,原因是第一个。下面说说怎么回事。
阅读更多…

Ugly Numbers

n=2^i*3^j*5^k,ijk是自然数。可以得到n序列 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, …
求此序列第N个数是多少。
一般的人会这样:
把可能的数都算出来,去重,再排序,得到序列

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int main()
{
    set<int> s;
    s.insert(1);
    set<int>::iterator it = s.begin();
    //此处使用1600而非1500,是为了防止类似*it*5 > *(++it)*2的情况出现而导致循环结束时较小的丑数仍未插入容器
    while(s.size()<=1600)
    {
        s.insert(*it*2);
        s.insert(*it*3);
        s.insert(*it*5);
        it++;
    }
    int n;
    while(cin>>n&&n)
    {
        it = s.begin();
        int i = n;
        while(--i){
            ++it;
        }
        cout<<"The "<<n<<"th ugly number is "<<*it<<"."<<endl;
    }
    return 0;
}

明白一些的人思路是这个:http://online-judge.uva.es/board/viewtopic.php?f=22&t=26972
引用原文代码是:

int main(void)
{
   int N;
   while(scanf("%d", &N)){
      if(N <= 0) continue;
      int v, p, temp;
      v = 1; p = 1;
      while(p < N){
         v++;
         temp = v;
         while(temp % 2 == 0) temp /= 2;
         if(temp == 1) { p++; continue;}
         while(temp % 3 == 0) temp /= 3;
         if(temp == 1) { p++; continue;}
         while(temp % 5 == 0) temp /= 5;
         if(temp == 1) { p++; continue;}
      }
      printf("%d\n", v);
   }
   return 0;
}

数小还可以,数大了就会很慢了
然后算法更精一些的人还可以这样:http://www.2cto.com/kf/201306/222203.html
引用原文代码是:

#include<stdio.h>  
int main(void) 
{ 
    int un[1505]={0}; 
    int m2=0,m3=0,m5=0,n,t; 
    un[0]=1; 
    for(n=1;n<1500;n++) 
    { 
        if(2*un[m2]>3*un[m3]) 
            t=un[m3]*3; 
        else 
            t=un[m2]*2; 
        if(t>un[m5]*5) 
            t=un[m5]*5;
        if(t == 2*un[m2]) m2++; 
        if(t == 3*un[m3]) m3++; 
        if(t == 5*un[m5]) m5++;
        un[n]=t; 
    } 
    printf("The 1500'th ugly number is %d.\n",un[1499]); 
    return 0; 
}

算法思路就是先定义一个集合,该集合中有元素1,如果x在集合中,并且y是x的下一个丑数,那么x*2,x*3,x*5也在集合中,其它数不再集合中,这三个数中必定是2x最小,因此首先放入数组中,而此时*2最小的应该是x的下一个丑数y*2,此时应该找出y*2,x*3,x*5中最小的数放入数组,以此类推,具体操作如下:
1
*2
*3
*5

选出乘积最小的,加入到结果集中,相应指针右移
1 2
*3 *2
*5

选出乘积最小的,加入到结果集中,相应指针右移
1 2 3
*5 *2
*3

选出乘积最小的,加入到结果集中,相应指针右移
1 2 3 4
*5 *3 *2

选出乘积最小的,加入到结果集中,相应指针右移
1 2 3 4
*3 *2
*5

以此类推,直到获得足够长的结果集
嗯。算是空间换时间吧。目的下标不确定的话需要自己处理数组空间。不过速度与前者比较那是相当的快啊。
不知道还有没有更好的解法。

为什么ping对方ip会返回重复回应包呢?

ping同一个序号的ICMP包却收到了多个回应:

root@test:/var/www/db# ping mail.corp.qihoo.net
PING mail.corp.qihoo.net (220.181.158.203) 56(84) bytes of data.
64 bytes from 220.181.158.203: icmp_req=1 ttl=114 time=158 ms
64 bytes from 220.181.158.203: icmp_req=1 ttl=114 time=158 ms (DUP!)
64 bytes from 220.181.158.203: icmp_req=2 ttl=114 time=157 ms
64 bytes from 220.181.158.203: icmp_req=2 ttl=114 time=157 ms (DUP!)
64 bytes from 220.181.158.203: icmp_req=3 ttl=114 time=157 ms
64 bytes from 220.181.158.203: icmp_req=3 ttl=114 time=157 ms (DUP!)
^C
— mail.corp.qihoo.net ping statistics —
3 packets transmitted, 3 received, +3 duplicates, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 157.363/157.646/158.133/0.338 ms

man ping 这样说:

ping will report duplicate and damaged packets. Duplicate packets
should never occur, and seem to be caused by inappropriate link-level
retransmissions. Duplicates may occur in many situations and are
rarely (if ever) a good sign, although the presence of low levels of
duplicates may not always be cause for alarm.

首先重复的数据包确实是不应该出现的,然后如此稳定的重复现象也不像是“inappropriate link-level retransmissions”,多方搜索下来前辈们的意见是有这么几种可能:
1.网络中存在环路路由,static route
2.双机HA
3.两台虚拟机使用了相同MAC地址
4.HUB问题
5.ICMP REDIRECT
6./etc/tcp里面的配置手动改过,改错了,广播地址改成了你所要ping的ip地址
阅读更多…

为邮件服务器设置域名DNS SPF记录

SPF用于辅助过滤垃圾邮件,描述哪些ip是此域名的合法发送者,当然不满足测试条件的ip发送的邮件就很有可能是有人恶意仿冒发送方发送的垃圾邮件了。
SPF 的 TXT 记录
SPF 记录包含在一个 TXT 记录之中,格式如下:
v=spf1 [[pre] type [ext] ] … [mod]
每个参数的含义如下表所示: 参数 描述
v=spf1 SPF 的版本。如果使用 Sender ID 的话,这个字段就应该是 v=spf2
pre 定义匹配时的返回值。
可能的返回值包括: 返回值 描述
+ 缺省值。在测试完成的时候表示通过。
– 表示测试失败。这个值通常是 -all,表示没有其他任何匹配发生。
~ 表示软失败,通常表示测试没有完成。
? 表示不置可否。这个值也通常在测试没有完成的时候使用。
type 定义使用的确认测试的类型。
可能的值包括: 候选值 描述
include 包含一个给定的域名的测试
以 include:domain 的形式书写。
all 终止测试序列。
比如,如果选项是 -all,那么到达这条记录也就意味着测试失败了。但是如果无法确定,可以使用”?all”来表示,这样,测试将被接受。
实例比如:
“v=spf1 ip4:220.181.12.0/22 ip4:202.108.9.128/25 ip4:202.108.5.0/24 ~all”
再比如QQ邮箱是
“v=spf1 include:spf.mail.qq.com ~all”
再再比如163邮箱是
“v=spf1 include:spf.163.com -all”
再再再比如de3eb.cn是(QQ企业邮箱加两台vps,include在后)
“v=spf1 ip4:209.141.61.51 ip4:203.195.248.238 include:spf.mail.qq.com -all”
详细参见
http://www.openspf.org/SPF_Record_Syntax

屋里打伞不长个

小时候有次在屋里玩伞,我妈说在屋里打伞不长个,我对此一直深信不疑。

直到有一天我看见我侄子在屋里玩伞,我随口说在屋里打伞不长个,我妈居然一脸疑惑的问我为!什!么? :o

唉,好像内心的小世界和另一个次元的世界发生了碰撞一样,让人很难以接受啊

含泪喷血更正自己的大小端概念

话说曾经自己的认知是正确的。
也就是大小端和字节序是一个概念,各平台实现不一样但通过网路传输数据时要统一转换成大端。
但是!但是!
在上家公司,在写C代码与同事java用自己的协议通信时数据异常,我说是大小端不对,要调换一下4个字节的顺序。
然后被领导指出,这不是大小端问题,是网络字节序和本地字节序的问题,他给讲解的意思大小端大概齐是那么个我听起来好像是汇编中寄存器的高地址和低地址的那种样子。 :?:
由于领导是十几年的老开发,我就这么相信他了,从此改变了自己对大小端的认识。
直到前两天这让我栽了个大跟头。 :sad:
唉。都是眼泪啊,为毛大牛总讲要勇于质疑,不怀疑不能见真理。子也曰:疑是思之始,学之端。
血与泪的教训啊,突然感觉这个世界真是没有什么是永远值得相信的了。 :cry:

青云备份功能简单测试

================================================================
注:领导的强制更新博客挂了。因为后续要跟进对比,所以挪到这里来了。还好我做了备份

    顺便吐槽领导搞这些东西有啥意思嘛,才给报100块害我不得不熬夜,真抠 :arrow:
================================================================
附加硬盘总配额为500G

500G性能盘写满再备份消耗3个多小时
其中写操作1个小时多一点,备份操作消耗2个小时零5分
对主机的备份操作疑似被排队处理。一个对虚机的备份操作被拆为两个备份链备份操作,20G的系统盘备份比500G的备份所需时间还长一些。
最后虽然生成了备份。但操作日志却把此次备份操作标记为失败。

后来为节省时间,我把500G盘删除,保留备份,建两个250G盘,同时进行写与备份操作。
250G盘写满需半小时稍多(1908秒,1989秒)(下午一点多),随后全量备份需59,64分钟左右,增量备份需88,84分钟
全备份+一层增量盘上(即第二层增量盘)写满2122,2027秒。(傍晚五点多)增量备份约92,96分钟
全备份+二层增量盘上(即第三层增量盘)写数据晚上睡觉没取到,增量备份时间约92,91分钟(计费变更时间-备份链节点时间,晚上十点多)
全备份+三层增量盘上(即第四层增量盘)写满1889(第二天上午九点多),2027(第二天下午两点)增量备份约92,93分钟
全备份+四层增量盘上(即第五层增量盘)写满1886(第二天中午十二点),1979(第二天下午五点)增量备份约71分钟,另一个备份过一个多小时提示失败后至欠费也没完成(除在建的备份外,链上共1186.32GB,5个备份点),等待时间超过7个小时。
全备份+五层增量盘上(即第六层增量盘)写满2115(第二天下午两点多)增量备份过一个多小时提示失败后等到欠费备份链示意图和计费还没更新(不算上在建的备份,本链共1432.4GB,6个备份点),等待时间超过9个小时
截至欠费,除未完成的备份点外,备份链总大小为3118.72GB。鉴于两条备份链已经分别等待超过7和9个小时仍未完成备份操作并且期间poweroff命令关机和控制台强制关机操作都十分困难的拖了很长时间才完成等等这些操作时间突然超过之前数据数倍的情况,我怀疑大容量的备份操作已经影响到了母机的正常运行。
阅读更多…

结构体赋值如何偷懒

结构体赋值的简单写法
比如结构体

typedef struct _abc {
        char a;
        short b;
        int c;
} abc;

一般人知道可以这样写abc v={0,1,2};
二般人知道还可以这样写abc v={.c=2,.b=1}; 效果同上。
但这都是定义变量时赋初值,如果是二次赋值,大多数人都只会

v.a=0;
v.b=1;
v.c=2;

因为这时如果写成v={.c=2,.b=1}会出现编译错误。
但是,其实只需要做下类型转换,依然可以这样写

v=(abc){.c=2,.b=1};

虽然这里写的代码不是很明显,但是如果结构体成员变量比较多,变量名又比较长的时候,这个懒还是很值得偷的,而且个人感觉这样写也会更清楚一些。