gbkzip完美解决Linux解压Windows下ZIP文件名乱码问题

别人从Windows系统下发给我一个zip文件,我拿到Linux平台解压之后发现文件名全是乱码。
在网上找了很多方案,但是大部分都有点麻烦。
闲着没事,用Python写了一个zip解压脚本,能够解决乱码问题:

源码在这里:

#!/usr/bin/env python
#-*- coding:utf8 -*-
'''
gbkzip - unzip Windows zip file and convert gbk to utf8

author:    YUCOAT(yucoat^yucoat.com)
date:      2012-9-28
homepage:  www.yucoat.com
If you find any bug please contact me, thank you!
'''

import os
import sys
import zipfile

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print 'Usage: gbkzip < zipfile.zip >'
        exit(1)

    try:
        zip_obj = zipfile.ZipFile(sys.argv[1], 'r')
    except IOError as e:
        print e.strerror
        exit(1)

    for name in zip_obj.namelist():
        name_utf8 = name.decode('gb2312')
        path = os.path.dirname(name_utf8)

        if (not os.path.exists(path)) and path:
            os.makedirs(path)
        #Start Exacting
        filedata = zip_obj.read(name)
        if not os.path.exists(name_utf8):
            tmp = open(name_utf8, 'w')
            tmp.write(filedata)
            tmp.close()
        print 'Exacting %s ... done!'% (name_utf8)
    zip_obj.close()

该程序的使用说明已经最新版本我都会放在github的这个页面

如果有什么问题,可以给我发邮件:thlgood ^ yucoat.com

Mint/Ubuntu安装深度音乐播放器

深度音乐发布也有一阵子了,它是一款特别适合国情的Linux播放器。

由于它安装的时候依赖 的第三方库有点多,导致很多网友望而却步。于是我写一下我的安装过程:

安装不麻烦
其实官方是有教程的:
点击进入官方教程

这是我的安装步骤,我的平台是64bit的Linux Mint 13

首先从这里下载Deepin UI库
然后从终端中安装:

sudo apt-get install python-xlib
sudo dpkg -i deepin-ui_1+git201209111100_amd64.deb

安装的时候会提示依赖不足,这个不用管,安装完了之后执行:

sudo apt-get -f install

就可以解决依赖问题了
接着以同样的方式在命令行界面安装深度音乐

sudo dpkg -i deepin-music-player_1+git201209111106_all.deb

如果提示依赖不足,可以用上面提到的方法解决

sudo apt-get -f install

如果你在安装的过程遇到其他的问题或者安装失败,请在下面留言

 

=======================补充=======================

深度的官方教程里面说要安装python-gtk2包,但是安装python-gtk2的时候却提示

错误: 破坏现有软件包 'python-glade2' 的依赖 python-gtk2 (= 2.24.0-3)

在这种请况下请检查一下你的电脑里面有没有安装python-gtk2:

sudo dpkg -l|grep 'python-gtk2'

如果发现已经安装python-gtk2了,那么在安装深度播放器的时候就不要再安装python-gtk2了

C++输入输出操作符重载

C++这玩意儿被我搁下好长时间了,最近又复习了一下。

操作符重载方面我只写输入输出操作符这一篇博文。这里我只写输出操作符的,输入也是一样的。

cout << Item
//等价于
cout.operator<<(Item)

一般来说输入输出操作符是定义为为类的友缘函数:

class Item
{
    ...
    friend ostream& operator << (ostream&, Item&);
}

ostream& operator << (ostream& out, Item& ItemInstance);
{
    return out << Item.name;
}

int main()
{
    Item one(...)
    cout << one << endl;
    ...
}

这里要注意:
操作符的返回类型不能为const,即:

friend cosnt ostream& operator << (...)

因为ostream本身会发生变化。

输出操作符作为成员函数进行重载

一般来说是不会把IO操作符作为成员函数进行重载的,在<>就有提到过

但是如果一定要将输出操作符作为成员函数重载,那么应该这样写:

class Item{
    ...
    ostream& operator << (ostream& out) {
        return out << 'hello, world!';
    }
}
//在使用的时候应该是
int main() {
    Item itemInstance(...);
    itemInstance << cout;
    ...
}

你没看错!是

itemInstance << cout;

而不是

cout << itemInstance;

在上面提到过:

cout << Item
//等价于
cout.operator<<(Item)

//那么
itemInstance << cout
//就应该等价于
itemInstance.operator<<(cout)
//这显然符合类实现

最后再次强调输入输出符号不作为类的成员函数被重载

将Google Chrome的地址栏默认搜索引擎设置为https协议的google

我一般会使用Google作为浏览器的默认搜索引擎。由于某些大家都懂但是又不怎么懂的原因,大陆网友在访问Google的时候常常会出现“链接已重置”的错误。

一个很好的解决办法就是使用https搜索,我用的是Google自家的Chrome浏览器,地址栏默认的搜索引擎是Google,但是默认使用的是http协议。

我们可以在“管理搜索引擎”里面这样添加Google基于https协议的搜索:

名字和关键词随便填写,URL填:


https://encrypted.google.com/search?{google:acceptedSuggestion}{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}&q=%s

这样,基于https的Google就填写好了

群里面的人已经满了

我之前创建了一个Linux QQ群,在创立之初的很长一段时间内,群里面的人都好少。于是我尝试着去论坛、博客、微博上去做宣传。可惜效果甚微。后来在博客上单独开一个页面为群做了简单的宣传,没想到没过多久群里的人就满了。

我不知道我的博客每天能有多少IP,我已经你不清我上次更新博客是什么时候。其实很多时候我都想更新我的博客,可是每次更新的时候我最想发的博文就是:《好久没有更新博客了》。。
想想也作罢了。

我没怎么更新博客,不能说我停止了学习。相反,人到了大三,我的学习力度比以前强多了。每天学到的知识也比以前深,也正是因为如此,我才没怎么发博文,因为一篇博文的信息量还是不够,为了阐述一个知识点可能需要其他的博文作为铺垫,这样一来才好懂。一想到要铺垫,我又放弃了写博客的念头。

都说大三是大学里面最关键的一年,这这一年里我必须学很多东西,这样一来我明年的这个时候出去应聘的时候才有底气。

人到大三,离毕业的日子不远了,坦白说我还有好多心愿没有完成。我没有当上12级新生的助理班主任,没有找到一份收入丰富的兼职(勤工助学的工资实在太少了),甚至没有谈过一场恋爱。

我希望在这个学年里能够完成这些心愿。有时候也觉得压力挺大的,要考软考又要准备英语六级。还有很多事情没有做完,时间似乎也不怎么够。

我想早点走上社会。我期待着一个新的起点!

Django教程一:安装与hello World

首先本系列笔记是基于Python 2.7/Linux/Django 1.4x的。其他的平台和版本,作者并未尝试

安装

首先去https://www.djangoproject.com/download/下载最新版Django,博主在发表这篇日志的时候最新版的Django是1.4.1

解压安装包得到django-1.4.1/目录,进入该目录,执行:

sudo python setup.py install

在安装新版之前,一定要先卸载旧版的Django。

一个hello world页面

在终端内执行:

django-admin.py startproject PROJECT_NAME

其中PROJECT_NAME是项目的名称,这里假设项目的名称是Blog
那么可以得到这样的一个目录树:

Blog/
|____ manager.py
|____ Blog/
    |____ urls.py
    |____ wsgi.py
    |____ __init__.py
    |____ settings.py

manager.py是开发过程中要常常使用的文件,顾名思义,就是用来管理的文件,比如创建app,运行shell,运行Django内置的web服务器等等
url.py文件是Django URL的配置文件,至于当用户访问www.example/post/1254/时,Django会根据url.py的内容来判断这个URL由试图(views)中那个函数来处理
__init__.py这个文件是空的,python的包都会有一个__init__.py文件。
wsgi.pywsgi是Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口。

第一个hello world

编辑urls.py文件,在urlpatterns = patterns(”,前面加入以下代码:

from django.http import HttpResponse
def hello(request):
    return HttpResponse('hello, world!')

然后在patterns(”,中加入:

url(r'^/$', hello),

整个urls.py现在看起来是:

from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
from django.http import HttpResponse
def hello(request):
    return HttpResponse('hello, world')

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'Blog.views.home', name='home'),
    # url(r'^Blog/', include('Blog.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # url(r'^admin/', include(admin.site.urls)),
    url(r'^$', hello),
)

然后将它保存,创建项目的时候不是有有一个manager.py吗?执行这个文件:

./manager runserver

然后在浏览器中输入http://127.0.0.1:8000/ 就可以看到hello world了。

Python变量与下划线

Python用下划线作为变量的前缀和后缀来指定特殊变量:

  • _xxx :不能用 ‘from module import *’导入
  • _xxx_ :系统定义名称
  • _xxx :类中的私有变量

很俗的一个标题——好久没有更新博客了

好久没有来博客了,刚登录的时候发现连用户名都给忘记了。

这次我就不以忙为借口了,因为这个借口太不靠谱了。你说我现在孤身一人在学校,一天之中除了偶尔写一些代码之外,大部分时间还是玩玩游戏,上上网,到了吃饭时间之后就起来吃饭,这日子简直和猪一样。

我唯一能找到的理由就是,我现在又变懒了。

现在的生活仿佛失去了目标,每天都精神世界就会变得空虚。然后靠游戏去消遣。
老实说,写到这里,我已经写不下去了,我可以把这篇日志保存到草稿中,以后再写,但是我没打算这样做,因为我知道一旦被我放到草稿中,这篇日志就会用无见天之日了。

所以我宁愿它没有被写完!

迅捷FW105U无线网卡Linux驱动安装

首先在终端内执行 lsusb 输出如下:

Bus 001 Device 003: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter

好了,我们得知该网卡使用的是RT5370芯片。

现在我们去http://www.ralinktech.com/en/04_support/support.php?sn=501下载RT5370对应的驱动,然后把驱动解压了,解压出来的是一个文件夹

注意:
我下载的驱动是一个tar.bz2文件,但是这个文件的扩展名却是bz2,
所以我得用tar -jxf package.bz2解压。

解压好了之后修改

os/linux/config.mk

# Support Wpa_Supplicant
HAS_WPA_SUPPLICANT=n


# Support Native WpaSupplicant for Network Maganger
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n

中的值都改为’y’.

然后编译安装:

sudo make  #make 前面记得加sudo
sudo make install

编译的过程中会有一些警告,不过没关系。
然后执行:

sudo depmod -a
sudo modprobe rt5370sta
sudo sh -c 'echo rt5370sta >> /etc/modules'

好了,无线网卡的驱动就可以搞定了,拔掉网线,你再看看右上角。。。。

C++面向对象之多态

运行期间绑定与编译期间绑定

void func() {
cout << "Hello, C++" << endl;}

在上面这段代码中,函数名func与函数体是紧密相连的。当func函数被调用时,到底执行哪一段代码在编译阶段就已经决定了。因此我们称之编译期绑定

还有一种是在运行期绑定。我们称这样的函数是多态的。

C++多态的前提条件

  1. 必须存在一个继承体系结构
  2. 继承体系结构中的一些类必须具有同名的virtual成员函数
  3. 至少有一个基类类型的指针或基类类型的引用。这个指针或引用可用来对virtual成员函数进行调用

示例程序:

#include <iostream>
using namespace std;

class human {
public:
    virtual void hello()
    { cout << "Hello_human" << endl; }
};

class man: public human{
public:
    void hello()
    { cout << "Hello_man" << endl; }
};

class woman: public human {
    void hello()
    {  cout << "hello_woman" << endl; }
};

int main()
{
    human *p = NULL;
    p = new human;
    p->hello();
    delete p;

    p = new man;
    p->hello();
    delete p;
   
    p = new woman;
    p->hello();
    delete p;
}

程序输出:

Hello_human
Hello_man
hello_woman

在上面的这段程序中,基类human的成员函数hello()被声明虚函数,派生类中的成员函数也会自动成为虚函数。如果不把它声明为虚函数,这个程序将会输出:

Hello_human
Hello_human
Hello_human

无觅相关文章插件,快速提升流量