• G
    guluting

    Reader分析


    数据结构

    type Reader struct {
        rd   io.Reader     // 被读取的io缓存,可以是网络的或文件的
        buf  []byte        // 缓冲区,用于给rd当缓存使用
        r, w int           // 读写游标,用来管理buf字段的
        err  error         // 存储当前Reader的异常值
    }
    

    常量分析

    const defaultBufSize = 4096   // 针对Reader中的buf字段,默认缓冲区大小(byte)
    const minReadBufferSize = 16  // 在初始化Reader结构的时候,能够设置的最小的缓冲区大小
    const maxConsecutiveEmptyReads = 100  // 从rd中读取数据无数据(fill操作)返回时(n==0)时,最多的读取次数
    

    函数分析
    func (b *Reader) fill();

    1、缓存对齐,如果读游标不在缓存的起始位置,则将可读数据对齐到起始位置copy(buf,buf[r:w])
    2、经过对齐后,如果w的游标超出了缓冲区的长度,则抛出一次异常
    3、尝试maxConsecutiveEmptyReads次从rd中读取数据到buf中,直到出现异常或者成功的读到数据到buf中了返回,如果超出了尝试次数则设置err为io.ErrNoProgress


    白色:空闲内存,可写入数据
    绿色:已写入内存,可读取数据
    灰色:已读取内存,可回收(fill函数在填充数据的同时会处理回收)
    0_1558596290334_未命名.png

    图中初始时有10个空闲块,R和W都指向下标0处。
    向内存中写入了5Byte的数据,这时候R在下标0处,W指向了下标5,这时候的可读数据为W-R=5Byte。
    读取了3Byte的数据,这时候R指向下标3,可读数据为W-R = 2,可回收空间为R。
    回收已读数据copy(buf,buf[r:w]),将R到W区间的数据平移至buf下标为0的位置。

    posted in GuaiK实验室 read more
  • G
    guluting

    看了Go语言的书后发现它有切片和map类型,但是没有Set类型,那么这时候如果需要用到Set类型如何实现呢?
    借助map和struct就可以很轻易的实现,利用两个特点:
    1、map的key是不会重复的
    2、struct{}是占用0内存空间的


    // 先定义map类型,key为int32,value为struct{}
    var mySet map[int32]struct{}
    // 使用make为map分配内存并初始化
    mySet = make(map[int32]struct{})
    // 使用mySet
    mySet[0] = struct{}{}
    mySet[100] = struct{}{} 
    

    struct{}{}的定义

     struct{}  {}
    |  ^     | ^
      type     empty element list
    

    posted in GuaiK实验室 read more
  • G
    guluting

    刚入门Golang语言的新手而言,gopath简直是一个奇葩的存在,因为你有两个做法可以去创建一个Go的项目:

    第一种:你随便找个目录建立一个工程,然后需要在环境变量中配置gopath的路径。
    第二种:直接把工程建立在现有的gopath的目录下。
    这几种方式确实有点恶心到我了。


    BUT

    我在看开源项目的时候发现了一个好东西,我分析了项目根目录有一个叫"go.mod"的文件,你那么这是干嘛的呢,通过强大的Google搜索了一下,那么下面就记录一下结果吧,废话很少,很精简,自己测试即可:

    生成go.mod的方式:(假设项目根目录叫:“guaik”)

    cd ./guaik
    go mod init guaik
    

    最后的"guaik"名字可以随便更换,这时候目录下就会出现一个go.mod的文件,那么其实这样就完事了。很简单

    之后如果要引用当前项目的包(在guaik目录中年有一个http的包)可以使用以下方式:

    import (
    "guaik/http"
    )
    

    posted in GuaiK实验室 read more
  • G
    guluting

    1、进入flutter的services目录
    cd flutter/packages/flutter/lib/src/services


    2、修改text_input.dart文件的TextInputConnection类的show方法,将以下代码注释掉
    SystemChannels.textInput.invokeMethod<void>('TextInput.show');

      /// Requests that the text input control become visible.
      void show() {
        assert(attached);
        // SystemChannels.textInput.invokeMethod<void>('TextInput.show');
      }
    

    3、重新编译下工程即可

    posted in GuaiK实验室 read more
  • G
    guluting

    • Close Xcode
    • Open Keychain
    • Remove “Iphone Developer” and “Apple Worldwide Developer Relations Certification Authority”
    • Reopen Xcode
    • Product / Run the project again with debug executable checked (Succeed)
    • Close Xcode
    • Open vscode
    • Debug / Start debugging
    • It built and run on physical device successfully

    posted in GuaiK实验室 read more
  • G
    guluting

    sudo vi /etc/bashrc

    #PS1='\h:\W \u\$ '
    PS1='\W \$ '
    

    posted in GuaiK实验室 read more
  • G
    guluting

        AnimationController _panelAnimationController;
        _panelAnimationController = new AnimationController(
          vsync: this,
          duration: new Duration(milliseconds: 300),
        );
        Animation<double> animation =
            new Tween(begin: 300.0, end: 0.0).animate(_panelAnimationController);
        animation.addStatusListener((status) {
          if (status == AnimationStatus.completed) {
            //动画执行结束时反向执行动画
            _panelAnimationController.reverse();
          } else if (status == AnimationStatus.dismissed) {
            //动画恢复到初始状态时执行动画(正向)
            _panelAnimationController.forward();
          }
        });
        animation.addListener(() {
          print(animation.value);
        });
        _panelAnimationController.forward();
    

    posted in GuaiK实验室 read more
  • G
    guluting

    下载地址:
    http://waon.sourceforge.net/#download


    依赖库安装:(Mac OS)

    brew install fftw
    brew install libsndfile
    

    编译:

    make --makefile=Makefile.waon
    

    posted in GuaiK实验室 read more
  • G
    guluting

    CMake是一个很便捷的跨平台编译工具,只要把目录结构排版好,写一个CMakeLists.txt告诉CMake怎么去生成makefile就ok了。


    基本用法

    # 目录结构
    -/ *(根目录)
    |-CMakeLists.txt
    |-main.cpp
    |-ios.toolchain.cmake *(可选项,用来编译ios项目用,下面会提供下载地址)
    |-build *(用来存放编译后可执行文件的目录)
    |-library *(用来存放编译后生成静态库的目录)
    |-utils *(utils静态库源码目录)
        |-CMakeLists.txt
        |-utils.cpp
        |-mem.cpp
        |-utils.h
        |-mem.cpp
    

    根目录中的CMakeLists.txt

    # 项目名称
    project(ANLib)
    # 设置CMake最小版本
    cmake_minimum_required(VERSION 2.8)
    set(CMAKE_MACOSX_RPATH 0)
    # 代码路径
    aux_source_directory(. test_src)
    #设置编译器
    set(CMAKE_CXX_COMPILER "g++")
    #设置构建类型,及相应的编译选项
    set(CMAKE_BUILD_TYPE "Release")
    set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -m64")
    set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -m64")
    
    #设置执行文件输出目录
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)
    #设置库输出路径
    set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/library)
    
    #设置utils库源码路径
    set(utils_dir ./utils)
    add_subdirectory(${utils_dir})
    include_directories(${utils_dir})
    
    link_directories(${PROJECT_SOURCE_DIR}/library)
    
    # 生成可执行的文件
    add_executable(test ${test_src})
    target_link_libraries(test utils)
    
    

    utils目录中的CMakeLists.txt

    set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/library)
    aux_source_directory(. dir_srcs)
    add_library(utils STATIC ${dir_srcs})
    target_link_libraries(utils)
    

    开始使用Cmake

    切换到根目录中,编译项目:

    cmake .
    make
    

    在mac中使用cmake编译ios的静态库:(需要mac os系统)

    clone以下项目,让后将’ios.toolchain.cmake’放到根目录中(以下链接选一个下载)
    https://code.google.com/archive/p/ios-cmake/downloads
    https://github.com/leetal/ios-cmake

    切换到根目录中,编译项目:

    cmake . -DCMAKE_TOOLCHAIN_FILE=./ios.toolchain.cmake -DIOS_PLATFORM=SIMULATOR64
    make
    

    相关选项说明:

    Set -DIOS_PLATFORM to "SIMULATOR" to build for iOS simulator 32 bit (i386) DEPRECATED
    Set -DIOS_PLATFORM to "SIMULATOR64" (example above) to build for iOS simulator 64 bit (x86_64)
    Set -DIOS_PLATFORM to "OS" to build for Device (armv7, armv7s, arm64, arm64e)
    Set -DIOS_PLATFORM to "OS64" to build for Device (arm64, arm64e)
    Set -DIOS_PLATFORM to "TVOS" to build for tvOS (arm64)
    Set -DIOS_PLATFORM to "SIMULATOR_TVOS" to build for tvOS Simulator (x86_64)
    Set -DIOS_PLATFORM to "WATCHOS" to build for watchOS (armv7k, arm64_32)
    Set -DIOS_PLATFORM to "SIMULATOR_WATCHOS" to build for watchOS Simulator (x86_64)
    

    posted in GuaiK实验室 read more
  • G
    guluting

    import 'package:flutter/services.dart';
    
    void main() {
      // 强制竖屏
      SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
          .then((_) {
        runApp(MainApp());
      });
    }
    

    posted in GuaiK实验室 read more
  • G
    guluting

    使用Gitlab内置的Nginx服务

    1、去官网下载最新版的Gitlab软件,根据操作系统选择:(我的是CentOS7,选择rpm x64安装包)
    https://packages.gitlab.com/gitlab/gitlab-ce

    wget https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-11.7.5-ce.0.el7.x86_64.rpm
    

    2、安装依赖包和相关配置

    sudo yum install -y curl policycoreutils-python openssh-server
    sudo yum install postfix
    sudo systemctl enable postfix
    sudo systemctl start postfix
    sudo systemctl enable sshd
    sudo systemctl start sshd
    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent  
    sudo firewall-cmd --zone=public --add-port=8081/tcp --permanent  
    sudo firewall-cmd --reload
    

    3、安装Gitlab

    rpm -i gitlab-ce-11.7.5-ce.0.el7.x86_64.rpm
    

    4、配置Gitlab,监听8080端口

    vi /etc/gitlab/gitlab.rb
    #=======================
    # 修改external_url,修改成你服务器的ip地址,如:external_url 'http://192.168.1.xxx'
    # 查找所有8080端口,共3个,全部改成8081
    # 查找nginx['listen_port'],将Nginx监听端口修改成8080
    

    5、重启Gitlab服务器

    sudo gitlab-ctl reconfigure
    sudo gitlab-ctl restart
    

    6、用浏览器访问:
    http://192.168.1.xxx:8080

    可能出现问题的解决方案:

    安装过程中卡死不动,强制终止后运行下面指令

    sudo systemctl restart gitlab-runsvdir
    sudo gitlab-ctl reconfigure
    sudo gitlab-ctl restart
    

    网络错误日志调试

    gitlab-ctl tail
    

    posted in GuaiK机房 read more
  • G
    guluting

    Debug:
    flutter run --debug

    Release:
    flutter run --release --no-track-widget-creation

    posted in GuaiK实验室 read more
  • G
    guluting

    启动容器命令:docker start d21a

    报错

    Error response from daemon: devmapper: Error mounting '/dev/mapper/docker-253:3-537354454-cdb4e31a34f55981f2cabe775700719ecc20bfdc6b85c1b26245b41026daa8fe' on '/var/lib/docker/devicemapper/mnt/cdb4e31a34f55981f2cabe775700719ecc20bfdc6b85c1b26245b41026daa8fe': invalid argument
    

    解决方式:
    /var/lib/docker/containers/d21a*目录中找到config.v2.json,然后vi config.v2.json
    找到MountLabelProcessLabel个键,并把其对应的引号中的内容清空即可

    posted in GuaiK机房 read more
  • G
    guluting

    一、安装及测试

    1、安装

    useradd -s /sbin/nologin -d /opt/minio minio
    mkdir -p /opt/minio/bin
    mkdir /opt/minio/data
    wget https://dl.minio.io/server/minio/release/linux-amd64/minio -O /opt/minio/bin/minio
    chmod +x /opt/minio/bin/minio
    chown -R minio:minio /opt/minio
    

    2、添加配置文件

    vi /opt/minio/minio.conf

    MINIO_VOLUMES=/opt/minio/data
    MINIO_OPTS="--address :9090"
    MINIO_ACCESS_KEY=[YOUR_ACCESS_KEY]
    MINIO_SECRET_KEY=[YOUR_SECRET_KEY]
    

    3、添加系统服务

    vi /etc/systemd/system/minio.service

    [Unit]
    Description=Minio
    Documentation=https://docs.minio.io
    Wants=network-online.target
    After=network-online.target
    AssertFileIsExecutable=/opt/minio/bin/minio
    
    [Service]
    WorkingDirectory=/opt/minio
    
    User=minio
    Group=minio
    
    PermissionsStartOnly=true
    
    EnvironmentFile=-/opt/minio/minio.conf
    ExecStartPre=/bin/bash -c "[ -n \"${MINIO_VOLUMES}\" ] || echo \"Variable MINIO_VOLUMES not set in /opt/minio/minio.conf\""
    
    ExecStart=/opt/minio/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
    
    StandardOutput=journal
    StandardError=inherit
    
    # Specifies the maximum file descriptor number that can be opened by this process
    LimitNOFILE=65536
    
    # Disable timeout logic and wait until process is stopped
    TimeoutStopSec=0
    
    # SIGTERM signal is used to stop Minio
    KillSignal=SIGTERM
    
    SendSIGKILL=no
    
    SuccessExitStatus=0
    
    [Install]
    WantedBy=multi-user.target
    

    4、启动Minio服务

    systemctl enable minio
    systemctl start minio
    systemctl status minio
    

    PS:默认minio的监听端口是:9000,我在配置文件中改成了9090,所以可以通过:
    http://host:9090访问minio后台。

    posted in GuaiK机房 read more
  • G
    guluting

    如果是Key-Vlue类型的数据(dict,map)相关的,你默认它遍历的顺序是随机的就好啦,它们本身就是无序的;有序的话主要还是List。

    posted in GuaiK实验室 read more
  • G
    guluting

    GuaikNet-怪客网络

    可配置微服务的HTTP网络服务端程序

    https://github.com/guaik/GuaikNet

    ⚙️安装说明:(CentOS7)

    yum -y install epel-release
    yum -y install git
    yum -y install python-tools
    yum -y install python-pip
    pip install --upgrade pip
    pip install tornado
    pip install gevent
    pip install pika
    
    git clone https://github.com/guaik/GuaikNet.git
    cd ./GuaikNet
    chmod +x ./start.sh
    ./start.sh
    
    # 如果显示如下信息,证明已经成功安装并运行
    # **********************************
    # @ Welcome to use <GuaikNet> system
    # @ website: https://bbs.guaik.org
    # @ email  : luting.gu@gmail.com
    # **********************************
    

    🚀系统测试:

    安装requests库

    pip install requests
    

    将项目根目录下的client.py文件复制到测试电脑,修改client.py中的http://localhost:8080,将其中的localhost改成你部署GuaikNet项目所在的服务器
    地址。

    然后运行:python ./client.py

    如果返回Welcome to use GuaikNet system则说明系统运行正常。


    📝使用说明

    GuaikNet的工作目录有两个,分别是http请求的处理目录./works和rpc的工作目录./rpc

    HTTP请求协议:

    示例:{"protocol":"json","version":"v1.01","action":"guaik.welcome","content":{}}

    protocol: 请求协议 选项:[json, aes, rsa] (当前只使用json,aes加密和rsa加密方式还未加入)。

    version : 版本号,如果客户端发起请求所使用的版本号与服务器当前版本号不同,服务端将不处理请求。

    action : 需要调用的服务,命名规则是以works目录为根目录: 子目录.文件名。以上面的请求"action":"guaik.welcome"为例,
    将会调用guaik目录下模块名为welcome的处理函数。

    content : 该字段为自定义字段,按照服务端的开发文档填写。

    HTTP处理例程:(./works/guaik/welcome.py)

    def handler(data,ctx):
        ctx.write("Welcome to use GuaiKNet system")
    

    处理例程函数定义统一写成:def handler(data,ctx): pass,否则无法被系统解析。

    参数:data 对应着客户端请求content字段

    参数:ctx http请求的上下文,通过该对象的write方法可以向客户端返回处理结果。


    RPC调用说明:

    需要安装RabbitMQ消息队列,一键安装脚本:

    curl -s -o rabbitmq.py https://raw.githubusercontent.com/guaik/GuaikInstaller/master/rabbitmq.py && python rabbitmq.py install

    RPC功能默认是关闭的,需要在./bootstrap.py文件中开启该功能:

    server.active_rpc("rpc_host", 5672, "/", "username", "passwd")

    找到该行,取消注释,填上消息队列的:(主机IP, 主机端口, 虚拟主机(vhost), 用户名, 密码)

    RPC处理例程的默认目录为:./rpc

    RPC处理例程调用规则:(以下是发送短信验证码的DEMO)

    from server.application import gm
    rpc = gm.get("rpc")
    rpc.call("sms.send_verify_code", "+8618888888888")
    

    从全局对象管理器(gm)中取出rpc对象,使用rpc对象的call方法,第一个参数是rpc的方法名,之后所有的参数是rpc方法对应的参数列表。原型为:
    def call(self,key,*args): ...

    方法名的规则是:模块名.函数名

    RPC方法定义规则:(以./rpc/sms.send_verify_code为例)

    import logging
    import requests
    import json
    from server.application import gm
    rpc = gm.get("rpc")
    
    api_key = "your_api_key"
    api_secret = "your_secret"
    brand = "Guaik"
    
    @rpc.route()
    def send_verify_code(number):
        request_id = None
        try:
            data = {"api_key":api_key,"api_secret":api_secret,"number":number,"brand":brand}
            headers = {'Content-Type': 'application/json'}
            r = requests.post("https://api.nexmo.com/verify/json",headers = headers, data = json.dumps(data))
            data = json.loads(r.text)
            if data["status"] == "0":
                request_id = data["request_id"]
        except Exception as e: logging.error(e)
        return request_id
    

    先从全局对象管理器gm中取出rpc对象,然后在send_verify_code的上方加上@rpc.route()注解,这时候send_verify_code将被注册到RpcManager中,
    成为RPC处理例程。


    🧙其他说明:

    ./bootstrap.py:

    LEVEL :当前服务器日志级别,作为Server的初始化参数传入。

    CUR_VERSION :当前解析器的版本号,作为Analysis的参数传入,用于判断客户端发送的请求版本是否正确。


    server.gen_http_process(8080,1,Analysis(CUR_VERSION)):
    以上代码生成http服务进程,默认监听8080端口。1代表启动一个进程,如果该参数为4,则启动4进程依次监听8080,8081,8082,8083端口。
    第三个参数传入解析器对象,该对象用于解析客户端请求并调用对应的处理例程,在该例程中存放着请求与处理例程的映射关系。也可以自定义解析器对象,
    基类在./base/analysis.py中。

    server.start(False)
    这边的False表示不以守护进程运行,如果需要以守护进程运行,则修改成True即可,守护进程默认只在Linux系统中生效。


    ./config目录下存放着可能会用到的配置文件,proxy.conf为Nginx反向代理的配置文件,可以修改它并将它放到/etc/nginx/conf.d下,
    然后重启Nginx服务使其生效。可以通过监听多个服务端口,配合Nginx实现服务端的多进程处理。

    upstream servers {
        server localhost:8001;
        server localhost:8002;
        server localhost:8003;
        server localhost:8004;
    }
    
    server {
        listen 8080;
        location / {
            proxy_pass  http://servers;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_redirect off;
            # Socket.IO Support
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
       }
    }
    

    🎃PS:打了这么多字应该会有错别字,欢迎纠正:luting.gu@gmail.com

    posted in GuaiK项目 read more
  • G
    guluting

    📣🛠 为了确保《GuaiK实验室》的数据安全,以及国外主机的各种不稳定因素。本站会不定期的关闭并备份所有数据库及文件资料。

    posted in GuaiK新闻 read more
  • G
    guluting

    # -*- coding:utf-8 -*-
    # 作者:luting.gu@gmail.com
    # 倒排索引-搜索引擎 DEMO
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    # t1到t7都是待搜索的全文
    t1 = """
          在我们家族,各行各业从业者都有。从政的,从商的,人民教师的,农民的,企业职员的。从收入水平看,就目前而言,自然是从商的赚的钱稍微比其他人都多一些。但是,亲眼目睹过去几年几位兄弟从商的工作状态,我真的没有羡慕过他们收入比我高,因为,他们的那种工作强度,那种紧张忙碌,那种工作压力,是我根本承受不起的。
    """
    t2 = """
    处女座为了爱情付出的不是金钱又或者时间之类的东西,而是心态,她们的思维模式比较单一,向往平凡的爱情模式,对于金钱的向往是从来没有过的,两个人在一起开开心心就好,心愿纯真简单。但是如果遇到渣男,她就会患得患失的思考为什么会这样,会造成她经常纠结是否是自身的问题,不断否定自己,想不开,久而久之很容易得与抑郁症。
    """
    t3 = """
    狮子座天生的骄傲会自豪,随着她的恋情一步一步的消失殆尽,越来越迁就恋人,狮子认为在生命中如果没有一次奋不顾身的恋爱,是不完整的。可是一旦恋情失败,狮子会变成另一个极端的自己,越发的讨厌以前的自己,抛弃原来的自我。或许有一天,她遇见对的人,会再次重生吧。
    """
    t4 = """
    人心有真假,时间能见证,感情有冷暖,风雨能考验,时间带不走真正的朋友,岁月留不住虚幻的拥有,时光转换,体会到缘分善变,平淡无语,感受了人情冷暖,有心的人,不管你在与不在,都会惦念,无心的情,无论你好与不好,只是漠然,走过一段路,总能有一次领悟,经历一些事,才能看清一些人。
    """
    t5 = """
    总会有些不喜欢,又不得不去做的事,与其每次抱着自杀的心情去面对,不如把它们养成习惯。习惯跑步,习惯健身,习惯记录,习惯和一个人在一起。习惯能消磨一个人对事物的厌恶感,能让一个人与世界相安无事。“习惯了就好”不是无奈,而是学会了对自己体谅。—— 刘同
    """
    t6 = """
    想知道一个人爱不爱你,就给他自由。不要妄图拴住爱情,世上没有能拴得住的爱人。若是爱你,何需拴着他?若不爱你,拴住他干嘛!爱你的人,走到天涯也会回来找你。要费尽心机来挽留的,早晚有走丢的一天。
    """
    t7 = """
    我们都像小孩,胡闹是因为依赖你;懂礼貌,是因为你是外人。
    """
    
    
    def del_space(text):
        """
        去除无用的符号
        @param [in] test 待处理的字符串
        @retval 去除无用符号后的字符串
        """
        space_char = " `~!@#$%^&*()-_=+[{]}\\|\t;:'\",<.>/?……()——【】、;「」,。、"
        for c in space_char.decode('utf-8'):
            text = text.replace(c,'')
        return text
    
    def n_gram(text,n):
        """
        使用N_GRAM对全文进行分割
        @param [in] text 待分割的文本
        @param [in] n 1:uni-gram 2:bi-gram 3:tri-gram
        @return 分割后的字典列表[[词语,位置下标],......]
        """
        text = text.decode('utf-8')
        retlist = []
        for i in xrange(0,len(text)-n+1):
            short_text = ['',0]
            for j in xrange(0,n):
                short_text[0] += text[i+j]
            short_text[1] = i
            retlist.append(short_text)
        return retlist
    
    
    data = []       # 用于存储数据,将下标作为doc_id
    index = {}      # 用来记录词典及对应的倒排项
    def make_index(text):
        """
        制作倒排索引
        @param [in] text 待处理的文本
        """
        data.append(text)
        doc_id = len(data) - 1
        word_list = n_gram(del_space(text),2)
        for item in word_list:
            if not index.has_key(item[0]):
                index[item[0]] = set()
            index[item[0]].add(doc_id)
    
    
    def query(text):
        """
        查询
        @param [in] text 用于查询的短语或词语
        @return 匹配成功的文档下标doc_id
        """
        word_list = n_gram(del_space(text),2)
        doc_list = set()
        for item in word_list:
            if index.has_key(item[0]):
                if len(doc_list) == 0:
                    doc_list = index[item[0]]
                else:
                    doc_list = doc_list & index[item[0]]
        return doc_list
    
    
    if __name__ == "__main__":
        # 生成倒排索引
        make_index(t1)
        make_index(t2)
        make_index(t3)
        make_index(t4)
        make_index(t5)
        make_index(t6)
        make_index(t7)
        # 开始检索并遍历输出结果
        id_list = query("不要妄图拴住爱情")
        for item in id_list:
            print str(item)+':'+data[item]
    

    posted in GuaiK实验室 read more
  • G
    guluting

    RabbitMQ

    安装

    curl -s -o rabbitmq.py https://raw.githubusercontent.com/guaik/GuaikInstaller/master/rabbitmq.py && python rabbitmq.py install

    卸载

    curl -s -o rabbitmq.py https://raw.githubusercontent.com/guaik/GuaikInstaller/master/rabbitmq.py && python rabbitmq.py remove


    MongoDB

    安装

    curl -s -o mongodb.py https://raw.githubusercontent.com/guaik/GuaikInstaller/master/mongodb.py && python mongodb.py install

    卸载

    curl -s -o mongodb.py https://raw.githubusercontent.com/guaik/GuaikInstaller/master/mongodb.py && python mongodb.py remove

    posted in GuaiK机房 read more