Group Details Private

GuaikSecurity

Information Security

Member List

  • Zero

    Golang允许跨站Http请求


    func (s *Service) Handler(w http.ResponseWriter, request *http.Request) {
        w.Header().Add("Access-Control-Allow-Origin", "*")
        w.Header().Add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,PATCH,OPTIONS")
        w.Header().Add("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization")
    }
    

    posted in GuaiK实验室 read more
  • Zero

    “Type ‘EventEmitter’ is not generic” ERROR in angular


    产生原因:
    在使用VSCode添加EventEmitter时,IDE会自动导入imports EventEmitter from Node.js

    import { EventEmitter } from "events";
    

    修改成Angular中的EventEmitter即可:

    import { EventEmitter } from "@angular/core";
    

    posted in GuaiK实验室 read more
  • Zero

    Angular2安装Http模块


    默认情况下Angular2没有自带Http模块,需要安装才能使用。


    npm install @angular/http
    

    posted in GuaiK实验室 read more
  • Zero

    Golang基于Redis的分布式锁


    我理解的分布式锁:

    1、为了避免单持有锁的进程奔溃而无法释放锁,所以必须能够为锁设定过期时间自动释放锁资源
    2、使用TTL检查锁是否成功的被设置过期时间,如果返回-1(未被设置)的话,使用Expire为其设定过期时间
    3、在释放锁的时候需要使用Watch命令,确保监测的值在事务执行时时未被改变,如果其他进程修改了锁,会触发事务异常,然后重新执行Watch。


    分享一个我写的Redis封装类,仅实现了连接和锁

    package dao
    
    import (
    	"time"
    
    	"github.com/go-redis/redis/v7"
    	uuid "github.com/satori/go.uuid"
    )
    
    type Rds struct {
    	Client         *redis.Client
    	AcquireTimeout int32
    	LockTimeout    int32
    }
    
    func NewRds(host, passwd string, db int) (rds *Rds, err error) {
    	rdsOpt := &redis.Options{
    		Addr:     host,
    		Password: passwd,
    		DB:       db,
    	}
    	client := redis.NewClient(rdsOpt)
    	_, err = client.Ping().Result()
    	if err != nil {
    		return
    	}
    	rds = &Rds{Client: client, AcquireTimeout: 10, LockTimeout: 10}
    	return
    }
    
    func (r *Rds) AcquireLockWithTimeout(key string) (identifier string, b bool) {
    	identifier = uuid.NewV4().String()
    	lockname := "lock:" + key
    	end := time.Now().Add(time.Second * time.Duration(r.AcquireTimeout))
    	for time.Now().Before(end) {
    		if r.Client.SetNX(lockname, identifier, time.Second*time.Duration(r.LockTimeout)).Val() {
    			// 如果key不存在,并成功设置了key
    			b = true
    			return
    		} else if r.Client.TTL(lockname).Val() == -1 {
    			// 如果key存在,但是没有剩余时间
    			r.Client.Expire(lockname, time.Second*time.Duration(r.LockTimeout))
    		}
    		time.Sleep(time.Microsecond)
    	}
    	return
    }
    
    func (r *Rds) ReleaseLock(key, identifier string) (b bool) {
    	lockname := "lock:" + key
    	txf := func(tx *redis.Tx) error {
    		v, err := tx.Get(lockname).Result()
    		if err != nil {
    			return err
    		}
    		_, err = tx.Pipelined(func(pipe redis.Pipeliner) error {
    			if v == identifier {
    				pipe.Del(lockname)
    				b = true
    			}
    			return nil
    		})
    		return err
    	}
    	for {
    		err := r.Client.Watch(txf, lockname)
    		if err == nil {
    			break
    		} else if err == redis.TxFailedErr {
    			glog.Error(err)
    		}
    	}
    	return
    }
    

    posted in GuaiK实验室 read more
  • Zero

    使用Golang对MongoDB创建索引


    1、下载MongoDB驱动

    go get github.com/mongodb/mongo-go-driver 
    

    2、连接MongoDB

    import (
    	"context"
    	"log"
    
    	"go.mongodb.org/mongo-driver/mongo"
    	"go.mongodb.org/mongo-driver/mongo/options"
    	"go.mongodb.org/mongo-driver/mongo/readpref"
    )
    
    client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://127.0.0.1:27017"))
    if err != nil {
        log.Fatal(err)
    }
    err = client.Connect(context.TODO())
    if err != nil {
        log.Fatal(err)
    }
    

    3、测试连接是否成功

    if err := client.Ping(context.TODO(), readpref.Primary()); err != nil {
        log.Fatal(err)
    }
    

    4、创建唯一索引

    // Email可能为空(注册时被必填项),为了防止
    // 空值的唯一冲突,所以设置成稀疏索引
    opEmail := options.Index()
    opEmail.SetName("email_index")
    opEmail.SetUnique(true)
    opEmail.SetSparse(true)
    
    // 默认唯一索引配置
    opDef := options.Index()
    opDef.SetName("def_index")
    opDef.SetUnique(true)
    
    // 使用配置生成索引对象
    modDef := mongo.IndexModel{
    	Keys: bson.M{
    		"nickname": 1,
    		"phone":    1,
    	}, Options: opDef,
    }
    modEmail := mongo.IndexModel{
    	Keys: bson.M{
    		"email": 1,
    	}, Options: opEmail,
    }
    
    // 为Collection配置索引,Indexes().CreateMany()可以一次
    // 指定多个索引对象
    col := client.Database("db_name").Collection("User")
    col.Indexes().CreateMany(context.TODO(), []mongo.IndexModel{modDef, modEmail})
    

    5、测试

    type RecUserI struct {
    	Nickname string             `bson:"nickname"`
    	Phone    string             `bson:"phone"`
    	Email    string             `bson:"email"`
    }
    // 邮箱为空值,并且使电话冲突
    result, err := col.InsertOne(context.TODO(), RecUserINickname: "guaik0", Phone: "18888888888"})
    if err != nil {
    	log.Fatal(err)
    	return
    }
    result, err = col.InsertOne(context.TODO(), RecUserINickname: "guaik1", Phone: "18888888888"})
    if err != nil {
    	log.Fatal(err)
    	return
    }
    

    posted in GuaiK实验室 read more
  • Zero

    优酷视频提取


    优酷使用的是m3u形式的媒体播放格式,通过拦截Http Response并且判断Content-Type是否等于application/vnd.apple.mpegurl可以很容易的拿到m3u文件,那么就可以批量下载ts格式的视频文件了,按照m3u列表进行播放即可。

    土豆视频提取


    土豆视频采用了定长格式的MP4格式视频,每播放完一段才会缓存下一段,所以相对于优酷来说并不能一次性的拿到所有的视频,在测试的时候发现在广告等待期间它不会加载MP4视频。

    posted in GuaiK实验室 read more
  • Zero

    openssl genrsa -out key.pem 2048
    openssl rsa -in key.pem -pubout -out key.pub
    openssl req -x509 -new -days 365 -key key.pem -out cert.crt
    

    posted in GuaiK实验室 read more
  • Zero

    macOS Catalina将不再使用bashrc改用zshrc,所以需要修改下命令行前面提示部分,让它变得精简一些:

    sudo vi /etc/zshrc
    # 替换以下指令
    #PS1="%n@%m %1~ %# "
    PS1="%m@%1~ # "
    

    安装命令行工具:

    xcode-select --install
    

    posted in GuaiK机房 read more
  • Zero

    你去了解下GLAD的使用方法:
    https://glad.dav1d.de/


    然后你只需要用导入以下头文件就可以了

    #include <glad/glad.h> 
    

    关于类怎么设计,你最好去看看游戏的设计模式,通常我会把纹理对象作为独立的类型,然后将数据和渲染器分开设计,比如游戏精灵Sprite类,和对应的渲染器SpriteRenderer类。

    posted in GuaiK故障处理 read more
  • Zero

    导入头文件:

    #include <QDateTime>
    

    初始化代码:

    /* 将startTime设置为全局变量或放在类中作为属性 */
    /* 确保渲染代码能够访问到 */
    /* startTime记录程序启动的时刻 */
    qint64 startTime;    
    startTime = QDateTime::currentDateTime().toMSecsSinceEpoch();
    

    渲染代码

    // 计算出程序已经运行的时间(秒)
    qint64 timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch();
    float t = (timestamp - startTime) / 1000.0;
    qDebug() << t;
    
    // 旋转 
    glm::mat4 model = glm::mat4(1.0f);
    model = glm::rotate(model, glm::radians(cos(t)*60.0f), glm::vec3(1.0f, 1.0f, 1.0f));
    

    posted in GuaiK故障处理 read more