呓语

从兔耳日记同步到自己的Typecho 的工作基本搞定,架构惨不忍睹。基本思路就是,设置一个cron ,每隔一个小时触发一个php 工作,每一次工作中,获取设置的RSS 内容,循环解析得到兔耳日记的内容,比对数据库记录,如果结果为空,则说明是新日记,用curl 模块登录Typecho ,模拟表单提交将日记post 到博客上去,然后把日记的permaLink 存入数据库。

发现自己跟室友们已经远离得太多了,早上被整个寝室的游戏声吵醒的时候,真的想大声骂出来。从早到晚,有空有电有网就是玩游戏,我真是不知道该怎么跟他们交流了。不过,芋头老师说过,自己选择自己负责。或许时间才有权判断谁是谁非,谁知道呢,或许某一天我会后悔不曾玩过游戏呢。

默认日记

我说。。。RSS 目前就这么点东西么。。要是可以把日记所有信息都输出出来就好了。。

还有,为什么会出现 no title 呢。

呓语

关于兔耳的一些建议,如果说给人听的话可能会很多,但是自己改起来,真的好像就那么一点点而已。。。只是一些样式方面的小细节。

还有,兔耳的搜索非常不给力。话说我之前玩MongoDB 的时候也是因为模糊查询这一块没过去结果出现有数据用不了这种局面的。小爝 你还要加油呀。

嘛,今天《钢之炼金术师》看到26 了,明天接着下,要不没得看了。

啊咧?阴晴雨雪和大风不是radio 这种关系吧?哈尔滨大晴天风都能把人吹得浮起来的。算了,这个不是大问题。

呓语

晚上在二餐看到个好萌的初中生~~

记梦

真是个好梦啊。真正清醒过来后,我对斜对床的室友感叹道。哈?他说。我没有回答更多。没人能理解我的梦。

前半部分是关于掉进水里淹死和各种花草的地域排斥方面的猎奇经历。然后梦就转入了高三校园。这次梦见的校园布局又有所不同。之所以知道是高三,因为所在的教学楼是最靠近校门的。

大概是放学后一段时间,我在收拾东西。抽屉一向很乱的,似乎花了很久。然后我背起书包(真奇怪梦里居然会背书包),转过身看着她。副班长刚刚跟她开玩笑,用手紧紧捂住她的耳朵。我伸出左手,用手背轻触了一下她右脸颊。她滚烫的脸给我一种温暖的感觉。真凉啊,我的手,我说。然后我把捂着她耳朵的副班长的双手拿开,(似乎是)抱着她的脸看了一会儿。然后我大概说了什么。然后我转身回家了,这个梦后来的部分就是我在楼下寻找我的自行车。

还有点迷糊的时候我回味这个梦,心里真想骂一句,艹!我当时为毛不直接上去把她强吻了。所以说我即使现在,还是太胆小,明明她的眼神很期待的。

大概过不了多久,我就会忘记,昨晚这个梦里,陪我度过的,到底是你还是她了吧。

支出数据爬取完成

把上次发布的一年期支出统计数据爬取了一下(数据长度是一年的,从 2011 年 8 月 1 日到 2012 年 7 月 30 日,但是有效数据是从 2012 年 2 月起才有的,之前是空白数据),就在上次发布的那个页面上,Chrome 开发工具里跑了一下,把数据复制到编辑器里了,晚上可以拿来做可视化。

表格是很简单的,去掉表头(第一行)和最后一行,剩余的是数据,没一行从左到右爬取,按顺序读取单元格内容。单元格内容都是包裹在一层 p 标签里的,取出来之后再取第一个子元素的内容就行了。

var billData = [];
for(var i = 1; i < num-1; i ++){
  var data = {};
  var trs = document.querySelectorAll('tr')[i];
  data.date = trs.children[0].children[0].innerHTML;
  data.Food=trs.children[1].children[0].innerHTML;
  data.Transportation = trs.children[2].children[0].innerHTML;
  data.Entertainment = trs.children[3].children[0].innerHTML;
  data.Clothing = trs.children[4].children[0].innerHTML;
  data.Accrssories = trs.children[5].children[0].innerHTML;
  data.Billings = trs.children[6].children[0].innerHTML;
  data.ElectronicEquip = trs.children[7].children[0].innerHTML;
  data.Family = trs.children[8].children[0].innerHTML;
  data.HealthCare = trs.children[9].children[0].innerHTML;
  data.Housing = trs.children[10].children[0].innerHTML;
  data.Education = trs.children[11].children[0].innerHTML;
  data.Sum = trs.children[12].children[0].innerHTML;
  billData.push(data);
}

我先这么跑了一遍,然后发现一个问题,源数据是最新的在最前面,而我希望最旧的数据在前面。排序本来是很简单的,但是被我那个记账的软件搞复杂了,它的格式是 dd.mm.yyyy 。后来想了一下,不需要排序的,只要把数据反转一下就行了。但是为了格式统一,我还是想把时间字符串搞标准一点。这里用了正则。

var billData = [];
for(var i = 1; i < num-1; i ++){
  var data = {};
  var trs = document.querySelectorAll('tr')[i];
  var dateStr = trs.children[0].children[0].innerHTML;
  var date = dateStr.match(/\d{4}$/)[0].toString()+'-'+dateStr.match(/\.\d{2}/)[0].replace(/\./, '').toString()+'-'+dateStr.match(/^\d{2}/)[0].toString();
  data.date = date;
  data.Food=trs.children[1].children[0].innerHTML;
  data.Transportation = trs.children[2].children[0].innerHTML;
  data.Entertainment = trs.children[3].children[0].innerHTML;
  data.Clothing = trs.children[4].children[0].innerHTML;
  data.Accrssories = trs.children[5].children[0].innerHTML;
  data.Billings = trs.children[6].children[0].innerHTML;
  data.ElectronicEquip = trs.children[7].children[0].innerHTML;
  data.Family = trs.children[8].children[0].innerHTML;
  data.HealthCare = trs.children[9].children[0].innerHTML;
  data.Housing = trs.children[10].children[0].innerHTML;
  data.Education = trs.children[11].children[0].innerHTML;
  data.Sum = trs.children[12].children[0].innerHTML;
  billData.push(data);
}

然后就很简单了,不需要排序,只需要将数组倒转就行了。

Ubuntu 下将任意格式音频转换为mp3

昨天要上传一首歌到点电网,结果搞不定转换,因为点电网只支持mp3 格式的上传,而我平时听的都是m4a 的。

来解释下我为什么不需要在Ubuntu 下将无损格式转换为其他。我听歌都是这么听,首先,我听到一首歌很好听,搜索到演唱者、专辑名称,搜索这张专辑的无损下载。如果有无损,下载无损;没有无损,找320kbps 的mp3 ;没有的话找192kbps 的mp3; 要是连这种音质都无法满足,那这歌太偏了,或者是刚刚出来还没有人抓轨,要么去买CD 要么等一段时间。如果下载的不是无损,直接放手机里;如果是无损,虚拟机win 系统用Foobar2000 打开,用NeroAAC 编码器转换到双通道512kbps aac 文件(m4a 扩展名),放到手机里。

我为什么要开虚拟机,原因也在这里,在Ubuntu 下我不知道怎么使用NeroAAC Encoder ==。 抱歉我找不到任何使用的提示。而使用faac 码率最高只有320kbps 。虽然据说faac 的算法能更好地还原低音,但我也没听出来区别,倒是码率低的硬伤无法弥补。

我尝试了一个小时,搜索到的方法没有一个能解决我的问题。要么就是mencoder ,要么就是ffmpeg 。我遇到了下面的情况。

ffmpeg -i 魔法の人.m4a -acodec mp3 魔法の人.mp3
# 输出结果
# ffmpeg version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
  built on Jun 12 2012 16:52:09 with gcc 4.6.3
# *** THIS PROGRAM IS DEPRECATED ***
# This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
# Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '魔法の人.m4a':
#   Metadata:
#     major_brand     : mp42
#     minor_version   : 0
#     compatible_brands: M4A mp42isom
#     creation_time   : 2012-08-30 05:27:37
#     track           : 2/12
#     genre           : JPop
#     album           : やさしい花の咲く場所
#     artist          : 奥華子
#     comment         : YEAR: 2006
#     title           : 魔法の人
#     encoder         : Nero AAC codec / 1.5.4.0
#     date            : 2006
#   Duration: 00:04:39.12, start: 0.000000, bitrate: 477 kb/s
#     Chapter #0.0: start 0.059501, end 279.127075
#     Metadata:
#       title           : 魔法の人
#     Stream #0.0(und): Audio: aac, 44100 Hz, stereo, s16, 476 kb/s
#     Metadata:
#       creation_time   : 2012-08-30 05:27:37
# Unknown encoder 'mp3'

不管怎么更换acodec 参数,结果都是一样的,ffmpeg 根本找不到对应的mp3 编码器。使用mencoder 就会出现下面这种情况。

mencoder -o 魔法の人.mp3 -ovc frameno -oac mp3lame -lameopts cbr:br=320 -of rawaudio 魔法の人.m4a
# MEncoder svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team
# success: format: 0  data: 0x0 - 0xfe563c
# libavformat version 53.21.0 (external)
# Mismatching header version 53.19.0
# libavformat file format detected.
# [lavf] stream 0: audio (aac), -aid 0, -alang und
# Video stream is mandatory!
# 
# Exiting...

而实际上只要使用 mplayer 将源文件 dump 成 wav 格式,再使用 lame 编码成 mp3 就可以了,简单有效。

mplayer 魔法の人.m4a -ao pcm
# MPlayer svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team
# mplayer: could not connect to socket
# mplayer: No such file or directory
# Failed to open LIRC support. You will not be able to use your remote control.
# 
# Playing 魔法の人.m4a.
# libavformat version 53.21.0 (external)
# Mismatching header version 53.19.0
# libavformat file format detected.
# [lavf] stream 0: audio (aac), -aid 0, -alang und
# Clip info:
#  major_brand: mp42
#  minor_version: 0
#  compatible_brands: M4A mp42isom
#  creation_time: 2012-08-30 05:27:37
#  track: 2/12
#  genre: JPop
#  album: やさしい花の咲く場所
#  artist: 奥華子
#  comment: YEAR: 2006
#  title: 魔法の人
#  encoder: Nero AAC codec / 1.5.4.0
#  date: 2006
# Load subtitles in ./
# ==========================================================================
# Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
# libavcodec version 53.35.0 (external)
# Mismatching header version 53.32.2
# AUDIO: 44100 Hz, 2 ch, s16le, 476.2 kbit/33.74% (ratio: 59526->176400)
# Selected audio codec: [ffaac] afm: ffmpeg (FFmpeg AAC (MPEG-2/MPEG-4 Audio))
# ==========================================================================
# [AO PCM] File: audiodump.wav (WAVE)
# PCM: Samplerate: 44100Hz Channels: Stereo Format s16le
# [AO PCM] Info: Faster dumping is achieved with -benchmark -vc null -vo null -ao pcm:fast
# [AO PCM] Info: To write WAVE files use -ao pcm:waveheader (default).
# AO: [pcm] 44100Hz 2ch s16le (2 bytes per sample)
# Video: no video
# Starting playback...
# A: 279.1 (04:39.1) of 279.1 (04:39.1)  0.2% 
# 
# 
# Exiting... (End of file)
# 
lame audiodump.wav -o 魔法の人.mp3 -b 320
# LAME 3.99.3 64bits (http://lame.sf.net)
# Using polyphase lowpass filter, transition band: 20094 Hz - 20627 Hz
# Encoding audiodump.wav to 魔法の人.mp3
# Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (4.4x) 320 kbps qval=3
#     Frame          |  CPU time/estim | REAL time/estim | play/CPU |    ETA 
#  10687/10687 (100%)|    0:10/    0:10|    0:10/    0:10|   27.695x|    0:00 
# --------------------------------------------------------------------------------------------------------------# ----------------------------------------
#    kbps        LR    MS  %     long switch short %
#   320.0       47.3  52.7        97.2   1.6   1.3
# Writing LAME Tag...done
# ReplayGain: -7.7dB

笔电各种奇葩的问题

这两天各种悲催。。哈尔滨最近火了,因为塌了座桥还反咬一口说是因为超载,加上各种塌陷事故,动不动出来个几十米的大洞 ==。我们去实习都小心翼翼地,一不小心掉下去可就完蛋。

昨天晚上把笔电拆开清灰,蛋疼的室友把螺丝装错了 ==。 ,腕托那里被顶起一个小包。。。。。。然后今天还发现他忘了把我风扇的线给插上,我说今天怎么一开机 CPU 烧到 80+ 度散热口居然还是凉的==。

今天更悲催。。从昨天晚上开始,电脑变得很卡,鼠标键盘动不动无响应,打字都成问题。今天折腾了一下午,还把compiz 设置重置了 ==。结果你猜是怎么回事?昨天突然热起来了,我就插了个USB 风扇,结果功率太大了,USB 口自动禁用,然后系统会不停尝试启用,然后系统就和硬件在那打架。。。。。。在这里提示一下,如果遇到有在字符终端不断出现下面这种信息(或是运行dmesg 出现这种信息),同时鼠标经常卡顿,键盘市场无响应的情况,应该检查USB 口或是其他端口是否有接入大功率外设。

# USB port 1 disabled by hub (EMI?), re-enabling...

再有就是关于 Apache2 服务器安装 Python 扩展的,搜索教程的话多半会发现给出的方法大多是说,去 mod_python 官网下载最新模块源码,然后编译,同时不要忘了指定 apxs 的路径。我不知道这种方法是适用于哪个版本的 Ubuntu ,至少在我的 Ubuntu 12.04 64 位上,连 Apache 配置文件的路径都对不上 ==。

所以安装方法类似于给 Apache2 安装 PHP 模块那样,直接终端执行下面的命令就行了。

# 安装mod_python 模块
sudo apt-get install libapache2-mod-python
# 生成模块的软链接
cd /etc/apache2/mods-enabled
sudo ln -s ../mods-available/mod_python.load mod_python.load

当然更详细的可以参考这里:ubuntu mod_python 安装 。在这里也有另一种方法:Ubuntu Apache2 Python的配置

中国天气网API

上次做飞信天气预报的时候简单搜索了一下中国天气网的 API ,当然是没有官方文档的,最初是谁挖掘出来的也不可考了。刚才在增加新功能的时候又顺手搜了一下相关资料,发现这个 API 还真不简单。中国天气网有三个 API 适用于不同场合的使用。

http://m.weather.com.cn/data/101050101.html 这个接口返回的格式如下。

阅读剩余部分 -

Python 批量下载煎蛋妹子图

上次不知道在哪里找到一个煎蛋妹子图地址,好像有5000 个图片地址来着?貌似是这里:http://www.funet8.com/5k-beauty-jiandan.html(时间太久我也不太清楚了,不过我同时还找到了这个:http://acora.cc/jandan-gril.live

然后补考完了么,感觉还不错,就把上次某人发的批量下载脚本顺手改了改(其实就是加上了了两个错误处理,中间有图片下载失败时不会直接退出而已)。代码存一下。

#! /usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import os
import sys
try:
  if __name__ == '__main__':
    cur_dir = os.path.dirname(os.path.abspath(__file__))
    urlfile = os.path.join(cur_dir, sys.argv[1])
    f = open(urlfile, 'r+')
    print 'Input checked.\n'
    for line in f:
      print 'Downloading file ', line
      names = line.split('/')
      name = names[-1].strip()
      try:
        urllib.urlretrieve(line, os.path.join(cur_dir, name))
        print 'Done!\n'
      except IOError, e:
        print 'Error occured!', e, '\n'
except IndexError, e:
  print 'No input specified. Exiting...\n'

另外我还找到了这个:http://acora.cc/quantities-to-obtain-a-custom-omelette-sister-figure.live,作者把爬虫发布了,可以用这个在本地服务器上抓妹子图地址,存在文本文件里,一行一个地址,然后用上面那个脚本加上执行权限运行就行了。

# 加上执行权限
chmod +x getooxx.py
# 启动批量下载(假设存有地址的文本文件为 jandan.txt )
./getooxx.py jandan.txt