August 2019

Git 下游更改后强行恢复至上游最新状态, 更新submodules至最新状态

1.下游更改后强行恢复至上游最新状态

2.Submodules, 第一次更新下载

3.submodule已经下载过一次,需要再次更新至上游最新状态

 …

Continue reading...

Python计算中文字符串长度时的注意事项

Python直接调用len计算出的是字符个数。如下:

如果要得到字节长度可以编码成utf-8格式:

编码成utf-8格式后,一个中文字符占用3个字节,所以长度结果为6。

如下:

Continue reading...

C语言exec 簇函数注意事项

exec函数簇在运行的时候是将原进程的映像替换成新的执行进程的,所以如果直接在一个进程中,即main函数中调用execl, execp等函数,主进程会被替换掉,exec簇函数后面的内容将不会被执行,所以如果要使用此函数,可以fork一个子进程来运行。

同样地,在线程中调用了此类函数,主进程的所有映像也一样会替换掉,因为线程没有独立地址空间,进程有,而exec簇函数会改变进程的映像,只能拿线程所在的进程下手。

exec类函数相关信息参照:execl(3) – Linux man page

原文:

Description

The exec() family of functions replaces the current process image with a new process image

Continue reading...

Python 以官方方式连接操作数据库

一: 下载数据库连接器

参考:https://dev.mysql.com/doc/connector-python/en/connector-python-installation-binary.html

 

二:测试连接

参考:https://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html

原文导包语句用的是 import mysql.connector ,我这边用python3运行是会报错的,换成上面写的就行了。

 

三:基础操作

数据库创建,新增表项,数据插入及查询:

Continue reading...

包含音频和视频的ogg文件的播放 – GStreamer实现

在这篇文章我写到了纯音频ogg文件的播放方法:

GStreamer学习笔记 – GStreamer实现ogg 格式音频播放及代码解析

但ogg本质是一个容器,可以同时容纳音频和视频,接下来讲两者如何同时播放。

音频和视频属于不同的数据流,解码转流和输出属于不同线路,所以需要至少两个线程来完成,GStreamer通过queue element来完成线程的创建开始和结束,其创建通过如下调用完成:

在需要开启线程的点之前加入queue element即可,然后再按实际情况链接各个元素。

为了让程序更加具有拓展性,需要获取ogg文件包含的数据流,根据数据流类型来决定是否需要两个线程来完成音频或视频的播放。如果不进行判断,直接加入两个queue element,则会出现一条不完整的链接,导致程序异常。

因为queue element需要等待pad added事件到来,再链接到demuxer的pad,如果只有一种数据流,pad added只会发生一次,也只能链接一个类型的queue element,剩下的则没有可链接的了。

至于为什么其中一条链接不完整会导致其他链接也不能正常工作,不知道它内部原理,所以就无法得知了。

 

一:获取ogg文件内部包含哪些编码格式 

ogg视频的编码格式为theora,音频的为vorbis,这里采用简单粗暴的办法,直接从ogg源文件的开头100多个字节中提取出字符串,如果里面包含theora,则含有视频流,包含vorbis则包含音频流,它的编码格式中应该是有说明需要在首部声明使用的编码方式的,用vim打开ogg文件即可以看到theora或者vorbis的字符串。

实现代码如下:

Continue reading...

WordPress 修改文章标题字体大小

思路:

  1. 用浏览器的F12调试功能,找到定义文章标题字体属性的class,如在写这篇文章时,本网站主题定义标题字体的class为entry-title
  2. 登录到服务器,cd到主题文件目录下,运行命令grep entry-title -r ./* | awk -F: '{print $1}'|uniq,找到.css结尾的文件,搜索1中的class名,本例中是entry-title。
  3. 找到class名后,将其内部的font-size:?px改成你想要的大小
  4. 如果主题自带修改标题属性功能,就不要这么麻烦啦

如下:

Continue reading...

GStreamer实现MP3音频播放

源代码:

Continue reading...

GStreamer学习笔记 – GStreamer实现ogg 格式音频播放及代码解析

源代码出处:
https://gstreamer.freedesktop.org/documentation/application-development/basics/helloworld.html?gi-language=c

Continue reading...

GStreamer学习笔记 – 基础名词概念篇

一. 基础名词概念

名词 概念
Elements An element is the most important class of objects in GStreamer.
Pads Pads are an element’s input and output, where you can connect other elements. A pad type is defined by two properties: its direction and its availability.
Bins A bin is a container for a collection of elements.
Pipelines A pipeline is a top-level bin.
Bus A bus is a simple system that takes care of forwarding messages from the streaming threads to an application in its own thread context
Capabilities(short: caps) describe the type of data that is streamed between two pads, or that one pad (template) supports.
Ghost pads A pad from some element in the bin that can be accessed directly from the bin as well. gst_element_add_pad (bin, gst_ghost_pad_new (“sink”, pad));

一. Bus

  • 每一个管道默认拥有一个总线Bus(不知道是不是这么翻译),不需要自己创建,只需设置消息处理函数到总线上即可,总线会自动周期检查消息并调用设置好的回调函数。

使用Glib mainloop时总线信号处理函数注册可用方式:

二. 流经管道的数据包括了实际媒体数据和相关控制信息,名为Buffer和Event

 

命令行运行输出文件为其可支持格式

以上为播放音频

三. Pads

Pad 的3种可用性

可用性 代表意思
Dynamic(or sometimes) pads Sometimes pads exist only in certain cases ( can disappear reanomly)
Request pads Appears only if explicitly requested by applications
Always pads pads always exist
  • 动态Pads

    当需要创建动态pipeline的时候,可以绑定信号处理函数到特定的element,当element自动创建完新的pad会发出pad-added信号,只要捕获此信号,就可以在信号处理函数中完成需要完成的动作,如element之间的链接(link)

Continue reading...

Linux屏幕取词翻译 – 思路及实现

前段时间用Python写了个终端版本的谷歌翻译爬虫:https://github.com/poemdistance/google-translate

觉得不太满足,刚好可以在这基础上弄个屏幕取词翻译就好了,要解决的问题有几个:

  1. 鼠标动作监测
  2. 屏幕字符提取
  3. 字符串翻译
  4. 界面显示
  5. 音频播放

一:鼠标动作监测

对于鼠标动作的监测,可以直接操作鼠标设备文件/dev/input/mice来完成,了解一下鼠标接口的相关协议http://www.isdaman.com/alsos/hardware/mouse/ps2interface.htm,可以从mice中读取出几个需要用到的按键信息存储到一个数组中,通过对数组信息的分析推算鼠标动作。

 

二:屏幕字符提取

关于屏幕字符提取,想到几种方法,

一是截图识别,不过准确率不够,实施起来也不算简单;

二是看能否从帧缓冲设备着手直接提取选中的字符,不过,太过底层,涉及的东西又多还都是知识盲区暂时不考虑;

三是用简单粗暴的办法,模拟按键发送Ctrl-C或者Ctrl-Shift-C来完成文本的复制。这个时候需要解决的问题有:

  1. 如何获取剪贴板内容
  2. 如何获取当前窗口的应用名称
  3. 如何模拟按键发送复制操作

因为电脑是Arch+Gnome,底层提供窗口等的服务用的是Xlib,可以从这里入手,另外模拟键盘操作也可以向键盘设备文件写入一定格式的一定数据来完成。

获取窗口应用名称可以打开一个管道执行现有命令,并读取其输出即可。至于为何要获取应用名,是因为对于终端来说,复制操作是ctrl-shift-c而不是ctrl-c,既要区别对待,必然需要先识别出当前窗口属于哪个应用。

屏幕字符提取的具体实现可以看这个项目:https://github.com/poemdistance/Screen-Word-Extraction

 

二更:

最后发现,X服务已经将屏幕中高亮的文本自动提取放置在了Primary Selection里,目前程序已直接从此剪贴板获取选中文本,省略了模拟复制。

 

 

三:字符串翻译

直接用exec函数调用写好的谷歌翻译爬虫即可,项目地址:

https://github.com/poemdistance/google-translate

之后又增加了个百度翻译的爬虫:

https://github.com/poemdistance/baidu-translate 

 

 

四:界面显示

可以采用Gtk完成界面编程,一方检测到有取词动作后进行翻译入口图标的弹出,按下入口图标后跳转到翻译窗口,监听窗口相关事件,完成相应动作,根据翻译结果动态调整显示界面的大小,放置谷歌百度翻译结果的切换按钮,随着窗口尺寸的拖拽,重绘相关控件以及背景图片,以适应新窗口。

另外尽量减少窗口的变化,提高用户体验,当切换到另一个翻译结果界面时,对比最佳界面大小,如果上一次的界面大小已经足够容纳当前窗口,不再重设尺寸。

如果界面弹出后翻译结果没被获取成功,如何在下一次的切换途中重新加载出来。

另中文字符的切割可以先弄懂UTF8编码格式,按照格式特点编写相应代码即可,详情见项目adjustStr.c文件

 

五. 音频播放

音频播放采用GStreamer库来完成,对传入的url进行直接播放,不用再写下载程序,播放逻辑为:播放按钮按下后,调用播放单词读音的回调函数,设置标志变量,切换英音和美音的播放。

 

 

代码架构:

代码整体架构:主函数开启多个线程,分别用于鼠标动作检测、入口图标绘制,翻译界面呈现。

其中检测到取词动作后,调用封装好的函数获取剪贴板内容,送入Python翻译输入端,Python获取的结果按一定格式写入共享内存,约定写入完成标志位用于判断写入完成情况。

C语言段检测到翻译结果获取完成,弹出入口图标,超时或用户区域外单击则销毁图标,点击图标则弹出翻译结果,最后调整字符串,插入到界面,呈现翻译结果。

整个Linux屏幕取词翻译项目见:https://github.com/poemdistance/ScreenTranslation

 

 

更新:

目前程序已添加快速搜索功能(Quick Search),由快捷键调出搜索框,输入后按回车符弹出翻译结果,实现思路:

1. 先是完成了Linux全局键盘监听和快捷键调出搜索框的功能,之后解决了Gtk绑定新的快捷键进行信号触发,进行搜索框的呼出和关闭,注册相关信号回调函数,捕获搜索框对应信号完成文本提取。

2.融合代码到原来工程项目,具体是在原来的项目中新开一个进程运行Quick Search,开辟新的共享内存,使原来的项目能够与Quick Search通信,交换必要信息,告知原项目当前正在运行Quick Search,请求数据写入Python翻译端,并调出翻译界面。

3.Quick Search端检查共享内存相关标志位,在翻译界面打开的状态下,忽略调出搜索框的快捷键操作

 

当然,这里省略了很多内部代码逻辑,有兴趣的话,可以看一下源码:

Linux屏幕取词翻译(适用于如Gnome等基于X server的桌面发行版) — 含界面

 

Quick Search 功能演示:

 …

Continue reading...