分类 大杂烩 下的文章

system environment

  • windows 11 23H2
  • wsl ubuntu 2204

install cuda 12.3

download url: https://developer.nvidia.com/cuda-downloads

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3

install cudnn

download url: https://developer.nvidia.com/cudnn-downloads

wget https://developer.download.nvidia.com/compute/cudnn/9.0.0/local_installers/cudnn-local-repo-ubuntu2204-9.0.0_1.0-1_amd64.deb
sudo dpkg -i cudnn-local-repo-ubuntu2204-9.0.0_1.0-1_amd64.deb
# 替换下面命令里的星号位具体的值
sudo cp /var/cudnn-local-repo-ubuntu2204-9.0.0/cudnn-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cudnn

add path

cuda_version=$(ls /usr/local/ | grep -oP "cuda-\d+\.\d+" | tail -1)
echo "CUDA Version: $cuda_version"
cuda_bin_path="/usr/local/$cuda_version/bin"
cuda_lib_path="/usr/local/$cuda_version/lib64"
echo "export PATH=\"$cuda_bin_path:\$PATH\"" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=\"$cuda_lib_path:\$LD_LIBRARY_PATH\"" >> ~/.bashrc
source ~/.bashrc

verify nvidia driver

nvidia-smi

verify cuda

nvcc -V

(function () {
  'use strict';

  function isVisible(t) {
    return !! (!t.hasAttribute('disabled') && t.getAttribute('aria-hidden') !== 'true' && t.offsetParent !== null);
  }

  function removeAccesskeyAttribute(selector) {
    document.querySelectorAll(selector).forEach(function(el) {
      el.removeAttribute('accesskey');
    });
  }
  function addClass(selector, clsName) {
    document.querySelectorAll(selector).forEach(function(el) {
      el.classList.add(clsName);
    });
  }

  function gi(i, len, op) {
    let n = op == '+' ? +1 : -1;
    i = i + n;
    if (i >= len) {
      i = 0;
    }
    if (i < 0) {
      i = len - 1;
    }
    return i;
  }

  function _toFocus(el) {
    let tagName = el.tagName.toLowerCase();
    let tagNames = ['div', 'p', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'form', 'img', 'nav', 'header', 'main', 'footer', 'section', 'aside'];
    if (tagNames.includes(tagName) || (tagName == 'a' && !el.hasAttribute('href'))) {
      if (!el.hasAttribute('tabindex')) {
        el.setAttribute('tabindex', '-1');
      }
    }
    el.focus();
  }

  function toFocus(focusSelector, op) {
    let els = [...document.body.querySelectorAll('*')];
    let len = els.length;
    let aeIndex = Math.max(0, els.indexOf(document.activeElement));
    let i = aeIndex == 0 ? 0 : gi(aeIndex, len, op);
    do {
      if (els[i].matches(focusSelector) && isVisible(els[i])) {
        _toFocus(els[i]);
        break;
      }
      i = gi(i, len, op);
    } while ( i != aeIndex );
  }

  function nextFocus(selector) {
    toFocus(selector, '+');
  }

  function previousFocus(selector) {
    toFocus(selector, '-');
  }

  function isIE() {
    return ( !! window.ActiveXObject || "ActiveXObject" in window);
  }

  if (!isIE()) {
    let keys = [];
    document.querySelectorAll('[accesskey]').forEach(function(el) {
      let key = el.getAttribute('accesskey');
      if (!keys.includes(key)) {
        keys.push(key);
      }
    });
    keys.forEach(function(key) {
      addClass('[accesskey="' + key + '"]', 'accesskey-' + key);
      removeAccesskeyAttribute('[accesskey="' + key + '"]');
    });

    document.addEventListener('keydown',
    function(e) {
      keys.forEach(function(key) {
        let keyCode = key.toUpperCase().charCodeAt();
        if (e.altKey && e.shiftKey && e.keyCode == keyCode) {
          e.preventDefault();
          previousFocus('.accesskey-' + key);
        } else if (e.altKey && e.keyCode == keyCode) {
          e.preventDefault();
          nextFocus('.accesskey-' + key);
        }
      });
    },
    null);
  }

}());

快捷键是指按键或按键组合,可提供另一种方式来执行通常使用鼠标执行的操作。下面是 新版 Microsoft Edge 的快捷键列表
适用于 Windows 10 的 Microsoft Edge
按键 执行的操作
Ctrl + D 将当前网页另存为收藏夹
Ctrl + E 在地址栏中打开搜索查询
Ctrl + F 在页面上查找
Ctrl + G 跳转到“查找栏”搜索结果中的下一个匹配项
Ctrl + H 在新标签页中打开“历史记录”(Web UI)
Ctrl + J 在新标签页中打开“下载”(Web UI)
Ctrl + L 选择地址栏中的 URL 以进行编辑
Ctrl + M 将当前标签页设为静音(切换)
Ctrl + N 打开新窗口
Ctrl + O 在 Microsoft Edge 中打开计算机中的文件
Ctrl + P 打印当前页
Ctrl + R 重新加载当前页
Ctrl + S 保存当前页
Ctrl + Shift + B 显示或隐藏收藏夹栏
Ctrl + Shift + D 在新文件夹中将所有打开的标签页另存为收藏夹
Ctrl + Shift + G 跳转到“查找栏”搜索结果中的上一个匹配项
Ctrl + Shift + I 打开开发人员工具
Ctrl + Shift + L 粘贴并搜索或粘贴并访问(如果它是 URL)
Ctrl + Shift + M 以其他用户身份登录或以来宾身份浏览
Ctrl + Shift + N 打开新的 InPrivate 窗口
Ctrl + Shift + O 打开收藏夹管理
Ctrl + Shift + P 使用系统对话框打印
Ctrl + Shift + R 重新加载当前页,忽略缓存的内容
Ctrl + Shift + T 重新打开上一个关闭的标签页并切换到该标签页
Ctrl + Shift + V 不带格式粘贴
Ctrl + Shift + W 关闭当前窗口
Ctrl + T 打开新标签页并切换到该标签页
Ctrl + U 查看源
Ctrl + W 关闭当前标签页
Ctrl + 0(零) 重置缩放级别
Ctrl + 1、2...8 切换到特定标签页
Ctrl + 9 切换到最后一个标签页
Ctrl + Enter 将 www. 和 .com 分别添加到在地址栏中键入的文本的开头和末尾
Ctrl + Shift + Delete 打开清除浏览数据选项
Ctrl + Tab 切换到下一个标签页
Ctrl + Shift + Tab 切换到上一个标签页
Ctrl + 加号 (+) 放大
Ctrl + 减号 (-) 缩小
Ctrl + \ (在 PDF 中)在“根据页面调整”与“根据宽度调整”之间切换 PDF
Ctrl + [ (在 PDF 中)将 PDF 逆时针旋转 90 度*
Ctrl + ] (在 PDF 中)将 PDF 顺时针旋转 90 度*
Ctrl + PgDn 切换到下一个标签页
Ctrl + PgUp 切换到上一个标签页
Alt 将焦点放在“设置及更多...”按钮上
Alt + Shift + B 将焦点放在收藏夹栏中的第一项上
Alt + D 选择地址栏中的 URL 以进行编辑
Alt + E 打开“设置及更多...”菜单
Alt + F 打开“设置及更多...”菜单
Alt + Shift + I 打开“发送反馈”对话框
Alt + Shift + T 将焦点放在工具栏中的第一项上
Alt + 向左键 返回
Alt + 向右键 前进
Alt + Home 在当前标签页中打开主页
Alt + F4 关闭当前窗口
F1 打开帮助
F3 在页面上查找
F4 选择地址栏中的 URL
Ctrl + F4 关闭当前标签页
F5 重新加载当前页
Shift + F5 重新加载当前页,忽略缓存的内容
F6 将焦点切换到下一个窗格
Shift + F6 将焦点切换到上一个窗格
F7 打开或关闭插入光标浏览
F10 将焦点放在“设置及更多...”按钮上
F10 + Enter 打开“设置及更多...”菜单
Shift + F10 打开上下文菜单
F11 进入全屏(切换)
F12 打开开发人员工具
Esc 停止加载页面;关闭对话框或弹出窗口
空格键 向下滚动网页,一次滚动一个屏幕
Shift + 空格键 向上滚动网页,一次滚动一个屏幕
PgDn 向下滚动网页,一次滚动一个屏幕
PgUp 向上滚动网页,一次滚动一个屏幕
Home 转到页面顶部,将键盘焦点移动到窗格的第一项
End 转到页面底部,将键盘焦点移动到窗格的最后一项
Tab 转到下一个制表位
Shift + Tab 转到上一个制表位

了解各种键盘快捷键,成为 Chrome 达人。

标签页和窗口快捷键

操作 快捷键
打开新窗口 Ctrl + n
在无痕模式下打开新窗口 Ctrl + Shift + n
打开新的标签页,并跳转到该标签页 Ctrl + t
按标签页的关闭顺序重新打开先前关闭的标签页 Ctrl + Shift + t
跳转到下一个打开的标签页 Ctrl + Tab 或 Ctrl + PgDn
跳转到上一个打开的标签页 Ctrl + Shift + Tab 或 Ctrl + PgUp
跳转到特定标签页 Ctrl + 1 到 Ctrl + 8
跳转到最右侧的那个标签页 Ctrl + 9
在当前标签页中打开主页 Alt + Home
打开当前标签页浏览记录中记录的上一个页面 Alt + 向左箭头键
打开当前标签页浏览记录中记录的下一个页面 Alt + 向右箭头键
关闭当前标签页 Ctrl + w 或 Ctrl + F4
关闭当前窗口 Ctrl + Shift + w 或 Alt + F4
最小化当前窗口 Alt + 空格键,然后按 n 键
最大化当前窗口 Alt + 空格键,然后按 x 键
退出 Google Chrome Alt + f,然后按 x 键

Google Chrome 功能快捷键

操作 快捷键
打开 Chrome 菜单 Alt + f 或 Alt + e
显示或隐藏书签栏 Ctrl + Shift + b
打开书签管理器 Ctrl + Shift + o
在新标签页中打开“历史记录”页 Ctrl + h
在新标签页中打开“下载内容”页 Ctrl + j
打开 Chrome 任务管理器 Shift + Esc
将焦点放置在 Chrome 工具栏中的第一项上 Shift + Alt + t
将焦点放置在 Chrome 工具栏中最右侧的那一项上 F10
将焦点移到未聚焦于的对话框(如果显示)或所有工具栏 F6
打开查找栏搜索当前网页 Ctrl + f 或 F3
跳转到与查找栏中搜索字词相匹配的下一条内容 Ctrl + g
跳转到与查找栏中搜索字词相匹配的上一条内容 Ctrl + Shift + g
打开“开发者工具” Ctrl + Shift + j 或 F12
打开“清除浏览数据”选项 Ctrl + Shift + Delete
在新标签页中打开 Chrome 帮助中心 F1
使用其他帐号登录或以访客身份浏览 Ctrl + Shift + m
打开反馈表单 Alt + Shift + i

地址栏快捷键

在地址栏中可使用以下快捷键:
操作 快捷键
使用默认搜索引擎进行搜索 输入搜索字词并按 Enter 键
使用其他搜索引擎进行搜索 输入搜索引擎名称,然后按 Tab 键
为网站名称添加 www. 和 .com,然后在当前标签页中打开该网址 输入网站名称并按 Ctrl + Enter 键
打开新的标签页并执行 Google 搜索 输入搜索字词并按 Alt + Enter 键
跳转到地址栏 Ctrl + l 或 Alt + d 或 F6
从页面中的任意位置搜索 Ctrl + k 或 Ctrl + e
从地址栏中移除联想查询内容 按向下箭头键以突出显示相应内容,然后按 Shift + Delete 键
将光标移到地址栏 Ctrl + F5

网页快捷键

操作 快捷键
打开选项以打印当前网页 Ctrl + p
打开选项以保存当前网页 Ctrl + s
重新加载当前网页 F5 或 Ctrl + r
重新加载当前网页(忽略缓存的内容) Shift + F5 或 Ctrl + Shift + r
停止加载网页 Esc
浏览下一个可点击项 Tab
浏览上一个可点击项 Shift + Tab
使用 Chrome 打开计算机中的文件 按住 Ctrl + o 键并选择文件
显示当前网页的 HTML 源代码(不可修改) Ctrl + u
将当前网页保存为书签 Ctrl + d
将所有打开的标签页以书签的形式保存在新文件夹中 Ctrl + Shift + d
开启或关闭全屏模式 F11
放大网页上的所有内容 Ctrl 和 +
缩小网页上的所有内容 Ctrl 和 -
将网页上的所有内容恢复到默认大小 Ctrl + 0
向下滚动网页,一次一个屏幕 空格键或 PgDn
向上滚动网页,一次一个屏幕 Shift + 空格键或 PgUp
转到网页顶部 Home
转到网页底部 End
在网页上水平滚动 按住 Shift 键并滚动鼠标滚轮
将光标移到文本字段中的上一个字词起始处 Ctrl + 向左箭头键
将光标移到下一个字词起始处 Ctrl + 向右箭头键
删除文本字段中的上一个字词 Ctrl + Backspace
在当前标签页中打开主页 Alt + Home
重置页面缩放级别 Ctrl + 0

鼠标快捷键

以下快捷键要求您使用鼠标:
操作 快捷键
在当前标签页中打开链接(仅限鼠标) 将链接拖到标签页中
在新的后台标签页中打开链接 按住 Ctrl 键的同时点击链接
打开链接,并跳转到该链接 按住 Ctrl + Shift 键的同时点击链接
打开链接,并跳转到该链接(仅使用鼠标) 将链接拖到标签栏的空白区域
在新窗口中打开链接 按住 Shift 键的同时点击链接
在新窗口中打开标签页(仅使用鼠标) 将标签页拖出标签栏
将标签页移至当前窗口(仅限鼠标) 将标签页拖到现有窗口中
将标签页移回其原始位置 拖动标签页的同时按 Esc
将当前网页保存为书签 将相应网址拖动到书签栏中
在网页上水平滚动 按住 Shift 键并滚动鼠标滚轮
下载链接目标 按住 Alt 键的同时点击链接
显示浏览记录 右键点击“后退”箭头 ,或者左键点住“后退”箭头; 右键点击“前进”箭头 ,或者左键点住“前进”箭头 
在最大化模式和窗口模式之间切换 双击标签栏的空白区域
放大网页上的所有内容 按住 Ctrl 键并向上滚动鼠标滚轮
缩小网页上的所有内容 按住 Ctrl 键并向下滚动鼠标滚轮

<?php
/**
 * 功能: 调用 ffmpeg 下载指定页面的歌曲,实际上是利用ffmpeg下载 m3u8地址
 * 这是在争度网的一个帖子里的需求,地址: http://www.zd.hk/thread-72366.htm
 * 楼主希望吧 http://ent.cnr.cn/ylzt/gqzj/ 这个页面的歌曲下载回来。
 * 用法: 将该文件保存为 ‘get.php'
 * 修改 $ffmpeg_path 和 $save_path 两个变量为你自己对应的位置
 * 在命令行下输入 ' php get.php'
 * 等待下载完毕即可
 * 补充:
 * ffmpeg 下载地址: https://ffmpeg.zeranoe.com/builds/
 * php for windows 下载地址: https://windows.php.net/download/
 * 作者: 杨永全
 * 博客: http://www.qt06.com/
 * 时间: 2019-11-20
*/

$ffmpeg_path = '"C:\Program Files\REAPER (x64)\ffmpeg.exe"'; //ffmpeg.exe路径
$save_path = 'd:\workspace\\'; //保存位置
$url = 'http://ent.cnr.cn/ylzt/gqzj/';
$pattern = '<li index="\d+" data-url="(.+?)"><span>(.+?)</span></li>';
$s = file_get_contents($url);
$s = iconv('gbk', 'utf-8', $s);
if(preg_match_all('#'.$pattern.'#is', $s, $rs)) {
    $cnt = count($rs[1]);
    $rc = 0;
    for($i = 0; $i < $cnt; $i++) {
        $cmd = $ffmpeg_path.' -i '.$rs[1][$i] . ' '.$save_path.trim($rs[2][$i]).'.mp3';
        system($cmd, $rc);
    }
    echo 'finished';
} else {
    echo 'parse failed';
}

  • JS交流: 1078389724JS交流
  • Reaper音频网: 374652340Reaper音频网
  • 喜马拉雅直播助手交流: 722925766喜马拉雅直播助手交流
  • 微信公众号运营管理: 688579275微信公众号运营管理
  • 晴天无障碍建站系统: 1805823晴天无障碍建站系统
  • PHP交流: 808831695PHP入门交流
  • C#交流: 421097336C#交流
  • python交流: 24158477python交流

搜集了一些 VIP 视频解析地址,大部分有效。仅作为学习研究。



互联网信息无障碍最近几年越来越受到关注和重视。互联网产品的无障碍改造也越来越受到关注和重视。
这是值得高兴的事情,这说明残障人或者说若是人群的信息获取问题得到关注和重视。
但是,在无障碍改造过程中也出现了一些新的问题,或者说出现了一些改造方式和方法上的误区,以至于引起受众的吐槽,甚至是强烈反应。

今天(2016-03-21)来说说被视障网友吐槽度非常高的冗余信息。

所谓的冗余信息,我认为就是多余的信息,添乱的信息,可以省略的信息,容易引起误导的信息。

之所以今天(2016-03-21)说冗余信息,是因为今天拿到了手机qq安卓版的一个测试版,在这个版本里,持续了很久的一个冗余提示终于得以改善,所以心情应该说是好的,于是就索性把这个问题展开说一下。

手机qq里,当有人发来语音消息的时候,在安卓平台上,读屏软件会读出类似下面这样的信息:
晴天 发来语音消息5秒按钮

争渡识图志愿者交流 发来语音13秒按钮

第一条是好友聊天过程中,对方发来语音消息的提示,第二条是在群聊过程中,群友发来语音消息的时候的提示。

如果正在看这些文字的你是一位明眼人,让我们来做个假设:假设你正在用qq跟你的好友聊天,你的手机屏幕上出现这些文字,每一条语音消息都会有这样一行文字出现,你会作何感受呢?
我不知道你眼前总是出现“晴天 发来语音消息xxx秒”,你会不会感到头晕目眩,我也不知道你还有没有兴致跟你的好友继续聊下去。但是我可以告诉你的是,我的耳朵每天都在忍受这样的煎熬,至少有半年以上,甚至更长,我已经不记得有多长时间了。

我有点情绪激动了,不过我会努力平静下来,让我们开始分析一下这两个提示信息吧。

我们用“争渡识图志愿者交流 发来语音13秒”这条信息作为例子来解析一下。
这条信息可以拆分为如下几个部分:

  1. 争渡识图志愿者交流 // 当前聊天窗口标题,如好友窗口或者群聊窗口
  2. 发来语音 // 描述信息
  3. 13秒 // 语音的时长
  4. 按钮 // 控件类型

可以看出,只有第三条是动态变化的,其余的都是固定不变的。

第一,听一条语音消息要用多少时间呢?

整个提示信息长度为18个字,假定1秒钟3个字,那么要6秒钟听完这一条信息。
之后,在进行双击收听语音,假定双击速度为0.5秒,我们在假定找到一条心语音消息需要0.5秒,那么从找到消息到听到语音这中间至少需要7秒钟。
每一条语音消息都需要7秒钟时间。

第二, 这样的提示合理吗?

当跟好友聊天的时候,窗口标题是好友的昵称,当在群聊的时候,窗口名称是群标题,当在讨论组内聊天的时候,窗口标题是讨论组的名字。
这个窗口标题就是每一条语音消息的提示信息的开头部分。那么这个窗口标题加在每一条语音消息的开头有必要吗?我猜想,产品设计的想法是,要告诉我这条语音是谁发来的,担心我不知道是谁发来的语音。
如果我这个猜想是对的,那么我有一个新的问题了,当我跟一个好友聊天的时候,他的声音我会不会很熟悉呢?我会把张三的声音听成李四的声音吗?我想我不会。写到这里,我突然想到一句话,人们都说盲人的耳朵特好用。
而当我在一个群里聊天的时候,情况会如何呢?群里人很多,告知我每一条语音是谁发来的很有必要了吧?没错,这一点我也很同意。那么我们看看手机qq的提示:“争渡识图志愿者交流 发来语音13秒按钮”,好吧,每一条语音都告诉我是这个群发来的。
我突然蒙了,我没有一个叫争渡识图志愿者交流的好友啊,为什么每次发来语音都是同一个人,却声音不同呢?
更让我郁闷的是,有的人居然就发两秒钟的消息,而我为了听到这两秒钟的声音,居然每次都要用掉我7秒钟的时间。
这分明就是在抢占我的时间,在浪费我的时间啊!这个时候我又想起了一句话,浪费时间就是谋财害命。

第三, 为什么会这样设计呢?

说实话,我不是设计者,我真心不知道为什么这样设计。
但是我妄自猜想一下吧:
“这盲人要用耳朵听,那么太简单的提示他们肯定是听不懂,或者会理解错,所以啊,就的提示的详细一些,准确一些。”
我不知道是不是因为这样的想法才制造出了类似前面那种提示方式,但是我作为一个实实在在的使用者,我只想说,这真的不好。
我想明眼人用户,可以看到界面上的文本来了解功能,也可以看图标来了解功能,还可以通过不同的颜色来判断功能。
那盲人用户该如何了解功能呢?无法看文本,无法看图标,无法分辨颜色。、有读屏软件,可以读出文字。对,所以就只有通过文本描述了。于是就出现了前面的冗余提示了。

第四, 我为什么觉得是冗余信息?

  1. 大量的重复内容,前面的例子只有第三部分信息是有用的,其余的都是无用的或者无关紧要的信息,至少前两部分是无用的。
  2. 浪费时间,一条信息,有大量时间是浪费在无关紧要的内容上,而且无法跳过。
  3. 似乎从某种意义上说,盲人很弱智,只有这样详尽的描述才能让他们明白和理解。

第五, 为什么会引起大量盲人小伙伴们的愤怒情绪?

答案似乎就在第四条里了。也难怪有的小伙伴戏称某些无障碍版本的软件是“智障软件”或者“弱智软件”。

第六, 到底该如何是好呢?

  1. 请不要想当然的设计。
  2. 请遵循所听即所见的原则。对于图标,请用精炼的单词或短语描述。
  3. 请尊重和遵循不同平台的无障碍规范。

我想这几条应该有必要展开专门的讨论,就留到下次吧。

第七, 结尾

最后感谢你耐心读到这里,也请原谅我占用了你这么多时间。也请你谅解在微博上情绪激动的我的小伙伴们。

这篇文字是3月21日开始写的,当时只写到了第二条,直到今天,关于冗余信息的问题再次引起了我的小伙伴们的愤怒,于是补充上后面的部分。

话说php的markdown解析器版本很多,但或多或少都存在一些问题。
最初用的是传统的markdown解析器(是[typecho][]使用的),我发现在解析某些带有 \# 的文本时,会出错,于是换成了[hyperdown][]。
但是,hyperdown会将所有的html代码转意,这对于博客来说有些不适合,因为在有些时候,需要手写一些html源码。
于是我给hyperdown提了一个issue。作者回复说因为hyperdown是基于[SegmentFault][]的,所以默认从安全考虑,全部转意了html字符。
我建议hyperdown加一个开关,默认不转意html,不过还没有得到回应。

今天在[github][]上搜索,找到了[erusev/parsedown][]。
经过测试体验,我之前遇到的几个问题都以解决,正好符合我的需要。
他还提供了几个选项,允许简单的定制,让我觉得最满意的是可以设置自动换行,可以将\n换行符转换成<br />