让视频始终居中的四种简单方法

     前段时间看到一个有意思的视频展示效果,简而言之就是左右两个视频总是显示各自中间的部分。文章作者通过 JS 同时改变每个视频的视窗宽度和视频的位置来实现,属于底层操作,我觉得应该可以更简单一些,只要让视频始终处于容器中间就不用对视频进行位移了。本来想看看文章中提到的 beoplay 页面里是如何做的,结果已经打不开了。。没关系,反正我也做出来了,而且找到了4种方法,CSS 和 JS 均只控制 width,居中则由浏览器自动完成,请看效果

     当时看到这个效果的时候,首先就想到了 flex 布局,因为常规布局下当图片以及视频内容宽度超过容器宽度时,常用的 text-aglin:center 和 margin:0 auto 已经无法让内容处于容器的中间,不行不行,给容器加上 overflow:hidden 也不行,但 flex 布局的居中却可以轻松实现此需求。

     然后又在学习过程中,想到了另外3种办法:

     object-fit 版:可以说它天生就用来干这事的,因为它控制的不是 video 或者 img 元素,而是其内容本身,其详细介绍可以看这篇文章。由于与其搭配的 object-position 默认就是居中,所以 css 里就只写了 object-fit。另外因为偷懒,用于同时控制两个视频宽度的 JS 我就照搬了文章作者的,感谢 ^_^。

     absolute 版:我们熟知对一个元素使用 absolute 定位,上下左右均为0,margin 为 auto,可以让它神奇的居中,并且若容器高度小于元素高度,元素也是居中的,可惜我们想要的是容器宽度小于内容宽度时也能居中无法实现,于是,请出了另一位嘉宾 writing-mode,其相关介绍,给容器设置 writing-mode 为 vertical-rl/lr 后,不论容器宽度是多少,视频也能居中了。所以方法准确的说应该是 absolute + writing-mode 版。

    background 版:这个方法目前只适用于 Firefox 浏览器,用到了其私有属性 -moz-element,原理是把一个 video 元素作为另一个元素的背景,居中起来就很好办了,center。。。。

    可能的方法:有一种跟 flex 类似的布局方式 grid,不过由于其只适用于 IE 浏览器,我就不浪费生命测试了,有时间的小伙伴可以试试。

 

    目前我就想到这几种方法,如果你有其他方法,欢迎与大家一起分享~~

    方法介绍完了,那么我的问题是:包括原文章作者实现在内的5种方法,在改变视频宽度时,哪种渲染效率更高?

Debian中安装、更新Dropbox

在Debian中可以通过

#aptitude install nautilus-dropbox

来安装Dropbox,而且在朝内需要先翻Q才行:

#export http_proxy=http://xxx.x.x.x:xxx

或者使用VPN等手段……

 

Dropbox需要手动更新版本,同样需要先翻Q,然后:

#dropbox update

我的Linux之路

      看到别人写的Linux学习之路,感触颇多,心里也有点痒,想记录一下自己的。

      从上高中开始,我才算正式接触电脑(虽然很小的时候在别人家也玩过电脑游戏,但也就个把小时而已,没什么更多了解),由于高中自由支配时间比较多(相对而言),加上我的不自觉,所以花了不少时间在玩电脑上,不过我也不是纯粹的玩,我比较喜欢去了解事物的原理,所以在高中期间我还是学了不少电脑知识,不过记忆中好像整个高中我都还没有听说Linux这个词。

      直到上大学后,才听说了Linux这个东西,觉得很神奇,就像发现了新大陆,买电脑后不久就开始折腾Linux系统了。 也不记得最开始看的是什么资料了,安装的第一个系统是Red Hat 9(旧资料坑爹呀,那时好像Fedora Core 5都出了,而我完全不知道),下载3CD安装镜像,花了不少流量,而那时学校上网还没有包月,心疼……安装采用的是VMware虚拟机方式,安装过程很顺利,但后来在vm-tools上面折腾得够呛。

      由于看的资料不系统,又是初次接触Linux,很多地方都不懂,还好我知道搜索,不过不同教程里的命令都不太一样啊,只有按部就班的输入教程里的命令,一个一个试,最可悲的是我那时不知道bash有tab自动补全啊,只能SB般地完整输入那些又长又不知道意思的命令……不记得花了多少时间,终于安装好了该死的vm-tools,也许就是这个事情,让我以后对VMware一直没什么好印象。

      我意识到我需要更系统的学习资料,于是就去图书馆借了《鸟哥的Linux私房菜》等书来看,慢慢的,我发现我以前所做的事情是多么SB。之后很长一段时间我都是看资料,我觉得我需要更多理论知识的支持。

      后来出于对无线网络(Wi-Fi)的兴趣,我经常在某无线论坛潜水,接触到BackTrack这个Linux系统,当时还是BackTrack 2,我还专门去买了一个U盘,将它安装到了U盘里,后来又升级到了BackTrack 3。

      08年4月,Ubuntu 8.04发布,我果断下载来安装,而且这次是直接安装到硬盘分区,和已有的XP组成双系统,随后开始了各种折腾……

看到我当时有多蛋疼了吧……

      不过Ubuntu虽然有很多优秀的地方,但用一段时间后,我还是被其不时弹出的错误窗口整烦了,于是格式化掉,安装上了BackTrack3,同时也明白了原来系统安装就是复制文件加设置这么回事儿。

      由于BackTrack4以前都是基于Slax(Slackware)的,我不是很喜欢其软件包管理系统,同时发现Debian的很多优点:系统超级稳定,apt包管理系统先进又好用……于是,我又将系统换成了Debian,它也是到目前我一直使用的系统。

我的开机画面(那时昵称还叫 小新),够自恋吧……背景图片来自腾讯TM网页。

 

      感谢Linux,让我知道了Windows之外的美好世界!开源、自由、分享,这就是我所喜爱的。

自定义U盘/移动硬盘图标

说到U盘,我就想起了我以前那个制作好的Win7安装U盘,被人借走后就再也没有回来了……

好了,题外话啰嗦完了,下面进入正题。给U盘设置一个个性图标,在Windows中,一打开“我的电脑”或者“计算机”就可以看到,多酷!

效果图:

设置方法:

第一步:准备一个图标

这个图标可以是ICO格式,也可以是带有图标的EXE文件,也可以是打包为DLL格式的图标集。

这里有一些在线制作、转换ICO格式图标的网站:

http://www.damotou.com/http://www.ico.la/ 

http://converticon.com/http://tools.dynamicdrive.com/favicon/(这两个网站为英文界面,但支持一个图标包含多种分辨率)

 

也可以用本地软件制作、提取:AveIconifier2Axialis IconWorkshop图标终结者3

 

第二步:制作autorun.inf文件

这个文件是不是很眼熟?没错,它就是被U盘病毒弄出名的,但今天的工作跟病毒无关。

假设上一步准备的图标文件名为 upan.ico /tubiao.exe/tubiao.dll。在U盘根目录新建一个文本文件,用记事本打开,写入内容:

[Autorun]
icon=upan.ico

—————–到此为止,这是分割线—————

注:对于exe和dll文件

icon=tubiao.exe,0          (0表示第一个图标,依次类推)

icon=tubiao.dll,0           (同上)

然后将文本文件改名为“autorun.inf”(如果系统未显示文件名后缀,则写入内容后,选择另存为,文件名和前文一样,文件类型选“所有文件”)。

第三步:重新插一次U盘。

 

 

更多折腾:

1.在autorun.inf里写上

label=自定义U盘名字

名字可以写很长哦……,而且即使修改了卷标仍然显示这个名字

2.隐藏这两个文件

在CMD中,分别运行(X改为U盘盘符)

attrib +h +r +s X:\autorun.inf

attrib +h +r +s X:\upan.ico

用Python干掉星空极速

一说到星空极速,就跟说到x虎360一样让我不爽。以前在学校的时候就想方设法把它干掉,当然,在众人的帮助下也确实干掉了。当时为了使用方便,自己用C语言实现了一个破解程序,虽然不完美,但也基本够用。

前不久在别人电脑上又看到了星空极速这个垃圾软件……

现在刚好自己又在学习Python,于是我想到了用Python来重写一遍,想了一下,应该比用C实现起来更顺畅些。

纯属练习,fuckxkjs32-gbk.py   代码如下:

#!/usr/bin/env python

# -*- coding:gbk -*-
”’ 找回星空极速3.2真实拨号密码
    用法:
    1-直接运行,然后按提示输入密码
    2-加参数运行,参数为密码,多个密码用空格隔开
        比如:fuckxkjs32.py woshimima1 woshimima2
    感谢:http://blog.sina.com.cn/s/blog_48a42d5b0100cet2.html

    注:本程序只使用了部分字符加密表
”’

import sys

encryptdict = { “ch_0” : [ “E2”,“96”,“D0”,“AC”,“9D”,“A3”,“B6”,“8F” ],
“ch_1” : [ “E3”,“97”,“D1”,“AD”,“9C”,“A2”,“B7”,“8E” ],
“ch_2” : [ “E0”,“94”,“D2”,“AE”,“9F”,“A1”,“B4”,“8D” ],
“ch_3” : [ “E1”,“95”,“D3”,“AF”,“9E”,“A0”,“B5”,“8C” ],
“ch_4” : [ “E6”,“92”,“D4”,“A8”,“99”,“A7”,“B2”,“8B” ],
“ch_5” : [ “E7”,“93”,“D5”,“A9”,“98”,“A6”,“B3”,“8A” ],
“ch_6” : [ “E4”,“90”,“D6”,“AA”,“9B”,“A5”,“B0”,“89” ],
“ch_7” : [ “E5”,“91”,“D7”,“AB”,“9A”,“A4”,“B1”,“88” ],
                “ch_8” : [ “EA”,“9E”,“D8”,“A4”,“95”,“AB”,“BE”,“87” ],
“ch_9” : [ “EB”,“9F”,“D9”,“A5”,“94”,“AA”,“BF”,“86” ],
“ch_q” : [ “A3”,“D7”,“91”,“ED”,“DC”,“E2”,“F7”,“CE” ],
“ch_w” : [ “A5”,“D1”,“97”,“EB”,“DA”,“E4”,“F1”,“C8” ],
“ch_e” : [ “B7”,“C3”,“85”,“F9”,“C8”,“F6”,“E3”,“DA” ],
“ch_r” : [ “A0”,“D4”,“92”,“EE”,“DF”,“E1”,“F4”,“CD” ],
“ch_t” : [ “A6”,“D2”,“94”,“E8”,“D9”,“E7”,“F2”,“CB” ],
“ch_y” : [ “AB”,“DF”,“99”,“E5”,“D4”,“EA”,“FF”,“C6” ],
“ch_u” : [ “A7”,“D3”,“95”,“E9”,“D8”,“E6”,“F3”,“CA” ],
“ch_i” : [ “BB”,“CF”,“89”,“F5”,“C4”,“FA”,“EF”,“D6” ],
“ch_o” : [ “BD”,“C9”,“8F”,“F3”,“C2”,“FC”,“E9”,“D0” ],
“ch_p” : [ “A2”,“D6”,“90”,“EC”,“DD”,“E3”,“F6”,“CF” ],
“ch_a” : [ “B3”,“C7”,“81”,“FD”,“CC”,“F2”,“E7”,“DE” ],
“ch_s” : [ “A1”,“D5”,“93”,“EF”,“DE”,“E0”,“F5”,“CC” ],
“ch_d” : [ “B6”,“C2”,“84”,“F8”,“C9”,“F7”,“E2”,“DB” ],
“ch_f” : [ “B4”,“C0”,“86”,“FA”,“CB”,“F5”,“E0”,“D9” ],
“ch_g” : [ “B5”,“C1”,“87”,“FB”,“CA”,“F4”,“E1”,“D8” ],
“ch_h” : [ “BA”,“CE”,“88”,“F4”,“C5”,“FB”,“EE”,“D7” ],
“ch_j” : [ “B8”,“CC”,“8A”,“F6”,“C7”,“F9”,“EC”,“D5” ],
“ch_k” : [ “B9”,“CD”,“8B”,“F7”,“C6”,“F8”,“ED”,“D4” ],
“ch_l” : [ “BE”,“CA”,“8C”,“F0”,“C1”,“FF”,“EA”,“D3” ],
“ch_z” : [ “A8”,“DC”,“9A”,“E6”,“D7”,“E9”,“FC”,“C5” ],
“ch_x” : [ “AA”,“DE”,“98”,“E4”,“D5”,“EB”,“FE”,“C7” ],
“ch_c” : [ “B1”,“C5”,“83”,“FF”,“CE”,“F0”,“E5”,“DC” ],
“ch_v” : [ “A4”,“D0”,“96”,“EA”,“DB”,“E5”,“F0”,“C9” ],
“ch_b” : [ “B0”,“C4”,“82”,“FE”,“CF”,“F1”,“E4”,“DD” ],
“ch_n” : [ “BC”,“C8”,“8E”,“F2”,“C3”,“FD”,“E8”,“D1” ],
“ch_m” : [ “BF”,“CB”,“8D”,“F1”,“C0”,“FE”,“EB”,“D2” ],
}

def main():
password = “”
# charset = “0123456789abcdefghijklmnopqrstuvwxyz”
if len(sys
.argv) == 1:
while password == “”:
password = raw_input(“请输入待破解密码:”)
print “真实密码:%s % encrypt(password)
else:
args = sys.argv
print “原始密码:真实密码”
for p in args[1:]:
print %s%s % (p,encrypt(p))

def encrypt(password):
truepass = “”
for i in range(len(password)):
truepass += encryptdict[(“ch_” + password[i])][i % 8]
return truepass

if __name__ == “__main__”:
main()

 

 

————————————————————–

不完善的地方(TODO):

  • 直接运行程序输入不能包含空格
  • 对字符集以外字符的处理
  • 将结果写入文件

让Nautilus恢复音乐、视频预览

用Debian的CD1断网情况下安装完成的系统真是“干净”,发现很多功能都消失了……

记得用Sid的时候,Nautilus以前可以显示视频内容预览画面,鼠标指针放在音乐文件上还会自动播放音乐……现在都不行。

我明白是很多软件包没有安装的原因,但问题是缺哪些软件包呢。Google半天后,解决了:

MP3预览:gstreamer0.10-fluendo-mp3

视频预览:gstreamer0.10-plugins-bad,gstreamer0.10-plugins-ugly,gstreamer0.10-ffmpeg

图片预览:gstreamer0.10-plugins-good等……(系统默认已安装)

 

Ref:

玩转GNOME预览功能

GStreamer – 维基百科

U盘修复记

话说今天准备重装Debian,于是开始制作安装U盘,心想Ubuntu里自带“启动U盘创建器”,还没用过,不知效果如何,正好可以试一下。

开始挺顺利,结果最后安装bootloader的时候提示错误“invalid string ‘GNU/Linux’…”,我想可能是由于Debian全称

“Debian GNU/Linux”里有个空格所致,造成多了一个参数……(什么时候去提交个Bug Report……)

我又转念一想,既然是在最后安装bootloader的时候出的错,我只要把bootloader修复不就行了吗,再一想Debian现在的ISO是Hybrid模式,直接dd到U盘就可以启动,那现在我只把前面446字节dd过去应该也可以吧……

想法是好的,但结果是残酷的,正是这个也许异想天开的想法,让我的U盘无法正常使用了……症状为:

  1. 重启电脑,无法在BIOS的启动设备中看到
  2. file /dev/sdc  显示为块设备
  3. 但用 fdisk /dev/sdc  和 dd 均提示无法打开设备
  4. 在Windows中也提示为未插入介质(类似于只插了SD读卡器而没有插SD卡的情况),用HP优盘格式化工具也无法格式化

没办法,看来只有用量产工具修复了。

修复过程还算顺利,用数码之家的U盘芯片检测软件ChipGenius检测出U盘的主控芯片后,下载对应的量产软件,基本上使用默认设置进行量产就行了,不过我发现这样量产后U盘在插入电脑后显示的名称变成了默认的“Generic Flash Disk”,而不是以前的“EAGET CM960”(几年前买的了),对于我这样一个有点完美主义(也可以说是洁癖……)的人来说,这是不能接受的。

于是在量产工具中进行设置,找到USB信息设定一项,发现下面有SCSI和USB两部分,“EAGET CM960”应该填在SCSI部分。(小插曲,本来SCSI部分默认信息为“Generic Flash Disk”,USB部分为“Generic Mass Storage”而我最开始没看清楚,以为是一样的,还在困惑哪个对应的才是“EAGET CM960”,于是Google了一下,发现应该是SCSI部分,当然如果我当初要是细心一点也用不着走这条弯路了……)

设定好后,重新量产一下,OK,U盘回来了……重新制作安装U盘去……

Sid,再见!

考虑了好多天,还是决定不再继续使用Sid了,而是重装Stable(Squeeze)。重装前记一下,原因稍后再写。

重装前的准备:

  1. 备份修改过的配置文件
  2. 记录额外安装的软件

先去完成这两件事……

—————–我是分割线—————–

系统安装完了,但我心情很沉重……因为我在安装的时候犯了错,把home分区格式化掉了,这是我用Linux以来第一次数据丢失……

PS:安装过程截图

——————-再割一下——————

言归正传,为什么用Sid两年多了突然决定不用了呢?

直接原因是因为前段时间升级了系统,但更新NV显卡驱动到290.10后,X无法启动了,现象是启动gdm后,就不断重复报错“acpid:client connected from xxx”、“acpid:client xxxx[0:0] has disconnected.”  在启动内核中加入noacpi和acpi=off也不行,使用老版本内核启动也不行,通过backports源把NV驱动降级到280.xx还是不行……查看/var/log/X.0.log,提示找到了显示设备(display device),但无法找到屏幕(screen)。但我不知道如何解决,网上搜了一圈,没有发现解决办法。

后来想想,我用Sid无非就是为了用上新版本的软件,但我的电脑是07年的产品,已经算是老家伙了,最新的GNOME 3只有使用后备模式(fallback),无法开启特效……而很多软件的新特性都是为新设备准备的,用一台老电脑来追新实在是不太合适,况且Debian 6.0(Squeeze)是今年才发布的,也还是比较新,加上backports源,Firefox等软件照样可以安装最新的版本,用她陪我的电脑终老或许正好……

不过等我以后换上了新电脑,我还是会再安装Sid的,See you……

一些Git学习资料

前言:

Git是啥:http://zh.wikipedia.org/wiki/Git

 

不知不觉看了一堆资料,都是很不错的(除了注明英文的其余均为中文):

Pro Git:http://progit.org/book/zh/

Git Community Book:http://gitbook.liuhui998.com/

 

Git 故事连载:http://gitstory.wordpress.com/

Git 中文教程:http://www.linuxsir.org/main/doc/git/gittutorcn.htm

Why Git is Better than X:http://zh-cn.whygitisbetterthanx.com/

理解Git工作流:http://heikezhi.com/2011/08/04/understanding-the-git-workflow/

GIT分支管理是一门艺术:http://roclinux.cn/?p=2129

Git开发管理之道:http://blog.leezhong.com/translate/2010/10/30/a-successful-git-branch.html

git多人协作开发流程(以blog为例):

http://blog.leezhong.com/tech/2011/02/25/git-workflow-with-blog-demo.html

[英]A few git tips you didn’t know about:http://mislav.uniqpath.com/2010/07/git-tips/

构造干净的 Git 历史线索:http://codecampo.com/topics/379

GotGitHub:http://www.worldhello.net/gotgithub/index.html

Git Immersion:http://gitimmersion.googol.im/