一个普通技术宅的点点滴滴

0%

今天的课和作业比较多,没有进行额外技术方面的学习。但在零碎时间里用kindle看了《浪潮之巅》的“幕后的英雄——风险投资”这一章,对目前的IT的风投创业过程有了一定的了解,整体大致如下:

风险投资是一种新型的投资方式,既不需要抵押,也不需要偿还,如果成功,风投资本家可以获得几倍、几十倍甚至上百倍的回报,如果不成功,钱也就打水漂了。

  1. 创业者有一个好点子,认为这种技术很有前景,于是及时申请专利(关键,涉及知识产权)
  2. 继续对这项技术对于原有技术的提高的数量级进行模拟测试(关键,将决定技术是革新性的还是革命性的)
  3. 模拟将来可能的应用情景,补充相应的专利
  4. 自己或者让合伙人一起制定一个商业计划描述商业情景(关键)
  5. 找到对自己项目中意的天使投资人,让其对自己进行天使投资(PS:天使投资人,就是专门针对初创公司,进行项目评估并投资的一群人,这轮投资叫做天使轮)
  6. 进行股权分配,继续运营,直到形成一定规模,需要更多资金注入时,找到风险投资公司,进行第N轮的投资,最终选择合适的时机上市

(由于进行了多轮投资,此时创始人手中的股权已经被稀释得差不多了,一般来讲,一个创始人在公司上市时还拥有10%的股份就很不错了)

这还只是非常简化的版本,实际创立一个公司要比上面的步骤复杂的多,可见创立一个公司,看起来容易,其实要做好的话,并不是拥有技术就能成功的。而一般来说,创始人到最后基本上已经不能控制公司了。创业水深,进入之前一定要做好十足的功课啊!前一定要做好十足的功课啊!

今天对C++的类的基础创建操作进行了学习,但今天让我印象最深刻的还是class与struct的区分

学过C语言的人对于struct都应该印象深刻,如果没有接触C的话可能会以为类只能用class来声明,但其实不然。
在C
中,struct的用法被进行了扩充,struct也是可以起到声明类的功能。

而struct和class的不同之处就在于struct成员的默认访问权限不同,struct是public,而class是private。换句话来说,下面两种形式的代码是等价的:

    class cla
    {
      //Nothing
      private:
      //Some code
      public:
      //Some code
    }

    struct cla
    {
      //Nothing
      private:
      //Some code
      public:
      //Some code
    }

由于class和struct的本质区别只有默认访问权限,所以如果我们自己再次进行定义访问权限的话,就不受到默认的影响了。所以,一般来说,用哪个都可以,但是为了代码的可读性,在定义的东西更接近于类的时候就用class,而接近于一个数据结构的话就用struct。话就用struct。

使用github的人都知道git这个版本控制软件,我也不例外,但之前一直处于一个“够用就好”的状态,命令只认识clone add commit和push,今天对git的分支和回滚方面进行了进一步的了解

git的详细指令可以

man git

git的分支是用来标记特定的代码提交,每一个分支通过SHA1sum值来标识,所以对分支进行的操作是轻量级的,所改变的仅仅是SHA1sum值。分支可以合并,但合并后仍然可以在原来的几个分支上进行开发。

今天还学到的是,最好不要用git pull,而是用git fetch和git merge代替之,因为git pull的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。当然,多数时候这是没问题的,但一旦代码有问题,你很难找到出错的地方。

今天对vi下的命令进行了一些学习,虽然学了,但是要勤加练习才有用,把vi的常用指令贴在下面,以供日后复习

移动光标

  • h:向左移动一个字符
  • j:向下移动一个字符
  • k:向上移动一个字符
  • l:向右移动一个字符
  • [Ctrl] + f:屏幕向下移动一页
  • [Ctrl] + b :屏幕向上移动一页
  • 0:跳到光标所在的行的开头
  • $:跳到光标所在的行的末尾
  • G:移动到文件的最后一行
  • gg: 移动到文件的第一行

搜索和替换

  • /word:向光标之下寻找一个名称为 word 的字符串
  • n1,n2s/word1/word2/g:n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2
  • 1,$s/word1/word2/gc:从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代

复制、粘贴、删除

  • yy:复制光标所在的那一行
  • x :删除光标所在的字符
  • dd:删除光标所在的一整行
  • p,P:粘贴复制的内容,p为粘贴在行后,P为行前
  • u:撤销之前所作的操作
  • [Ctrl]+r:还原上一个动作
  • .:重复上一个动作

不同方法进入编辑模式

  • i:插入模式(向前插入)
  • a:插入模式(向后插入)
  • o:插入模式(下一行插入)
  • r:替换模式

进入编辑模式后按[esc]返回

其他操作

  • :w:保存
  • :q:退出

在学习这些命令之后,要多加复习才不会遗忘,所以应该制作一张表格放在书桌醒目的位置,以备随时查阅

中文命令行

有一定经验的linux用户都知道,linux下有很多tty,有的是运行纯命令行的tty,当然为了装逼特殊需求,我们可能会用到在命令行下的一些工具,让命令行变得实用,今天我便对这些装13工具进行了一些了解

首先是在纯命令行下的中文支持,我们用

sudo apt install fbterm fctix-fbterm-fronted

来安装中文命令行和小企鹅拼音输入法,由于我目前使用的ubuntu17.04默认开启,所以不需要手动配置framebuffer

为了保证能够正常运行,还需要将自己的用户加入video组

sudo usermod -a -G video username

修改权限:

sudo chmod u+s `which fbterm`

使用

fbterm -i fcitx-fbterm

开启fberm并启用拼音

播放电影

安装:

sudo apt install mplayer

播放:

mplayer -vo fbdev2 <xx.avi>

PS:配合弹幕下载+xml转ass弹幕,你还可以享受在命令行看弹幕视频的感觉,如果想用字符画输出的话,将fbdev2改为aa(黑白)或者caca(彩色)

截图工具

安装:

sudo apt install fbcat

使用:

fbgrab XX.png

分屏软件

sudo apt install tmux

今天逛学信网的时候发现学籍信息已经录入,马上到阿里云购买了学生优惠主机,想到学校没有OJ系统,便决定利用现有的开源项目,自己搭建一个OJ系统。

购买阿里云后,开始ssh一直上不去,后来发现原来是没有设置端口开放。在控制台里配置好后,ssh登陆服务器

我使用的是HUSTOJ开源项目,按照教程搭建后,就可以通过80端口直接访问服务器,在注册admin账户后,oj就算搭建好了,但因为没有备案,目前只能使用IP地址访问,题库也有待完善��

今天比较忙,所以咸鱼了一下,只是对python的matplotlib绘制条形图做了一下了解。

首先是用matplotlib绘制条形图,只需要调用pyplot的bar()方法,下面是一个基本使用

plt.bar(range(len(data)), data)
plt.show()

BTW,x轴的坐标除了可以用range()生成以外,还可以使用numpy库的arange()方法来生成,这个方法与range()类似,但可以产生小数,返回一个数组
例如

numpy.arange(1,4,0.5)

这个语句返回的就是一个(1,1.5,2,2.5,3,3.5,4)这样的数组一个(1,1.5,2,2.5,3,3.5,4)这样的数组

今天对着《Python极客项目编程》上的第一个例子进行学习,了解了plistlib,matplotlib,numpy库的一些使用,但是在运行过程中出现了一些问题,在此做下记录。

有问题的代码如下:

file=open("common.txt",'w');
for val in commonTracks:
    val=val[0];
    s= val+'\n';
    file.write(s.encode("UTF-8"));

运行时,解释器提示write方法接收的不是一个字符串。经过一番排查发现,通过encode转化为的并不是字符串,而是字节流bytes,在python中,bytes是字节流bytes对象,字符串是字符串str对象。

我们可以在python下实际运行一下这段代码

a="Hello World";
print(a.encode("UTF-8"));

我们会得到这样的输出:

>>> print(a.encode("UTF-8"));
b'Hello World'

看起来和普通的字符串只是多了一个b,但这就表示这是一个字节流bytes,所以我们如果要向文件写入字节流的话,就要在open函数里,使用二进制模式,即将原来的代码改为

file=open("common.txt",'wb');

便解决了问题。

当我们想要让某个程序开机在后台启动的时候,一种维护性较好的办法就是在linux下加入一个开机启动服务。

今天对于linux下的服务脚本的做了一些了解,环境为ubuntu 17.04

首先,系统上的每个服务的脚本都保存在/etc/init.c 下,这些文件都是一些sh脚本,可以直接执行。
下面是一个是一个init脚本:

#!/bin/sh                                                         
### BEGIN INIT INFO
# Provides:       kcptun
# Required-Start: $network $syslog $local_fs $remote_fs $named
# Required-Stop:  $network $local_fs $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description:  The start of kcptun
# Description:    A script to run kcptun
### END INIT INFO


PATH=/usr/local/bin:/sbin:/usr/bin:/bin

case "$1" in
  start)
      #sth. to start service
      ;;
  stop)
      #sth. to stop service
      ;;
  restart)
      #sth. to restart service
      ;;
  status)
      #sth. to get service status
      ;;
  *)
      echo 'Usage: service myservice {start|status|stop|restart}'
      echo ''
      exit 1
esac
exit 0

首先是上面的注释部分,第一行是指明解析使用的解释器,然后便是INIT INFO,这里也是必不可少的部分,里面记录了脚本的一些相关信息,具体如下:

  • Provides: 服务名称,这个应当和文件名相同
  • Required-Start:表示在这个服务启动前需要启动的服务
  • Required-Stop:表示在这个服务关闭前需要启动的服务
  • Default-Start:表示这个脚本在指定的运行等级下会启动
  • Default-Stop:表示这个脚本在指定的运行等级下会关闭
  • Short-Description:简短描述
  • Description:描述

然后声明PATH变量,方便我们调用各种脚本

接下来是对传入参数进行判断,这里的 $1 是传入的参数,可以在里面的不同参数下加入自己的代码

然后将这个文件放到/etc/init.d/下

在/etc/rc.d 下我们可以看到各个服务在不同运行级别下的启动关系,当然我们并不需要亲自去修改这些文件,系统已经给我们提供了工具来自动修改这些文件,在ubuntu下,这个工具是update-rc.d

我们可以运行

update-rc.d <yourservice> default

便可以让系统配置好脚本,在合适的时候启动�动

今天本要写一个Web Extension,但一个密码框加入图标的方法目前没有什么好的解决方案,所以便暂时放置,转而学习gqrx的使用


gqrx是linux下的一个开源的软件无线电程序,我配合hackrf硬件,进行了FM和航空无线电的接收实验。

FM广播接受

打开gqrx,启动,在Reciver option中进行如下设置:

  • Frequency:频率,输入大致要收听的频段
  • Mode:这里选择WFM(Mono)以收听调频广播
  • AGC: Fast
  • Squelch:这个值在能听清的情况下越小消除噪音效果越好

此时应当能听到沙沙声,观察图像,黄色和红色的部分就是有无线信号的地方,拖动红线,就可以切换频道收听了

航空无线电接收

航空无线电接收与FM广播也是大同小异,只要把mode调至AM,并调到适合的频率,就可以听到机组与地面的通信了,但是我由于等了半个小时也没收到通信,于是就不贴图了贴图了