Ubuntu 装机总结

本以为常年 Ubuntu 装机小达人的我不会再出现重装的失败的情况,不想,竟然成功将自己的重装次数刷新到30次(仔细想想,不应该是30次,应该是50次都有了吧)。

绝望之余,打算记录一下自己装机的心路历程。

  • 首先很恶心的一件事,Ubuntu 安装的时候如果网络环境不好,那么安装程序会闪退。基于 Ubuntu 的 mint 就没有这个问题。可见 Ubuntu的安装程序写的有多么不鲁棒。。(WTF)。
  • 再一个事情,cuda 最近(2019-03-19)安装不上了。我不知道是内核的原因,还是 header 的问题,反正就是安装不上了。我想尝试一下 runfile,看看能不能安装上,如果不能安装,那么我打算在网上找一个教程。我连 cuda 都没能装上,真不知道是哪里出了问题。
  • 装不上的表现是,mint 无法进入图形界面,并且键盘和鼠标都没有反应。-.- 我的天啊。

放弃了,真是老狗,只要安装 nvidia 驱动电脑就启动不了,闹呢,浪费这么多时间。
我也想只安装 cuda 然后直接上 docker 然后上 deepo 啊。


19日晚:明天再试试自带的驱动。

为啥重装呢?

之前的根目录分的还是太小。分给根目录32G,然后给/usr/local分了大概128G,但是东西都安装到 /usr/bin/lib 下面了,索性就重装了。当然/home是肯定分出去了的。



With third-party driver ( nvidia – 390 ) I finally success. ALL HAIL MINT !

最后通过 Mint 安装了一下第三方的 nvidia 驱动,390版本,终于成功了。看来以后还是要搜索相关的博客才行了。

编程语言与知识基础

随着一部分编程经验的增长,我越来越觉得,是在知识基础上实现应用的工具。

最初,在我进行应用编码的时候,往往让我 stuck 的东西就是基础知识。这种基础知识,比如 WSGI,session,cookie 这些东西;以及过于焦急的学习心态。总想做出点什么,但是却没有意识到做出一个东西需要积累和时间。

语言的重要性在于,大量的使用语言会让你更了解你所使用的,与计算机交流的方式。这个很重要。语言使我们本身就站在巨人的肩膀上处理事情。因此,专注于一门语言在最初是十分重要的,因为我想很多人像我一样急于求成,并且很难按下心来慢慢学习知识基础。

意识到的时间似乎有点晚,但是不算太迟。我也能够花一些时间在知识基础上,使得事情解决的更加清晰。

还有就是硬件。想象中总是很美好的,但是实际上编程过程中,若是不考虑硬件,不考虑拓扑是不可取的。这是视角割裂。最近一直都在读一些软件工程方面的书,但是读的越多,越不敢说。

潜意识里,读的越多越发现自己懂得少,害怕自己说错。

就这些,算是给 2018 年读者的一个交代。

将已经运行的进程切换到后台

之前一直都是用 screen 来后台运行 Linux 进程,但是 screen 对于已经在运行的进程就不方便处理了,这个时候怎么办呢?

  • 0. Run some SOMECOMMAND
  • 1. ctrl+z to stop (pause) the program and get back to the shell
  • 2. bg to run it in the background
  • 3. disown -h so that the process isn’t killed when the terminal closes
  • 4. Type exit to get out of the shell because now your good to go as the operation will run in the background in it own process so its not tied to a shell
  • 套路摘选自下面的连接。
https://sites.google.com/a/kossboss.com/main/linux—move-running-to-process-nohup

这次训练直接用 bg 结果把自己的任务直接干掉了。。。「sad」。记得用 disown -h 来让任务逃离 「terminal」的控制。

Django tricks

关于 session

django.contrib.sessions.middleware | Django documentation | Django

session 是使用 cookie 来进行判断的,通过 session_cookie_name 来提取,然后通过 SessionStore() 来保存。

因此,Django 也是通过 sessionid 来区分用户;(或者其他什么名称)。

使用 cache 作为全局变量

cache.set(‘foo’, ‘bar’) # another function cache.get(‘foo’) # get ‘bar’

使用 cache , django-redis 是一个好方法。可以在使用 cache.lock变量,在应用层面加锁,来完成异步操作,还可以支持分布式应用,十分方便。

Ubuntu 多显示器方案

多显示器方案。
使用 `xrandr` ,输出当前存在的screen
Screen 0: minimum 8 x 8, current 7680 x 2160, maximum 16384 x 16384
DP-0 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 connected 3840x2160+3840+0 (normal left inverted right x axis y axis) 510mm x 287mm
1920x1080 59.93*+ 59.94 
1680x1050 59.95 
1600x900 75.00 60.00 
1440x900 59.89 
1280x1024 75.02 70.00 60.02 
1280x720 59.94 
1152x864 75.00 
1024x768 75.03 70.07 60.00 
800x600 75.00 72.19 60.32 56.25 
720x480 59.94 59.94 
640x480 75.00 72.81 59.94 
DP-4 disconnected (normal left inverted right x axis y axis)
DP-5 disconnected (normal left inverted right x axis y axis)
eDP-1-1 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 380mm x 210mm
3840x2160 60.00*+ 59.97
找到命运的显示器,然后输入
xrandr --output eDP-1-1 --auto --output DP-3 --auto --scale 2x2 --right-of eDP-1-1
问题解决。
—-
2019-01-19 补充
不怎么 work,总是闪屏。。

My Keras tricks.

记录了一些使用 keras 的技巧。

categorical_crossentropy vs sparse_categorical_crossentropy.

3. The Answer, In a Nutshell

  • If your targets are one-hot encoded, use categorical_crossentropy.
  • Examples of one-hot encodings:
  • [1,0,0]
  • [0,1,0]
  • [0,0,1]
  • But if your targets are integers, use sparse_categorical_crossentropy.
  • Examples of integer encodings (for the sake of completion):
    • 1, 2, 3

clip norm


https://wulc.me/2018/05/01/%E6%A2%AF%E5%BA%A6%E8%A3%81%E5%89%AA%E5%8F%8A%E5%85%B6%E4%BD%9C%E7%94%A8/
可以加速 RNN 训练

Multiple GPU

# https://keras.io/utils/#multi_gpu_model#

使用多GPU,注意使用 save 的时候,传参传 model (multi_gpu_model的model参数)

Encode Labels

可以把不同的字符[‘aa’, ‘bb’, ‘cc’, ‘aa’] 编码成 [0, 1, 2, 0]

1
2
3
4
5
6
# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)

训练中存在的问题

训练性能低了别急着调参,首先看看数据预处理有没有问题,评价指标是不是写错了。再一个,batch norm 要勤快点加上。

相似的文章还有:https://svtter.cn/2018/02/01/keras%e5%9d%91/

为你的 Docker 项目集成 ELK

https://github.com/twtrubiks/docker-elk-tutorial

基本上按照这个配置就可以了,创建 @timestamp 这一步,可以用如下脚本替代 Postman

$ curl -XPOST -D- 'http://localhost:5601/api/saved_objects/index-pattern' \
    -H 'Content-Type: application/json' \
    -H 'kbn-version: 6.5.4' \
    -d '{"attributes":{"title":"logstash-*","timeFieldName":"@timestamp"}}'

这也是 tutorials 中,使用的 ELK images 给出的。

https://github.com/deviantony/docker-elk

继续阅读

使用 beego 一键生成 API

首先要吐槽一点:beego 的文档对于新手实在是太不友好了。

beego 的官方文档会出现一些问题,比如 tutorials 里面,应该是 beego run 而不是 beego run hello

beego 是啥

beego 是 golang 的一个 web 开发框架,集成了不少远 golang 没有的有价值的函数,对于快速开发高性能的 go 应用有不少帮助。

如果想开发简单的 go 应用,其实可以不使用 golang 框架,因为 go 本身就定义为云计算时代 C 语言,很多功能其实以及包含了,没有必要学习一个框架给自己增加不必要的麻烦。

继续阅读

手把手教你搭建 vue-cli

vuejs 这东西,实不相瞒,学习了很长时间,从看文档到使用,大概有一年的时间。当然,其实上手没有那么难,<script src="vue.js"></script>这样就搞定了。只是想要用的比较优雅,存在一定的难度。

但是硬核玩家肯定不能止步于此。于是就开始了vue-cli的探究。没想到这个探究如此之长,以至于我在很长一段时间内,都没有正儿八经的写过前端。

继续阅读