EdmondFrank's 时光足迹

この先は暗い夜道だけかもしれない それでも信じて進むんだ。星がその道を少しでも照らしてくれるのを。
或许前路永夜,即便如此我也要前进,因为星光即使微弱也会我为照亮前途。
——《四月は君の嘘》

如何控制你的梦境

如何控制梦境


说到如何控制梦境,那么不得不提到的就是"清醒梦"了.

控制梦境的基础-清醒梦

清醒梦:(英语:lucid dream)又被称为"清明梦",是指在意识清醒的时候所作的梦.清醒梦跟白日梦并不相同,清醒梦是做梦者于睡眠状态中保持意识清醒;而白日梦则是做梦者于清醒状态中进行冥想或幻想,而不进入睡眠状态之中.在清醒梦的状态下,做梦者可以在梦中拥有清醒时候的思考和记忆能力,部分的人甚至可以使自己的梦境中的感觉真实得跟现实世界并无二样,但却知道自己身处梦中,清醒梦者亦能记忆大部分各个不同清醒梦之世界与情境。

清醒梦是人们在做梦的时候还保持意识的清醒。这时会有更加清楚的感觉,甚至有时可以直接控制梦的内容。完整的从开始到结束的这种过程就叫做清醒梦。


控制梦境可能是一个人能够拥有的最迷人的经历了,在梦中的世界,你可以自由翱翔,发挥你的想象力尽情创造.那么如何控制你的梦境呢?往下读,或许就能得到对你有用的提示了!

控制梦境的方法

方法一:记录你的梦境

  1. 买一个小的笔记本,这会成为你的追梦笔记.把笔记本放在床边,准备上一支你喜欢的笔,这样你就能在醒来的时候快速写下梦中发生的事情了.
  2. 记得,要放在床头喔.如果时间拖得太长,有关梦中的记忆就会消失咯.
  3. 在你的笔记本里写下你想要梦到什么.我喜欢把这称为目标梦境.
  4. 画出图画并写下指示,细节越多越好.
  5. 并且其中一个很重要的秘诀就是告诉你自己在梦中会经历什么,这样当你在梦境之中就能够意识到自己在做梦了.
  6. 每天早晨,一觉醒来之后,就记录下自己的梦.即使你的梦境不是你所期待的,也要写下来喔.
  7. 就像运动员要每天锻炼一样,时常训练自己的大脑回忆梦境,有助于作出更加精确而深入的梦.
  8. 再者,对比已发生的梦境和目标梦境的类似和不同之处,尝试解读自己的梦境.要记住梦境不会像大脑清醒时一样为你呈现出具体的影像或问题的答案,更多的是通过隐喻或抽象的图像来与你交流.

方法二:练习觉醒

  1. 阅读你的目标梦境.在每天晚上睡觉之前,尽可能频繁地阅读它,并尝试将其细节映入脑中.
  2. 当你把一个内容看过一两次后,你的大脑就会认为它已经明白这些词的意思,并开始倦怠下来.因此,要确认完全掌握了目标梦境的意义,这样你才能在睡觉前全面地感知它.
  3. 躺下来,闭上眼睛,然后努力想想你的目标梦境.放松,再放松,仔细想想它的细节.
  4. 幻想你目标梦境中的画面出现在你的潜意识中。你的潜意识会产生许多画面,有些和你的目标梦境完全不相干,所以排开那些不相干的,并努力把注意力集中在相关的上面。
  5. 想想你的目标梦境中的背景画面和声音;努力在意识中听到这声音。试着感受与你的感觉,情绪等有关联的感觉。
  6. 如果没有出现清晰的声音或图像,试着再次在做梦笔记中阅读你的目标梦境。
  7. 漫步在你的目标梦境之中.由始至终以第一人称的视角,想象你的眼睛会看到什么.
  8. 试着按照梦境中应当发生的顺序在你的目标梦境中慢步。
  9. 努力地想,但要保持静止的姿势。不过紧张,放松就好。
  10. 带着脑中的这些画面和声音睡觉。记得在醒来时要记录你的梦,不管是什么梦。

方法三:控制自己的梦境

  1. 试着在白天进行“真实性核实”.真实性核实是当你问自己:“我是醒着,还是在做梦?”这最终能帮助你在睡着后识别梦境和现实的不同.
  2. 真实性核实要求注意到梦境和现实的一个根本不同:在做梦时,状态是流动的,而现实中,状态是不变的。在梦里,文字会变成不同的词组;树木会改变颜色和形状;时钟会让时间倒流而不是向前走。而在现实中,文字是不会变的,树木长在地上,而时钟精准地走动。
  3. 要有效地确认真实性,无论在现实还是梦境里,都可以看文字。假设房间里有张贴画上写着“吉米·亨德里克斯”。转过身待一会儿,然后再次看这个贴画。如果上面还写着“吉米·亨德里克斯”,这次真实性核实说明你醒着。如果你转过身去,再看贴画时上面写着“琼斯母亲”,那么这次真实性核实说明你在做梦。
  4. 利用你的真实性核查。当你在做梦,并意识到自己在做梦时,就开始能控制梦里发生的大部分事情了。
  5. 当你战胜了梦境并意识到自己在做梦时,试着让自己平静下来。如果你对于终于能有控制梦境太激动了,你可能会因为激动突然醒来。
  6. 先尝试小的运动。再一次,这关乎于控制住自己的兴奋,不要突然醒来。当你意识到自己能完全掌控梦境后,连做饭,爬梯子,或是玩滑板这样的平常事都会很有趣。
  7. 逐步地在梦里尝试更大的活动。许多人喜欢飞翔,游进大海深处的感觉,还有时空旅行。试着移动巨大的物体,穿过墙壁,甚至是心灵遥感。你在梦里能做的事情只被自己的想象力所限制!

最后祝大家好梦

图片截获工具driftnet

图片截获工具driftnet

driftnet是一款简单强大的图片捕获工具,可以在网络数据包之中实时判断和离线捕获图片,该工具内置于kali工具包之中.在正常的Linux系统系统也可以在Github上下载源码编译使用.

语法:driftnet [options] [fifter code]

常用选项:

  • -h:显示帮助信息
  • -b:捕获到新图片时,发出蜂鸣声.
  • -i interface:选择监听接口(默认为全部接口,此选项为关键选项.)
  • -f file:读取一个指定pcap数据包中的图片
  • -p:不让所监听的接口使用混杂模式
  • -a:后台模式,即截取的图片自动保存至临时目录中,不显示在屏幕上.
  • -m number:指定保存图片的最大数目
  • -d directory:指定保存图片的路径
  • -x prefix:指定保存图片的前缀名
  • -s:尝试解读网络数据包中的音频流或视频流信息,现只支持MPEG格式
  • -S:类似-s

使用示例:

Wlan0监听:

1
driftnet -i wlan0

读取指定pcap数据包:

1
driftnet -f /home/tmp/tmp.pcapng -a -d /tmp/

常用组合:

ettercap + driftnet

arproof + driftnet

(有关组合的使用以及dirftnet的其他用法,博主会在后期的博客,陆续更新,敬请期待.)

标准化configure文件的生成

标准化configure文件的生成

作为一个Linux系统下的开发者,都会或多或少地使用make这个命令来编译自己的程序,既然要用到make命令的话,一个简易的Makefile文件是必不可少的。平时大家自己编译时,如果要使用make命令编译的话,应该都是自己手写一个简单实用的Makefile文件。但一般软件需要发布的时候,由于自己手写的Makefile文件,不符合GNU的标准,且没有考虑各种诸多因素,导致程序在编译时也会出现各种问题。 因此为了解决如何生成符合CNU标准的configure和Makefile文件,我们可以使用Linux中autotools系统的工具来进行自动生成configure脚本来创建Makefile文件。

下面我以一个简单的HelloWorld程序作为例子:

一、建立项目文件夹

1
2
$ mkdir /tmp/hello
$ cd /tmp/hello

二、编写源文件(博主此处以C++程序为例)

1
2
$ vim hello.cpp
(此处大家可以自己喜欢的编辑器编写)
1
2
3
4
5
6
7
8
//hello.cpp
#include<iostream>
using namespace std;
int main (int argc,char** argv)
{
     cout<<"Hello World!"<<endl;
     return 0;
}

保存并退出后,当前目录下就有了一个hello.cpp的程序源文件了。

三、生成初步configure文件

1
$ autoscan

大家用man来查看autoscan这个命令就会知道,这个命令使用扫描当前源代码目录并生成configure.in模板的,这个命令的输出文件是configure.scan,我们只要将它重命名为configure.in再编辑其中的内容即可。

1
2
$ mv configure.scan configure.in
$ vim configure.in

注:"#“在脚本语言或linux的大部分配置文件中代表注释,与C&C++的“//”意义相同 现在将configure.in修改下一下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.63])
AC_INIT(hello.cpp,1.0)  #此项代表源代码的路径,1.0为版本号(可省略)
AM_INIT_AUTOMAKE(hello,1.0)#此项为必需项,代表生成软件包的名字和版本号
#AC_CONFIG_SRCDIR(hello.cpp) #为了简化操作,我们注释掉这两项内容
#AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX   #此项代表使用C++编译器
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile) #此项填写我们要输出的Makefile的名字

保存退出后。 我们再来执行aclocal和autoconf这两个命令,来分别生成aclocal.m4和configure文件

1
$ aclocal && autoconf

其中生成的两个文件

aclocal.m4: 是由aclocal这个perl脚本程序自动生成的,而aclocal的定义是:"aclocal - create aclocal.m4 by scanning configure.ac"

configure:则是由autoconf根据GNU m4宏处理器处理aclocal.m4文件,生成的一个脚本。

所以,以上命令的顺序不可颠倒。

四、手建一个Makefile.am文件

1
$ vim Makefile.am

Makefile.am文件中主要包括三个项:

1.AUTOMAKE_OPTIONS:

这个是automake 的选项。在执行automake 时,它会检查目录下是否存在标准GNU 软件包中应具备的各种文件,例如AUTHORS 、ChangeLog 、NEWS 等文件。我们将其设置成foreign 时,automake 会改用一般软件包的标准来检查。除此之外,可选的条目还有如下所示:

  • –cygnus assume program is part of Cygnus-style tree
  • –foreign set strictness to foreign
  • –gnits set strictness to gnits
  • –gnu set strictness to gnu

2.bin_PROGRAMS:

这个是指定我们所要产生的可执行文件的文件名。如果你要产生多个可执行文件,那么在各个名字间用空格隔开。

3.hello_SOURCES:

这个是指定产生“hello” 时所需要的源代码。如果它用到了多个源文件,那么请使用空格符号将它们隔开。

eg: hello_SOURCES=test.cpp test.h test1.cpp test2.h

1
2
3
4
//编辑Makefile.am文件内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.cpp

五、执行automake

1
2
$ automake --add-missing
(或 automake -a,命令意义相同)

其中以上的命令选项

  • -a, –add-missing add missing standard files to package

代表自动添加软件包所需要的标准文件。

六、执行configure脚本来生成我们的目标Makefile文件

1
$ ./configure

至此我们想要的标准的configure和Makefile文件都已经生成了。

最后只要执行make命令就可以编译我们的hello程序了

1
2
3
$ make

$ ./hello

输出如下:

Hello World!

我的算法天梯之路之-爬楼梯

我的算法天梯之路之-爬楼梯

最近在计蒜客的算法练习题目之中看到了这样一道比较有意思的题目.

原题如下所示:

假设你现在正在爬楼梯,楼梯有n级。每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部? 格式: 第一行输入一个数n(n<=50),代表楼梯的级数。 接下来一行输出你的方法总数。 样例输入 5 样例输出 8

从题面上看,可以发现这是一道比较典型的递归算法题目. 既然已知阶梯数为N,而最大跨步数为2,那么我们可以先假设有3级阶梯,那么所有的走法就有:

111 12 21

这样子分析完之后,我们可以发现,我们总共要处理的情况有两种:

  1. 剩余阶梯数大于最大步数
  2. 剩余阶梯数小于最大步数

而判断走法是否可行的条件就是:最后的当前阶梯数是否为0

因此我们可以写出如下的递归函数:

1
2
3
4
5
6
7
8
9
10
11
def calcSumofMethod(ladder)
  sum = 0
  if ladder == 0 || ladder == 1
    return 1
  else
    [1,2].each{|i|sum+= calcSumofMethod(ladder-i)}
  end
  return sum
end
ladder = gets.to_i
puts calcSumofMethod(ladder)

但是由于计蒜客的算法问题有1000ms运行时间的限制,因此在此处用Ruby的递归算法来实现并非是正解(可能是Ruby的性能问题导致运行超时,博主没试过用C进行递归.有兴趣的人可以试一试.)

我们再自习观察前10级阶梯数算出的结果会发现:随着阶梯数N的增长,走法的总数符合斐波那契数列规律增长, f(N)=f(N-1)+f(N-2) 利用这个规律我们可以采取以下循环方法实现:

1
2
3
4
5
6
7
8
9
def calcArray
  result=Array.new
  result[0]=1
  result[1]=2
  (2..49).each{|i|result[i]=result[i-1]+result[i-2]}
  return result
end
ladder = gets.to_i
puts calcArray[ladder-1]