0%

“叮铃铃…”,一大早,海盗船长僵尸屋里面的电话就响了起来。海盗船长僵尸懒洋洋摘下挂在墙上的电话,里面传来玉米加农炮的声音。玉米加农炮欢快地说道:“海盗船长僵尸,你每天都在修船吗?”海盗船长僵尸无奈回答道:“是啊,船都被你炸破了。”玉米加农炮嘿嘿一笑说道:“你明天早上不用修船了,我会派人帮你修的。你到镇上的小酒馆来,我请你喝酒。”海盗船长高兴地说:“好,谢谢!”

玉米加农炮打电话给海盗船长僵尸

海盗船长僵尸如约来到镇上的小酒馆,玉米加农炮早已等在那里了。海盗船长僵尸径直地走到玉米加农炮的桌前,在玉米加农炮对面的椅子上坐了下来。玉米加农炮拿着菜单向海盗船长僵尸问道:“你想喝什么酒呢?”海盗船长僵尸看了看菜单说:“来瓶啤酒吧!”玉米加农炮又问道:“想吃什么菜呢?”海盗船长僵尸拍着桌子大叫道:“我要吃大鱼大肉!”玉米加农炮捂嘴偷笑说:“那就再给你加一盘鸡脑子吧。”小酒馆的服务员下去准备酒菜了。海盗船长僵尸说:“我要去给我的鹦鹉买一些鸟食。”于是就大步地走出了小酒馆。不一会,就拿一小盒鸟食回到了原来的座位上。海盗船长僵尸将鸟食放在桌上,摘下帽子,挂上椅子角上。看到鸟食,鹦鹉立刻从帽子里飞出来,落在桌子上,高兴地吃了起来。

不一会,小酒馆的服务员就将他们点的酒菜端了上来。海盗船长僵尸和玉米加农炮高兴地吃了起来,边吃边聊。海盗船长僵尸突然抬起头来问道:“我的大船修好了吗?”玉米加农炮回答道:“等我问一问。”于是拿出电话,给修船工人打电话。玉米加农炮向修船的工作问道:“船修得怎么样了?”工人回答道:“已经修得差不多了。就差外面的漆没有刷了。”工人又补充问道:“对了,里面的家具需要搬进去吗?”玉米加农炮回答说:“搬进去也可以。”这一切都被海盗船长僵尸听在耳朵里。

海盗船长僵尸到酒馆

很快,他们就吃完了。海盗船长僵尸站起身醉意朦胧地说:“我要回去看看我的大船怎么样了?”玉米加农炮对着海盗船长僵尸的背景说:“回去看看你的大船吧。如果满意就给我发一个微信,如果不满意就给我给电话。”

海盗船长僵尸回到他的大船上,惊喜地发现,他的破船已经焕然一新了。海盗船长僵尸高兴地给玉米加农炮发微信说:“我的破船已经变成新船了,谢谢你,我很满意。”

海盗船长僵尸去看新船

玉米加农炮为什么要请海盗船长僵尸到镇上的小酒馆喝酒呢?这要从一个月前的事情说起。

一个月以前刮了一场大风。狂风怒吼,掀翻了玉米加农炮家的房顶。玉米加农炮向海盗船长僵尸求救,说:“海盗船长僵尸,我家的房顶被狂风掀翻了,你能来帮帮我吗?”海盗船长僵尸爽快地说:“当然可以!”于是驾驶着海盗大船来到了植物镇,修好了玉米加农炮被狂风掀翻的屋顶。从此以后,他们就成了好朋友。于是一个月以后,玉米加农炮就请海盗船长僵尸到镇上的小酒馆来喝酒,而且帮他修好了被炸破的海盗大船。

一个月以前的故事

在茫茫的大海上,有一艘大船远远地驶来,人们都以为是一艘满载乘客的大船,走近了却发现,原来是一群僵尸。海盗船长僵尸在驾驶仓里手握方向盘眼望前方,大船的甲板上站满了海盗僵尸和海盗小鬼僵尸,还有滚桶僵尸和飞贼僵尸。

海盗大船

海盗大船慢慢地靠近岸边,海盗船长松开方向盘,向僵尸们下达命令。命令海盗僵尸爬上高高的瞭望塔观察岸边的情况。海盗僵尸向海盗船长僵尸报告说:“岸边发现了许多植物!”海盗船长僵尸命令小鬼僵尸向全体僵尸传达准备战斗的命令。大船上的僵尸都兴奋起来,哇哇叫着要抓住岸上的植物们。看到僵尸们气势汹汹的样子,岸上的行人大喊一声“救命”转身就跑。

僵尸们准备战斗

岸边的植物们立刻进入战斗状态,摆出了战斗队形。全息坚果勇敢地站了最前面。机枪射手站在全息坚果的身后,子弹上膛,眼睛紧紧盯着僵尸来的方向。高高的仙人掌站在队伍中间,一副严阵以待的样子。

僵尸们听到海盗船长进攻的命令,纷纷跳下大船向岸边冲去。滚桶僵尸滚着圆桶冲在了最前面,没有想到碰到了土豆地雷,轰的一声被炸翻在地。紧随其后的飞贼僵尸借助绳子的力量落在了全息坚果的面前,被坚果结实地挡在前面,机枪射手立刻射出愤怒的子弹,将飞贼僵尸打倒在地。小鬼僵尸紧随飞贼僵尸身后快速地来到了全息坚果的面前,还没有反应过来就被机枪射手的子弹打倒在地。海盗船长的鹦鹉扑扇着翅膀飞在空中,仙手掌立刻挺起高高的身子,吐出火红的尖刺,把鹦鹉打了一个措手不及。

植物与僵尸的战斗

植物与僵尸的战斗的十分激烈。一排一排的小鬼僵尸不顾死活地直冲过来。滚桶僵尸滚着圆圆的滚桶紧紧地跟在小鬼僵尸身后。海盗船长僵尸站在队伍的最后,大声喊着“冲啊”给僵尸们鼓劲。听到海盗船长僵尸的命令,飞贼僵尸一个俯冲,正落土豆地雷在身上,伴随着轰的一声,飞贼僵尸被炸得粉粹。海盗船长僵尸见状,生气地踢了面前的滚桶僵尸一脚,滚桶僵尸抱着滚桶快速地向前滚去,将小鬼僵尸们撞倒在地。植物们看到僵尸们人仰马翻的样子,不由得哈哈大笑。

僵尸人仰马翻

僵尸们攻不过植物的阵线,无可奈何地撤退了。植物们又一次获得了胜利,高兴地欢呼起来。

植物欢呼胜利

为了防止僵尸们卷土重来,玉米加农炮制造出了U-99号潜水艇,这是一个攻击性超强的潜水艇。由于自己做不了这么多事情,于是他叫来了磁力菇帮忙。玉米加农炮负责组装潜水艇,磁力菇负责给潜水艇刷漆。两个小伙伴互相配合,终于造出了U-99号潜水艇。

玉米加农炮的潜水艇

有一天,玉米加农炮驾驶着自己制造的潜水艇去偷袭海盗船长僵尸。U-99号潜水艇静悄悄地靠近了海盗大船。玉米加农炮利用潜望镜偷偷地观察海盗船长的动静。突然,玉米加农炮命令一号鱼雷发射。一号鱼雷静悄悄地直冲海盗大船而去,将海盗大船的油箱炸破了一个大洞。海盗船长僵尸被炸得摇摇晃晃,迷惑不解地问道:“什么情况?!”海盗船长赶紧跑到船边一看,原来是油箱破了。海盗船长僵尸气急败坏地感到:“赶快去修理!”他嗖地一声跳下船,去修改被炸破的油箱。

这一幕幕都被玉米加农炮看得一清二楚。他哈哈大笑,说道:“他肯定不知道是我玉米加农炮炸的。哈哈哈哈….”。

玉米加农炮驾驶潜水艇

玉米加农炮取得了重大的胜利,僵尸们又要被僵尸博士大骂了。

在互联网蓬勃发展发展的今天,微信与微博成为人们日常社交生活与信息获取的主要工具。此时谈到博客,总是给人一种上个世纪陈旧互联网产品的感觉。事实上,十年前的互联网可以说是博客的鼎盛时期。当时,主要的互联网门户网站,如新浪、网易等,都提供自己博客服务。提供博客服务平台也成为一个主要的创业点。当时的年轻人也以写博客为乐,不断地表达自己的思想和观点,在互联网上发出自己的声音。博客分享、订阅和阅读也成为当时每天生活中的重要一部分。经过十余年的发展,博客时代逐渐式微,微信、微博大兴其道。

CSDN号称国内最大的程序员社区,也提供有自己的博客平台。大量的技术大牛与小白菜鸟在CSDN的博客平台上分享编程经验与技术感悟,直到现在,当你在百度上搜索技术问题,也常常会搜索到CSDN博客中某个技术博主的解决之道。不过不得不承认,CSDN的技术团队似乎一直没有长进过,发展到如今的移动互联网时代,CSDN的技术博客更是为满屏的广告和其他乱七八糟的推荐所覆盖,很难看到真正有用的内容。

现在想来,我的第一个博客也是开在CSDN上的。当时试着写一些技术类的文章,无奈没有生花妙笔,技术的研究又不深入,实在写不出什么太有价值的文章,于是试着将自己平时学习时所看到的技术文章或书籍翻译一下,发到博客上,一来作为学习的记录,二来也可以帮助有需要的朋友,就这样慢慢地积累了一些翻译的文字,也正是靠着这些文字,很惭愧地为CSDN列为C++技术专家。

CSDN博客的技术团队一直为网友们所诟病。就个人的使用体验来说,居然还出现过使用自己的帐号密码却登陆到他人后台管理的情况,还好个人及时退出,没有做什么恶意操作。另外一件印象比较深刻的事情是取消了对微软的博客写作工具Live Writer的支持。当时正是我对Live Writer十分新鲜的时候,也正因如此,觉得博客写作是一件很有趣的事情。结果不久后,CSDN博客就在没有任何通知的情况下取消了对Live Writer的支持,当时在社区里面也引起了一片口水的混战,作为CSDN CTO的某人也和网友们吵做一团。后来的CSDN数据库泄漏事件,更是一度将其推上了舆论的风口浪尖。

我的CSDN博客曾经因为用户密码泄漏,导致被人利用在上面发了一些乱七八糟的东西而被CSDN封号,通过申诉找回帐户密码后不久又出现了二次泄漏(想来自己也是够衰的),使得我的CSDN博客长期处于404状态。当时还小小的感慨了一下,觉得自己早期的互联网痕迹就这样被清空了。前几天一次偶然的机会试着访问了一下,发现居然是可见状态了,尝试登陆时被要求修改密码,于是立即修改密码登陆。就是在这样的机缘巧合之中,恢复了早期的文字,也便有了这样一篇小小的水文。

由博客时代走过来的你,还记得你的第一个博客吗?

That’s all~~Enjoy it~~

OpenWrt作为一款优秀的开源路由系统,在为路由玩家提供多种新奇玩法的同时,也为借助智能路由器创业的年轻人提供了新的机遇。如果不想直接使用各种所谓的智能路由器,大可以自己购买支持刷机OpenWrt的路由器,自己动手折腾来打造一款满足自身需求的智能路由器。

本人并不是一名路由器玩家,确切地说,自己还只是一个路由器小白,仅是为了替换掉自己的TP-Link,同时尝鲜一下OpenWrt,因而由万能的淘宝上购买了一个二手的美国网件(NetGear)路由器,准备尝试自己刷机OpenWrt。

NetGear到手后,连接上电源,登陆进入管理界面,见识到了NetGear的原厂固件,转念一想,那就先试一下原厂固件吧。于是简单的配置后,就通地原厂固件来网上冲浪了。

我风买的这个二手NetGear带有2.4G和5G两个频段的无线接口。不过使用一段时间后发现,两个频段的无线接口都会出现手机可以连接无线网,但是无线网无法连接外网的情况,有时换着连一连,运气好的时候可以连通外网。最终让我痛下决定刷机的理由是,我的Kindle只能连接2.4G的无线网,无法连通外网,这就意味着无法接收亚马逊推送的电子书。

既然购买NetGear的初衷就是为了刷机OpenWrt,那为什么还要忍受原厂的固件呢?说刷就刷,于是体验到了下面的刷机流程。

首先到OpenWrt官网确定手中的路由器是否为OpenWrt所支持。相信你手中的路由器肯定是为OpenWrt所支持的,因为就是为了OpenWrt才买的路由器嘛。

然后可以由OpenWrt的文档开始。重点是这里,在这里描述了刷机的详细步骤。

固件下载页面下载所需要的固件,将所下载的固件存放在本地文件夹中。

通过浏览器登陆路由器,所需要的用户名和密码通常都会在路由器机身找到。登陆后进入路由器固件管理页面,找到固件刷机菜单,上传先前所下载的固件,开始刷机。耐心等待路由器重启后,即可开始体验OpenWrt。

刷机后的操作可以参考这里

首次登陆OpenWrt会看到类似如下的登陆的登陆界面

OpenWrt登陆界面

当然,在第一次登陆时会提醒设置root密码。为了安全起见,请妥善设置root密码。

登陆后可以看到系统概览以及各种可以设置的功能菜单。

对于我们而言,刷机后的首要操作就是连接网络了。不过相信初次接触OpenWrt的朋友会对OpenWrt的各种接口感到迷惑。当然对于熟悉Linux的朋友来说,eth0、eth1这样的名称就显得很是面熟了,这正是Linux系统中所用的网卡的名称了。对于脱胎于Linux的OpenWrt而言,也是同样如此。对于OpenWrt中的接品名称可以参考这里

OpenWrt默认的WAN口设置并不是用于拨号上网的,因而需要我们自己设置。在Network->Interfaces页面将默认的WAN删除。点击Add new interface...按钮,会进入到创建新接口的页面,在这里填写所需要的信息。接口名字填写WAN,由于是用于拨号上网,因而接口协议选择PPPoE,所用的网卡为eth1。如下图所示。

添加WAN口

提交之后即可进入详细设置页面,在这里填写我们宽带的用户名与密码。在这里需要提醒大家的是一定要设置WAN口的防火墙,否则会出现无法上网的情况。如下图所示。

WAN防火墙

经过上面的设置后,如果一切正常,我们应该可以畅快地开始网络冲浪了。当然,OpenWrt的玩法还有很多,这需要我们自己去折腾探索。如果因为操作错误导致无法连接路由器的情况时,可以通过长按Reset按钮来恢复出厂设置。当然,在刷机了OpenWrt后,恢复出厂设置是指恢复OpenWrt的默认设置。

That’all~~ Enjoy it~~

Eigen 作为大名鼎鼎的代数计算库,为许多计算软件库所依赖,而在开发过程中由于Eigen库所引起的编译错误也着实让人光火。

在我的Debian9下,GCC版本为6.3.0,默认的ABI为C++14。而在编译使用Eigen的软件包时,由于某些废弃的C++11语法会导致大量的编译警告,虽说可以通过GCC的编译选项来关闭这些警告,但还是让人心里很不舒畅。在最近更是遇到了由于Eigen中StdVector所导致的partial specialization问题则更是让人不知所措。在一番Google之后,找到关于该问题的讨论。原来是由于C++11中vector接口的变化所导致的。

正在郁闷时,点开Eigen的主页,看到已发布3.3.4版本,抱着试试看的态度下载编译安装,再重新编译之前的软件,居然顺利通过了,并且也不再有恼人的C++11的废弃编译警告了。

如果你也遇到类似的问题,不妨升级到最新的3.3.4版本来试试吧。

Gentoo安装成功后,在后续的使用过程中还会涉及到一些软件的安装与配置问题,在这里补记一下。

WebCamera

要想使用笔记本自身携带的摄像头或是外接USB摄像头,我们需要配置内核使其支持WebCamera。

1
2
3
4
5
6
Device Drivers --->
<M> Multimedia support --->
[*] Cameras/video grabbers support
[*] Media Controller API
[*] V4L2 sub-device userspace API
[*] V4L platform devices

USB3

1
2
3
Device Drivers --->
[*] USB support --->
[M] xHCI HCD (USB 3.0) support

ALSA

再次证实,虽然在Gentoo官方文档ALSA配置中对ALSA的配置进行了说明。但只有将ALSA编译为内核模块,而不能直接编译进入内核,然后才可以使用alsaconf进行配置。

Emacs

要使得Emacs支持字体设置,我们需要在编译时启用xft

1
USE="xft" emerge -av emacs

QtDoc

在Gentoo下做Qt开发,Qt的参考文档是必不可少的工具:

1
emerge -av dev-qt/qt-docs

QtCreator作为一款优秀的开发工具,当仁不让的成为Qt开发工具的不二之选,然而为了能够在QtCreator中显示漂亮的Qt参考文档,我们需要打开webkit

1
USE="webkit doc" emerge -av dev-qt/qt-creator

如果在启动QtCreator之后点击Help之后显示空页面,则需要在Options > Help > Documentation设置页面添加/usr/share/doc/qt-5.5.1目录下所有的QCH文件。

Lighttpd

架设一个私人服务器,将自己常用的一些库的文档放在服务器目录下,在需要的时候通过浏览器浏览查看,可以为我们平时的工作与学习带来极大的方便。lighttpd轻量、小巧,足够我们平时的个人使用:

1
emerge -av www-servers/lighttpd

配合PHP使用需要进行简单的配置,而且所需要的配置十分简单:

vim /etc/lighttpd/lighttpd.conf

在配置文件的最后部分,启用mod_fastcgi:

include "mod_fastcgi.conf"

编辑mod_fastcgi.conf文件,在其中指定php-cgi的路径:

“bin-path" => "/usr/bin/php-cgi"

PHP

需要启用”cgi”选项,当然也需要根据我们的需要启用各个选项,例如数据库操作相关的选项:

USE="cgi" emerge -av dev-lang/php

最近由于某些原因重新安装了我的Gentoo系统,虽然之前可以顺利的安装并使用,但再次安装的时候还是会遇到许多问题,趁此机会,将安装中遇到问题及解决方法记录一下。

安装Gentoo

Gentoo最常见的安装方式是使由stage3开始安装。stage3是一系列已编译好的基础工具链,也可以看作是一个简单的基本系统。如果喜欢折腾,也可以选择由stage1或是stage2开始安装。但很多时候并没有这样的必要。

下载stage3

我们可以由Gentoo官网或是某个速度较快的镜像站点下载,例如,我们可以选择阿里云镜像

准备硬盘分区

准备要安装系统的硬盘分区,并进行格式化,例如我要安装在/dev/sda2这个分区:

mkfs.ext4 /dev/sda2

解压stage3

挂载已准备好的安装分区:

mount /dev/sda2 /mnt

将下载的stage3压缩包解压到准备好的分区中:

cd /mnt
tar -xvf ~/stage3.tar.bz2

准备chroot环境

挂载必要的系统文件,准备chroot环境:

mount -t proc /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --make-slave /mnt/sys
mount --rbind /dev /mnt/dev
mount --make-slave /mnt/dev

为了能够顺利地emerge整个系统,我们需要能够正确地解析DNS:

cp /etc/resolv.conf /mnt/etc

chroot进入Gentoo系统

在准备好这些环境之后,我们就可以chroot进入这个最小的Gentoo系统了:

chroot /mnt

更新环境变量,为emerge做好准备:

source /etc/profile
env-update

这样以后,我们就拥有了一个完全可用的Gentoo系统。接下的工作就是要使用强大的emerge来Emerge整个世界了。

准备portage

portage是一个描述如何下载、编译以及安装软件的元数据集。emerge正是通过portage来管理整个Gentoo系统的。

/etc/portage/repos.conf目录下存放在portage仓库的配置文件,例如主portage仓库的配置文件为/etc/portage/repos.conf/genntoo.conf,其内容如下:

[DEFAULT]
main-repo = gentoo

[gentoo]
location = /usr/portage
sync-type = webrsync
sync-uri  = rsync://rsync.aliyun.com/gentoo-portage

在这里需要注意的就是sync-typesync-uri指定了portage的更新方式与更新地址,而摒弃了传统的在/etc/portage/make.conf指定portage更新地址的做法。

同步portage

将portage树同步到本地目录:

emerge-webrsync

配置make.conf

我们可以一些全局的编译安装配置选择写入/etc/portage/make.conf文件中:

1
2
3
4
5
LINGUAS="zh_CN"
INPUT_DEVICES="evdev keyboard mouse synaptics"
VIDEO_CARDS="intel nvidia"

GENTOO_MIRRORS="http://mirrors.aliyun.com/gentoo/"

在这里需要注意以下几项:

  • INPUT_DEVICES指定了本机的输入设备
  • VIDEO_CARDS指定了本机的显卡类型
  • GENTOO_MIRRORS指定了我们要的仓库镜像

安装Linux内核

这也许是我们要安装的第一个portage包吧。

emerge -av gentoo-sources

安装成功后,我们会在/usr/src目录下看到解压后的Linux内核目录以及一个指定该目录的linux链接。

配置安装Linux内核

进入Linux内核目录:

cd /usr/src/linux
make menuconfig

这样以后,我们就可以看到内核配置菜单。Linux的功能模块可以编译进入内核(以*标识)也可以编译为可动态加载的模块(以M标识),可以通过空格键进行选择切换。在配置Linux编译选项时,我们需要注意以下几点:

  • 将Gentoo所在分区的文件系统格式编译进入内核,例如,我选择使用ext4作为Gentoo的文件系统,则需要将ext4编译进入内核,而将其他的文件系统格式编译为模块。

  • 根据自己的硬件设备选择功能模块,例如,我的Acer上装有一个块Atheros AR9462无线网卡,则需要在设备驱动下Aheros支持中选中ath9k功能模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CONFIG_ATH9K_HW=m
CONFIG_ATH9K_COMMON=m
CONFIG_ATH9K_BTCOEX_SUPPORT=y
CONFIG_ATH9K=m
CONFIG_ATH9K_PCI=y
CONFIG_ATH9K_AHB=y
CONFIG_ATH9K_DEBUGFS=y
# CONFIG_ATH9K_STATION_STATISTICS is not set
CONFIG_ATH9K_DYNACK=y
# CONFIG_ATH9K_WOW is not set
CONFIG_ATH9K_RFKILL=y
# CONFIG_ATH9K_CHANNEL_CONTEXT is not set
CONFIG_ATH9K_PCOEM=y
# CONFIG_ATH9K_HTC is not set
  • 在无线配置部分,选中WEXT模块:
1
2
3
CONFIG_WEXT_CORE=y
CONFIG_WEXT_PROC=y
CONFIG_CFG80211_WEXT=y

在完成所需要的配置后就可以进行内核编译了:

make -j4

编译完成之后,安装内核模块:

make modules_install

将编译得到的内核拷贝到/boot目录下:

cp arch/x86_64/boot/bzImage /boot/kernel
cp .config /boot/config
cp System.map /boot

这样我们就得到可以用来启动系统的内核了。

配置/etc/fstab

/etc/fstab文件中配置了系统启动时所需要的分区信息,我们可以根据我们的实际情况进行配置,例如:

1
2
3
4
5
# <fs>			<mountpoint>	<type>		<opts>		<dump/pass>

# NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.
UUID=388db5b1-c74e-4db5-8624-4218dcbaad79 / ext4 noatime 0 1
UUID=ec2e513d-3fb0-4dba-8ab0-d363ce6c20e1 none swap sw 0 0

UUID值可以通过下列命令来查看:

ls -l /dev/disk/by-uuid

安装必要的系统工具

日志工具:

emerge --ask app-admin/sysklogd
rc-update add sysklogd default

cron工具:

emerge --ask sys-process/cronie
rc-update add cronie default

文件索引工具:

emerge --ask sys-apps/mlocate
updatedb

这样以后当我们需要查找某个文件时就可以通过locate命令来定位了。

安装配置启动器

我们可以使用grub来管理系统启动:

emerge -av sys-boot/grub

grub安装到磁盘引导扇区:

grub-install /dev/sda

这样以后我们就可以使用编译得到的内核来引导Gentoo系统了。

配置无线网络

在现代信息社会中,没有无线网格几乎是无法想像的一件事情。因而在新系统启动之后配置无线网络似乎就成为我们的当务之急。当然,相关的配置操作也可以在宿主系统中完成。

如果一切正常,在Gentoo系统启动后,我们可以通过ifconfig命令来查看当前系统的网络接口,包括有线与无线接口。下面我们着重记录一下相关的无线配置。

安装必需的工具:

emerge -av net-wireless/wpa_supplicant

wpa_supplicant的配置位于/etc/wpa_supplicant/wpa_supplicant.conf中:

1
2
3
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
ap_scan=1

使无线接口在系统启动时自动启动:

ln -s /etc/init.d/net.lo /etc/init.d/net.wlp3s0

其中,wlp3s0是我机器上的无线接口名称。

推荐使用wicd来管理网络连接:

emerge -av wicd

有了自由的无线网络,接下来我们就可以开始快乐的Gentoo之旅了。

安装X

作为个人桌面使用的Gentoo,我们并不想每天都是面对黑黑的终端窗口工作,我们也希望看到五彩斑澜的精彩世界,这一切都需要神秘的X:

emerge xorg-server

安装XFCE

X仅是一个显示服务器,而我们日常接触更多的则是各种桌面管理器或桌面环境。在这里推荐简约小巧的XFCE

emerge -av xfce4-meta

当然,如果你觉得这样安装的软件包过多,我们也可以选择我们需要的软件包来安装:

emerge -av xfce4-session
emerge -av xfce4-terminal
emerge -av xfce4-panel
emerge -av xfwm4

或者在/usr/portage/xfce-base下选择自己所需要的软件包来安装。

XFCE就是通往世界的一扇窗,我们可以由这里开始精彩的Gentoo之旅游。

Sublime Text是一个优秀的文本编辑器,通过各种插件可以极大地扩展其自身的功能,从而可以方便地将其打造为得心应手的开发利器,而Package Control正是Sublime Text强大功能的基石。

当然,我们首先要做的就是为Sublime Text安装Package Control,在Package Control的官网上介绍了具体的安装命令,对于Sublime Text3而言,我们需要通过Ctrl+',或是菜单项中的View->Show Console来打开Sublime Text控制台,然后输入如下命令:

1
import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

重新启动Sublime Text后就可以通过ctrl+shift+p来搜索并安装自己所需要的插件了。

不知道有哪些插件?没有关系,可以在Package Control浏览搜索自己所需要的插件哦。

帮师兄处理数据,不仅需要提取指定的列项数据,而且要保存为JSON格式,以方便其后续在D3中处理。在网上搜索了一下,在R中保存为JSON格式数据,可以使用jsonlite包。

安装jsonlite包:

1
install.packages('jsonlite')

将数据转换为JSON格式:

1
2
3
library(jsonlite)
data <- read.csv("my_data.csv")
json_data <- toJSON(data, pretty = TRUE)

将转换后的数据保存为文件:

1
writeLines(json_data, "my_data.json")

最近需要使用R来简单地处理一些数据。不过拿到手里的数据文件是Excel格式的(XLSX),而在我的R环境中读取却一直没有成功,于是想到将其转换为CSV格式再进行读取处理。

将XLSX文件转换为CSV文件需要使用xlsx2csv小程序,在Debian上可以方便地使用apt-get来安装:

1
apt-get install xlsx2csv

另外需要一提的就是Debian中还有一个xls2csv小程序,正如其名所示,这个小程序可以将Excel 2007以前的文件转换为CSV格式,但却无法处理XLXS文件。

如果有多个文件需要进行转换操作,可以使用下面的脚本进行批量转换:

1
2
3
4
5
6
for file in $(ls *.xlsx)
do
echo "processing $file ..."
csv_name=$(basename $file .xlsx)".csv"
xlsx2csv $file $csv_name
done

得到CSV文件后,就可以使用R来进行所需要的处理了。