“自音版”小马宝莉折腾记

家里小公主喜欢小马宝莉,汪汪队等动画片,但为了保护视力,也不能一直给她看啊。于是在喜马拉雅里面寻找故事给她听,可她又提出新要求,要听动画原声,还发明了一个词汇,叫“自音”,说要听“小马宝莉自音”的。“自音”就是自己说话发音的,不要听别人讲的。

其实难不倒技术宅老爹,只要给老爹时间,不就是“自音”的么,这还不简单。

下载视频网站上的视频有个大杀器叫 you-get,这个脚本宇宙无敌,支持各种视频网站上的链接解析和下载。为了避免问题,必须使用github上的最新版本,谁让视频网站三天两头修改视频链接加密算法呢。

有了这个脚本,还需要一些自动化工具,一集一集的下载视频太累了,不是技术宅的风格。要下载,就要连锅端,下就下整部剧。那么问题来了,怎么获得整部剧集的链接?在Youku上找来找去,还真有个简单的方法。

我们在youku上搜索视频,如果直接点进去,那么一般是会直接进入播放第一集或者某一集的界面。这里不太方便获取每一集的播放链接。我们需要一个界面,列出了每一集的播放链接。这个界面就在“剧情简介”-》“查看详情”的一个链接里面,这个页面的格式类似: http://list.youku.com/show/id_z289c519a05cb11e69e2a.html?spm=a2h0k.8191407.0.0 ,在这里里面有“剧集列表”,我们需要找到得到这个剧集列表的方法。

用chrome F12调试一下页面,不难发现这个剧集列表是js调用一个类似链接获取的:

http://list.youku.com/show/episode?id=306170&stage=reload_21&callback=jQuery111207579820662716203_1504226273929&_=1504226273934

这里我们试着自己调用一下该链接,发现会返回具体的剧集信息。看看每个字段都是啥含义?id估计是这部剧集的id,stage可以看到是起始编号,callback是不是可以随便写?果然,callback设置成别的值不影响结果。

id的获取可以从该页面的源码中得到,找 “showid=xxxxx” 得到xxxxx的ID即可。

有了这些信息,写一个工具爬下来整部剧集轻而易举了。

至于怎么写这个工具,不用多说了,我都写好放在这里 了。

动画片都端下来了,弄成“自音版”还费啥劲,随手一个调用ffmpeg的脚本就搞定了。

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
for file in ./*.mp4
do
audio=$(basename "$file" .mp4)
ffmpeg -i "$file" -f mp3 -ab 192000 -vn "$audio.mp3"
done
for file in ./*.flv
do
audio=$(basename "$file" .flv)
ffmpeg -i "$file" -f mp3 -ab 192000 -vn "$audio.mp3"
done

目测一大堆“自音版”动画片已经在路上。。。。。。

gccgo crosscompile

这篇文档写的有一些出入:

https://github.com/golang/go/wiki/GccgoCrossCompilation

最好的方法是利用gcc源代码编译gccgo时生成的go工具,比如在ubuntu上:

1
sudo apt install gccgo

会安装go-6这个程序,这个程序默认的是使用gccgo作为工具链的。

这样即可使用:

1
GCCGO=gccgo go-6 build xxx.go

如果gccgo设置成一个交叉编译的工具链中的gccgo,也是可以的。

可以用-n命令行参数查看一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fire3@ubuntu ~ $ GCCGO=gccgo ./go-6 build -n ./hello.go
#
# command-line-arguments
#
mkdir -p $WORK/command-line-arguments/_obj/
mkdir -p $WORK/command-line-arguments/_obj/exe/
cd /home/fire3
/usr/bin/gccgo -I $WORK -c -g -m64 -fgo-relative-import-path=_/home/fire3 -o $WORK/command-line-arguments/_obj/_go_.o ./hello.go
ar rc $WORK/libcommand-line-arguments.a $WORK/command-line-arguments/_obj/_go_.o
cd .
/usr/bin/gccgo -o $WORK/command-line-arguments/_obj/exe/a.out $WORK/command-line-arguments/_obj/_go_.o -Wl,-( -m64 -Wl,--whole-archive -Wl,--no-whole-archive -Wl,- )
mv $WORK/command-line-arguments/_obj/exe/a.out hello

另外,如果我们的交叉编译gccgo参数不支持m64,可以写一个xgccgo脚本放在/usr/bin下,内容如下:

1
2
3
4
#!/bin/bash
args=$*
nargs=$(echo $args | sed "s/-m64//g")
mytarget-cros-linux-gnu-gccgo $nargs

然后使用:

1
GCCGO=xgccgo go-6 build hello.go

中文字卡快速制作

小朋友马上中班下学期了,阅读量越来越大,又很喜欢读绘本,准备开始多教一些汉字了。程序员老爹的思路和硬件工程师老妈的思路迥然不同,硬件工程师老妈准备从硬件入手,先裁剪小纸卡,然后一个一个做字卡。软件工程师老爹自然是从软件入手,准备自动化的生成可打印的字卡,提高可扩展性和生产效率。

more >>

redmine install centos7

first install docker and docker-compose:

follow the instruction here:
https://docs.docker.com/engine/installation/linux/centos/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
$ sudo yum install docker-engine
$ sudo systemctl enable docker.service
$ sudo systemctl start docker
$ sudo docker run --rm hello-world
$ sudo pip install docker-compose

then use docker install redmine

1
wget https://raw.githubusercontent.com/sameersbn/docker-redmine/master/docker-compose.yml