分类 Software 下的文章

最近在由于某个开发的移动平台的工作环境变成了 Firefox,在一次重新安装了 Ubuntu 系统之后,mp3 无法正常播放,提示错误大致如下

 Warning: Cannot play media. No decoders for requested formats: audio/mpeg

不管是通过是 <audio src></audio> 还是 new Audio() 的方式,都报出这个错误,最后总结出来三条解决方法:

  1. 安装 ubuntu-restricted-extras sudo apt-get install ubuntu-restricted-extras
  2. 安装 gnash sudo apt-get install gnash (一个 gnu 做的 flash 播放器,其中包含了浏览器插件)
    这条比较容易忽略,虽然我也不明白为什么 Firefox 调用解码器还和 flash 有关。
  3. 安装最新版的 Firefox,实测 59 版本就算满足了上面两条,还是无法正常播放,而 63 版本正常。

一直以来,MAC 下鼠标的功能按键(比如侧键)都不能正常工作,罗技自己的驱动对鼠标型号的支持都非常有限,比如我手中的 G500s 和 G502 就不能正常支持,尝试过很多方案,都不能完美解决,最近发现了 SensibleSideButtons 这个应用,完美的解决了这个问题。

根据作者的描述,他一直以来也被这个问题困扰,知道后来研究了 Logitech MX Master 的技术方案,最终采用模拟 Trackpad 三指手势的方式,完美的解决了这个问题。

具体可以看作者写的技术原理和实现 http://sensible-side-buttons.archagon.net/

1. Tray(托盘图片)消失

假如你把 tray 的实例变量定义在了函数内部(比如 app.on('ready', createWindow) 的回调函数内),那么当 JavaScript 引擎进行垃圾回收的时候,这个变量就会被销毁,这样 tray 的实例就没了,托盘图标就消失了。

2. 无法进行复制、粘贴之类的操作

由于默认没有绑定任何快捷键,当然操作不了,使用官方提供的下面这段代码,将各平台所有常见的菜单(快捷键)绑定好。

const template = [
  {
    label: 'Edit',
    submenu: [
      {role: 'undo'},
      {role: 'redo'},
      {type: 'separator'},
      {role: 'cut'},
      {role: 'copy'},
      {role: 'paste'},
      {role: 'pasteandmatchstyle'},
      {role: 'delete'},
      {role: 'selectall'}
    ]
  },
  {
    label: 'View',
    submenu: [
      {role: 'reload'},
      {role: 'forcereload'},
      {role: 'toggledevtools'},
      {type: 'separator'},
      {role: 'resetzoom'},
      {role: 'zoomin'},
      {role: 'zoomout'},
      {type: 'separator'},
      {role: 'togglefullscreen'}
    ]
  },
  {
    role: 'window',
    submenu: [
      {role: 'minimize'},
      {role: 'close'}
    ]
  },
  {
    role: 'help',
    submenu: [
      {
        label: 'Learn More',
        click () { require('electron').shell.openExternal('https://electron.atom.io') }
      }
    ]
  }
]

if (process.platform === 'darwin') {
  template.unshift({
    label: app.getName(),
    submenu: [
      {role: 'about'},
      {type: 'separator'},
      {role: 'services', submenu: []},
      {type: 'separator'},
      {role: 'hide'},
      {role: 'hideothers'},
      {role: 'unhide'},
      {type: 'separator'},
      {role: 'quit'}
    ]
  })

  // Edit menu
  template[1].submenu.push(
    {type: 'separator'},
    {
      label: 'Speech',
      submenu: [
        {role: 'startspeaking'},
        {role: 'stopspeaking'}
      ]
    }
  )

  // Window menu
  template[3].submenu = [
    {role: 'close'},
    {role: 'minimize'},
    {role: 'zoom'},
    {type: 'separator'},
    {role: 'front'}
  ]
}

问题

出于个人习惯,我在终端模拟器(iTerm2 等)中,都是将光标(cursor)设置为 vertical bar,而在 neovim 中则是将 normal 模式的光标设置为 block。

这样一来,当我从 neovim 的正常模式退出时,导致终端的光标样式也变成了 block,非常麻烦。主要是因为终端没有提供 API 查询当前的光标样式设置,因此 neovim 在退出时也不知道要如何重设光标。

解决

思路就是退出 neovim 的时候把光标重新设置为 vertical bar(ver25)。

if $TERM_PROGRAM =~ "iTerm"
  " reset cursor when vim exits
  au VimLeave * set guicursor=a:ver25-blinkon0
endif

其中ver25就是想要设置的样式,也可以是block等等,这样在退出 neovim 的时候就会重新将 iTerm2 的光标设置为 vertical bar。

  • 360 极速浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36 QIHU 360EE"
  • 猎豹安全浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER"
  • 搜狗浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0"
  • QQ 浏览器
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; QQBrowser/8.0.1374.400)"
  • 百度浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36"
  • 360 安全浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"
  • 傲游浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.2.2000 Chrome/30.0.1599.101 Safari/537.36"
  • UC 浏览器PC版
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 UBrowser/3.1.1644.29 Safari/537.36"

使用tmux之后,原本的鼠标滚动查看历史记录就变成了切换历史命令,不是很习惯。可以通过以下方法修改回来。

~/ 下新建 .tmux.conf (如果没有的话),其中加入下面这句:

set-window-option -g mode-mouse on

然后使用这个conf: tmux source-file .tmux.conf

就可以继续使用滚轮查看历史记录啦

首先搭建Shadowsocks,参见官方使用指南:

官方使用指南(英文) / 官方使用指南(中文)

这里选择了SS的python版本,事实上,cow本身提供了代理方案,但是Shadowsocks的操作空间更大。

官方指南使用 pip 安装SS环境,在一些没有安装pip的vps,需要先安装一下,ubuntu系的是

sudo apt-get install python-pip

接着就新建一个SS的配置文件 config.json 。可以新建一个 SS 目录,用来存放,方便寻找。

{
"server":"my_server_ip",
"server_port":8388,
"local_port":1080,
"password":"barfoo!",
"timeout":600,
"method":"table" //加密方案推荐 aes-256-cfb ,需安装 m2crypto
}

如果是单IP VPS,推荐使用 0.0.0.0 作为 server 的值。

加密方案使用 aes-256-cfb ,安装 m2crypto 。ubuntu 系

sudo apt-get install python-m2crypto

安装 gevent 可以提高 Shadowsocks 的性能:

sudo apt-get install python-gevent

SS 可以使用命令行参数覆盖默认配置,具体参见 命令行参数 。

:以上安装命令需要管理员权限。

接下来在配置文件(config.json) 文件所在目录使用

nohup ssserver > log &

这样可以在后台运行SS,断开SSH连接之后依旧可以使用SS,调试情况下,可以使用 ssserver 启动 SS,可以看到信息记录。

然后配置 cow 。官方文档: cow github

以 windows 版本为例 。下载:cow 。也可以从 go 源码编译。

windows 版本的 cow 配置文件为目录下 rc.txt 。实际情况下,我们需要的部分很少。

#开头的行是注释,会被忽略
# 本地 HTTP 代理地址
# 配置 HTTP 和 HTTPS 代理时请填入该地址
# 或者在自动代理配置中填入 http://127.0.0.1:7777/pac
listen = http://127.0.0.1:7777
# SOCKS5 二级代理
# proxy = socks5://127.0.0.1:1080
# HTTP 二级代理
# proxy = http://127.0.0.1:8080
# proxy = http://user:password@127.0.0.1:8080
# shadowsocks 二级代理
proxy = ss://aes-256-cfb:password@1.2.3.4:8388
# cow 二级代理
# proxy = cow://aes-128-cfb:password@1.2.3.4:8388

由于这里使用SS作为二级代理,因此将其他二级代理的配置都注释了,可以根据自己的情况自行配制。

需要修改的有两个地方,首先是 listen 的端口,选一个好记又不冲突的吧。

另外是配置 SS 的参数。在 shadowsocks 二级代理处。

此处我已经使用了 aes-256-cfb 作为样例,可以根据自己的情况修改。冒号后填入SS密码,[code]@[/code]后填入服务器完整地址。

运行 cow-taskbar.exe 或者 cow-hide.exe 启动 cow 。前者会自动缩小到系统托盘,后者则是完全后台。不需要再额外运行 SS 本地程序。

配合浏览器端的代理扩展。例如 Chrome 上的 Proxy SwitchySharp 。在 HTTP/HTTPS 中填入 listen 参数。或者直接使用 pac 。

接来下就可以开始体验了。实际使用下,cow 的作用非常明显,相当于一个实时更新的 list ,无需再担心切换问题。

SS 和 cow 的代码、原理、其他使用方式都可以参照它们的 github 主页。其中SS还提供了 nodejs 及源码 等其他服务器版本,以及多平台的本地版本,可以在不同情况下使用。

The online Rubik's Cube solver program will help you find the solution for your unsolved puzzle.

Noppoo家产的机械键盘,因为其低廉的价格和不错的性能受到不少像我这样没有太多钱烧键盘的人的喜爱。

默认情况下,Noppoo的键盘在Mac下会有错位问题(部分键位),以前有一种解决方法是USB转PS2转USB,这个方法比较麻烦,而且不一定有效。

现在有了更好的解决方法,IOUSBHIDDriverDescriptorOverride 是一个针对Noppoo的USB键盘Mac OS系统修正项目。配合 KeyRemap4MacBook 可以完美修正Noppoo的Mac兼容性。

1、安装 最新版的 IOUSBHIDDriverDescriptorOverride 。

2、安装 KeyRemap4MacBook 。(这可以修复部分键位的残留问题。)

3、重启!体验一下。

事实上,安装完 IOUSBHIDDriverDescriptorOverride 之后只能使 Mac 正确识别Noppoo 的键盘,少数键位依旧存在问题,比如 ? + 等这几个上档功能键位不可用(无法通过上档输入这几个字符)。通过安装 KeyRemap4MacBook 就可以完美解决这些问题。

:考虑到实际情况下,默认是由 windows 键 作为 cmd 键,非常不顺手,所以在系统偏好设置 – 键盘,里进行修改,点击 修饰键,然后选择对应的Noppoo键盘,将 option 和 cmd 键的对应键调换一下,使得 alt 键作为 cmd ,windows 键作为 option ,就会符合 MacBook 自带键盘的键位习惯了。

IOUSBHIDDriverDescriptorOverride:

IOUSBHIDDriverDescriptorOverride