存档

‘一句话’ 分类的存档

Nautilus

2021年6月4日 没有评论

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

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

sudo nautilus

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

分类: 一句话 标签:

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, 一句话 标签:

SoundTouch

2020年10月1日 没有评论

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

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

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

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

获取Firefox当前打开的标签页地址

2020年9月3日 没有评论

说起三大浏览器,当然少不了火狐浏览器了。我们继续探讨如何获取该浏览器的当前标签页地址。

首选我们需要下载 NDde.dll 这个文件,添加其引用。

using NDde.Client;

DdeClient dde = new DdeClient("Firefox", "WWW_GetWindowInfo");
dde.Connect();
string url = dde.Request("URL", int.MaxValue);
dde.Disconnect();

MessageBox.Show(url);

虽然是要借助于第三方的库,但是可用快速实现 Demo 也是蛮不错的选择了。

关于NDde,原来的官网已经停止维护了,我看Github上有一个fork该项目的地址,https://github.com/anphonic/NDde 大家可以移步看看。

分类: 一句话 标签:

获取IE当前打开的标签页地址

2020年8月3日 没有评论

在前面的文章中,有分享获取chrome标签页地址的代码。现在,再来看看如何查找到 IE标签页的地址。

首先,我们需要添加2个引用:

1、引用c:\windows\system32\SHDocVw.dll

2、引用COM组件Microsoft HTML Object Library

SHDocVw.ShellWindows sws = new SHDocVw.ShellWindows();
StringBuilder sb = new StringBuilder();
foreach (SHDocVw.InternetExplorer iw in sws)
{
	sb.AppendLine(iw.LocationURL);
}
MessageBox.Show(sb.ToString());

这里iw是所有一打开的IE,包括IE本身或者基于IE内核的企业浏览器,还包括我的电脑打开的所有窗口。
你可根据实际情况筛选掉 file 开头的地址。http开头的都是当前打开的IE的地址。

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

Yolo探索之 OpenCV 安装

2020年7月6日 没有评论

其实 opencv 对于 windows 平台是很友好的,先从这里下载最新版本的opencv的包,看起来是个exe,其实就是一个自解压缩包,解压缩完成后,界面就会自动消失,所以大家不要慌。

我这里就给放到了 c:\tools 目录下。

再接下来就是要添加环境变量了,在 opencv\build 目录下,有一个setup_vars_opencv4.cmd 文件,在命令行下以管理员权限执行它,就会增加一部分环境变量。

然后【我的电脑(右键)】->【属性】->【高级系统设置】->【高级(标签)】->【环境变量】->“双击”系统变量中的Path->在变量值里面添加相应的路径。

由于目录下有 vc14 和 vc15 两个目录,所以建议把这两个都给加进去,例如 C:\Tools\opencv\build\x64\vc15\bin。

还有最后一步,就是重启系统以便生效。我没有重启系统,后面编译 yolo 的时候就报错了。所以为了稳妥起见,重启下还是比较好。

分类: AI, 一句话 标签: ,

apt-get -f install执行之后错误,python配置出错

2020年6月16日 没有评论

这几天在尝试在ARM上安装python3,是各种麻烦的很。突然发现apt-get install后各种报错,郁闷之极。

现在回头再检查,应该就是当初运行了 apt-get -f install 命令导致的。

因为是安装各种软件都有这个问题,所以影响很大,内心恨不得要把系统给重装了才对。在网上各种检索都不对,后来无意间终于发现了一个方法

亲测有效。但是不知道原因。

cd /var/lib/dpkg  
sudo mv info info.bak  
sudo mkdir info

就这么简单的几行代码,解决了问题。

现在要做的就是回想当初遗漏了哪些命令。

分类: Firefly, 一句话 标签:

根据进程获取 UWP 的包信息

2020年5月15日 没有评论

最近的一个实验项目,要监控UWP程序的启动。发现了一个比较简单的方式是使用 WMI,当有新的进程被创建时,就可以收到一个消息回调,这样的方式比不断地去轮询要优雅和有效率的多。

但是我们的目标UWP,是采用 WinJS开发的,这样会带来一个问题。就是在进程列表里,它是托管在一个叫做 wwahost.exe 的进程里的。如果有多个类似的程序的话,我们无法简单地区分出来。

所以我们需要进一步获取详细信息以便做过滤,幸好微软提供了配套的东西。我们可以使用一个叫做 UserModelId的东西来对不同的UWP程序做区分。下面是来自微软官方的实例代码(https://docs.microsoft.com/zh-cn/windows/win32/api/appmodel/nf-appmodel-getapplicationusermodelid)。

#define _UNICODE 1
#define UNICODE 1

#include <Windows.h>
#include <appmodel.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>

int ShowUsage();
void ShowProcessApplicationUserModelId(__in const UINT32 pid, __in HANDLE process);

int ShowUsage()
{
    wprintf(L"Usage: GetApplicationUserModelId <pid> [<pid>...]\n");
    return 1;
}

int __cdecl wmain(__in int argc, __in_ecount(argc) WCHAR * argv[])
{
    if (argc <= 1)
        return ShowUsage();

    for (int i=1; i<argc; ++i)
    {
        UINT32 pid = wcstoul(argv[i], NULL, 10);
        if (pid > 0)
        {
            HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
            if (process == NULL)
                wprintf(L"Error %d in OpenProcess (pid=%u)\n", GetLastError(), pid);
            else
            {
                ShowProcessApplicationUserModelId(pid, process);
                CloseHandle(process);
            }
        }
    }
    return 0;
}

void ShowProcessApplicationUserModelId(__in const UINT32 pid, __in HANDLE process)
{
    wprintf(L"Process %u (handle=%p)\n", pid, process);

    UINT32 length = 0;
    LONG rc = GetApplicationUserModelId(process, &length, NULL);
    if (rc != ERROR_INSUFFICIENT_BUFFER)
    {
        if (rc == APPMODEL_ERROR_NO_APPLICATION)
            wprintf(L"Desktop application\n");
        else
            wprintf(L"Error %d in GetApplicationUserModelId\n", rc);
        return;
    }

    PWSTR fullName = (PWSTR) malloc(length * sizeof(*fullName));
    if (fullName == NULL)
    {
        wprintf(L"Error allocating memory\n");
        return;
    }

    rc = GetApplicationUserModelId(process, &length, fullName);
    if (rc != ERROR_SUCCESS)
        wprintf(L"Error %d retrieving ApplicationUserModelId\n", rc);
    else
        wprintf(L"%s\n", fullName);

    free(fullName);
}

整体的代码比较简单,没有什么特别好说的。代码中一共调用了2次GetApplicationUserModelId方法,第一次是为了计算数据的长度,然后第二次根据数据长度重新请求以得到最终的数据。

这就是我为什么讨厌C++的原因,把指针的操作搞这么恶心。

在代码验证后,又发现了另外一个API:IsImmersiveProcess ,通过该函数可以简单地判断一个进程是否是Store类型的程序,在有的场合例如唯一性校验上还是有帮助的。有兴趣可以移步 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-isimmersiveprocess

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

由于管理员设置的策略,该磁盘处于脱机状态

2020年4月15日 没有评论

服务器在安装了一次系统更新后,数据盘不见了。跑到后台看磁盘还在,于是进磁盘管理看,可以看到那块磁盘,但是未加载。提示由于管理员设置的策略,该磁盘处于脱机状态。

按照网上的说法,非常忐忑低执行了操作,担心数据一下子没有了。后来成功加载回来了,数据没有丢失。

1.运行:cmd
2.输入:diskpart 回车进入diskpart命令行
3.DISKPART> san
4.DISKPART> san policy=onlineall
5.DISKPART>list disk
6.DISKPART> select disk 1
7.DISKPART>attributes disk clear readonly
8.DISKPART>online disk

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

正式在家远程办公

2020年3月12日 没有评论

节前放假的时候,忘记带电源线,没有想到这个就是噩梦的开始哇。

由于疫情的影响,又是封城,结果一直买不到电源线。直到最近,各个省市逐渐复工,快递才开始工作。

终于收到了电源线。

可以干活了,可以当键盘侠了。

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