我感觉我的审美变了

今晚,我再一次将我的图库整理了一遍,去除低劣的卖萌,卖肉,卖腐,卖泪,将更加精粹的更符合我现在口味的图留了下来。

(或许,被我去除的图并不低劣,但是啊,这毕竟是我的图库,一个随着我的审美变化而变化的图库,……所以,被我舍弃的图啊,请原谅我吧~)

就拿单人物肖像画来举例:

最初,我喜欢简单大方

{<1>}

vagrant 是坑...

如果自己重头开始建一个 base box,在为支持 vagrant 必要步骤即为:

1
mkdir ~/.ssh/
cd ~/.ssh

wget http://github.com/mitchellh/vagrant/raw/master/keys/vagrant
wget http://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub

mv vagrant.pub authorized_keys

然而,如果根据已有的 base box ,在里面装一大堆乱七八糟的东西后,再把它打包,成一个新的 box ,按照官网上说的,也很简单:

1
cd ~/.ssh

rm authorized_keys
wget -O authorized_keys http://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub

然而,我得到的结果是:

Python Path

大家都懂 python 模块搜索路径优先级为:

  1. 在当前目录下搜索该模块。
  2. 在环境变量 PYTHONPATH 中搜索。
  3. 在 python 安装路径中搜索。

然而,第一条其实很含糊,尤其是对类似学过模块管理功能先进的 nodejs 党的人来说。

先举个栗子:

1
#dir map
/project
|------ main.py
|------ /lib</p>
        |------ __init__.py
        |------ ex1.py
        |------ ex2.py

main.py 为可执行文件,要导入 ex1.py 。 而 ex1.py 依赖于 ex2.py ,所以 ex1.py 中需要导入 ex2.py 。那么问题来了,ex1.py 中该怎么写导入语句呢?

我是 nodejs 入门脚本语言的,所以第一反应是 :

1
import ex2

实例对象无法修改类变量的对象引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Example:
Call=0


print(Example.Call)
a = Example()
b = Example()
print(a.Call)
print(b.Call)

a.Call = 1
print(Example.Call)
print(a.Call)
print(b.Call)

作为Example的实例,a修改类变量为1,我预期是 在使得Example.Call变幻时,同时使b.Call也发生变化。

然而, 结果是:

1
2
3
4
5
6
0
0
0
0
1
0

Example.Call 与 b.Call 都没发生变化。可能的情况是 a.Call改变了对象引用 不与Example.Call引用同一对象,但这样的话 类成员就显得有些迷了, 比方说,我改变Example.Call的对象引用,b.Call不再与Example引用同一个对象, 那类成员不就失去了原来的意义,只能当是实例初始化时可供类修改的成员。

所以,我们还一个实验:

Archlinux Gnome3 环境下与fcitx的斗争

在 archlinux,无论是 fcitx 还是 ibus 配置都有点麻烦 (っ- ‸ – ς)

伟大的wiki给了我们非常好的指导

然而, 我还是在 fcitx 的安装配置上踩到了多个坑。

Start, 简单而又愉悦地根据 archwiki 上的指导, 安装 fcitx 与相应的辅助包:

1
sudo pacman -Rncd ibus
sudo pacman -S fcitx fcitx-configtool fcitx-im fcitx-qt5

在这里需要注意的也就是: 最好装上fcitx-im和fcitx-qt5, 除非你确认自己不需要

Then, 再次简单而又愉悦地根据 archwiki 上的指导, 修改 ~/.xprofile, 然后 reboot ( 这里主要是为了能够在 terminal 中使用 fcitx )

1
#at ~/.xprofile

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

Figth With Django Test !

assertTemplateUsed 一个用于测试 render response 的 template name 的东西,然而它的测试具有局限性,

e.g. :

project tree:

./template_test_project
├── db.sqlite3
├── template_test_project
│--├── __init__.py
│--├── settings.py
│-- ├── urls.py
│-- └── wsgi.py
├── manage.py
├── templates
│-- └── aaaa
│--     └── aaaa.html
└── template_test_app
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │-- └── __init__.py
    ├── models.py
    ├── tests.py
    ├── urls.py
    └── views.py

template\_test\_project.urls.py :

1
2
3
4
5
6
7
from django.conf.urls import url, include
from django.views.generic.base import TemplateView, RedirectView

urlpatterns = [
url(r'^redirect/', RedirectView.as_view(url='/')),
url(r'^$',include('template_test_app.urls'))
]

我的buffer-plus插件

vim 不只是一个好的代码编辑器,它还一个很好的代码阅读器。

首先,你需要通过以下几部完成基础配置:

  • 在编译vim时加上 --enable-cscope 参数
  • 然后再安装 cscopectags 这两款软件
  • 安装 tagbar 插件

当你想要阅读他人代码的时候,你只需要:

  • 在project的根文件夹下面使用 ctags -R && cscope -Rbq ,之后你的根文件夹下会生成 tagscscope.\* 文件
  • 此时,打开vim,你就可以通过 <C-]> 进行文件之间的函数、对象、宏跳转了,而通过 tagbar ,你又可以清晰的看见当前文件的定义列表(包括函数和对象和宏和全局变量)

然而,用 cscope 跳转时有一个问题 —— vim 通过 切换当前窗口的buffer 来进行跳转。

这里的问题不在于我得通过 :bp<CR> 才能跳转回之前的buffer, 而在于 对于习惯于通过 tab 方式控制文件流的我,无法清晰地看清到底有多少buffer(毕竟你可能会连续使用好几次 <C-]>), 需要调用 :ls<CR> —— 很麻烦。

我想到了将文件流控制的方式改为buffer,但是buffer方式是有缺点的,当然tab也有缺点。

对比:

  1. tab切换时可以允许当前文件未保存修改, buffer不行
  2. tab每次新开tab时,需要重新调用 NERDTreetagbar , buffer不需要
  3. buffer关闭一个buffer( :bd<CR> or :bw<CR> )时, 可能会引起 tagbar 的闪退,导致vim关闭, tab不会
  4. buffer创建 NEW FILE 不干净(新文件窗口是从旧文件窗口中切割开来的)

Linux概念架构的理解

声明:

  • 本文转自简书
  • 本文翻译自Conceptual Architecture of the Linux Kernel

摘要

Linux kernel成功的两个原因:(1)灵活的架构设计使得大量的志愿开发者能够很容易加入到开发过程中;(2)每个子系统(尤其是那些需要改进的)都具备良好的可扩展性。正是这两个原因使得Linux kernel可以不断进化和改进。

Linux内核在整个计算机系统中的位置

分层结构 的原则:the dependencies between subsystems are from the top down: layers pictured near the top depend on lower layers, but subsystems nearer the bottom do not depend on higher layers.

这种子系统之间的依赖性只能是从上到下,也就是在上图中位于顶层的子系统依赖位于底层的子系统,反之则不行。

内核的作用

  1. *虚拟化(抽象)*,将计算机硬件抽象为一台虚拟机,供用户进程(process)使用;进程运行时完全不需要知道硬件是如何工作的,只要调用Linux kernel提供的虚拟接口(virtual interface)即可。
  2. *多任务处理*,实际上是多个任务在并行使用计算机硬件资源,内核的任务是仲裁对资源的使用,制造每个进程都以为自己是独占系统的错觉。

PS:进程上下文切换就是要换掉程序状态字、换掉页表基地址寄存器的内容、换掉current指向的task\struct实例、换掉PC——>也就换掉了进程打开的文件(通过task\struct的files可以找到)、换掉了进程内存的执行空间(通过task\struct的mem可以找到);

文件名批量修改器

实在太闲的我就把那堆积在一起的图片文件整理了一下然而,以前制作的那个图片修改器 + 真的太烂了+ 真的太傲娇了!它基于 nodejs,除了异步处理算是亮点以外,当真烂到家! 而且由于当时不懂事,用的是 callback 形式,真的不忍直视!

通过nodejs实现

代码是这样的: