Nautilus

2021年6月4日 没有评论

我自己使用的是 Ubuntu 系统,在每次安装软件时,对于系统目录下,又不能带文件夹遍历的方式覆盖,可能我没有找到方法吧,所以每次都是手动的通过命令行去完成,很是费劲。

终于让我无意间找到了一种可行的方式,就是使用系统自带的资源文件管理器 nautilus,命令行以管理员权限运行,就可以弹出用户界面了,在这个界面里去做文件夹的复制、替换都不再禁止了。

sudo nautilus

爽的一比,windows 的体验又回来了。

分类: 一句话 标签:

MinIO 分布式存储工具

2021年5月7日 没有评论

这几天在寻思怎么安全地保存文件,以前一直是放到 MongoDB 里的 GridFs ,但是看到网上有人现身说法,提示千万不要用数据库存储文件,如果文件损坏就无法挽回了。想一想还是有几分道理的,搞得我都有点不自信了。

经过一番搜索,发现了 MinIO 这么一个工具。

其实我并不在乎是否支持亚马逊的S3,也不关心是否是分布式,其服务器端够轻量,蛮不错。

从其官网下载文件后,就可以运行试一试拉。

minio.exe server c:\data

程序会输出当前的 appkey 和 secretkey,以及可访问的 url 地址。默认的账号和密码就是 minioadmin,登录进去看了看,就是和普通的网盘界面差不多。

创建了 bucket,上传文件,然后在文件夹里确认。

基本上,每创建一个 bucket ,就会在程序的根目录下创建一个同名的文件夹,里面存放上传的文件。此外,还有生成一些文件相关的元数据保存在config文件夹里。我尝试了本地直接删除文件夹,然后在网页里上传也会正确提示这个bucket 不存在了。不过 config 文件夹里还是会有一个同名文件夹不会被删除。当然啦,这样的场景,对于真实产线其实就比较少见了。

这个工具有一个比较厉害的是如果一半的硬盘坏掉了,都可以把文件恢复过来,而且是基于文件粒度的。像一些磁盘坏道修复工具,粒度都是基于分区的,速度会慢很多。听起来很有趣的样子。

分类: 日常 标签:

尝鲜 Yolo 物体识别

2021年4月17日 没有评论

Yolo 作为当下比较流行的物体检查AI模型之一,还是得到了大家的青睐,主要说来有几个因素:

1、检测的范围广。按照官方的说法是可以支持9000种常见的分类,并且Yolo v2覆盖了 coco 的数据集。
2、检测的准确率高。我拿实际照片跑了下,还是有意外的惊喜。
3、检测速度快。使用普通的 CPU就可以运行 Tiny YOLO 低配版的数据集,我的笔记本上大概会是12s左右。在 2080Ti 显卡上跑 Yolo v2或者 v3的版本速度都很快,毫秒级别的响应。

原本是想在树莓派上运行,所以尝试的是源码安装。如果缺少什么依赖库,自行安装。

git clone https://github.com/pjreddie/darknet
cd darknet
make

编译完成后,还需要去下载权重文件,这个就比较大了,我先后找过好几个不同的版本,好在都找齐了。

运行命令

./darknet detect cfg/yolo.cfg weights/yolo.weights data/dog.jpg

如果想试一试乞丐版本,就换成下面的参数:

./darknet detect cfg/tiny-yolo.cfg weights/tiny-yolo.weights data/dog.jpg

运行后,会在根目录下生产一张 predictions.jpg 结果图片,多次运行命令会覆盖掉先前的图片。

在我的 Firefly 上是可以成功编译成功的,但是加载权重文件预测时失败了,不知道是内存不够用还是什么情况,网上有很多类似的提问,浏览了好多,还有修改版的权重文件提供,反正我是没有成功,看起来想在树莓派上跑起来不太可行了。

有哪位同学可以跑通,麻烦告诉下我。

分类: AI, 日常 标签:

Python 无法安装 Pillow

2021年3月17日 没有评论

在安装好 Python3 后,使用 pip3 安装 pillow,总是报错 The headers or library files could not be found for jpeg, a required dependency when compiling Pillow from source.

搜索了一圈,最后在这里找到了解决问题的方法。

分类: Banana Pi, Firefly, 一句话 标签:

Python 操作JIRA

2021年2月25日 没有评论

最近被各种统计和归总纠结着,从系统里查询然后在 Excel 里填数据。就寻思着是否有方式可以加速,网上检索下,果然找到有访问 JIRA 现成的库。

pip3 install jira

认证
JIRA的访问是有权限的,在访问Jira项目时首先要进行认证,JIRA Python库提供了3种认证方式:

通过Cookis方式认证(用户名,密码)
通过Basic Auth方式认证(用户名,密码)
通过OAuth方式认证

form jira import JIRA

jira = JIRA('http://jira.***.com/', auth=('用户名', '登录密码')

返回的jira对象便可以对Jira进行操作。主要的操作包括:

  • 项目
  • 问题
  • 搜索
  • 关注者
  • 评论
  • 附件

项目(Project)
jira.projects(): 查看所有项目列表
jira.project(“项目的Key”): 查看单个项目


项目对象的主要属性及方法如下:

  • key: 项目的Key
  • name: 项目名称
  • description: 项目描述
  • lead: 项目负责人
  • projectCategory: 项目分类
  • components: 项目组件
  • versions: 项目中的版本
  • raw: 项目的原始API数据
print(jira.projects()) # 打印所有你有权限访问的项目列表
project = jira.project('某个项目的Key')
print(project.key, project.name, project.lead)

问题(Issue)
Issue是 JIRA 的核心,JIRA 中的任务,用户Story,Bug实质上都是一个Issue。
单个问题对象可以通过jira.issue(“问题的Key”)得到,问题的主要属性和方法如下:

  • id: 问题的id
  • key: 问题的Key
  • permalink(): 获取问题连接
  • fields: 问题的描述,创建时间等所有的配置域
  • raw: 问题的原始API数据


配置域(Fields)
一般问题的ields中的属性分为固定属性和自定义属性,自定义属性格式一般为类似customfield_10012这种。常用的问题的Fields有:

  • assignee:经办人
  • created: 创建时间
  • creator: 创建人
  • labels: 标签
  • priorit: 优先级
  • progress:
  • project: 所示项目
  • reporter: 报告人
  • status: 状态
  • summary: 问题描述
  • worklog: 活动日志
  • updated: 更新时间
  • watches: 关注者
  • comments: 评论
  • resolution: 解决方案
  • subtasks: 子任务
  • issuelinks: 连接问题
  • lastViewed: 最近查看时间
  • attachment
issue = jira.issue('JRA-1330')
print(issue.key, issue.fields.summary, issue.fields.status)

关注者/评论/附件

  • jira.watchers(): 问题的关注者
  • jira.add_watcher(): 添加关注者
  • jira.remove_watcher(): 移除关注者
  • jira.comments(): 问题的所有评论
  • jira.comment(): 某条评论
  • jira.add_comment():添加评论
  • comment.update()/delete(): 更新/删除评论
  • jira.add_attachment(): 添加附件
issue = jira.issue('JRA-1330')

print(jiaa.watchers(issue)) # 所有关注者
jira.add_watcher(issue, 'username') # 添加关注者

print(jira.comments(issue)) # 所有评论
comment = jira.comment(issue, '10234') # 某条评论
jira.add_comment(issue, 'new comment') # 新增评论
comment.update(body='update comment') # 更新评论
comment.delete() # 删除该评论

print(issue.fields.attachment) # 问题附件
jira.add_attachment(issue=issue, attachment='/some/path/attachment.txt') # 添加附件


创建/分配/转换问题
jira.create_issue(): 创建问题
jira.create_issues(): 批量创建问题
jira.assign_issue(): 分配问题
jira.transitions(): 获取问题的工作流
jira.transition_issue(): 转换问题

# 创建问题
issue_dict = {
    'project': {'id': 123},
    'summary': 'New issue from jira-python',
    'description': 'Look into this one',
    'issuetype': {'name': 'Bug'},
}
new_issue = jira.create_issue(fields=issue_dict)

# 批量创建问题
issue_list = [
{
    'project': {'id': 123},
    'summary': 'First issue of many',
    'description': 'Look into this one',
    'issuetype': {'name': 'Bug'},
},
{
    'project': {'key': 'FOO'},
    'summary': 'Second issue',
    'description': 'Another one',
    'issuetype': {'name': 'Bug'},
},
{
    'project': {'name': 'Bar'},
    'summary': 'Last issue',
    'description': 'Final issue of batch.',
    'issuetype': {'name': 'Bug'},
}]
issues = jira.create_issues(field_list=issue_list)

# 分配问题
jira.assign_issue(issue, 'newassignee')

# 转换问题
jira.transition_issue(issue, '5', assignee={'name': 'pm_user'}, resolution={'id': '3'})

搜索
JIRA 的搜索非常强大,并配有一套专门的搜索语言,称为JQL(Jira Query Language),JIRA 的Python库便是基于JQL语法进行搜索的,返回的是搜索到的问题列表。

jira.search_issues('JQL语句')
#默认最大结果数未1000,可以通过maxResults参数配置,该参数为-1时不限制数量,返回所有搜索结果。

jira.search_issues('project=PROJ and assignee = currentUser()', maxResults=-1)
分类: 日常 标签:

判断某个 UWP 程序是否已经安装

2021年1月20日 没有评论

在一些代码逻辑里,经常需要判断指定的 UWP程序是否已经安装,其实微软已经提供了相应的API了,无论是Win32还是原生的 UWP程序都可以直接使用,这就是 PackageManager,其文档地址见这里

但是这个类,微软给添加了一个标记 [Windows.Foundation.Metadata.WebHostHidden],所以如果是网页里就无法调用了。为了规避掉这个问题,发现了一个类似hack 的方式。

就是使用 QueryUriSupportAsync 方法,向请求的UWP程序发送一个不存在的协议字符串,然后检查其返回值。返回的是一个枚举类型,也就是说,如果是 0(已安装)或者3(不支持该协议),就表明这个程序对于当前用户来说是已安装的。

下面是一段 js 的调用示例代码:

static queryUriSupport(uri, packageName) {
    return Windows.System.Launcher.queryUriSupportAsync(
        new Windows.Foundation.Uri(uri),
        0,
        packageName
    );
}

简单、暴力、直接,恰好解决了网页里的权限问题。

分类: 日常 标签:

NTLM SSP攻击服务器解决办法

2020年12月16日 没有评论

最近无聊就翻看了下服务器的日志情况,看到有好多攻击记录,都是使用 NtLmSsp 暴力破解,查了一下,都是使用的俄罗斯那边的代理,创建了防火墙规则,过滤了一波IP地址,又观察了2天,发现还有有部分攻击,不过把尝试频率给降低了。

按照网上的方式,打开本地安全策略管理,按下图修改。

下面是修改前的默认值

经过测试,发现仅仅拒绝所有域账户还是会存在攻击的情况。直接拒绝所有账户,世界就清净了,当然了,远程桌面也别想用了,使用别的方式咯。

分类: 日常 标签:

python 实现 windows 身份验证登录

2020年12月1日 没有评论

最近在打算写个工具去获取车辆的停车信息,以提醒自己及时地挪车。

常规地讲,需要先登录内网系统查看,内网在域里,使用了单点登录和 winodws 身份验证机制。Python 里大家使用的比较多的是 requests 库,但是它不支持这样的登录。

我们就需要别的库来帮忙了,经过一番搜索,发现 requests_ntlm 满足要求。

import requests
from requests_ntlm import HttpNtlmAuth

response = requests.get(url, auth=HttpNtlmAuth(“name”, “password”))

经过实际验证,这个库会有2次的401错误请求。

顺便也搜索了下如何使用 .Net 来获取,看起来更简单:

string url = “http://adm.xxxx.com/Biz/ParkingCarOverTime/List_Employee.aspx”;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.PreAuthenticate = true;
NetworkCredential credential = new NetworkCredential(“name”, “password”);
request.Credentials = credential;

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Console.WriteLine($”Authentication successful {response.StatusCode}”);
StreamReader sr = new StreamReader(response.GetResponseStream());
Console.WriteLine(sr.ReadToEnd());

不要问细节,问就是使用 PreAuthenticate 属性

分类: Python, 日常 标签:

Python 提取图片的主体颜色

2020年11月5日 没有评论

如果要计算一个图片的平均色或者是主题色,过去的做法是遍历图片的像素点,然后分别针对R\G\B做加权平均。但是这样会产生一个意料之外的结果,就是这个平均值的颜色,在这个图片上根本就没有出现过。它仅仅是数学意义上的平均值。

所以另外一种思路就是根据图片里的颜色做聚类分析,只在已经存在的颜色范围里计算。这里可以使用 k-means 传统机器学习算法。

from skimage import io
from sklearn.cluster import KMeans
import numpy as np

# k-means中的k值,即选择几个中心点
k = 3

img = io.imread('city.jpg')
# 转换数据维度
img_ori_shape = img.shape
img1 = img.reshape((img_ori_shape[0] * img_ori_shape[1], img_ori_shape[2]))
img_shape = img1.shape

# 获取图片色彩层数
n_channels = img_shape[1]
# 构造聚类器
estimator = KMeans(n_clusters=k, max_iter= 4000, init='k-means++', n_init=50)
estimator.fit(img1) # 聚类
centroids = estimator.cluster_centers_  # 获取聚类中心

# 生成一个可视化矩阵
result = []
result_width = 200
result_height_per_center = 80
for center_index in range(k):
    result.append(np.full((result_width * result_height_per_center, n_channels), 
    centroids[center_index], dtype=int))
result = np.array(result)
result = result.reshape((result_height_per_center * k, result_width, n_channels))
# 保存矩阵到图片
io.imsave('result.jpg', result)

最后放上测试使用的图片,有兴趣的同学可以试一试,顺序有可能不一样,但是颜色应该是这几个。

分类: Python, 日常 标签:

SoundTouch

2020年10月1日 没有评论

SoundTouch是一个开源的音频处理库,其官网(http://soundtouch.surina.net),该库支持在windows、GNU、android平台的安装,有编译好的库也有源码。

主要实现包含变速、变调、变速同时变调等三个 功能模块,能够对媒体流实时操作,也能对音频文件操作。

Soundtouch支持音频的变时不变调处理(tempo),变调不变时处理(pitch),和变时变调处理(playback rate),在soundtouch的可执行命令里对应tempo、pitch、rate。

分类: 一句话, 日常 标签: ,