CS110L-Week 1 Exercises: Hello world

第一周作业链接: https://reberhardt.com/cs110l/spring-2020/assignments/week-1-exercises/

第一周的作业主要是熟悉Rust的工具链安装和一些Rust语法

第一部分 helloworld

安装工具链,访问Rust官方: https://www.rust-lang.org/tools/install

helloworld

cargo 提供了命令行来创建rust项目

cargo new helloworld

然后就可以cargo build 或者cargo run

➜  helloworld git:(main) ✗ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    ├── CACHEDIR.TAG
    └── debug
        ├── build
        ├── deps
        │   ├── helloworld-681c2ade33f71cab
        │   └── helloworld-681c2ade33f71cab.d
        ├── examples
        ├── helloworld
        ├── helloworld.d
        └── incremental
            └── helloworld-3gmsxxterlir4
                ├── s-fw1pxstg53-1leo6ld-2439fudoc3hif
                │   ├── 14i0bcdbfi2ugad2.o
                │   ├── 15ne1gcrt9rvpglq.o
                │   ├── 18abmkatn3n4l0hu.o
                │   ├── 27s29o1kcsspusdg.o
                │   ├── 2xwm4i2jxgoiz5co.o
                │   ├── 3050lnwbirtj1yb5.o
                │   ├── dep-graph.bin
                │   ├── gp126zvew3eug9.o
                │   ├── q4wkdgq1k2s2v4m.o
                │   ├── query-cache.bin
                │   └── work-products.bin
                └── s-fw1pxstg53-1leo6ld.lock

从上面可以看到,整个项目的结构。src/main.rs 是源代码 target中的目录为编译生成的目录

main.rs 自带hello,world

fn main() {
    println!("Hello, world!");
}

Cargo.toml是包依赖

[package]
name = "helloworld"
version = "0.1.0"
authors = ["Jimmy Xiang <xxg1413@gmail.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

第二部分 Rust语法热身

    let n:i32 = 1;
    let n = 1;


    //可变类型
    let mut  n = 0;
    n = n + 1;

    //Rust有两种字符串: &str和String
    let s: &str = "hello,world"; //只读数据段

    let mut s: String = String::from("hello,");
    s.push_str("world");
    println!("{}", s);


     //动态数组
     let mut v: Vec<i32> = Vec::new();
     v.push(2);
     v.push(3);

     
     //固定大小数组
     let mut arr: [i32; 4] = [0,2,4,8];
     arr[0] = -2;
     println!("{}", arr[0]+arr[1]);


     //迭代器
     for i in arr.iter()
     {
         println!("{}",i);
     }


     //while
    let mut sum = 0;
    let mut i = 0;
     while i < 20 
     {
         i += 1;
         sum += i;

     }

     println!("sum={}",sum);


    //loop  它有助于编译器对变量初始化进行一些假设。
    let mut i = 0;
    loop {

        i += 1;

        if i == 10 {
            break;
        }
    }

    println!("i={}",i);

    //函数

    fn mysum(a: i32, b:i32) -> i32 
    {
        a + b  //Rust是一种基于表达式的 语言,不需要分号

        //a + b ; 会出错
    }
     
    println!("sum={}", mysum(1,2));

练习:

use std::collections::HashSet;
//练习

fn add_n(v: Vec<i32>, n: i32) -> Vec<i32> {
    

    let mut result: Vec<i32> = Vec::new();

    for i in v.iter() {
        result.push(i+n)
    }

    result
}

fn add_n_inplace(v: &mut Vec<i32>, n: i32) {

    let mut i = 0;

    while i < v.len() {

        v[i] = v[i] + n;
        i = i + 1;
    }
}

fn dedup(v: &mut Vec<i32>) {


    let mut hs = HashSet::new();
    let mut i = 0;

    while i < v.len() {

        if !hs.contains(&v[i]) {

            hs.insert(v[i]);
            i += 1;

        }  else {

            v.remove(i);
        }
    
    }
}



#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_add_n() {
        assert_eq!(add_n(vec![1], 2), vec![3]);
    }

    #[test]
    fn test_add_n_inplace() {
        let mut v = vec![1];
        add_n_inplace(&mut v, 2);
        assert_eq!(v, vec![3]);
    }

    #[test]
    fn test_dedup() {
        let mut v = vec![3, 1, 0, 1, 4, 4];
        dedup(&mut v);
        assert_eq!(v, vec![3, 1, 0, 4]);
    }
}

第三部分 Hangman

代码:

libfuzzer demo-01

在上CS110l中有一个程序用来说明C/C++内存不安全的问题,我学到这里想着就用libfuzzer来fuzzer一下吧,顺便学习一下libfuzzer。

libfuzzer我已经搭建好了的,你可以根据https://github.com/Dor1s/libfuzzer-workshop来搭建环境。

源程序:

#include <stdio.h>
#include <string.h>

int main()
{
    char s[100];
    int i;
    
    printf("\nEnter a string:");
    gets(s);

    for(i = 0; s[i] != '\0'; i++)
    {
        if ( s[i] >= 'a' && s[i] <= 'z')
        {
            s[i] = s[i] - 32;
        }
    }

    printf("\nString in Upper Case = %s", s);
    return 0;
}

很明显,这里是有缓冲区溢出的漏洞,gets函数不安全。最后发现,gets在C++11中被移除了,这个程序编译不过,放弃。

成长型思维——志存高远

怎么样志存高远

  • 敢于梦想
  • 抓住机会
  • 创造有利的环境
  • 负起责任
  • 选择自己的命运

更高的志向的人努力做到下面四点

  1. 创造未来
  2. 变革与颠覆
  3. 专注使命
  4. 抛开理性

敢于梦想的简单问题

  1. 10年后我希望自己是什么状态?
  2. 要实现10年目标,需要什么技能,经验和支持
  3. 为了实现我的目标,我需要在1年,2年,3年,5年的时间取得哪些成果
  4. 本周我需要些什么才能起步?现在应该做些什么?

回答:

  1. 10年后至少是不后悔的模样,希望有一个幸福的家庭,有孩子,也有自己的事业,爱好。最好能做一家实现自己梦想的公司,有好的团队,有希望上市。
  2. 需要各种知识,提高认知能力,交际能力,演讲能力,财务能力,投资能力,需要抓住机会,深入一个场景深耕几年,需要耐心,专注而且可以自得其乐,实现自己的价值,找到一条少有人走的路。
  3. 需要一个长期的规划,在1年,2年,3年,5年不断的向目标逼近
  4. 本周主要是一些做一些对长期来说非常有意义的事情,比如看书,独立思考,提高认知能力,向内看也向外看。现在应该养成一些良好的习惯,努力找方向并确定下来。

成长型思维——七种思维模式

思维模式目录

  1. 志存高远
  2. 用于行动
  3. 坚韧不屈
  4. 积极乐观
  5. 承担责任
  6. 善于合作
  7. 不断成长

1.思维方式的分类?

思维方式分为固定型和成长型

2.思维模式的重要性

一个人从平凡到伟大,就是从技能到思维的转变,独特的思维方式才是成功的关键

3.成长型思维的意义

人在成长型思维模式下,看待世界的方式是非常灵活的,相信世界的所以事情都是改变着的,每一个人都在不断的成长和进步,更愿意看到别人身上的优点和潜力,拥有积极的人生观。

可以更好的针对不确定性做出反应。

4.思维模式是否可以学习?

可以学习,思维模式也存在差异,但是是可以被观察和记录的,成功的思维模式是可以被任何人学习的。

[好文分享]傅盛认知三部曲

傅盛在2017年,分享过三篇文章,谈认知,推荐一下。

  1. 傅盛认知三部曲之一:所谓成长就是认知升级
  2. 傅盛认知三部曲之二:管理本质就是认知管理
  3. 傅盛认知三部曲之三:战略就是格局+破局
  4. 傅盛认知三部曲后记:到底什么是认知?

认知三部曲笔记

所谓成长就是认知升级

人的四种认知状态

  • 不知道自己不知道——以为自己什么都知道,自以为是的认知状态。
  • 知道自己不知道——有敬畏之心,开始空杯心态,准备丰富自己的认知。
  • 知道自己知道——抓住了事情的规律,提升了自己的认知。
  • 不知道自己知道——永远保持空杯心态,认知的最高境界。

人需要保持谦卑的状态,时刻学习的状态,不断自我否定反省,才能真正的成长。主要是因为现在的行业变化太快,知识也变化太快。

认知的重要性

人和人拼的就是对一件事情的理解,对行业的洞察,执行本质是实践认知。真正的认知需要通过行动展现,行动一旦缺失,认知容易陷入误区

认知升级

1.以为自己知道,远远不如以为自己不知道

这种很正常,半桶水容易出事,不知道就不会去做,可以避免一些风险。自我否定,假设自己无知,才能认知升级。

2.以为自己认为重要和真的认为重要,往往不是一回事

这种状态很正常,判断事情的重要性是决定性的,这和方向有关系,走错了再努力也没办法。不行动的认知,就是伪认知,需要去行动,去参与才是真正的认知。

认知升级的三剂解药

1.坚信大趋势

不理解,就执行,在执行中理解。这句话非常对,大趋势下一定要行动,先进去。不行动,是最糟糕的。行动,才有可能证伪

2.对外求教,不做井底之蛙

对内求索,只是学习,对外求教带来的是新的认知。不要以自我为中心,不向外看。确实要多和人交流,和行业外的人交流,与陌生人交流。

3.活在当下,面向未来

多错才有机会对,确实,量变才有质变,要接受失败,要战胜恐惧。

认知的本质

认知的本质就是做决定。认知偏差导致完全不一样的决定。你拥有的资源、兵力,都不重要,核心是你脑海里的大图和你认知的能力。

管理本质就是认知管理

判断力

第一篇说了认知就是做决定,怎么才能做正确的决定,就需要判断力。管理者需要有判断力才能做正确的决定,所以需要认知。管理不是执行管理,不是组织结构管理,而是你比别人更理解一件事情。领导力的核心不是所谓的高情商,而是在大格局下构建对整个行业的认知体系,用大趋势做出正确的判断和聪明的决策。

一体两翼三个管理维度

  1. 一体:构建领导者的认知体系

个优秀的领导,必须在核心点上拥有覆盖队伍的认知体系。领导的认知需要大于一个队伍,应该他是做决定的那个人。

认知体系,是在脑海里有完整的认知框架,才能做出正确的判断

怎么建立认知框架

  • 对市场和产品的深入了解是认知体系的基础
  • 真的要去和市场上吃过猪肉的人多聊天
  • 切忌以听报告的方式建立认知

谁建立正确认知,谁就脱颖而出。

2.两翼:认知管理的两剂良药

  • 学会逆向思考,如果花的时间少一半,事情能否做得更好
  • 战略的略是忽略,不敢忽略,本质是分不清优先级

管理更有效率,其实最好就是只做判断的事情。不要忽略战略,要分清优先级。要知道什么是更重要的。找到最关键的点,牢牢不放

3.三个管理维度:信息、时间、人

1.信息

需要足够大的信息输入,足够高的反思频率,才能信息输出,才能产生格局,做出正确判断

信息应该怎么输入

  • 深入分析对手
  • 定期遍访行业
  • 不断招聘行业里的人

一个领导者的本质就是做正确的决定。有一句话叫主将无能累死三军。执行很难的本质是没有做出正确的决定。

2.时间

时间的分配,表明了一个领导者对实际情况的优先级判断。

需要反思时间应该如何分配

3.人

一句话:学会通过管一个人达到管一片人的目的

  • 要简化对人的管理,找到关键人
  • 其次就是简化目标

团队目标越简单,越明确,越容易达成一致

现在我做管理,就简化成“定目标”和“找关键人”。目标要简单清晰,人要能挺身而出,超出预期,一战就要解决问题。

好领导,首先是打胜仗。开战之前,就要有七分胜算。这七分胜,就靠认知。打的就是认知之仗。看上去千军万马在打,本质是两个将领脑海里的战争格局。胜负基本已定。先胜后战,胜算就在认知

战略就是格局+破局

战略三部曲

1.预测

预测背后就是格局观。勤奋依然很重要,但聪明的勤奋才是关键。这个时候,就要求我们想清楚,行业里的大风在哪里,并做出预测。

格局思考

美国人强调“think different”很有情怀,后来才发现,本质不是情怀,而是为了减少竞争成本。因为美国创业者们比我们更早进入血海竞争阶段,“勤奋+努力+不要命”已经很难产生质的差别了,才逼迫他们用“更勤奋的思考”来避免高成本的竞争,从而降低失败概率。

2.破局点

所谓战略,就是在这样的格局认知下,找到破局点,制定路线图,投入资源

战略认知的两个误区

  • 见招拆招,啥热做啥,啥熟悉做啥
  • 做产品的方法论依然停留在5年前,认为抓一个简单功能热点就颠覆格局。

不要做单点,而是做一个大方向下的可串联的点,如果每个单点,不是在一个大格局下的累加,以致每个单点都会遇到对手强大的竞争,很难长大,需要在单点在聚焦,只把一个单点做到极致就能创造奇迹的时代,真的过去了。

怎么做战略

1.脑海要有大格局。大格局就是对这个行业深入的、清晰的认知。

我们需要花足够的时间去了解行业,去思考对手,去观察现象。在获取大量信息后,不断在脑海里做思维推演,去判断

2.养成格局和破局结合的思维习惯

你的格局,大风口。破局就是找到与众不同的那个点。二者缺一不可。

真正的超越机会,不是来自于在工作时间上把对手逼死,而是在认知深度上先把自己逼疯。

战略是在这个路线图下的势能的累加,不能累加势能的,再有效果的执行,本质都是增加成本

到底什么是认知?

认知是什么?

认知是基于一个综合情况而做出的一个精准判断

认知三要素

  • 输入
  • 训练
  • 判断

认知第一要素:信息输入与挖掘

信息挖掘的核心,就是广度深度兼得。

  • 广度:对很多新的现象和机会视而不见
  • 深度: 对当下处境和形势看不透

盲区:

  • 看不起-自傲
  • 接受不了-自卑

看不起

抗拒信息的输入,是非常不对的。看到一个现象,如果没有惶恐感,就会错过一堆现象。一个现象背后必然有大规律,而这个大规律背后,肯定还有别的现象根本不在你的视野。

当一个现象发生时,我们应该首先扑上去,了解它,吃透它,再想想背后的规律

接受不了

如果你能在信息输入与挖掘的过程中,把自傲与自卑对抗掉,获取信息的维度一定会好很多

克服盲区

  • 要能趴在地上面对自己
  • 要能学会倾听。

当我们学习时,应该趴在地上,每个人都挺高大,像小学生一样对别人保持崇敬和倾听;而遇到困难时,应该站得更高一点,虽然困难很多,但心态要乐观。

经验主义的问题在于,拿过去的经验作信息筛选,往往漏掉可能改变自己的很多新信息。

认知第二要素:思维模式训练

思维模式的训练中,还有一个非常重要的点叫自我挑战。即不断站在自己的对立面自我互搏。

所谓思维模式训练,就是不断进行“自己问自己”的思考训练。两个自我,反复博弈,无休无止,直至精进。

认知第三要素:自我博弈与输出判断

做判断,必须基于深度思考。而深度思考的核心标志,就是自我博弈

反思

  • 客观环境反思
  • 心态反思
  • 能力反思

面对困境时,多向内看,反求诸己;取得一些成绩时,多向外看,总结外在机会,警惕自傲。如此,认知能力才可精进。

精进,认知现实能力的不断升级。即通过大量信息的不断输入,反复的思维模式训练,不断自我博弈与挑战,克服自傲与自卑心态,使其认知结构在广度与深度上充分扩展,形成一套更高维度的、完整的认知框架,最终做出正确的判断和聪明的决策。

新的开始,2021年

直到1月份底,我才正式完成了2021年的年度计划。

今天,2月1日周一,也是算正式的开始执行。

我的计划如下

  • 恢复公众号P小二和FlyPython的更新
  • 新增公众号P爷说
  • 新增P爷说和Chindia Bar YouTube的频道并开始更新
  • 开始2021年的100天漏洞挖掘计划
  • 坚持每天更新晨间日志

今年,我们下定决心开始做YouTube,也算是进入了视频创作领域,希望先做半年看看效果。在制定总计划时,计划收入很大一部分是来自于漏洞挖掘和自媒体。我是认为2021年是对于我自己充满挑战的一年,希望今年我能够很好的完成计划。顺便期待有一个好的机会,有一个大爆发。

最后,希望我今年可以快速的成长,加油。

每日想法——2021年2月

2月1日

4个W

  • Who: 受众
  • What: 竞对分析
  • Why: 产品实用性
  • When:产品时间点

感觉最重要的还是产品

    2月2日

    用户定位确实非常的重要

    2月3日

    2月4日

    2月5日

    2月6日

    2月7日

    2月8日

    2月9日

    2月10日

    2月11日

    2月12日

    2月13日

    2月14日

    2月15日

    2月16日

    2月17日

    2月18日

    2月19日

    2月20日

    2月21日

    2月22日

    2月23日

    2月24日

    2月25日

    2月26日

    2月27日

    2月28日