青春部落,流年似水 http://www.youthtribe.com 青春是一场远行,总记不起来时的路。 Fri, 24 Mar 2023 10:13:36 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.1.6 青春部落,流年似水 http://www.youthtribe.com/archives/2023 Fri, 24 Mar 2023 09:09:17 +0000 http://www.youthtribe.com/?p=2023 自己设计的苹果ios的一个类似安卓的TOAST的信息显示提示功能,基于swift5开发。可以指定 显示时长。单位 秒,可以是小数,比如2.5秒。

//
//  Tools.swift
//  Mark
//
//  Created by nelson on 2022/12/14.
//

import Foundation
import UIKit
// 自己整的一个工具类
class Tools {
    static func toast(msg:String,seconds:Double,vc:UIViewController){
        
        //得到当前 UIViewController 的 安全显示区域
        
        let insets:UIEdgeInsets = vc.view.safeAreaInsets
        //开始测量当前内容要显示的 大小,宽度 不超过 最大宽度
        
        
        //不要紧贴着底部,留一个marging->to->bottom
        let marginBottom:CGFloat = 50
        
        let width = UIScreen.getScreenWidth() - insets.left - insets.right
        let height = UIScreen.getScreenHeight() - insets.top - insets.bottom - marginBottom
        
        let font:UIFont = UIFont.preferredFont(forTextStyle: .body)
        
        let dict = [NSAttributedString.Key.font : font]
        let msgRectTemp = (msg as NSString).boundingRect(with: CGSize(width: width , height: height), options: [.usesFontLeading,.usesLineFragmentOrigin], attributes: dict as [NSAttributedString.Key : Any], context: nil)
        
        //因为有insets,所以需要人为扩大 rect
        let msgRect = CGRect(x: 0, y: 0, width: Int(ceil(msgRectTemp.width)) + Int(MyLabelToast.insetHor * 2), height: Int(ceil(msgRectTemp.height)) + Int(MyLabelToast.insetVer * 2))
        
        
        let y = Int(UIScreen.getScreenHeight() - insets.bottom - msgRect.height - marginBottom)
        
        let x = insets.left + (CGFloat(width) - msgRect.width ) / 2
        
        var label:UILabel?
        
        let frame = CGRect(x: Int(x), y: y, width: Int(ceil(msgRect.width))  , height: Int(msgRect.height))

        label = vc.view.window?.windowScene?.windows.last?.viewWithTag(999) as? UILabel
        if(label == nil){
            //新建立
            label = MyLabelToast(frame: frame)
            
            label!.layer.masksToBounds = true // 不加这句 圆角会无效
            label!.layer.cornerRadius = 5
            
            label!.backgroundColor = UIColor.black.withAlphaComponent(0.5)
            label!.textColor = UIColor.white
            label!.font = font
            
            //
            label!.tag = 999
        }
        else{
            //不用新建立
            //label!.frame = frame
        }
        
        //
        label!.text = msg
        vc.view.window?.windowScene?.windows.last?.addSubview(label!)
        
        //下边的方法不可以!在pad上 ,不是全屏的vc时,会显示不正常
        //vc.view.addSubview(label!)
        
        //定时器
        let timer = Timer.scheduledTimer(withTimeInterval: seconds, repeats: false) { Timer in
            if(label != nil){
                label!.removeFromSuperview()
            }            
        }
        
        return
    }
}
extension UIScreen{
    static func getScreenWidth()->CGFloat{
        return UIScreen.main.bounds.size.width
    }
    static func getScreenHeight()->CGFloat{
        return UIScreen.main.bounds.size.height
    }    
    static func getScreenSize()->CGSize{
        return UIScreen.main.bounds.size
    }
}

用来呈现文字的label

//
//  MyLabelToast.swift
//  Mark
//
//  Created by nelson on 2023/3/21.
//
/*
 主要就是为了增加 toast 中 label的 padding
 */
import UIKit

class MyLabelToast: UILabel {

    static let insetHor:CGFloat = 20
    static let insetVer:CGFloat = 10
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
        let insets = UIEdgeInsets(top: 10, left: 20, bottom: 10, right: 20)
        super.drawText(in: rect.inset(by: insets))
//        super.draw(rect)
        
    }
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.numberOfLines = 0
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}

用法如下:

Tools.toast(msg: "青春部落!GREAT!www.youthtribe.com!", seconds: 3, vc: self)

效果如下,类似android的toast:

]]>
青春部落,流年似水 http://www.youthtribe.com/archives/2014 Fri, 21 Oct 2022 09:44:53 +0000 http://www.youthtribe.com/?p=2014 我是中国广东电信(深圳),手机链接自己的wifi 会遇到这样的情况

  • 经常打不开手机网站,比如 m.sohu.com
  • 浏览手机网站 偶尔会会弹出恶意广告
  • 快手,抖音等短视频很卡,有时根本打不开
  • 可是我电脑连接的同一个wifi就不卡,为什么呢?

    开始我认为是什么dns被挟持,不健康dns导致的,但试了多个dns都不行。

    为什么呢?首先,我的电脑之前也是有一些网站打不开,当时的解决办法是 禁用电脑上的ip6.今天我也本想禁用手机上的ip6协议的,但是网络搜索了下,发现 手机上不支持禁用ip6协议。

    下图是电脑上,找到网络适配器选项,属性,只勾选ip4,不勾选ip6。从而 禁用ip6。

    然后,我就打开路由器,我的路由器是友华pt632,超级管理员用户名:telecomadmin 密码:nE7jA%5m,有网络连接那里,有个internet连接,在协议那里只选择ip4就可以了,默认是ip4/ip6.

    然后手机上网就一切正常了。

    总结:现阶段ip6还有很多问题,很垃圾,不建议使用!!!(严谨点说,在部分地方会有问题,比如 深圳电信)

    ]]>
    青春部落,流年似水 http://www.youthtribe.com/archives/2010 Fri, 21 Oct 2022 09:42:46 +0000 http://www.youthtribe.com/?p=2010

    最近想捣鼓捣鼓免费的视频编辑软件 DaVinci,中文名字为达芬奇软件。之前下载的是17版本,最近下载的是最新 18 beta版本。

    但是很遗憾,当时下载安装了17版本,但是软件不正常。表现为在进入了软件界面后,在选择工程项目,或者项目后,会有极大概率卡死(也有小概率会正常进入,或者很久很久才进入),长时间没有响应。显然软件不正常。当时我感觉是17版本有bug(但隐约也感觉是和自己电脑环境有冲突了,毕竟这么大的出名的视频编辑软件,应该不会有太大的bug的)。

    结果好不容易等到了18版本,下载,安装,结果还是一样,还是进入项目工程会卡死。

    网上搜索了下,有说是字体冲突的,有说是软件的网络访问权限的问题,但经我验证都不是。后来有人说是因为自己插有USB耳机的原因,我初步感觉是这个原因。然后我就在电脑的设备管理器上禁用了usb耳机,发现问题依旧。但由于耳机是插在电脑后边,我也懒得捣鼓,没有物理上拔出usb耳机,就暂时放下了。但我感觉就是usb耳机的冲突问题

    今天我把电脑主机 抬出来,拔掉usb耳机,打开软件 ,一切正常了。重复几次,都很ok。

    所以足以证明,DaVinci 17 和最新的18版本 ,是存在和usb耳机冲突的问题的(也不敢断然说算是bug,只能说是个问题!)

    文章来源:https://www.nbqq.net/article/show/117

    ]]>
    青春部落,流年似水 http://www.youthtribe.com/archives/1973 Tue, 12 Apr 2022 15:38:45 +0000 http://www.youthtribe.com/?p=1973 用户名:芝士史莱姆

    steamid :https://steamcommunity.com/profiles/76561198991399077/

    76561198991399077

    以下是他的对话套路:

    芝士史莱姆下午10:51
    zai ?
    zai ?
    芝士史莱姆下午11:10
    哈哈
    我就想和你一起打cs
    你有没有自己的csgo团队呀?Ovo
    芝士史莱姆下午11:22
    哦哦
    我们在b5进行csgo锦标赛,还需要打一场。你能不能加入我们?我们在b5 TYLOO打qaq

    所以,大家一定要小心,谨防上当受骗。

    ]]>
    青春部落,流年似水 http://www.youthtribe.com/archives/1964 Mon, 07 Feb 2022 14:45:37 +0000 http://www.youthtribe.com/?p=1964

    http://paper.ce.cn/jjrb/html/2011-01/30/content_136601.htm

    ]]>
    青春部落,流年似水 http://www.youthtribe.com/archives/1960 Sun, 06 Feb 2022 07:47:57 +0000 http://www.youthtribe.com/?p=1960 直接上代码吧,qt得到文件md5的值应该还是比较常用到的一个功能。

    QString ThreadDownload::getFileMd5(QString filename)
    {
        QFile theFile(filename);
        if(!theFile.open(QIODevice::ReadOnly)){
            return "failed";
        }
        QByteArray ba = QCryptographicHash::hash(theFile.readAll(), QCryptographicHash::Md5);
        theFile.close();
        return QString(ba.toHex());
    
    }
    ]]>
    青春部落,流年似水 http://www.youthtribe.com/archives/1950 Sat, 05 Feb 2022 17:57:20 +0000 http://www.youthtribe.com/?p=1950 这两天在捣鼓测试阿里云的对象存储,阿里云称为 阿里云对象存储OSS(Object Storage Service)。

    首先,相关sdk是放在 github的。so,需要科学上网。很是不方便。

    再者就是遇到了提供的教程默认编译出来的lib是64位的。我的项目均是32位下开发的。如果设置为win32的,vs编译时会有如下的提示:

    错误 LNK1112 模块计算机类型“x86”与目标计算机类型“x64”冲突 cpp-sdk F:\迅雷下载\aliyun-oss-cpp-sdk-1.9.0\build\sdk\Debug\OssClient.obj 1

    解决办法是修改项目的属性中的 文档管理程序的-》所有选项-》附加选项,/machine:x64 改为 /machine:x86

    但好像各个vs版本的这个属性的位置有所不一样,注意区别对待。

    还有如下问题:

    阿里云oss也集成了相关的第三方库,libcurl,ssleasy等,这和我当前项目的不兼容。生成的exe程序会有如下提示:

    然后我就用他提供的dll直接替换了我的原先的。简单看是没问题,可以正常执行(但真不确保就没问题呀,内心还是比较担心的)。所以还是需要仔细测试。

    还有就是,好像他的第三方库的dll只有release版本的,没有debug的,这样的话,我的程序 在debug模式下就不能正常运行了,只能在release模式下开发了。。。这,也是个问题呀。。。不知道怎么整。。。

    最开始是打算捣鼓腾讯云对象存储的,感觉腾讯的第三方库 也不好弄。poco。就放弃了。

    ]]>
    青春部落,流年似水 http://www.youthtribe.com/archives/1946 Sat, 29 Jan 2022 02:45:32 +0000 http://www.youthtribe.com/?p=1946 我用的笔记本可以用百度搜索,但是却死活打不开百度知道和百度贴吧。后来想起来,我之前 是解决过这个问题的。原因就是把自己电脑的网络的IP6协议给禁用了,还用传统的IP4就可以了。至于具体是什么问题导致的不懒得研究搜索了。反正用IP4协议也没什么影响。

    ]]>
    青春部落,流年似水 http://www.youthtribe.com/archives/1932 Thu, 06 Jan 2022 08:15:50 +0000 http://www.youthtribe.com/?p=1932 一些小黑客会试图通过正常的但高频的【正常访问】去查看我们网站的一些隐藏的页面,比如管理员登录页面。还有一种比较常见的是去扫描一些 行业内的 现成的 木马文件,来攻击我们的网站。因为短时间内会有大量的看似正常的请求,会造成性能不高的服务器的报警,如内存或者cpu,甚至带宽 吃紧,影响正常服务。

    下图为非法请求示例

    可以利用redis的高性能优势去做一些文章。

    原理就是用网站程序去判断用户的请求,如果判断出是恶意的,那么把该访问者记录下来存储到redis中去。如果该访问者再来请求,那么直接给他返回500。正常情况来讲,黑客的扫描工具得知500相应码后,应该会停止扫描吧。就算不停止,那么redis的高性能也可以抵挡这些非法扫描请求,从而达到保护服务器的目的。通常可以设置一个小时内禁止该ip的正常访问。时间可以自己设置。

    如何判断恶意访问:比如我的是php程序,如果用户的请求中出现了 .asp或者.jsp,或者hack,hacker字样,那么就判断你小子不老实,就打入冷宫。至于加哪些判断字符可以根据自己的需求进行设置。

    需要服务器安装redis,我这里是用的php做了一个示例,我的php文件名为【illegal_deny.php】,用户可以直接在站点入口包含此文件即可。

    require __DIR__.'/../app/diy/illegal_deny.php';
    

    下边是文件内容。请根据自己的实际情况进行修改。

    <?php
    //redis的配置
    //define('REDIS_SERVER_IP', '121.40.24.38');
    define('REDIS_SERVER_IP', '127.0.0.1');
    define('REDIS_SERVER_PORT', 6379);
    //auth就是密码
    define('REDIS_SERVER_AUTH', 'yourpassword');
    
    //禁止访问的时间,单位秒 3600 = 1小时
    define('DENY_TIME', 3600);
    
    
    function getRedis($db = 0){
        
        $redis = new \Redis();
        $res = $redis->connect(REDIS_SERVER_IP,REDIS_SERVER_PORT);
        $redis->auth(REDIS_SERVER_AUTH);
        $redis->select($db);
        return $redis;
    }
    
    //如果是访问一些非法网址,比如黑客,就进行一段时间的访问屏蔽 begin
    //非法访问次数
    $illegal_attempt_count_key = 'ILLEGAL_ATTEMPT_COUNT';
    
    //是否已经被限制访问
    $illegal_key = "ILLEGAL_IP_".$_SERVER['REMOTE_ADDR'];
    //$illegal_key = "ILLEGAL_IP_".$_SERVER['HTTP_X_FORWARDED_FOR'];
    
    
    
    $uri = $_SERVER['REQUEST_URI'];
    
    
    $redis = getRedis();
    //$redis->delete($illegal_key);
    if($redis->exists($illegal_key)){
     
        header('HTTP/1.1 500 Internal Server Error');
        exit(0);
    }
    
    $limit_time = DENY_TIME;//禁止时间,单位秒
    //判断是否要进行限制
    
    //几个禁止访问的目录
    if($uri == '/admin'){
        //
        $redis->setex($illegal_key,$limit_time,date("Y-m-d H:i:s",time()));
        $redis->incr($illegal_attempt_count_key);
        header('HTTP/1.1 500 Internal Server Error');
        exit(0);
    }
    
    //限制访问地址包含的一些关键词,只要匹配到就进行限制
    $illegal_urls = ['hack','hacker','.asp','.jsp'];
    foreach ($illegal_urls as $url){
        if(strpos($uri, $url)){
            //
            $redis->setex($illegal_key,$limit_time,date("Y-m-d H:i:s",time()));
            $redis->incr($illegal_attempt_count_key);
            
            header('HTTP/1.1 500 Internal Server Error');
            exit(0);
        }
    }
    //如果是访问一些非法网址,比如黑客,就进行一段时间的访问屏蔽 over
    

    附:对我的1cpu2G内存的服务器加了这个【护盾】后,服务器就不会再报警了(之前是cpu 一旦过90%使用率就会发邮件,短信,好烦)。真香!谁用谁说好。

    ]]>
    青春部落,流年似水 http://www.youthtribe.com/archives/1923 http://www.youthtribe.com/archives/1923#respond Tue, 23 Nov 2021 07:22:43 +0000 http://www.youthtribe.com/?p=1923 昨天看到一个文章说(注意是文章,不是新闻,中国是没有新闻的) 网盘企业响应号召 对免费用户不限速了。文章标题 很唬人:

    重磅!网盘正式“停止限速”:百度狂喜,阿里哭晕?

    原文:https://m.sohu.com/a/502702718_324615/?pvid=000115_3w_a&scm=1004.759734081562017792.0.0.0&spm=smwp.home.fd-it.4.1637611344659LytDbUX

    我看到后,首先就是不信,这是出于自己的认知上的不信。我当时就觉得不信(我就是想说 我对这种鸟报道的怀疑是正确的)。今天试了,不过150k。大概120k。还是限的很严重(我认为500k以上才算不限制,也不奢求完全不限制了。为什么是500K。你让看个高清不卡就可以了。阿弥陀佛了。)。

    还以为不是最新版本的原因,结果升级一下,还是一样。

    所以,两点

    一是现在的网络上多数的文章在看到后,在选择相信前 一定要思考一下是否为真。

    二是国家政策的响应,号召与最终落实,多数,俩字,呵呵。(政策首先是要合理,人家网盘都是企业是要成本的,你国家凭什么 代表网民去免费索取vip服务。觉得不合理不用就行了呗。我就几乎不用百度网盘啊)。

    注:其实网盘没有测试。不涉及其他网盘。

    ]]>
    http://www.youthtribe.com/archives/1923/feed 0