装逼尚未成功,同志仍需努力。

本文来自河蟹娱乐,看到的时候让我想起了《娱乐至死》和《瓦尔登湖》,总之,不打算拯救世界,也不在乎别人装逼,生活什么的,简单最好。文中观点也许略有偏颇,读者自己心中有数即可-bystander  你受过良好的教育,有意无意间说起自己的大学,旁人无一例外纷纷投来艳羡目光。你工作光鲜,不是四大就是4A,不是垄断国企就是全球500强;在一个都是中国人的公司里互相叫对方英文名。你衣食无忧,三个月工资买一LV包;你生活清闲,上班时就像神九的航天员,明明啥事没干还要装出一副很忙的样子;你格调不俗,业余时间不是昆曲就是话剧,不是民谣专场就是妈妈咪呀;你善良正义,身处斗室,胸怀天下,每天吃饱饭就刷刷微博拯救中国。  你用苹果,买个五千块的马脸iPhone,又是贴膜又是镶钻,十天换八个壳;你用谷歌,买个两千块的安卓手机,又是S-OFF又是ROOT,十天刷八个ROM。你关注互联网,精通电子产品,上机锋网威锋网雷锋网,电脑里永远装着十个GTD软件八个思维导图软件,用Instagram记录生活,对乔布斯比对你爸还了解,以果粉自居并喜欢到论坛上问:iOS6完美越狱什么时候出来啊?  你发烧,你还发骚,出门带着IPC,用麻绳绑个随身耳放,再配一对ER4P入耳式耳塞,完全隔音,也不怕被车撞死。嫌不够惹眼?那就换一副时下最流行的魔声Beats Pro头戴式耳机,每一个苹果旗舰店的配件区里都有卖,它颜色鲜艳外形时尚,两个耳朵每边印着一个b,挂在你的头上,真是实至名归。  你叫自己“吃货”,可怜的娃从小在城里长大没吃过什么好东西,为了美食频道里推荐的坑爹路边摊,坐10块钱地铁从城南干到城北。你热爱美食,每次花十分钟炒菜,二十分钟摆盘,三十分钟拍照,拍好导进PhotoShop里用康熙字典体配上两句文言文,传到博客上豆瓣上微博上。  你文艺青年,琴棋书画样样不通,格律没搞懂就敢写古诗词,最爱莎士比亚的英雄双行体。你只到电影院看电影,提到外国电影从不说中文名,也不说英文名,管《指环王》叫LOTR,《蝙蝠侠3》叫TDKR,倍洋气倍有面子。你一听到维瓦尔第的《四季》,就会想起波光粼粼的日内瓦湖和白雪皑皑的阿尔卑斯山。  终于有一天,当你拿着一张音乐会赠票睡死在钢琴声中,当你附庸风雅跑去看毕加索画展却一张画也没看懂,你突然意识到了自己的浅薄。没有金刚钻,怎装瓷器逼?没有付出,哪来收获?  装逼没有那么容易,才会特别让人着迷。  你开始认认真真地看书,时间宝贵,你只看经典,抬手就是中华书局、上海古籍,各种珍本善本影印本,横排版的书不看,简体字的书不看。理论学习也不能落下,商务印书馆汉译世界学术名著丛书买它个几十本回来,黄的绿的橙的蓝的,书架上一排彩虹。  你偷偷把手机铃声从《我的歌声里》换成肖邦的夜曲,王菲、张国荣的CD扔掉,你万青,你痛仰,你Pink Floyd,你Guns N’ Roses,你从流行听到爵士,从摇听到古典,别人问起你最喜欢的歌手,你四十五度角仰望星空,眼神虔诚地说出一句:“In Bach We Trust。”念到Bach的ch时上腭抬高,发成“喝哈”轻读加连读的效果,一口纯正的小舌音,德味!  数码单反是不能再用了,现在连旅游团的大叔大妈们都人手一只无敌兔了。相机一定得是胶片的,胶片一定得是120的,拉开你们家冰箱,啥吃的没有,满满的全是胶卷——还必须得是过期的。  国内景点是不能再去了,水乡古镇全是搞一夜情的,西藏全是又酸又穷除了会辞职什么都不会的城市小白领。你背包,你户外,你特立独行无所畏惧,你穿Columbia防水鞋、NorthFace冲锋衣,你用GPS迷了路,在黄山的雨夜里发出求救信息。  你张开双手去生活去爱,你受了伤害,你的小心脏扎满绷带。你痛不欲生,你长夜痛哭过人生,痛完哭完后你顿悟你看透你蜕变,你长了一分智慧叫阅历,你多了一分气质叫成熟。你情感专家,你麻辣教师,你知性姐姐。你豆瓣粉丝几万,微博粉丝几十万,你吊了个有房有车有钱的金龟婿,然后教小姑娘们什么是爱情;你一天到晚不干正事,然后教小朋友们如何治疗拖延症;你做了个朝九晚五的无趣上班族,然后教大学生们别放弃梦想。你读书写字做主妇,你把体内毒素分泌成畅销书。你解答粉丝来信,聆听读者倾述,你款到发货,话到病除。你忙着生产一种叫“正能量”的东西,没有它,你的读者将无以为继,夜夜痛哭。  你研习人类学、社会学、历史学、植物学、建筑学、心理学,你掌握六门外语:英语、法语、德语、日语、西班牙语、铁岭话,你知道康熙他小舅的二大爷哪年死的,你分得清古典柱式认得出欧洲广场,你叫得出路边一花一草的科属名字,你开口M2闭口流通性过剩,你和同好攒了个铅笔经济研究社,研究除了经济学以外的任何东西。  只有门外汉才会在听古典音乐的时候想到什么画面,你谈论的是作品的母题、动机、织体、转调、升降、横向展开的层次与纵向展开的速度。你告诉还在听莫扎特“我不想不想长大”和贝多芬“当当当当”的新手:不妨尝试一下莫扎特和贝多芬的钢琴协奏曲,尤其是莫扎特的K.491和K.595,贝多芬的Op.37和Op.73,精彩绝伦,不输给他们任何的交响乐作品以及歌剧。你对中产气味古典主义模仿者勃拉姆斯充满轻视,对婆婆妈妈的柴可夫斯基只有厌烦。斯特劳斯里面只能听听理查·斯特劳斯,他的艺术歌曲还算有那么点思想性;至于约翰·斯特劳斯,天啊,真不知道这个家伙除开写了几首平庸的圆舞曲外还干了些什么。  你上知天文下知地理,对世界充满好奇心和求知欲,没事就到网上破解谣言。你三十好几找不到对象,去非诚勿扰相亲告诉人家“喜欢TBBT加分哦”,结果“可惜不是你,陪我到最后……”。你在粉丝面前表演Name Dropping的把戏大秀才艺,隔天一觉醒来照旧要加班熬夜做苦力,供房养车还利息。  你有知识有思想有文化有品位,唯独没有钱。你浑身上下散发着狐臭般无法抗拒的人格魅力,唯独没有活人鸟你。  装逼尚未成功,同志仍需努力。  你苦心智、劳筋骨、饿体肤,长夜痛哭算个屁,未曾坐过春运绿皮车者,不足以语人生。你比别人聪明你还比别人勤奋,你睡得比别人晚起得比别人早,你头发一天比一天少,肚子一天比一天大,鸡鸡一天比一天软。“吃得苦中苦,方装逼上逼”,皇天不负苦心装逼的人,你行业老大了,你商界精英了,你社会名流了,Finally, You did it, You DID it!  你实现了“财务上的自由”。你从不像其它男人一样热衷讨论好车,一般你的做法是:买一辆。不过,好车没什么值得炫耀的,车再好能好得过煤老板的?身为“中国知识新贵”的你,更喜欢邀请朋友到家里听自己两百万的Hi-End系统上播放的马勒和布鲁克纳。你听音室里的唱片的总价能买三辆奔驰,你用十三种工具调整自己唱机唱臂的位置,你告诉朋友,玩音响最关键的不是音源,也不是音箱,而是电:水电偏冷,火电偏暖,核电偏硬,你只用来自新疆阿克苏的风电,宽松醇厚。  你从微软跳到谷歌,最后弄个创新工场,做出了市面上最好的安卓盗版装机软件。你是中国的雷布斯,三千块市价的安卓手机你只卖两千块,除了一直缺货外,没什么不好的。  你从英国回来,都不用做学问搞研究,把民主的细节背诵一遍就当上了副教授。你出国就去冰岛,斯堪的纳维亚那块,北欧冰冷的气质才衬你高洁的内心,哦,对了,出门前记得把所有微博删掉。  你是央视主持人,你抑郁了,你又好了,你开着豪车到人民大会堂骂执政党的娘,骂完回台里继续主持读书节目;你血水盐水里泡过,说十句话引用八句名人名言,采访的时候总像只孵蛋的鹌鹑一样看着对方,你内心强大业务出众文笔一流,更要命的是,你还穷,谁敢不喜欢你简直天理难容。  你文学青年,你杂志主编,你说看不懂你小说的人是傻逼,看不懂你小说的人就是傻逼;你说文学有金线,文学就有金线。你眼光高,天底下看得上眼的东西就两样:美玉和鹌鹑。你率性随意,什么都可以将就,但避孕套一定要用最薄的。  你为民主民权民生摇旗呐喊,早年带老婆到天安门广场拍露逼照,直接则对城楼上的人像竖中指,好像很厉害的样子,可惜被查过一次账后就痿了,回来后一副受尽人间辛酸的萌样,像闰土一样四处找粉丝借钱,谁看谁心疼。  你老了,头发胡子花白,你归隐田园,深藏功与名。你心情不好就打个飞的去伦敦喂鸽子,去尼泊尔爬珠穆朗玛峰,心情好的时候就给干女儿做一盘难看但好吃的红烧肉。  你会当凌绝顶,一览众逼小。你再也不需要装逼,因为,你就是逼。  你安然地度过了一生,死后安葬在宁静的故乡,野花轻轻覆盖你的墓碑,上面镌刻的六个大字清晰可辨:  “活过,爱过,装过。”

双查询注入

作者:bystander 论坛:法客论坛 这个东西比较难解释。我就不多解释。尽量通过这篇文章大家能够照猫画虎手注即可。想要深入理解的可以去看看mysql数据库的一些知识 介绍一下双查询注入,有时候我们通过order by 语句获取到了确定的列数,可是当我们使用union select或union select all查询的时候, 却会出现一个错误提示,列数不一致。 而我们使用下面的语句: 执行之后就会显示mysql版本,用户名,服务器名, 以及数据目录… 获取数据库里 许多人会在上面的语句里使用:database()方法来获取数据库, 可是。这个方法只能获取一个数据库。如果你入侵的网站存在多个数据库。上面这个查询就不能用了因此使用下面这个方法更好些。。 不同点在于第二个查询语句在information_schema.schemata里查询 schema_name ,这样就能查到所有的数据库了。 注意语句中的Limit 0,1会显示地一个数据库,改成 Limit 1,1 会显示第二个 Limit 2,1 会显示第三个, Limit 3,1 会显示第四个。。以此类推。 补充个: 在普通的SQL注入中,使用如下的语句 会一次爆出所有的数据库 而使用下面的 只会显示当前站点使用的数据库。 获取表名 回正题,我们继续使用双查询来获取数据库的表: 注意语句中的table_schema=0xHEX 这里的hex用你要查询的数据库进行hex编码后替换即可。 同样的,这里可以要修改LIMIT后面的值来得到第二个第三个第四个表。 获取列名 然后我们来获取列名: 和上一句很像,注意这一句"And table_name=0xHEXEDTABLENAME” 还是一样的。后面的部分是要查询的表名的hex值,同时,通过增加后面的LIMIT值来获取更多的列名。下面是大家最感兴趣的地方。。从列里面取值。 获取列值 一些人使用: 也就是他们使用tablename.columnname 有个缺点就是一次只能获取一个列的值,要是该表有个1000多列啥的。。一个个就了。。为了更快一些。后来很多人开始使用这个: 这样一次就能获取多个列的值了,但是还有个bug,因为是直接从mysql的所有表里面找,并且没有指定数据库名,如果mysql有两个数据库有同样的一个表名。那么这样找出来的就不知道到底是哪个了。。就混乱了。。所以。现在我们用这个: 好处一个是可以一次获取多个列的值,同时使用 database.table, 可以明确我们要找的表了。不要忘了增加LIMIT来获取下一条记录啊 错误之处还请指正。

你是想读书,还是想读完书?

本文来自知乎,我的看法呢,同意作者的。但不完全是这样。每个人都会建议你把好书读千百遍。改变自己什么的。其一,别人认为的好书不一定能启发你。因此,需要多读书来遇到那本如来神掌,其二。对于非技术书来说,作者的观点是正确的。人文,心理这类书绝对不在多。在于书为了自己的一部分。改变了自己。而技术书无此功能。多读多做才能进步。 本科时,一位很有才华的心理学老师说过的一句话,让我终身难忘: 很多同学喜欢说自己一天能读多少页的书,有些人一天能读50页,有些人能读100页。可是一旦你用“页数”为单位来度量读书这种行为时,从一开始你就错了。 同理,我想对题主说,你用读了多少本书来形容你的读书经历,这种思路,从一开始就错了。 如果你认真读到了书里去,是不会care、甚至会完全忽略掉今天读了多少页,今年读了多少本的;当你沉迷于书中绚烂多彩的世界,当你的观念被翻天覆地地革新,是不会care、甚至会完全忽略掉今天读了多少页,今年读了多少本的。 当我们看手表的时候,常是快等不及了;当我们数书页的时候,常是快看不下去了;当我们念叨看了几本书的时候,常是连书名都记不全了。所以,数多少页、多少本这行为本身,就说明你已经败了。 很多时候,一个人对待知识和思想的态度,就体现在用什么东西去丈量它。 如果有人问一位读书而有大成之人:你因何而脱胎换骨?你因何而涅磐重生?这些问题,他该如何作答?他说:”我因200本书而脱胎换骨,我因1000本书而涅磐重生“,如何? 学而悟道,有时候一本书就够了,有时候一万本都不够。这取决于,你读了什么书,更重要的是,你是如何读的:你有没有读进去把自己活埋在里面,又有没有读出来敲打出一个新的自己。 有些书,是一代宗师级的人物,把他们毕生的智慧熔铸在一本书里面;有些书,是一个领域的开疆拓土之作,从一片混沌中劈出一个新世界;有些书,是一个领域的集大成之作,观点纷繁,气象万千;有些书,如盗梦空间一般有几层境界,你多读一遍就多梦到一层。对这些书,你若只是都当成那两百分之一,花上一个星期匆匆读完,读后即扔,只摘下几条金句供日后泡妞之用,难道这就算读过了吗? 有些书,要用心血去读;有些书,要用足够的经历去读;有些书,是要绞尽最后一粒脑细胞去读;有些书,是一辈子都读不完读不透…… 看书的方法,不仅要看作者写了什么(一层),还要琢磨文字背后的意蕴,那些弦外之音(二层),还要去思考作者为什么要写这些、要这样写(三层),还要去想想看作者用了什么样的框架和策略在组织这本书,以及在各种细微处又用了什么样的方法和技巧(四层),当然更重要的是,以上的这些分析对你自己的现实和精神世界能带来什么样的帮助,是否能启发你、引导你、改变你……(五层) 于是,一本值得都烂读透的书,就需要你去读五遍、十遍去读烂读透它。 于是乎,和很多人的答案相反:所谓200本,你不是读少了,而是读多了、读水了、读浅了! 其实你的状态一点都不特殊,你和许多人一样,以为自己在读书,其实是在集邮。 最后,建议你重新拿起一本你最崇敬的书,换一种方式,再读一遍、两遍、三遍……

C#反射实现简单的插件系统

如果用过一些优秀的开源或是非开源的应用软件,就会发现这些软件的一个很大的优势就是其开放性,任何有能力的人都可以为其开发不同的插件来增强其的功能。比如著名的foobar2000,Vim和TotalCommander等等。 C#的反射可以用来实现一个简单的插件系统。思路很简单,我们创建一个解决方案,包含三个工程,一个为我们的软件MyApplication,一个为插件接口IPlugin,一个为具体的插件MyPlugin。插件系统的基本思路是我们用一个接口类库,来定义我们软件可以使用的插件必须实现的方法签名。然后我们的软件MyApplication通过引用该IPlugin dll来动态调用,而具体的实现插件MyPlugin则引用该接口来实现具体的方法。这样我们的应用程序就能在不知道具体插件的情况下调用插件了。。 结构图如下: 关键代码也就是通过对程序集载入。搜索到对应接口的实现类。然后调用即可。

C#多线程揭秘

文章略长。。。 Demo下载:Demo.Threading.zip 介绍 本文将通过一些例子来展示.net 中如何实现多线程,涉及到以下四部分。 1 .线程概念 2 .如何实现多线程 3 .如何确保线程安全 4 .死锁 什么是进程 一个进程就是一个可执行文件运行的操作系统上下文环境。它被用来分隔虚拟地址空间,线程,对象句柄(指向类似文件这样的资源的指针),以及环境变量,进程还有一些类似优先级类和最大内存分配的属性。 也就是说: 1 .一个进程就是一个包含资源的内存块。 2 .操作系统执行的一个单独的任务。 3 .一个正在运行的软件 4 .一个进程拥有一个/多个操作系统线程 一般的。一个进程最大可以是4GB的内存空间,这块内存是安全,私有,其他进程是无法访问的。 什么是线程 一个线程就是在一个进程里执行的一条指令流,所有的线程都在一个进程里执行,也就是一个进程可以包含多个线程。线程公用进程的虚拟地址空间。线程是操作系统的调度单元。一个线程的上下文由操作系统进行保存/恢复。 也就是说: 1 .一个线程是进程里的一条指令流。 2 .所有的线程在进程里。一个进程可以有多个线程 3 .一个进程的所有线程使用进程的虚拟地址空间。 什么是多线程 多线程指的是进程同时有多个线程活动。这可以通过时间片的线程模拟或是多cpu上的超线程来实现。可以提高性能。 多线程-为什么或是为什么不? 为什么多线程 1 .保持UI响应。 2 .提高性能(对于cpu密集型和I/O密集型的进程) 为什么不多线程 1 .过度使用降低性能 2 .代码复杂,增加设计时间,潜在的bug 线程池 线程池为你的程序提供了一个由操作系统管理的机制。在线程池里的都是后台线程。一个线程池线程在程序的前台线程都退出后,也会推出。每个进程一个线程池。默认情况下。每个处理器会为进程分配25个线程。但是可以通过SetMaxThreads 方法来改变。 .net 中的线程 在.net 中,线程可以通过下面6个方法来实现。 1 .Thread线程类 2 .Delegates委托 3 .Background Worker 4 .ThreadPool 线程池 5 .Task任务类 6 .Parallel并行类 下面的几部分里。我将逐一展示实现方法。 简而言之,多线程就是通过使程序同时运行多个任务来最大化计算机能力,同时能够保持UI响应。下图是一个例子的图示。 代码 提供的源码是一个简单的WinForm程序。模拟了.net中委托,线程类和Background Worker三种方法。 程序异步执行一个繁重的操作,这样UI就不会无响应。三个方法都是模拟的。 这个“繁重”的操作 真实的开发中,这个繁重的操作从轮询数据库到流媒体操作都可以。基本上可以是任何事情。源码里面是向一个字符串追加值。String是不能变的。追加的时候,新的字符串变量会被创建,旧的会被丢弃,这是由CLR处理的。如果做很多次这个操作,是很耗资源的。这也是为什么我们使用Stringbuilder.Append 来代替这个操作。通过调整界面中的次数。可以通知追加的次数。 后面我们有一个Utility泪,有一个LoadData() 方法。类里面也有一个和LoadData() 有着同样签名的委托 同步调用 当点击Get Data Sync按钮的时候。操作和UI在同一个线程里,因此阻塞了UI线程。因此。UI线程会未响应 异步调用 使用委托(异步编程模型) 如果你选择了“Delegates”单选按钮,那么LoadData()方法就会通过使用委托来异步调用。首先通过utility.LoadData(). 的地址初始化delLoadData 类型,然后调用委托的BeginInvoke()方法。在.net的世界里。任何一个有着BeginXXX和EndXXX名字的方法都是异步的。比如delegate.Invoke()将会在同一个线程里调用方法。而delegate.BeginInvoke()则会另开一个线程调用。 BeginInvoke()有三个参数 1 .传递给Utility.LoadData()方法的参数 2 .回调方法的地址 3 .对象的状态 回调 一旦我们开了一个线程执行一些操作,我们就想知道操作正在发生些什么,换句话说。我们需要当操作完成的时候我们能够收到通知。有三种方法可以知道一个操作是否完成。 1 .回调 2 .轮询 3 .等待直到完成 在我的源码里,我们使用回调方法来捕获线程的完成。回调只需要在调用BeginInvoke的时候把回到函数的名字传递进去。这会告诉线程当你做完工作以后调用这个回调方法就好了。 一旦一个独立线程里的一个方法启动。你也许关心也许不关心方法的返回值,如果一个方法没有返回值,那么可以叫做“触发然后忘记的调用”,这种情况下就不需要回调函数了。这里callback直接传入null就可以了。 在我们的例子中,我们需要一个回调方法,因此,哦们需要传递回调方法的名字到参数里。这里我们的回调方法的名字就叫做CallBack(),纯属巧合。 回调方法的签名都是void MethodName(IAsyncResult asyncResult). IAsyncResult包含了关于线程的一些必要的信息,返回的数据可以像下面这样提取。 而轮询的方法(本例没有使用)则是像这样 等待直到完成,如名所示,就是等待直到完成。 更新UI 既然我们已经捕获了操作结束,并且取回了LoadData()的结果。我们需要用结果来更新UI,但是有个问题。文本框需要在UI线程里更新,结果在回调里取到了。回调和他启动的时候是一个线程(他是由新开的线程启动的)。因为UI线程和回调不是同一个线程。换句话说。文本框不能像下面这样更新。 回调里执行这一行将会导致一个跨线程的系统异常。我们需要在后台线程和Ui线程之前构建一个桥。来更新文本框的值。可以通过使用Invoke()或是BeginInvoke()方法。 我定义了一个方法来更新UI 对上面的方法定义一个委托 如下调用BeginInvoke()方法。 需要注意的是一旦一个线程通过委托启动。它就不能取消,暂停,或是终止,我们无法控制那个线程。 使用Thread线程类 同样的操作可以是哟哦那个Thread类来完成。这个类的优点是你可以对操作有更多的控制,比如暂停/取消操作,类在System.Threading命名空间里。 我们有一个私有的方法LoadData(),他是Utility.LoadData()方法的一个包装。 这样做是因为 Utility.LoadData() 需要一个参数。而我们需要一个ThreadStart委托,这个委托没有参数。 这个委托没有参数,为了防止我们需要传递参数,我们可以使用有参的ThreadStart委托,不幸的是,这个委托只能把object作为参数,而我们需要一个字符串所以需要类型转换。 是的。Thread泪可以对线程有更多的控制。中断。终止,获取线程状态。 使用BackgroundWorker 这个类是一个组件,可以使得线程使用更简单,这个BackgroundWorker类的主要特点就是可以异步的报告进度,这就可以用来更新状态栏,保持UI可视化的更新进度 为了完成操作,我们需要把下面两个属性设置为true,缺省时false • WorkerReportsProgress • WorkerSupportsCancel 这个类有三个主要的事件DoCount, ProgressChanged, RunWorkerCompleted 初始化的时候需要注册这三个事件

利用反射转换对象list到csv

扒自一工程。。可以学习一下.net中反射的简单用法  增加这个只是两个预定义的实体框架内的属性。 使用PropertyInfo 可以获得名字。数据类型。声明类型,反射类型,读写属性等等。也可以设置或获取属性值。

操作系统的死锁和内存管理

这部分是最后一部分笔记。《现代操作系统》第三版的笔记就这样了。 死锁; 把需要排他性使用的对象称为资源,资源分为可抢占的和不可抢占的。可抢占资源可以从拥有它的进程中抢占而不会具有任何副作用。存储器就是可抢占的。不可抢占资源是指在不引起相关的计算失败的情况下,无法把它从占有她的进程处抢占过来。比如CD刻录机,如果一个进程开始刻盘,突然分配给CD刻录机到另一进程,就会划坏CD盘。死锁会发生在不可抢占资源中 死锁的规范定义:如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,该进程集合就是死锁的。 死锁的四个必要条件 1.互斥条件。每个资源要么已经分配给一个进程,要么就是可用的。 2.占有和等待条件,已经得到了某个资源的进程可以再请求新的资源。 3.不可抢占条件,已经分配给一个进程的资源不可强制性的被抢占,他只能由占有她的进程显式的释放。 4.环路等待条件。死锁发生时,系统中一定有友两个/多个进程组成的一条回路,该环路中的每个进程都在等待着下一个进程所占有的资源。 死锁处理的四种策略 1.忽略该问题,如果可以忽略。则忽略 2.检测死锁并恢复,让死锁发生,检测他们是否发生,一旦发生。采取行动。 3.仔细对资源进行分配。动态的避免死锁。 4.通过破坏引起的四个必要条件之一。防止死锁发生。 银行家算法就是对每个请求进行检查。检查如果满足这一请求是否会达到安全状态,或是,那么满足这请求,若否。就推迟这一请求的满足。为了看状态是否安全。类似于银行家投资。看自己是否有足够的资源满足客户。如果可以。就认为投资是可以收回的。接着检查最接近最大限额的一个客户。如果所有投资最终都被收回。则该状态安全。 通信死锁:两个/以上的进程发送消息通信。A向B发送请求信息,然后阻塞直到B回复。假设请求信息丢失,A将阻塞等待回复。B则阻塞等待一个向其发送命令的请求。则发生死锁。他不能通过对资源排序/安排调度来避免,因此。采用了超时来中断通信死锁。 活锁:两个进程A和B,A获得1.B获得2.轮询请求对方的。没有进程被阻塞。看起来像是死锁发生了。就叫做活锁。 内存管理 每个linux进程都有一个地址空间,逻辑上有三段组成:代码。数据和堆栈段。代码段包含了形成程序可执行代码的机器指令。通常是只读的。是由编译器把源码转换成机器码形成的。 数据段包含了所有程序变量。字符串。数字和其他数据的存储。由两部分,初始化数据和未初始化数据。后者即为BSS,符号起始块。加载后被初始化为0.数据段可以修改。可以增加数据段的大小。 第三段是栈段。大多数机器里。从虚拟地址空间的顶部/附近开始。并且向下生长。 linux内存由三部分组成。前两部分是内核和内存映射,被钉在内存中。页面从不换粗。内存的其他部分,被划分为页框。每个页框都可以包含一个代码。数据或栈页面。 window如何知道系统配置的细节呢。答案就是windows会挂载一种特殊的文件系统,其为小文件做了优化,到名字空间,也就是注册表。注册表被阻止成了不同的卷,称作储巢。hive。一个叫做system的储巢会在系统启动时。装入内存。这里面包含了驱动什么设备工作。什么软件要初始化。那些变量等等。

recon-ng开源信息探测框架

作者:bystander 博客:http://leaver.me 微博:http://t.qq.com/lazystander 论坛:法客论坛 首发。转载什么的请注明出处。起码给我留个链接啥的嘛。 首先介绍一下。这个工具是国外刚刚发布的。主要用来渗透前的信息探测。使用类似Metasploit 主要有 Auxiliary: 这个模块查询主机信息泄漏页。进行hash反查,模糊名称精确,检查某个email是否密码泄漏,域名解析ip等 Contacts: 这个模块探测和某一公司有关的人员的信息,主要包括 LinkedIn 和Jigsaw 这两个模块。得到的信息可以被Auxiliary模块使用,如果和Social Engineer Toolkit(社会工程学工具集,这个工具已经发布了。是开源的。大家可以看看),一起。效果强大。 Hosts: 这个用来获取站点子域名。。包括使用baidu。Google bing等。。效果相当强大。 Output: 这个模块用来创建输出报表 Pwnedlist: 这个模块不是得shell的。他可通过 Pwnedlist.com 提供的api,如果这个网站被入侵过。那么可以直接获得其他黑客泄漏的帐号密码。。(需要去 Pwnedlist.com 注册) 安装方法: bt下直接 然后有可能提示输入密码,好象是随便输一个用来保护版本控制。。我输的是toor。。 然后就安装好了。输入 然后 首先查看有哪些模块。输入 图一 我以获取子域名为例,通过我前面的介绍你已经知道了hosts模块里的所有模块基本都是干这事的。我用里面的baidu模块来说明。你也可以使用bing等,, 输入命令 图二 刚开始你可能不清楚这个模块的说明。那么继续输入info即可查看模块的详细说明 要开始使用。我们输入 和Metasploit很像把。可以查看要使用需要的配置。 图三 看表,会发现有三行。第一行是标题,第二行是域名设置,第三行是输出。这个current value也就是当前值已经为true。所以不用设置。req的意思是是否必须设置。我们输入 baidu.com就是你的目标了。 就会从百度的结果里提取百度的子域名信息了。要开始。我们输入 图四 更多希望大家发掘吧。我抛砖。求引玉。

操作系统中的输入输出

输入输出 I/O硬件: I/O设备分为两类:块设备和字符设备,块设备吧信息存储在固定大小的块中,每个块有自己的地址,传输以块为单位,每个块都能独立于其他块读写,硬盘,CD-ROM和USB盘都是常见的块设备。字符设备是以字符为单位发送和接收一个字符流,而不考虑任何块结构,字符设备不可寻址,也不寻道,打印机,网络几口,鼠标,以及大多数与磁盘不同的设备都可看作是字符设备。 I/O设备一般由机械部件和电子部件两部分组成,通常分开处理,实现模块化和通用设计,电子部件称作设备控制器/适配器,在个人计算机上,通常以主板上的芯片的形式出现,或者以插入PCI的印刷电路板的形式出现。控制器卡上通常有一个连接器,通向设备本身的电缆可以插入到这个连接器中, 控制器的任务是吧串行的位流转换成字节块,并进行必要的错误校正工作,字节块通常首先在控制器内部的一个缓冲区中按位进行组装,然后再对校验和进行校验并证明字节块没有错误后再将它复制到主存中。 每个控制器都有几个寄存器用来和cpu通信,通过写入这些寄存器,操作系统可以命令设备发送数据等等操作。 1.内存映射io 将所有控制寄存器映射到内存空间中,每个寄存器被分配一个唯一的内存地址,并且不会有内存被分配这一地址,这样的系统称为内存映射I/O,通常位于地址空间的顶端。使用内存映射io,设备控制器只是内存中的变量,c语言可以和其他变量一样寻址,这样,I/O设备驱动程序就可以采用c语言编写。 2.DMA 无论CPU是否具有内存映射I/O,他都需要寻址设备控制器以便和他们交换数据,但浪费eficpu时间,所以经常使用直接存储器存储。可独立于cpu访问地址总线。 没有DMA的时候,首先控制器从磁盘驱动器串行的一位一位的读一个块,直到将整块信息放入控制器的内存缓冲区中,接着,他计算校验和,以保证没有读错误发生,然后控制器产生一个中断,当操作系统开始运行时,它重复地从控制器的缓冲区中一次一个字节/一个字的读取该块的信息,并将其放入内存中。 当有DMA的时候,首先CPU通过设置DMA控制器的寄存器对它进行编程,所以DMA控制器知道将什么数据传送到什么地方,(第1步)DMA控制器还要向磁盘控制器发送一个命令,通知他从磁盘读数据到其内部的缓冲区中,并且对校验和进行检验,如果磁盘控制器中的缓冲区中的数据是有效的的。那么DMA开始 DMA控制器通过在总线上发出一个读请求到磁盘控制器而发起DMA传送(第2步),这一读请求和其他一样,并且磁盘控制器并不关心是来自DMA还是CPU,一般情况下,要写的内存地址在总线的地址线上,所以磁盘控制器从内部缓冲区中读取下一个字的时候,她知道要写的什么地方,写到内存是另一个标准总线周期,(第3步) 当写操作完成时,磁盘控制器在总线上发起一个应答信号到DMA(第4步),于是DMA控制器部增要使用的内存地址,并且步减字节计数,如果字节计数仍然大于0,则从父2-4步。完成后产生中断告诉cpu,操作系统开始工作时,数据已经在内存中了。 中断: 将机器留在一个明确状态的中断称为精确中断,四个特征,1.PC保存在一个已知的地方。2.PC所指向的指令之前的所有指令都已经完全执行。3.PC所指向的指令之后的所有指令都没有执行。4.PC所指向的指令的执行状态是已知的。注意,对于PC所指向的指令以后的指令,并没有禁止他们开始执行,而只是要求在中断发生之前必须撤销他们对寄存器或内存所做的任何修改。 I/O软件: 设计I/O软件时一个关键的点就是设备独立性,意思是我们可以访问任意I/O设备而无需事先指定设备。也就是对于不同的I/O硬件。同一段程序是可以的。 具有标准接口的驱动程序的工作方式如下:对于每一种设备类型,例如磁盘和打印机。操作系统定义一组驱动程序必须支持的函数,对于磁盘而言,这些函数自然的包含读和写,除此之外还包含开启和关闭电源,格式化以及其他与磁盘有关的事情。驱动程序通常包含一张表格,这张表格具有针对这些函数指向驱动程序自身的指针。当驱动程序装载时,操作系统记录下这张函数指针表的地址。所以当操作系统需要调用一个函数时,可以通过表格发出间接调用。这张函数指针表定义了驱动程序与操作系统其他部分之间的接口。 **双缓冲:**当第二个缓冲区正在复制用户空间的时候,第一个缓冲区用来接收新的字符。以这样的方法。两个缓冲区轮流使用。称为双缓冲。 磁盘臂调度算法: 读/写一个磁盘块需要时间:1.寻道时间(将磁盘臂移动到适当的柱面上所需的时间)2.旋转延迟(等待适当扇区旋转到磁头下所需的时间)。3.实际数据传输时间。 一个磁盘子系统具有如下特性:当一个写命令发给它时,磁盘要么正确地写数据,要么什么也不做,让现有的数据完整无缺的留下,这样的系统称为稳定存储器,并且是在软件中实现的。目标是不惜一切代价保持磁盘的一致性。 **时钟:**两种。1种是直接接到电源线上。就可以每个电压周期产生一个终端。现在比较少。另一种是由晶体振荡器,计数器和存储寄存器三个构成。当把一块石英晶体适当的切割并且安装到一定的压力之下时就可以产生非常精确的周期性信号。时钟启动时,存储寄存器的值被复制到计数器中,每一个脉冲使计数器-1,直到为0,产生中断。

操作系统中的文件系统

文件系统 进程,地址空间,文件这些抽象概念均是操作系统中的重要概念,如果理解了这三个概念,就迈上了成为一个操作系统专家的道路。 文件系统存放在磁盘上,多数磁盘划分为一个/多个分区,每个分区有一个独立的文件系统,磁盘的0号扇区称为主引导记录,也就是MBR,用来引导计算机,MBR的结尾就是分区表了。该表给出了每个分区的起始和结束地址。表中的一个分区被标记为活动分区。在计算机被引导时,BIOS读入并执行MBR,MBR做的第一件事就是确定活动分区,读入他的第一个块,称为引导块,并执行之,引导块中的程度将装载该分区中的操作系统,为统一起见,每个分区都从一个启动块开始,即使它不含有一个可以启动的操作系统。 文件的实现: 1.连续分配,每个文件作为一连串连续数据存储在磁盘上。实现简单,读操作性能好,一次就可以了。但不足是删除之后不能移动,因为成本太高,使得空块增多。碎片化严重。更诡异的是对于文件编辑软件,实现无法准确预测大小,如果预测错了。。就跪了。 //研究那些具有清晰和简洁概念的老式系统和思想是很重要的,因为他们可能以一种令人吃惊的方式在未来系统中获得应用。 2.链表分配 为每个文件构造磁盘块链表,一个文件分为N个文件块,N个文件块构成一个链表,存储在物理上的多个地方。顺序读取很方便,但随机读取则相当缓慢,由于指针的存在,每个磁盘块存储数据的字节不再是2的整数次幂,导致系统运行效率降低,因为很多程序都是以2的整数次幂来读写磁盘的。 3.在内存中采用表的链表分配 去除每个文件块在磁盘上的指针字,放入内存的一个表上,就可以解决上一个分配的不足。直观的例子如图。 文件A使用了磁盘块4,7,2,10,12 内存中这样的表格称为文件分配表,也就是FAT了。主要缺点是对于大磁盘的小块,这种表需要的内存占用太大。。不太适用。 4.i节点 记录各个文件包含哪些磁盘块的方法是给每个文件赋予一个称为i节点的数据结构,其中类除了文件属性和文件块的磁盘地址.相对于在内存中采用表的方式,这种机制的优势在于只有对应文件打开时,其i节点才进入内存. 文件系统的一致性检查分为两种:块的一致性检查和文件的一致性检查.构造两张表,一张跟踪块在文件中的出现次数,另一张跟踪该块在空闲表中的出现次数,如果一致,则某一块必然在两个表中1/2中为1,如果某一块没有出现在任何一张表中,则称为块丢失,浪费了磁盘空间.解决方法是让文件系统检验程序把他们加入到空闲表中 如果在空闲表中出现了两次.则重新建议建议空闲表即可. 如果在文件表中出现了两次.则比较麻烦. 文件系统性能 1.高速缓存,最常用,指的是一系列的块,逻辑上属于磁盘.但实际上被保存在内存上.基本算法是检查全部的读请求,查看在高速缓存中是否有所需要的块,如果存在,就读,否则读入高速缓存在复制到其他地方. 2.块提前读,在需要用到块之前,试图提前将其写入高速缓存,从而提高命中率.比如某个文件有n个块,则请求k块的时候,则同时预读k+1块.只适用于顺序读取的文件,对随机读取文件,则没有效果/反效果. 3.减少磁盘臂运动 把所有可能顺序读取的块放在一起,当然最好是放在同一个柱面上,从而减少磁盘臂的移动次数.