Way of Life Welcome to Anho's World

18Apr/120

Win8 Metro App分享功能JavaScript实现

似Win8最近发布的比较凶,Metro Style App的开发也炒的比较凶,之前还什么renren抢先成为第一个Metro App什么什么的。其实我2月份就开始做了我会乱说?Win8还没发布消费者预览版我就在开发者预览版上写代码了我会乱说?3天我就做了一个App我会乱说?
额,我刚才说了什么?恩,什么都没说。。。还是回归题目吧。。。get started什么的我就不说了吧,介绍点小功能,就是分享功能。分享功能是Win8内置的,就是可以直接将某些内容分享到其他可以接受分享的App,比如微博、人人什么的,就像下面这个图的样子

由于我没装renren神马的,就只能分享到邮件了~
至于怎么实现,官网提供了一个sample(点我),不过其实没那么多,看下面的代码

    function dateRequested(e) {
        e.request.data.properties.title = '分享的标题';
        e.request.data.properties.description = '分享的描述';
        var shareValue = '分享的内容';
        e.request.data.setText(shareValue);
    }

    function setupShare() {
        var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();
        dataTransferManager.addEventListener('datarequested', dateRequested);
    }

对Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView()这个东西(微软的东西总是那么长。。。)添加一个datarequested事件,就是在要分享时,获得需要分享的内容
然后你可能会说再加个分享button,就完成了~NO~到这里就已经完成了。。。其实一开始我也加了分享button,后来微软说不能有,原因是在Win8的contract里面已经有了,就是把鼠标移到右下角会出来个contract,见下图

所以分享的实现就这么简单了,就是注册一个提供分享内容的事件就好了
祝各位Win8开发之路愉快,O(∩_∩)O~~

14Apr/122

简洁的陌生人聊天nodejs实现

近写了个陌生人聊天应用,原型是omegle,本来是要在人人上上线的,结果因为UI的各种原因审核一直没有通过
整个应用是nodejs + socket.io实现的,一开始用的websocket,结果顾忌到强大的某浏览器用户,还是使用了socket.io中ajax部分的api
服务端实现就是存下每个用户的socket信息,匹配,发送信息。匹配的部分还有待改进,感觉没有随机性= =

var users=[];//存当前接入用户
var avail=[];//存正在等待聊天的用户
var abled=[];//存users中空缺的位置

io.sockets.on('connection', function(socket) {
    //socket连接时存入用户信息,并在用户socket中存入其在users中的位置
    if (abled.length == 0) {
        socket.set('index', users.length);
        users.push({
            socket : socket,
            available : false,
            stranger : null
        });
    } else {
        var index = abled.pop();
        socket.set('index', index);
        users[index] = {
            socket : socket,
            available : false,
            stranger : null
        }
    }

    //收到开始要求,若没有在等待用户就加入等待用户队列,有就匹配聊天
    socket.on('start', function() {
        var my_index = socket.store.data.index;

        if (avail.length == 0) {
            avail.push(my_index);
        } else {
            var index = r.rand(avail.length);
            var stranger_index = avail[index];
            avail.splice(index);
            if (users[stranger_index]) {
                if (stranger_index != my_index) {
                    users[my_index].stranger = stranger_index;
                    socket.emit('started');
                    users[stranger_index].stranger = my_index;
                    users[stranger_index].available = false;
                    users[stranger_index].socket.emit('started');
                }
            }
        }
    });

    //收到结束要求,更新用户信息
    socket.on('end', function() {
        var my_index = socket.store.data.index;
        var stranger_index = users[my_index].stranger;
        socket.emit('ended', true);
        if (users[stranger_index]) {
            users[stranger_index].socket.emit('ended', false);
			users[stranger_index].stranger = null;
        }
		users[my_index].stranger = null;
    });

    //收到发消息要求,发送给相应用户
    socket.on('send_message', function(message) {
        var my_index = socket.store.data.index;
        var stranger_index = users[my_index].stranger;
        if (users[stranger_index]) {
            users[stranger_index].socket.emit('get_message', message);
        }
    });

    //socket断开连接
    socket.on('disconnect', function() {
        var my_index = socket.store.data.index;
        var stranger_index = users[my_index].stranger;
        if (users[stranger_index]) {
            users[stranger_index].socket.emit('ended', false);
			users[stranger_index].stranger = null;
        }
        users[my_index] = null;
        abled.push(my_index);
    });
});

客户端也是一样,发送匹配、消息、断开请求

var socket = io.connect('http://' + window.location.host);

function send_message(){
    if ($('#change').attr('class') == 'start') {
        return false;
    }
    var message = $('textarea').val();
    if (message) {
        show_message('you', message);
        socket.emit('send_message', message);
        $('textarea').attr('value', '');
    }
}

function show_message(say, msg){
    $('#chat').append(message_html(say, msg))
        .scrollTop($('#chat')[0].scrollHeight);;
}

$(document).ready(function() {

    show_message('stranger','点击左下角遇见有缘的陌生人吧( ̄ˇ ̄)');

    $('#change').click(function() {
        var method = $(this).attr('class');
        if (method == 'start') {
            socket.emit('start');
            $('#chat').empty();
            show_message('stranger','寻找中......');
        } else {
            socket.emit('end');
        }
    });

    socket.on('started', function() {
        $button = $('#change');
        $button.text('disconnect');
        $button.attr('class', 'disconnect');
        $('#chat').empty();
        show_message('stranger','找到TA了,开始聊天吧∩ˍ∩,聊得不happy可以点左下角断开哦');
    });

    socket.on('ended', function(is_you) {
        $button = $('#change');
        $button.text('start');
        $button.attr('class', 'start');
        if (is_you) {
            show_message('stranger', '你和我断开连接了(>﹏<)');
        } else {
            show_message('stranger', '他离开了,再找个吧');
        }
    });

    $("#send").click(function(){
        send_message();
        $('textarea').focus();
    });

    $('textarea').keydown(function(e){
        if(e.keyCode == 13){
            send_message();
            return false;
        }
    });

    socket.on('get_message', function(message) {
        show_message('stranger', message);
    });
});

话说最近看到个什么文章,说node.js可以写桌面程序了。。。我又想起了我以前说的,很多人都想发明一种语言,这种语言什么都能干,结果JavaScript办到了。。。

4Dec/113

Dian团队2011个人总结

湘江北去,橘子洲头”。一个背包,一张车票,一个人的旅行。十月,江风拂面,浮现出一年来的回忆,书写着两个人的甜蜜。——题记

“携来百侣曾游。忆往昔峥嵘岁月稠”
橘子洲曾是诗人与众多革命同志聚会的地方,它见证了许多不平凡的岁月。Dian团队又何尝不是,见证了这么多队员不平凡的岁月,挪威组也见证了我成长的道路。
从菜鸟到所谓的“大牛”,凭借的只是一身的拼劲与积极的态度。从组员变成组长也承蒙周亮的看重,但自己也早早的向周亮表示过相当组长的意愿,也许是这份积极让周亮对我有了更多的关注。成为组长后,关注的东西已经不仅仅是技术,更多的时候需要看到别人看不到的东西,像人员、质量的风险,同时也需要关注项目组的氛围、组员的情绪。简单的理解就是从考虑一个人的问题变成了考虑所有人的问题。这加速了我的成长步伐,让我思考了更多的东西,也从中总结了不一样的经验。

“恰同学少年,风华正茂;书生意气,挥斥方遒”
第四届队委会成立时,吴宇斌邀请我加入人力资源部,我也就此开始了我的队委会工作生涯。在人资部工作让我很愉快,开始接触招新的工作,也非常喜欢这样的工作。
一开始加入队委会仅仅是因为不辜负林子敬的推荐,但后来的刘老师的一句“Dian团队没有狼”,让我触动很深,我及其的不赞同这样的观点,于是我下定了决心,参加了第五届Dian团队队长的竞选。与龚小聪、林子敬同台竞选,还在启明报告厅这样正式的场合,从走进会场一直到我上场前都非常的紧张,问答环节也发挥的一般,不出意外的竞选失利了。一次的不成功并不会让我沮丧,虽然下次的时候我会非常的忙,但是我一定会再次走上这个演讲台,展现出我自己的年轻气盛!

“曾记否,到中流击水,浪遏飞舟?”
无论是项目攻坚,还是队委会工作,都离不开的是人。在一次次的讨论、合作、聚会中,收获的是成功,是喜悦,是情感。
项目组、队委会,都离不开聚餐。人资部在第四届队委会的尾声还吃了一次散伙饭。大家喝得虽不是酒,也是情浓于水吧,只有真正一起奋斗过的人,才能收获真正的感情吧。暑假的最后几天,我也在项目组闲余组织了大家一起去庐山旅游了一趟,大家也都玩的很开心。旅游并不在玩到了什么,我想更重要的是和谁一起,也许就是大家一窝人在宾馆里打三国杀,更让人开心呢?
另外,这次的庐山行,也算是让我收获了自己的另一半,这是不是也可以叫做庐山恋呢?哈哈。在新的一年也许下愿望吧,希望我们能一起走的更远。

“怅寥廓,问苍茫大地,谁主沉浮?”
在第五届队委会成立后,也即是年末的这几个月里,我思考了很多。也并不是曾经没有思考,而是现在站在了更高的平台上。我想,也许团队已经需要有些人站出来,有更多的年轻人站出来,承担起团队的责任。
在即将到来的一年里,我想我已经做好了准备,也已经奠定了良好的基础,我希望能够为团队的突破付出更多。

Tagged as: 3 Comments
24Nov/112

用watij爬取网页内容

段时间,移动组找我帮忙抓个数据:http://jwc.hust.edu.cn:81/index.aspx,我看了看,觉得应该没问题吧,就答应了。后来发现,asp.net真不是一般的变态啊。。。
尝试了各种方法,都不行,只好请教师傅。师傅也很纠结,后来不知道从哪儿搜出了个方法,用watir(web application test in ruby),通过ruby打开firefox然后访问网页,并对网页进行操作,来获取数据。
看起来很简单。。但是麻烦在于要编译一个firefox。。编译一个firefox也不是特麻烦。。麻烦在还得加个jssh的extension。。加个extension也不是很麻烦。。还不能用firefox的新版本。。话说那弄个旧版本吧,不难吧。。旧版本还我勒个去不能再ubuntu11.10上编译。。。。。后来纠结到了win32上,得把firefox删了,下个3.X的版本。。。
搞了好久,搞的好无语,最后周导居然还真的整出来了。。。这都不是重点,重点是我感觉这太难搞了,平台要求太高啊,兼容性太差啦。。 好吧其实是我嫌麻烦。。。
然后我打开了google,输入 watir java。 喵了个咪的,这不是有watij(web application test in java)吗!
一开始我还以为只是不用装ruby了而已,用了之后发现,什么系统版本,什么firefox版本都弱爆了好不好,别人直接把mozilla给你封装好了,直接用啊。所以最后发现真的是很简单。。

package com.zhiweizhang.crawler;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

import org.watij.webspec.dsl.Tag;
import org.watij.webspec.dsl.WebSpec;

public class WatijCrawler {

	private static String homepage = "http://jwc.hust.edu.cn:81/index.aspx";

	//教学楼对应value值,西十二8,东九7,西五5,东十二1
	private static String[] building = {"西十二", "东九", "西五", "东十二"};
	private static String[] buildingValue = {"8", "7", "5", "1"};

	public static void main(String[] args) throws Exception {
		//打开网页,并隐藏webspec界面
		WebSpec ws = new WebSpec().mozilla().hide();
		ws.open(homepage);

		for (int i = 0; i < 4; i ++) {
			System.out.println("Fetching information of building " + building[i]);
			ws.find.select().with.id("Build").set("value", buildingValue[i]);//选择教学楼
			ws.find.input().with.name("btnRightall").click();//选择所有教室
			ws.find.input().with.name("Button1").click();//点击查询
			int page = 0;
			File file;
			Tag tag = ws.find.a().with.innerText("后页");
			//下载所有页的网页
			while (tag.exists()) {
				page++;
				file = new File(building[i] + "/" + page + ".html");
				BufferedWriter bw = new BufferedWriter(new FileWriter(file));
				System.out.println("Downloading page " + page + " ...");
				bw.write(source());
				bw.close();
				tag.click();
				tag = ws.find.a().with.innerText("后页");
			}
			System.out.println("All the pages have been downloaded.");
		}
	}

}

太方便了,这个斑马以后登录各种网站都可以直接这么写了。
值得一提的是,watij其实是一个测试工具,用于测试web应用,就如名字所说。。。

详情参考:http://watij.com/

Tagged as: , , , 2 Comments
7Oct/110

10个项目死亡的信号

近在看一本书,叫《IT项目管理那些事儿》,感觉有些地方应该简要做下笔记。发现貌似马上就2个月没更新博客了....就顺便记在博客上吧。

书上看到关于项目死亡的10个信号,是来自微软的资深工程师Dare Obasanjo在2007年写的一篇博客 Top Ten Signs Your Software Project is Doomed,看后我个人对其中一些也比较有感触,内容如下

1. 第一版做太多功能;
2. 太依赖新技术平台;
3. 与公司另一个有分量的产品竞争;
4. 团队人手不足;
5. 复杂的问题,需要复杂的解法;
6. 成员开始隐藏进度落后的事实和原因;
7. 不断更改,增加的需求;
8. 2.0症候群 —— 非要更大,更强,更美;
9. 产品没有市场立足点;
10. 你根本无法解决的大问题。

Tagged as: , , No Comments
23Aug/110

程序猿装13指南

“工欲善其事必先利其器。”

1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好。一个用来查资料,一个用来写代码。总之要显得信息量很大,效率很高。

2.椅子不一定要舒服,但是一定要可以半躺着。

3.大量的便签,各种的颜色的,用来记录每天要完成的事务,多多益善。沿着电脑屏幕的边框,尽量贴满,显出有很多事情的样子。

4.工具书,orelly的,机械工业,电子工业什么的都可以,能英文就英文,不行影印版的也可以,反正越厚越好,而且千万不要放在书架上,一定要堆在桌上,半打开状。

二、从进门开始

1.着装!着装!不管你是去实验室,或者去公司的大楼,在或者是小公司的民宅,或是自己创业的黑作坊;无论是春夏秋冬白天晚上刮风下雨电闪雷鸣台风龙卷风,一个装b的程序员都要十分在意自己着装!这里只提出参考建议。初级装:衬衣+牛仔裤+休闲鞋。中级装:T恤+宽松短裤+拖鞋。高级装:背心+宽松大花裤衩+人字拖。

2.得体的举止。在走廊以及任何形式的过道里,一定要双手插兜,走得像个痞子,至少要看起来有点反社会,如若不行,可走文弱天才型geek路线。。

3.如果有女性在你背后指指点点,小声嘀咕说这一定是一个技术男的时候,应该先低头,然后保持低头状态,缓缓回头,坏坏地蔑笑但是不要出声,然后快步前行。

4.进门后,一定不要跟任何人打招呼,笔直走向自己的位置,最多路过打一杯咖啡,千万不要有多余的动作,显示出自己的专注与心无旁骛。

三、坐下就不要再动了

1.坐下以后,姿势需要略微后仰,能翘着二郎腿最好了,然后在后仰的情况下低着头,以便看到屏幕,然后千万就不要再动了。

2.粗暴地把电脑前的大堆书推开一个口,然后摘下电脑上的一个便签,看一眼,不过3秒,可以开始coding了。

3.能不用IDE就不要用,实在装不了,无论IDE是什么,一定要调成DOS那种黑色背景的。

4.如果写前台界面,就不停地调试后台代码;如果写java,就在里面混编C;如果写C,就在里面混编汇编。不光要coding,还要时不时的翻出一本什么英文的书翻一翻,看不懂就看看插图,然后扔到面前假装懂了继续coding。

5.什么看起来高端就用什么,不要管实用不实用。例如对C++:switch统统重构成多态;如果有指针,统统改成智能的;C++一定要自己写 template;数字是全部要替换成宏的名字能起多长就起多长;struct就不要出现了,如果出现,也一定要用__attriburte__修饰一下;运算都是位操作的;操作符都是重载的;网络都是并发缓冲线程池的;int只用int32_t声明的;继承不用普通的,什么多继承虚继承啊;helloworld也要写捕获异常的;后人一看代码,中间一堆关键字 extern,asm,auto,XXXXX_cast,volatile,explicit,register,template,让一般总在敲 int,if,else,for的小程序员顿时心生崇拜。

6.注释?算了吧。只有两个路线可以选:一,变量名起得巨长无比,看代码就和读英文文章一样顺畅,根本不需要加注释。 二,代码无比晦涩,加不加注释根本无影响。

7.千万不要用IM工具交流,千万不要问同事问题,显得自己没有水平,都是自己上网或者查书。

8.无论是同事间开玩笑或者发生任何群体性时间,不要抬头,更不要东张西望,即使地震火灾,也一定要先提交代码再行离开。

四、潇洒地离开

1.人走,主机是千万千万不能关的,至少要跑个daily build,实在不行正在svn提交也勉强算过关。

2.书应该已经又堆到屏幕前了,千万不要整理,明天再来推开。

3.不强求最后一个走,但一定要所有的非程序员,什么市场啊前台啊pm啊都走光了,才可以走。

4.走得时候一定要率性,千万不要收拾任何东西,站起来,出门,好的,就这样。

5.如果今天一定要说句话的话,找到那个最苦逼的程序员,跟他说,你进度太慢了啊,不要老让我等你。

Tagged as: No Comments
27Jun/112

笔记:jar包简单修改方法

于一个比较大的jar包来说,整个反编译、修改、再编译的过程确实比较麻烦,而我一直想修改一个jar包里的一点东西,由于修改的部分不多,我想到了如下办法。

用winRAR打开jar包,就像操作压缩文件一样取出里面需要被修改的类文件,然后反编译成java文件,修改java文件后再编译成class文件
这里需要注意的是,编译的jdk版本一定要和jar包的一样,可是如何获得这个版本呢?通过javap命令可以实现

javap -verbose classfile

这样在结果中会出现
minor version: 0
major version: 50
这样的东西,这表示使用的jdk 1.5
那么在如何用jdk 1.5编译我们的java文件呢? 难道重新下一个jdk 1.5 ?这太麻烦了,javac命令就可以实现

javac -classpath jarfile.jar -target 1.5 javafile.java

这样就可以用jdk 1.5编译java文件了
注意命令中的-classpath设置,如果不设置,java文件往往会编译不通过的哦~ 理由我就不需要解释了吧

这样再删除jar包中的原class文件,把我们编译的class文件复制进去,运行jar包就可以了哦~

Tagged as: , , 2 Comments
26Jun/111

笔记:比较win32下python与java通过实现XMPP协议发送gtalk消息

近想做个弹窗提醒,可是又嫌麻烦,经过各种尝试,还是觉得gtalk消息的弹窗提醒比较好,于是出现以下情况

由于gtalk是基于jabber的XMPP协议开发的,所以只需要通过实现XMPP协议即可实现发送该talk消息,也就是说需要实现XMPP的库。

首先是想用Python写,选用PyXMPP,代码如下

#!/usr/bin/python
# -*- coding: utf-8 -*-

from pyxmpp.jid import JID
from pyxmpp.message import Message
from pyxmpp.jabber.client import JabberClient
from pyxmpp.jabber.simple import send_message
from pyxmpp import streamtls

class Gtalk():
    def __init__(self, sid, spwd):
        self.sid = JID(sid)
        self.spwd = spwd

    def send_msg(self, rid,  msg):
        self.rid = JID(rid)
        if not self.sid.resource:
            self.sid = JID(self.sid.node, self.sid.domain, 'send_message')

        msg = Message(to_jid=self.rid, body=msg)
        def send(stream):
            stream.send(msg)

        self.xmpp_do(send)

    def xmpp_do(self, function):
        class Client(JabberClient):
            def session_started(self):
                function(self.stream)
                self.disconnect()

        tls = streamtls.TLSSettings(require=True, verify_peer=False)
        auth = ['sasl:PLAIN']
        gtalkClient = Client(self.sid, self.spwd, tls_settings=tls, auth_methods=auth)
        gtalkClient.connect()
        try:
            gtalkClient.loop(1)
        except KeyboardInterrupt:
            print u'disconnecting...'
            gtalkClient.disconnect()

if __name__ == '__main__':
    g = Gtalk('account@gmail.com', u'password')
    g.send_msg('to@gmail.com', 'Hello World')

但是有关PyXMPP的安装在Ubuntu上非常简单,但是在win32上将变得非常复杂,由于PyXMPP依赖于libxml2 python binding以及dnspython
俺也是纠结了很久,最后在某牛的帮助下才在win32上将PyXMPP编译成功

于是我想就不能有更简单更容易移植的程序吗?
说到移植,Java必然是首选,于是选用Smack Java XMPP包来实现:

package com.zhiweizhang;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;

public class SendMessage {

	public static void main(String[] args) throws XMPPException {

		XMPPConnection.DEBUG_ENABLED = false;
		XMPPConnection connection = new XMPPConnection("gmail.com");
		connection.connect();
		connection.login("account", "password");
		Chat chat = connection.getChatManager().createChat("to@gmail.com", new MessageListener() {
            public void processMessage(Chat chat, Message message) {
            }
        });
		chat.sendMessage("Hello World!");
		connection.disconnect();
	}
}

所以java的程序即简单明了,又容易移植,特别是在windows环境下

最后PS: 搞的越来越觉得java很爽了。。。 讨厌的java的表示压力好大呀好大。。。 肿么办。。。

11Jun/112

Perl笔记:ubuntu下Perl模块的安装与Excel中文乱码问题

似。。。有两个月木有写博客了。。。上次是一个月,下次会不会是三个月咧。。。好吧,还是写笔记吧

最近小学了一下Perl语言,感觉现在学起语言来还是蛮快的,基本不要花什么时间。但是我不喜欢学了东西不能用,于是马上想写个程序帮助我每周提交项目的时候生成代码文件列表,以上是背景。

简单的Perl代码就不说了,主要谈下遇到的问题。首先就是需要安装Perl模块,来操作Excel文件,就好像java里的库一样。但是网上的东西总是那么坑爹,提到ppm命令。。。我尝试了好久才知道那是win32下的。。。所以说google,百度神码的,不适合程序员!!官方的文档才是王道!!当然经常是英文的。。。我查到CPAN是Perl模块的集散地,据说包含了几乎所有Perl模块,于是从CPAN安装Perl模块,首先在命令行输入:

sudo perl -MCPAN -e shell

然后会进入CPAN的命令行,首次使用可能需要配置一下,如果联网,一路回车就可以了,在CPAN中输入

cpan> o conf urllist unshift http://www.perl.com/CPAN/
cpan> o conf commit

可以修改CPAN的镜像地址,如我用的http://www.perl.com/CPAN/
输入install ...即可安装相应的模块,如我要安装Spreadsheet模块则输入

cpan> install Spreadsheet

就OK了~ 是不是很简单,嘿嘿

但是写程序时发现,用该模块在Excel中写入中文的话显示的全是乱码!然后我又发现了网上的东西多么的坑爹。。。说用Unicode::Map模块可以解决。。简直就是坑爹啊!!!害我还把Unicode的英文文档全部看完了!!!结果根本就不能解决问题!!!
最后历经千辛万苦。。终于查到用Encode模块中decode方法对字符串进行编码转换就OK了。。于是代码勒样写:

#!/usr/bin/perl

use Spreadsheet::WriteExcel; #调用Excel写模块
use Encode; #调用Encode模块

my $workbook = Spreadsheet::WriteExcel->new("sample.xls"); #生成Excel文件
my $worksheet = $workbook->add_worksheet(); #加入sheet表
$worksheet->write(0, 0, decode("utf8", "张志炜")); #写入中文

更多的操作可以查询http://search.cpan.org/,记住是英文的哦~

25Apr/112

Ubuntu上的一些小东西

隔一个月,俺才回来写博客,惭愧啊惭愧~这段时间说忙吧,也不是非常忙,就是事情很多=。=当组长之后各种完全没有接触过的问题接踵而来,让我很烦恼。但是该来的早晚要来,在这个还能找到人帮助的时候来,也是一种幸运吧~P话不多说,还是写博客吧

之前一直说要给自己留一个ubuntu系统,但是一直没搞。前两天决定把Dell的小本装成ubuntu,于是今天装了。装好之后想搞点儿好玩的,然后听说有个神马Mac...............buntu,于是非常想尝试一下,打开firefox直接在地址栏输入macbuntu,就直接到下载页面了。。。 ubuntu就是强大。。。 然后下载、安装、重启。。。 我勒个去,真的和mac一摸一样喂!山寨的mac绝对是mac中的mac!!!

然后要装中文输入法,之前我一直用的fcitx,就是小企鹅。其实当时我自己都不知道是怎么装好的。。。 这次则不想再尝试了,于是决定装ibus
先在终端添加源:

sudo add-apt-repository ppa:shawn-p-huang/ppa
sudo apt-get update

然后安装:

sudo apt-get install ibus-gtk ibus-qt4 ibus-pinyin ibus-pinyin-db-open-phrase

最后在System -> Preferences -> Keyboard Input Method中配置一下就好

神马都搞好了之后,准备解决一个严重的问题。。。 没有无线网卡驱动=。= 记得以前有同学问我ubuntu没有声卡驱动怎么解决,我不知道来着。。。
这次我在 /usr/share/applications/ 里找到了一个程序叫 Additional Drivers 运行之后。。就可以选择下载安装没有的驱动了。。。。。
我表示灰常意外,macbuntu的话在下面就可以找到这个文件夹。。。 不过不是macbuntu的话我还真没考证过有没有这个程序。。

好啦,今天ubuntu上的小东西就这些啦,以后俺尽量快些更新博客吧~ 晚安睡觉啦~

Tagged as: , , 2 Comments