Pages:  1 2 ... 7 8 9 10 11 ... 21 22
lytsing – Page 9 – lytsing's Blog

Author: lytsing

  • ip地址查询(C++版)

    最近公司服务器被hack,怀疑的ip每次都登录ip138.com查询,很麻烦,想起维护新糊涂的时候,曾经写个小程序统计用户ip地址来源。ip数据库是纯真版,代码是参考别人的,忘了是谁写的,我就只修改了main函数。

    /**
     * file: ip_from.cpp
     * @date: 2007.4.20
     *
     */
    
    #include <cstdio>
    #include <cstdlib>
    #include <string>
    #include <sstream>
    #include <iostream>
    #include <iomanip>
    #include <ios>
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <stdexcept>
    #include <algorithm>
    using namespace std;
    
    typedef unsigned int IP_TYPE;
    
    const int  IP_SIZE = 4;
    const int  OFFSET_SIZE = 3;
    const int  INDEX_RECORD_SIZE = IP_SIZE + OFFSET_SIZE;
    
    class IpLocater {
    private:
        FILE* dbfile;
        int   first_index;
        int   last_index;
        enum  { REDIRECT_MODE_1 = 0x01, REDIRECT_MODE_2 = 0x02 };
    protected:
    
    public:
        IpLocater(const string dbfilename = "QQWry.Dat")
        {
            dbfile = fopen(dbfilename.c_str(),"rb");
            if (!dbfile) {
                printf("can not open the ip db file %s\n", dbfilename.c_str());
                exit(0);
            }
    
            fread(&first_index, sizeof(int), 1, dbfile);
            fread(&last_index, sizeof(int), 1, dbfile);
        }
        ~IpLocater(){
            fclose(dbfile);
        }
    
        int getRecordCount() const {
            return (last_index - first_index ) / INDEX_RECORD_SIZE + 1;
        }
        
        string readString(const int offset = 0){
            if (offset) {
                fseek(dbfile, offset, SEEK_SET);
            }
    
            char ch = fgetc(dbfile);
            ostringstream sstr ;
            while (ch != 0 && ch != EOF) {
                sstr << ch;
                ch = fgetc(dbfile);
            }
            return sstr.str();
        }
    
        inline int readInt3(const int offset = 0 ) {
            if (offset) {
                fseek(dbfile,offset,SEEK_SET);
            }
        
            int result = 0;
            fread(&result, sizeof(char), 3, dbfile);
            return result;
        }
    
        string readAreaAddr(const int offset = 0) {
            if (offset) {
                fseek(dbfile, offset, SEEK_SET);
            }
            char b = fgetc(dbfile);
            if (b == REDIRECT_MODE_1 || b == REDIRECT_MODE_2) {
                int areaOffset = 0;
                fread(&areaOffset, 1, 3, dbfile);
                if (areaOffset) {
                    return readString(areaOffset);
                } else {
                    return "Unkown";
                }
            } else {
                fseek(dbfile, -1, SEEK_CUR);
                return readString();
            }
        }
    
        unsigned int readLastIp(const int offset) {
            fseek(dbfile, offset, SEEK_SET);
            unsigned int ip = 0;
            fread(&ip, sizeof(unsigned int), 1, dbfile);
            return ip;
        }
    
        string readFullAddr(const int offset, int ip = 0) {
            string address = "";
    
            fseek(dbfile, offset + 4, SEEK_SET);
    
            char ch = fgetc(dbfile);
            if (ch == REDIRECT_MODE_1) {
                int countryOffset = 0;
                fread(&countryOffset,sizeof(char),3,dbfile);
                
                fseek(dbfile, countryOffset, SEEK_SET);
                char byte = fgetc(dbfile);
                if (byte == REDIRECT_MODE_2 ) {
                    int p = 0;
                    fread(&p, 1, 3, dbfile);
                    address = readString(p);
                    fseek(dbfile, countryOffset + 4, SEEK_SET);
                } else {
                    address = readString(countryOffset);
                }
                address += readAreaAddr(); // current position
            } else if (ch == REDIRECT_MODE_2) {
                int p = 0;
                fread(&p, 1, 3, dbfile);
                address = readString(p);
                address += readAreaAddr(offset + 8);
            } else {
                fseek(dbfile, -1, SEEK_CUR);
                address = readString();
                address += readAreaAddr();
            }
    
            return address;
        }
    
        void printAddr(int first = 0, int count = 100){
            int record_count  = getRecordCount();
            for (int i = first; i< first+count && i<record_count; i++)
            {
                fseek(dbfile,i*INDEX_RECORD_SIZE+first_index,SEEK_SET);
                unsigned int ip = 0;
                fread(&ip,sizeof(unsigned int),1,dbfile);
                int offset = 0;
                fread(&offset,1,OFFSET_SIZE,dbfile);
                cout << ip2string(ip) << "-" << ip2string(readLastIp(offset))
                    << readFullAddr(offset) << endl;
            }
        }
    
        int find(unsigned int ip,int left ,int right) {
            if (right - left == 1) {
                return left;
            } else {
                int middle = (left + right) / 2;
                
                int offset = first_index + middle * INDEX_RECORD_SIZE;
                fseek(dbfile,offset,SEEK_SET);
                unsigned int new_ip = 0;
                fread(&new_ip,sizeof(unsigned int),1,dbfile);
                
                if (ip >= new_ip) {
                    return find(ip,middle,right);
                } else {
                    return find(ip,left,middle);
                }
            }
        }
    
        string getIpAddr( unsigned int ip){
            int index = find(ip,0, getRecordCount() - 1 );
            int index_offset = first_index + index * INDEX_RECORD_SIZE + 4;
            int addr_offset = 0;
            fseek(dbfile,index_offset,SEEK_SET);
            fread(&addr_offset,1,3,dbfile);
            string address = readFullAddr( addr_offset,ip );
            return address;
        }
        
        string ip2string( unsigned int ip) const{
            ostringstream sstr;
            sstr << ((ip & 0xff000000)>>24) ;
            sstr << "." << ((ip & 0xff0000)>>16);
            sstr << "." << ((ip & 0xff00)>>8);
            sstr << "." << (ip & 0xff);
            return sstr.str();
        }
    
        unsigned int string2ip(const string ipstr)const{
            string str = ipstr;
            unsigned int ip = 0;
            int p = 0;
            p = str.find(".");
            ip += atoi(str.substr(0,p).c_str());
            ip <<= 8;
            str = str.substr(p+1,str.length());
            p = str.find(".");
            ip += atoi(str.substr(0,p).c_str());
            ip <<= 8;
            str = str.substr(p+1,str.length());
            p = str.find(".");
            ip += atoi(str.substr(0,p).c_str());
            ip <<= 8;
            ip += atoi(str.substr(p+1,str.length()).c_str());
            return ip;
        }
    
        string getIpAddr(string ip){
    
            return getIpAddr( string2ip( ip ) );
        }
    };
    
    int main(int argc, char* argv[])
    {
        IpLocater locater("/var/opt/QQWry.Dat");
    #if 0   
        if (argc > 1) {
            string ip = argv[1];
            cout << locater.getIpAddr(ip) << endl;
        } else {
            string str;
            while (cin >> str) {
                cout << locater.getIpAddr(str) << endl;
            }
        }
    #endif
    
        long counter = 0;
    
        if (argc > 1) {
            string file_name = argv[1];
            ifstream infile(file_name.c_str(), ios::in);
    
            if (!infile) {
                cerr << "oops: unable to open log file"
                    << file_name << '\n';
                return -1;
            }
    
            string tmp;
            vector<string> vect;
    
            try {
                while (getline(infile, tmp, '\n'))
                    vect.push_back(tmp.substr(0, tmp.find(' ')));
            } catch (exception& e) {
                cout << e.what() << '\n';
            }
    
            sort(vect.begin(), vect.end());
            vector<string>::iterator it = unique(vect.begin(), vect.end());
            typedef vector<string>::const_iterator iter;
            streamsize prec = cout.precision();
    
            for (iter i = vect.begin(); i != it; ++i) {
                ++counter;
                cout << setprecision(18) << *i << '\t';
                cout << setprecision(prec) << locater.getIpAddr(*i) << endl;
            }
        } else {
            string str;
            while (cin >> str) {
                cout << locater.getIpAddr(str) << endl;
            }
        }
    
        cout << "Today the web access ip total is: " << counter << endl;
    
        return 0;
    }
    

    编译:
    g++ -Wall -o ip_from ip_from.cpp

    代码写死了,记得ip纯真数据库放在 /var/opt/QQWry.Dat 主要用来分析apache的日志。

    newytht:~/bin$ cat stat_ip_from

    #!/bin/sh
    
    now=`date +"%Y%m%d"`
    log_file="/usr/local/apache2/logs/access_log.$now"
    
    if [ -f $log_file ]; then
    	ipnum=`./ip_from '  < /usr/local/apache2/logs/access_log.$now ;
    	echo "$ipnum"  >> /home/bbs/0Announce/bbslist/ip_stat_from
    fi
  • adb 通过 wifi 连接 Android 设备

    1. 需要 root 权限

    代码修改点:

    /system/extras/su/su.c

    60     /* Until we have something better, only root and the shell can use su. */
    61     myuid = getuid();
    62     if (myuid != AID_ROOT && myuid != AID_SHELL) {
    63         fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
    64         return 1;
    65     }
    
    67   if(setgid(gid) || setuid(uid)) {
    68       fprintf(stderr,"su: permission denied\n");
    69        return 1;
    70    }

    把63,64,68,69 行注释掉,编译生成su,然后push到设备。

    adb push su /system/xbin/ 
    adb shell chmod 6755 /system/xbin/su

    2. 安装 adbwireless 软件,一键搞定
    在电子市场上搜 adb,前面两个随便选一个都行。
    adb-wifi in market

    如果电子市场上不了,在 Terminal Emulator 直接输入:

    setprop service.adb.tcp.port 8000
    stop adbd
    start adbd

    通过adb 连上设备,下面是我机器上的操作结果:
    deli@deli-laptop:~$ adb connect 192.168.1.103:8000
    already connected to 192.168.1.103:8000
    deli@deli-laptop:~$ adb shell
    # busybox sh
    / #

  • windows xp 使用VirtualBox 安装 Snow Leopard

    按照这篇文章操作,基本可以搞定。补充些内容吧。

    一、我的PC配置:

    CPU:Inter(R) Core(TM)2 Duo CPU E7400 @ 2.80GHz
    内存:4.00GB
    显卡(集成): 英特尔 G41 Express Chipset ( 256 MB / 微星 )
    操作系统:Windows xp(32位)

    二、虚拟磁盘分区

    原来的磁盘分区都是fat格式,最大支持单个文件只有4G,我要在D盘上安装,将D盘转化为成NTFS

    convert D: /fs:ntfs

    这台机器原来搞过MTK开发,装了图像处理软件ImageMagick ,这个软件也包含一个convert命令。所以输入上面的命令后,发现错误,先把它卸载掉。

    在选择磁盘向导中,创建一个30G大小的虚拟磁盘,出于性能考虑,创建fixed-size类型的虚拟磁盘。

    装完 Snow Leopard系统,就占用近10G的空间,做开发需要要装Xcode,大块头,光安装文件就要下载4个多G,安装需要 10G的空间。矮油!我只分配20G的虚拟分区都不够用,后面又得重新安装。

    三、分辨率的设置

    默认分辨率是1024 * 768,在Video info选项没有我想要的分辨率,需要手动新建。

    1. 找到VirtualBox的安装路径,下面有一个VBoxManage.exe文件,在命令行切换到这个目录,然后执行以下命令:

    VBoxManage setextradata "Snow Leopard" CustomVideoMode1 1440x900x32

    Snow Leopard 是我mac虚拟机取的名字

    2. 重启引导启动,在启动界面 输入:

    "Graphics Mode"="1440*900*32"

    四、其他设置

    显示–>显卡。把显存拉到最大,我的是128M,将启用3D加速勾上。
    系统–>处理器–> cpu数量,我的改为2。

    =更新(2011/5/27)=
    iAtkos s3 v2,系统的版本是10.6.3,gcc,make这一堆东西没有,要装xcode这一坨4G多的东西,xcode4要求是10.6.6+。几次升级失败后,痛定思痛,为何不开始就直接装 10.6.6版本呢。于是google一下,按 Installing Mac OS X Snow Leopard 10.6.6 on VirtualBox 安装ok.

  • Android Market 架构设计解析

    1. 没有源代码。
    2. 通过反编译工具(apktool/dex2jar),察看网络数据包工具(tcpdump/wireshark)研究,不能保证100%的正确,但整体的思路还是能看出来的。国内也有很多第三方电子市场,但形像神不像。

    Android Market Overview : Client & Server

    大致的代码目录(android 1.5版本, 后续版本比较复杂):

    Vending
    |-- AndroidManifest
    |-- res
    |   |-- drawable
    |   |-- drawable-finger
    |   |-- layout
    |   |-- menu
    |   |-- values
    |   `-- xml
    `-- src
        `-- com
            |-- android
            |   `-- vending
            |       |-- SuggestionsProvider.java
            |       |-- ...
            |       |-- VendingNotificationManager.java
            |       |-- adapters
            |       |   |-- AggregatedAdapter.java
            |       |   `-- SectionAdapter.java
            |       |-- api
            |       |   |-- ApiException.java
            |       |   |-- ...
            |       |   `-- UninstallReasonService.java
            |       |-- cache
            |       |   |-- CacheManager.java
            |       |   |-- CacheManagerImpl.java
            |       |   `-- Cacheable.java
            |       |-- controller
            |       |   |-- ActivityAccessor.java
            |       |   |-- ...
            |       |   `-- ResultsController.java
            |       |-- licensing
            |       |   |-- ILicenseResultListener.aidl
            |       |   |-- ILicensingService.aidl
            |       |   `-- LicensingService.java
            |       |-- model
            |       |   |-- Address.java
            |       |   |-- ...
            |       |   `-- UninstallReasonResponseProto.java
            |       `-- util
            |           |-- Base64.java
            |           |-- ...
            |           `-- Util.java
            `-- google
                `-- android
                    |-- googleapps
                    |-- googlelogin
                    `-- providers

    代码文件命名规则

    每个Activity,以Activity为后缀,比如AssetCategoryBrowserActivity.java
    api目录中,继承BaseService的类,以Service为后缀,比如AssetService.java
    model目录中,提供Protobuf TAG的类,以Proto为后缀,比如UninstallReasonResponseProto.java

    用到的设计模式

    MVC, COR(Chain Of Responsibility), Observer(Notification机制), State ,Singleton,Abstact Factory等,看Android的源代码,这些都很常见。除此之外,对于Server/Client 网络系统,Service Locator, Request-Response,lazyload等设计方法也用到。

    数据交换格式protobuf

    在 Protocol Buffers in Android 稍有提到过,protobuf传输的是二进制,比Json、XML有速度上的优势和使用的方便,服务器端可以用C/C++,Java,python等实现。

    API

    http://code.google.com/p/android-market-api/
    Android Market 的开源 API 项目,非官方提供的,基于Google Protocol Buffers 协议实现。

    Cache 机制
    Cache 可以保存在内存,也可以写入disk上。

    /data/data/com.android.vending/cache # ls
    AVMC_UAR{-5434199881535588028_}_____0_10_rei___
    AVMC_UAR{8501175443043592143_}_____0_10_rei___
    AVMC_UAR{}APPLICATION__APP_WALLPAPER_POPULAR_ALL_0_10____
    AVMC_UAR{}APPLICATION__APP_WALLPAPER_POPULAR_ALL_10_10____
    AVMC_UAR{}_____0_10__rvh__
    AVMC_UCR-5434199881535588028_0_3_self_
    AVMC_UCR8501175443043592143_0_3_self_
    AVMC_UGIR_-2863385711196347958
    AVMC_UGIR_-4594342797900232749
    AVMC_UGIR_-5005302620309917353
    AVMC_UGIR_-543419988153558802
    ......

    AVMC_UGIR_-543419988153558802的格式是这样的:
    “AVMC_” + “U”/”S” + “GIR_” + assetId

    其他类似。

    具体实现,可以参考libaddressinput 里的 Cache.java

    本地数据库

    /data/data/com.android.vending/databases/assets.db

    把它 pull 出来,用 sqlite3 工具可以看到数据表。这个主要用来保存下载过的apk信息。

    PUSH 通知

    有软件更新时,就用push推送消息,com/google/android/server/checkin/CheckinService 收到消息后,给market发送一个 “com.android.vending.UPDATES_AVAILABLE” intent。push机制,android froyo之前,用的是XMPP协议,之后是c2dm。

    支付系统

    Google checkout, 没有用过。

    还有很多很多细节的东西,不一一详述。总之,做这么一个平台,需要考虑的东西太多了,不是一个人可以搞出来的。

  • 梅泉文昌阁

    古迹寻踪

    梅泉文昌阁,位于广西平果旧城菊良村,以下文字摘自 《独石滩》 2008年10月15日 双月 总第33期

    —————————— 分割线开始 —————————-

    梅泉文昌阁

    从东壁塔往西约二里,在菊良村小学附近的一座山坡上,有一口美丽的古泉,名叫梅泉,泉水清澈如镜,源源终年不断,泉边长着一颗千年梅树,与泉水相衬妣美,实为胜景之地,故称“梅泉胜景”。

    咸丰初年,在菊良村百良屯秀才黄俊冠的倡导下,当地有名之士捐资献料,出谋献策,在这里修建了一座规模雄伟,金碧辉煌的寺庙,名曰梅泉文昌阁。庙内设立神牌佛像,有观音菩萨,红脸关公,十八罗汉等,生态逼真,惟妙惟肖。正门有一块雕着“梅泉胜景”的大石横匾安置其上,其字苍劲有力,颇有“笔锋腾虎豹,墨浪走蛟龙”之感,落款为周孔惠手笔。门前竖立一块约2米,宽约1米的大石碑,这就是“梅泉文昌阁碑”,记载着文昌阁建立的背景,位置,经过以及某地某人捐资捐物数。碑文首句曰:“人才不择地而生”,这一论点充分说明当时立碑者思想前卫,对后一代有着积极的影响。还有一块“梅泉诗”碑立于寺后,后两句为“梅泉涌出芙蓉镜,留着他年及第人”,这就是说前人的光辉,永远照耀着后人开拓前进。

    遗憾的是,如今“梅泉胜景”虚存其名,“文革”期间,辉煌的文昌被“四旧”砸得粉粹,善良的菩萨,威武的关公,乐观的十八罗汉也是难逃劫难,就连泉边的千年梅树也消失无踪。无情的历史,给“梅泉胜景”带来致命的创伤,如今只剩下清流、石匾、记事碑而已。倘若建造者们在天有灵,一定为此落泪啊。
    —————————— 分割线结束 —————————-

    梅泉文昌阁碑文

    人才不择地而生。郡以北二百里有奇为兴宁寨。风俗淳朴,不尚文逦迤,而前砠之凹梅泉出焉,山下出泉象取诸蒙,有景行育德之义,乡人士 甞遨其间,山不高而秀,泉不深而清,盖勝景也。余倡捐鸠工庇材,帖泉建阁设文昌帝君像,众皆可期年而落成,复屋重檐,折瓴分流,上下两层,开门九配就德,通窗六准六经。壁上绘花卉人物,譬儒者襟怀,无所不备也。告竣携同志登阁以观四面环云,一泓貯静。有非人思议所及殆,妙想天开也乎。东望星岭联珠,佛宇新泉掩映成趣。值此文机,朗畅光聚,奎气射斗,匠心独运,手造五凤楼觉流水,今日明月前身,几得意忘言者矣?由是而西,簇笔峰高,如玉荀遥簪, 铓毫束立,鼓文心之精锐,为处囊锥,为出匣剑,雕虫小技勿庸也。放鹰山峙,其南神情奇肆, 倐起倐落,不可摸捉。非文势之,积健为雄,变化莫测者,与北则股帽山俯让泉,知文情之大雅,春容宛从端章,甫习礼乐中来也。睹斯阁也,因遨而见景,因景而悟文,夫豈徒为是登临之乐也耶。虽然余将有进焉,且夫士君子之立学也,先器识而后文艺,尚道德而默词章。实之不存,虚车饰无,当也,未也。其存心光如泉鱼在藻,厯厯可数,其立平清正;如泉泻石磴,冰在玉壶;其制行洁白,如泉之涓涓,始流淤泥而不染。如此有文有本,活泼泼地胸别具一泉。孔曰在川,孟曰观澜,此物之志也,不纵使英豪蔚起,文同翻水,思若涌泉, 立阁之本意哉。居山陬而振文凤,请自隗始,若筮虎变,占鹤鸣,翻然为图南鹏以光宠斯阁者,余将拭目以俟后之人!

    黄俊冠拜撰

    咸丰四年岁次甲寅孟春月吉时立

    注:原文繁体字无标点,此标点正确与否,共商榷

    甞 cháng 古同“尝”。
    逦迤:读音lǐyǐ 曲折连绵。也作“迤逦”
    砠: 读音jū 上面有土的石山;一说为上面有石的土山。
    瓴: líng 古代一种盛水的瓶子:高屋建瓴(从房顶上往下泻水,喻居高临下的形势)。
    貯 zhù 见“贮”
    铓 (鋩) máng 刀剑等的尖端;锋刃:锋铓。剑铓。
    倐 shū 同“倏”。
    豈 qǐ(岂的繁体字)
    陬 zōu 隅,角落:陬见(粗浅的见识)
    请自隗始 qǐng zì wěi shǐ 复句式;作谓语;比喻自愿带头
    筮 shì 古代用蓍草占卦:“龟为卜,策为筮”。筮仕(古人将出外做官,先占卦问吉凶。后称初次做官为“筮仕”)。
    俟 sì 〔俟次〕依次。 等待:俟机进攻。
    厯 lì 古同“歴”
    歴 lì 古同“历”。