分类 Tech Insight 下的文章

Matlab与Excel混合编程其实早在2010年科学网左正伟博客就有一篇文章总结了,到现在(2015年)也不为过时。这里在简要引用一下,作者终结了四种(当时)主流的实现方式:

  • 利用Excel Link(最常用方法),具体参见Matlab帮助或Excel Link手册
  • 利用Excel生成器(Matlab作COM服务器)
  • 利用Active X控制(Matlab作COM客户端)
  • 文件导入方法(利用xlsreadxlswrite函数读写Excel文件)

路上这篇文章主要介绍最后一种方法,即利用xlsreadxlswrite函数去读写Excel文件,再用Matlab进行数据处理的思路。因为路上的需求非常简单(粗暴):统计一堆按照某种格式制作的Excel文件(工作簿)中每个工作表(工作表/Worksheet)中指定位置的内容,并返回统计结构。
Matlab去满足这两种需求也很简单:利用xlsread读取内容,处理后,利用xlswrite写入预定格式的Excel文件中。其中xlsread用的函数调用方法为:

[num,txt,raw] = xlsread(filename,sheet,xlRange)

xlswrite的调用方法为:

xlswrite(filename,A,sheet,xlRange)

同时我们使用

[satus,sheets] = xlsfinfo(filename)

得到每个工作表(worksheet)的名称,同时我们也可以通过numel(sheets)获得工作表数量信息。而为了去自动读取所有的Excel文件,我们将所有要处理的文件放在一个文件夹下,然后利用 file = dir('./*.xlsx') 命令将所有Excel文件存入一个结构数组中。

思路(步骤)总结

  1. 利用 dir 函数读取所有要处理的Excel文件信息
  2. 利用xlsfinfo函数获得Exce文件中的工作表(worksheet)信息(名称、数量等)
  3. 利用xlsread函数读取Excel文件中指定工作表(worksheet)指定位置数据
  4. Matlab 编程处理数据
  5. 利用xlswrite 函数将相关数据以存入预定格式的 Excel 文件中

Discuz! 是非常知名的论坛和门户建站平台。但是其对电子邮箱有32位的限制,任何超过32位的邮箱都会被判断为无效邮箱。但是,实际上现在会有一些邮箱会超过这一限制,因此本着对所有用户负责人的态度,解除这一限制就成了当务之急。

经过粗略的研究Discuz!的form有效性验证是form内容提交到网站后,后台(php语言部分)进行验证,再将结果通过Ajax(注册时采用)或者召唤相应页面(注册后手动修改邮箱时采用)的方式返回到网页前端。同时,通过对3.2版本的Discuz!数据库研究发现,其默认的邮箱字段长度位255为可变字符(varchar)。因此,只要我们修改后台相应的php验证模块,我们可以实现最长255位的邮箱支持。不过实际上很难有人注册这种邮箱,我们的目标是为正常人类服务,因此将邮箱长度设置为64位.下面是步骤,就两步:

  1. 修改注册流程的后台php验证代码:
    修改\discuz\source\function\function_core.php第370行函数「isemail」中最大长度32为64
  2. 修改手动修改邮箱流程的后台php验证代码:
    修改\discuz\source\function\function_member.php第285行函数「checkemail($email)」中「strlen($email) > 32」为「strlen($email) > 64」.

注:文章基于python3,路上通过这篇文章中的内容,写了20多行代码,实现定时抓取某网页某几个数据的目标

准备工作

要使用python抓取网页,可以使用两个包:requests用于下载网页,而BeautifulSoup则对网页进行结构化解析。如果你在电脑上安装了pip,则可以使用下面的命令下载安装这两个包:

pip install requests beautifulsoup4

或者按照引用文章1将两个包安装到虚拟环境。
(实际上路上通过分析发现,在路上的需求里,第二个包没有用到。。)

抓取网页

抓取网页及其简单,假如我要抓取「https://pip.pypa.io/en/stable/」这个网页,则使用:

import requests
response = requests.get(‘https://pip.pypa.io/en/stable/')

在函数返回后,就能从response.text中获得这个页面的文本数据(html或者其他文本)。

抓取数据后,使用BeautifulSoup对文本数据处理,便会得结构化的HTML,然后就可以利用BeautifulSoup强大的HTML处理能力抓取相关内容了。但是路上经过分析发现需要抓取的内容位于某xx.js文件内,是json变量。所以BeautifulSoup没能使用的上。。

使用python处理JSON内容

python原生支持JSON,使用json.loads(JSONdata)将JSON转换为xml,然后使用xml相关技术得到相关数据。具体步骤略去。
python处理JSON可以参见这篇文章

数据科学是一门跨学科的专业,在「大数据」的背景(噱头)下,看起来很有前途

根据Drew Conway给出的数据科学的一个文氏图,可以看出数据科学是Hacking Skills, Math & Statistics Knowledge 以及Substantive Expertise的大交集。

  ![Data_Science_VD.png][2]

要学习数据科学,路上认为可以从上面的文氏图来推算应该的学习内容,它们应该包括:

  1. Hacking Skills (计算机知识)

    • 基本的编程语言和与数据处理相关的包/框架,例如python语言
    • 数据处理框架,比如处理大数据的利器:Hadoop
  2. Math & Statistics Knowledge (数理统计知识)

    • 统计学(概率统计)
    • (机器)学习理论
  3. 数据科学综合知识

    • 数据挖掘等

问题的由来

为了提高生产力,特别搞了个双屏(笔记本 LVDS + VGA),但是最佳分辨率是1280x1024的VGA显示器在archlinux系统里面最高分辨率只有1024x768。导致的结果就是显示出来的图像和文字都怪怪的,跟笔记本电脑显示器上面的大小不一致,这样一来眼睛就会非常的疲劳。

一路折腾

由于在KDE下的各种设置都没效果,所以本着不搞定这个问题不睡觉了精神,熬夜无数去追寻答案,试图搞出一个解决方案来。一路折腾,折腾得到了一些解答:

VGA连接上笔记本之后,没有被显卡驱动正确识别,显卡只知道又有个显示器连接上来了,能传输显示的数据,但是不能传输控制数据(控制显示器黑屏,获取显示器EDID信息等)。所以结果就是显卡按照1024x768的默认安全的分辨率输出显示信号,而系统里面对于VGA的显示模式,也只有最高1024x768的模式,所以KDE里面的display设置也就只能设置成了1024x768.

路上研究了下EDID,然后沿着「显卡驱动」「Xorg」「KDE」的途径一个一个“排查”。

路上先研究了下archlinux系统Xorg下面的ati显卡驱动,闭源私有驱动已经不支持笔记本上若干年前的老显卡了,而开源显卡驱动是支持的,而且archlinux上面还说了开源显卡对多屏(multihead)的支持更好。所以结果就是显卡驱动这方面不能干什么。

路上又跑去看Xorg的相干内容,发现「可以在KMS或者Xorg.conf文件里面增加自定义的EDID文件」,于是跑去了windows系统搞了个VGA的EDID信息。先试了下KMS里面添加EDID文件,结果没有反应。然后又试试添加了xorg.conf文件里面,试了几次,有的没有反应,有的直接不能进入X界面(KDE当然不能启动了。。)

最后路上去搞了搞KDE系统本身,倒是发现了display存储的显示配置信息(./KDE4/share/config/krandr)。不过发现修改这个文件也不起作用。

柳暗花明又一村 发现xrandr的强大

路上在各处追寻问题的时候,发现原来xrandr可以直接定义显示器的显示模式,然后试了试,感觉非常棒!
比如这篇文章就说了,如何在Linux下设置屏幕分辨率。简单讲步骤有这些:

  1. 使用cvt命令生成VGA最佳分辨率的显示模式(1280x1024)

    $cvt 1280 1024
    输出:
    \# 1280x1024 59.89 Hz (CVT 1.31M4) hsync: 63.67 kHz; pclk: 109.00 MHz
    Modeline "1280x1024_60.00" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync
    ’modeline‘这行就是我们下面要用到的显示模式 "1280x1024_60.00" 是显示模式的名字,下面我们可以重命名

  2. 给系统添加1280x1024的模式

    #xrandr --newmode "1280x1024" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync

  3. 将这个模式添加到VGA显示器的显示模式中,这样VGA就可以使用这个显示模式来显示内容了。首先使用

    xrandr

    命令获取VGA显示器在系统中的名称,路上的VGA显示的名称是VGA-0。然后执行:

    xrandr --addmode VGA1 "1280x1024"

  4. 最后在KDE里面设置或者直接使用xrandr设置VGA显示器的显示模式

待解决的问题

但是,xrandr只能存在本次X session下,不会保存在系统中。所以重启之后...回到解放前..

解决方法上篇文章也说了,可以添加自启动脚本。但是在KDE下面添加的时候要注意的是,如果用KDE自带autostart添加,一点要选择在KDE启动之前执行(pre-KDE)。按照这种方法,成功为VGA添加了1280x1024的模式。但是上面提到的KDE配置信息不认,最后的结果就是恢复到了KDE桌面显示的安全模式(双屏输出,LVDS克隆VGA显示内容)。然后只能手动的在KDE设置下面更改分辨率和显示模式(这时候又1280x1024的选项)

所以最后的问题是:如何让xrandr的信息被保存下来并正确配置KDE。
上面的问题实际将xrandr配置信息直接写到自启动脚本去,然后让KDE去调用这个脚本就行。虽然这样显示器会出现闪烁,但是总比每次手动修改容易!