整理了一下图片,用Picasa3导出的时候提示 由于磁盘错误,无法对文件执行写操作 。磁盘可能已满或为只读。
但是我检查了各种地方发现并没有磁盘已满,或者文件只读。网上搜了一下没发现什么有价值的线索。于是尝试将导出失败的文件从相册删除,然后可以继续导出了。问题是900多个文件,删了半天删除了十几个,问题是还不知道有多少个是存在问题的,一个个删除也不是办法,最终还是决定上调试器解决这个问题,猜测应该是出问题直接退出了。
整理了一下图片,用Picasa3导出的时候提示 由于磁盘错误,无法对文件执行写操作 。磁盘可能已满或为只读。
但是我检查了各种地方发现并没有磁盘已满,或者文件只读。网上搜了一下没发现什么有价值的线索。于是尝试将导出失败的文件从相册删除,然后可以继续导出了。问题是900多个文件,删了半天删除了十几个,问题是还不知道有多少个是存在问题的,一个个删除也不是办法,最终还是决定上调试器解决这个问题,猜测应该是出问题直接退出了。
闲来没事,找了个av网站,看了几个视频,然后想下载一下。结果发现多年不上这些av网站,现在的av网站播放的源文件已经不是avi或者mp4了,而是m3u8的播放列表。在firefox中可以使用Video DownloadHelper 来获取相应的下载地址,但是有的时候如果m3u8中包含的是播放列表,会无法获取下载链接。
于是就想着怎么直接下载文件,其实通过ffmpeg可以很方便的获取下载链接:
只需要下面的一样命令:
ffmpeg -protocol_whitelist "file,http,crypto,tcp,https,tls" -i https://videox11.ynkcq.com:8081/20200109/8Pr79HKk/600kb/hls/index.m3u8 -c copy out.mp4
之前提到使用ratelimit来限制访问频率,我的目的是根据用户来限制访问频率,但是实际上通过下面的代码并没有达到效果,如果用多个浏览器进行同时刷新,会存在跳过限制的情况
@ratelimit(key='user', rate='1/8s', block=True, method=('POST'))
本来是不想重复造轮子的,但是由于这个轮子不大好用,于是只好重新造一个,基于redis可以使用下面的代码来实现(ttl为限制时长):
def set_method_limit(method_name, player_id, ttl):
cash_name = 'RATELIMIT::METHOD=' + method_name + 'PLAYERID=' + str(player_id)
cache.set(cash_name, method_name, ttl)
def check_is_limit(method_name, player_id):
cash_name = 'RATELIMIT::METHOD=' + method_name + 'PLAYERID=' + str(player_id)
if cash_name in cache:
return True
return False
def redis_ratelimit(method='ALL', block=False, ttl=5):
def decorator(fn):
@wraps(fn)
def _wrapped(*args, **kw):
# Work as a CBV method decorator.
request = args[0]
auth = request.META.get('HTTP_AUTHORIZATION', 'UNKNOWN')
# 获取用户id 如果失败则用token
try:
auth = request.user.id
print('PID= ' + str(auth))
except:
pass
token = str(auth).split(' ')[-1]
if check_is_limit(method, token) and block:
content = {
'status': 403,
'message': '大侠喝口茶,小女子给你讲个故事如何?\r\n 从前有座山,山上有座庙……',
}
return JsonResponse(content)
# raise Redis_Rate_Limit()
set_method_limit(method, token, ttl)
return fn(*args, **kw)
return _wrapped
return decorator
使用方法和retalimit一致:
@api_view(['POST', 'GET'])
@redis_ratelimit(method='api_test', block=True, ttl=10)
@csrf_exempt
def api_test(request):
"""
测试接口
http://192.168.1.195:8006/rest-api/battle/api-test/
:return: 普通数据测试
"""
return json_response_message(status=API_SUCCESS, message=timezone.now().date())
redis 安装:
pip3 install django-redis
不知道是阿里云的问题还是ubuntu本身的问题,今天安装mysqlclient提示:
/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto
collect2: error: ld returned 1 exit status
error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1
网上搜了一下没有发现类似的错误信息,于是转换思路直接搜索: /usr/bin/ld: cannot find -lssl 在这篇文章看到了解决方案:
https://blog.51cto.com/eminzhang/1285705
用了多年不用的Delphi 写了个路径修改工具:
下载链接: 链接:https://pan.baidu.com/s/1Gztriz7sfpFSDghTyrX-Hw
提取码:hwvg
原理说明:https://image.h4ck.org.cn/2019/12/配置修改picasa3本地数据库路径/
Google 的免费图片管理工具Picasa,数秒钟内就可找到并欣赏计算机上的图片。 Picasa 原为独立收费的图像管理、处理软件,其界面美观华丽, 功能实用丰富。后来被 Google 收购并改为免费软件, 成为了 Google 的一部分,它最突出的优点是搜索硬盘中的相片图片的速度很快,当你输入一个字后,准备输入第二个字时,它已经即时显示出搜索出的图片。不管照片有多少,空间有多大,几秒内就可以查找到所需要的图片。Picasa 是一款可帮助您在计算机上立即找到、修改和共享所有图片的软件。每次打开 Picasa 时,它都会自动查找所有图片(甚至是那些您已经遗忘的图片),并将它们按日期顺序放在可见的相册中,同时以您易于识别的名称命名文件夹。您可以通过拖放操作来排列相册,还可以添加标签来创建新组。Picasa 保证您的图片从始至终都井井有条。
不管是windows还是mac想找个好用的看图软件还是比较难,用的都不怎么合手。以前一直用Picasa3,结果现在google早已经不维护这个项目了。
尝试安装acdsee,浏览功能也还ok,但是预览的时候不能跨目录导致图片较多的时候会出现需要来回切换目录的问题。
对于美女的热爱无法自拔 😆 ,经常会去搜索一些美女图片,下载下来,然后找时间慢慢欣赏。主要用途是用作电脑桌面手机桌面,通常会百度或者bing去搜索下找到图片下载。相对来说能够直接用作桌面的图片并不多,多数是尺寸问题,并不是十分合适。但是即使不能直接用,可以用ps修改下图片尺寸,或者欣赏也是好的啊。 🙂
以前曾经从一个网站mzitu.com 爬了一些图片,但是最近访问的时候却发现网站挂了~~
最近做了一个系统由于部分接口需要进行耗时操作,因而不希望用户进行频繁访问,需要进行访问频率限制。如果要自己实现一个访问限制功能相对来说也不会太复杂,并且网上有各种代码可以参考。如果自己不想实现这个代码可以使用 Django Ratelimit 。
Django Ratelimit is a ratelimiting decorator for Django views.
https://travis-ci.org/jsocol/django-ratelimit.png?branch=master
Code: https://github.com/jsocol/django-ratelimit
License: Apache Software License
Issues: https://github.com/jsocol/django-ratelimit/issues
Documentation: http://django-ratelimit.readthedocs.org/
使用方法也相对来说比较简单:
@ratelimit(key='ip', rate='5/m')
def myview(request):
# Will be true if the same IP makes more than 5 POST
# requests/minute.
was_limited = getattr(request, 'limited', False)
return HttpResponse()
@ratelimit(key='ip', rate='5/m', block=True)
def myview(request):
# If the same IP makes >5 reqs/min, will raise Ratelimited
return HttpResponse()
@ratelimit(key='post:username', rate='5/m', method=['GET', 'POST'])
def login(request):
# If the same username is used >5 times/min, this will be True.
# The `username` value will come from GET or POST, determined by the
# request method.
was_limited = getattr(request, 'limited', False)
return HttpResponse()
@ratelimit(key='post:username', rate='5/m')
@ratelimit(key='post:tenant', rate='5/m')
def login(request):
# Use multiple keys by stacking decorators.
return HttpResponse()
@ratelimit(key='get:q', rate='5/m')
@ratelimit(key='post:q', rate='5/m')
def search(request):
# These two decorators combine to form one rate limit: the same search
# query can only be tried 5 times a minute, regardless of the request
# method (GET or POST)
return HttpResponse()