痛苦编译xv6

我竟然以为xv6可以一次性编译成功。结果6个小时就这么过去了。从官网下载了xv6源码。编译时说没有qemu,那就先下载编译qemu。一开始没多想,直接configure,不出意外的提示缺少各种库,什么zlib,glib,pixman。安装完,make。结果一个半小时后见。后悔当时没加个-j8。

好不容易编译成qemu,xv6竟然跑不起来….图形模式提示链接vnc,命令行模式卡在booting from hard disk。天煞,看了help才知道,qemu不会自动提示安装GUI组件。我需要手动准备好SDL2。折腾过后,还是卡在了GUI的booting from hard dist,而且那个小窗口一直闪…好在我想起来可以不用多平台支持,加上-j8,节省了大量编译时间。 Continue reading 痛苦编译xv6

额,Rust

首先,我觉得利益和技术需求远不足以撑起Rust社区,那剩下就是情怀了~

近几年新语言的官方定位和实际应用普遍有偏差。Rust是个例外,剑指C++,意在打造一个没有历史包袱的Modern语言。(我觉得阻碍Scala发展的其中一个原因也是迎合Java)。经历了大大小小的版本变革,Rust基本稳定了,并且社区反馈不错。学了点简单内容,记录一下。

管理工具

官方钦定了cargo

cargo new <ProjectName> --bin
cargo check
cargo build
cargo run

不加–bin默认编译出库。编译运行不加–release默认是debug版本。默认会创建git配置可以说非常方便。 Continue reading 额,Rust

拾起一点Python

这是我第一个系统学习的语言,不记得为什么后来没再用。那时候刚刚出现的3.0完全没普及。本文以Python3初学者的角度,看看语言层面有什么好玩的东西。

Print

我的第一个学习资料中,作者使用了大量的print语句log调试。2.x版的print语句(不是函数)简直太方便。我不是很理解3.x版的print函数价值在哪,难道是直接回调?

P.S. 甚至Scala都开始去除部分括号。

运算符

python的运算符比常规语言多一点,而且令人印象深刻。

  • 常规运算,+ – * / %
  • 地板除,//;乘方,**
  • 交互模式下有_,上一次输出的字符。
  • 赋值,=。可以多重赋值,比如交换变量。Go也学会了这一招。
    a = 1
    b = 2
    a, b = b, a
    

Continue reading 拾起一点Python

C++之无聊小技巧三.1

上文讨论了一工厂和访问者,为了贯彻娱乐精神,我们接下来组合这两个机制,看能搞出什么花样?

struct WidgetVisitor {
  virtual Widget *createNut(Nut &nut) = 0;
  virtual Widget *createBolt(Bolt &bolt) = 0;
};
struct Bolt : Widget {
  void accept(WidgetVisitor &v) { v.createBolt(*this); }
};
struct Nut : Widget {
  void accept(WidgetVisitor &v) { v.createNut(*this); }
};
struct WidgetFactory : WidgetVisitor {
  Widget *createNut(Nut &nut) { return new Nut; }
  Widget *createBolt(Bolt &bolt) { return new Bolt; }
};

使用的时候是这样:

Nut nut;
Bolt bolt;
WidgetFactory wc;
Nut *pNut = bolt.accept(wc);
Bolt *pBolt = nut.accept(wc);

哈哈,是不是有一种想打人的冲动?这也正体现本文的关键字——无聊。 Continue reading C++之无聊小技巧三.1

C++之无聊小技巧三

上一篇扯了一点设计模式,本文接着讨论。以下内容仅供娱乐。

先看一个朴实的例子:

struct Widget {};
struct WidgetManager {
  Widget *getWidget() {
    Widget *pw = this->createWidget();
    widgets.push_back(pw);
    return pw;
  }
private:
  virtual Widget *createWidget() { return new Widget; }
  vector<Widget *> widgets;
};
struct Bolt : Widget {};
struct BoltManager : WidgetManager {
  Widget *createWidget() { return new Bolt; }
};

Continue reading C++之无聊小技巧三

C++之无聊小技巧二

接下来扯一点设计模式。一般的业务框架会包含大量的模板方法模式,它的目的主要是为了复用代码。看个简单例子:

struct SessionManager {
  void execute() {
    open();
    run();
    close();
  }
private:
  void open() { cout << "session start" << endl; }
  void close() { cout << "session end" << endl; }
  virtual void run() { cout << "run" << endl; }
};
struct Printer : SessionManager {
  void run() { cout << "print ABC" << endl; }
};
int main() { 
  SessionManager *a = new Printer(); 
  a->execute();
/*
print: 
  session start
  print ABC
  session end
*/
}

Continue reading C++之无聊小技巧二

C++之无聊小技巧

通用编程语言的基本特性都相差不远,同时也各有各的玩法。C++特性之多首屈一指,各种其他语言看不到的玩法,当然其实用性也有限。本文简单探讨一些无聊并有趣的技巧,特性或者Idiom。演示这些的目的在娱乐,并不建议在工程中使用。

诊断

C语言本身就有assert(),不过没有输出信息。C++11又加上static_assert(),支持输出信息。
在这之前可以自己实现带输出的诊断:

#define m_assert(condition, message){ \
  if ( !(condition) ) {  \
    print("Assertion failed:", message);  \
    exit(-1); \
  }  \
}  \

或者这样:


assert(condition && message)

Continue reading C++之无聊小技巧

C++,STL的小故事

一位逻辑学家Robert Kowalski说过Algorithm = Logic + Control。什么是Logic?什么又是Control?其实就是业务逻辑和控制流。

大多情况下,我们要简化的流程就是循环。有个理念叫“no raw loop”,不是说禁止你用for loop,而是将循环流程封装起来,只在业务层暴露抽象算法接口。《Effective STL》中也有过类似探讨——Item 43. Prefer algorithm calls to hand-written loops

Continue reading C++,STL的小故事

加密?

本文会假设你了解过密码学,接着演示一个RSA算法实例。最后试图引发一些问题。下面进入正题。

非对称加密,又叫公开密钥加密。先看一个熟悉的场景

小明同学不厌其烦地ssh到某台机器,十年如一日地敲密码。通常情况下,这种密码又复杂又长。终于,小明受不了了。他先ssh-keygen生成密钥对,再将公钥ssh-copy-id到该机器,就此进入了免输密码时代。

这里利用的当然就是非对称加密技术。逻辑上我们拿到公钥不能推导出私钥,却能推导出加密信息,是不是有点玄学?所以现实中退而求其次,只求反向推导过程超级复杂即可。这里最常见的就是RSA算法,其名源为三个图灵奖作者的姓氏首字母。 Continue reading 加密?