随着现代浏览器性能的提升,前端工程师设计出的交互方式也多种多样。其中瀑布流方式滚动更新加载已经是一种常见的Web前端交互方式了。

然而在Rails中如何实现这样一种随着用户滚动页面就能自动追加内容到页面的方式呢?

有一些现成的Gem可以推荐,例如jquery-infinite-pageswill_paginate_infinite等。不过我觉得它们使用比较复杂,不如自己去实现一个。

本文既然提到最方便,自然是需要用一种最小化改动的方式来实现这样的功能。

具体如何实现,请往下看。

首先假设我们要实现瀑布流式动态更新的对象是Post(或者是Article、News或者其他),第一步我们需要在Gemfile中加入以下两个Gem:

1
2
gem 'will_paginate'
gem 'bootstrap-will_paginate'

然后执行bundle,接着去修改posts_controller.rb,修改其中的index方法:

1
2
3
4
5
6
7
8
def index
@posts = Post.all.paginate(:page => params[:page], :per_page => 10)

respond_to do |format|
format.html
format.js
end
end

这里由于我们增加了js的渲染格式,所以要去views/posts中添加一个index.js.erb模板文件,内容如下:

1
2
3
4
5
6
7
$('#posts_list').append('<%= j render @posts %>');
<% if @posts.next_page %>
$('.pagination').replaceWith('<%= j will_paginate @posts %>');
<% else %>
$(window).off('scroll');
$('.pagination').remove();
<% end %>

上面的代码通过js定位页面中的posts_list作为要追加元素的目标,所以我们稍微修改一下views/posts/index.html.erb,在其中加入posts_list元素:

1
2
3
4
5
6
7
8

<div id="posts_list">
<%= render @posts %>
</div>

<div id="infinite-scrolling">
<%= will_paginate %>
</div>

在这段代码中,我们将@posts集合交给其他模板去渲染了,而这里暂时还没有用来渲染@posts的模板,所以要在views/posts中创建一个_post.html.erb模板文件,内容如下:

1
2
3
4
5
<div>
<h3><%= post.title %></h3>
<p><%= post.content %></p>
<hr/>
</div>

就这么简单,用来输出标题和内容。

最后关键的一步,需要创建一个事件监听器来捕获页面的滚动变化,所以在assets/javascripts/posts.coffee中,加入以下代码:

1
2
3
4
5
6
7
8
9
10

$(document).on "turbolinks:load", ->
$(window).on 'scroll', ->
more_posts_url = $('.pagination .next_page a').attr('href')
if more_posts_url && $(window).scrollTop() > $(document).height() - $(window).height() - 60
$('.pagination').html('<img src="/assets/ajax-loader.gif" alt="Loading..." title="Loading..." />')
$.getScript more_posts_url
return
return

如此一来,就实现了通过ajax方式请求原来需要在下一页展现内容,并把内容追加到index.html的文章列表中,也就实现了瀑布流加载了。

一切修改好以后,重启Rails服务,在页面滚动一下试试吧。

本方法参考自https://www.sitepoint.com/infinite-scrolling-rails-basics/

在无垠的大地,广袤的草原上,生活着一批原始人。

他们以部落的方式群居,身体强壮的人负责打猎、种植,心灵手巧的人负责编织、烹饪。

部落里需要饮水,于是年老的长者带领着大家从遥远的河流里,往部落挖了一条沟渠。

至于为什么他们不直接搬到大河边居住,也许是因为河边土地过于松软吧,部落的土房子还无法适应那样松软的地表。

日子就这样,年复一年。

对了,在沟渠挖好以后,部落里除了打猎、编织的人以外,又多了一类人。

他们因为住的离沟渠比较近,可以很轻易地打到水,所以,他们开始一个新的工作,卖水。

不过,在原始人的世界里,没有“卖”这个字,他们也理解不了这个行为。

他们只是用打好的水,去和部落里的其他人换取一些猎物和织好的布。

日子就这样,年复一年。部落的居民也没觉得有什么奇怪。

这确实不是什么奇怪的事情。

毕竟,每个打猎回来的傍晚,打猎的人实在很累,也确实不想再亲自去渠边,拎那么一捅水回来。

他更愿意,拿自己多分到的一只野兔,去和住在沟渠边的人换一桶水。

这样看起来,整个部落的协作,反而变得更高效了。

卖水本身合情合理,也不是什么坏事,反而是一种善举。

这世界本就是这样,很多事情的发生,都有一个善良的初衷。

这件善良的事情,一致这样延续着,年复一年。

直到过了很多年,部落里有了一个聪明人,他居然用木材做成管道,可以更方便地引导水的流动。

一开始部落里的人只是以为可以多一种运输材料。

可是谁知道,有一天,一个原始人居然跳出来说,既然我们可以做成这么方便的管子了,为什么我们不把水供应到部落的每个居民家中呢?

这样,我们就可以不需要从沟渠里取水了!

猎人很开心,他送给这个提建议的伙伴一头野猪,感谢他提出这么具有建设性的思路。

但有一些人,他们不开心了。那就是原本住在沟渠边卖水的人。

这么些年,他们早已经忘记了怎么打猎,甚至,他们当中有的已经开始刻意逃避打猎了。

他们只知道怎么高效地取水、换野兔。

使用管道供水,就意味着,部落抛弃了他们。

管道,可以让猎人不用拿野兔换就可以喝到水,虽然猎人们同样需要用野兔去换一根可以供水的管道。

但却让渠边的人的生活,发生很大的变化。

提议用管道供水的人,他有错吗?他只是一个颠覆者。

发明管道的人,他呢,有错吗?他只是热爱发明。

猎人有错吗?他只是不想再用野兔换水。

在沟渠边卖水的人,有错吗?他只是在用劳动为别人提供方便。

没有谁有错,只是环境需要演变,部落必然要向着更高效的层次转变。

守旧者害怕改变,固执坚守。

颠覆者陷入困局,遇到阻力。

听说在有的部落,甚至因为这些,在内部起了冲突。好在这个部落没有。

最后,事情怎么样了呢?

部落开会决定把供水管道的建设和维护工作交给这些只会卖水的部落居民,让他们继续发扬奉献精神,为部落提供方便。

事情顺利推进了。

一个互害型社会,谁也逃不掉,谁也躲不开。正如雪崩时,没有一片雪花是无辜的。
希望此文可以引起我们共同的反思。

每天披星戴月地上班,走过熙熙攘攘的人群。

可曾想过,这一切繁荣与庸碌,是谁的宏观设计?

你收到的需求,你交付的方案,是谁在帷幄运筹?

今天下了雨,早上你过马路时,匆匆踩了脚油门,溅起的雨水淋湿了一位路人。

路人十分郁闷,带着糟糕的心情草草应付了上司催促的图纸 – 他是一位建筑师。

若干年以后,在你经过最多的路口多了一栋很丑的楼。

你觉得看起来无比别扭,别扭到甚至影响你的心情。

可谁能想到这楼之所以别扭,起因竟是那天飞溅的雨水?

那天的建筑师因为心情不好,还骂了手下的工人几句。

工人感到很不平衡。自那以后,他手里的螺丝,就从没拧紧过。

他心里想,反正建好的楼,最后也轮不到自己住。先倒霉的也是别人。

后来楼真的倒了,一次惨烈的事故。

一个在事故中失去亲人的受害者疯了,去校园里施暴。

保安眼睁睁看着孩子们受到伤害,不敢上前。

他心里想,反正受害的不是自己的孩子 – 更何况,他因为买不起那倒掉的楼,根本没有老婆。

你在广播里听说了这件事,庆幸还好自己的孩子不在这座校园。

庆幸的同时,更加用力地踩了脚油门,并没有感觉到,这又是一个雨天。

这部电影,前不久去重温了一遍。为的就是给宫崎骏补一张电影票。
想必现在影评都烂大街了,解读无非就围绕几个角度:欲望、人性、环保等等。

相比之下,宫崎骏并没有像东野圭吾那样近距离凝视深渊,在宫崎骏老爷子的笔下,世界虽然有着这样那样的不美好,但最后,总是会回归美好。

老爷子其实很善良,把一切的善意都流露在笔端,送给这个世界了。

文艺大师的出现,往往会和时代背景有着紧密的联系。

宫崎骏出生于二十世纪四十年代初,成长于六十年代初。
翻看日本的现代史,从二十世纪六七十年代开始,经济进入了稳定增长时期。从1989年开始的平成年代,到90年代末,东京渐渐成为了国际金融市场,经济达到了战后的顶点。
金融的飞速发展,让日本的经济突飞猛进,也加速实现了日本的现代化,以致于蜡笔小新那个年代的日本家庭,彩电、冰箱等家电已经成为了日本家庭的常见的家庭用品了。
宫崎骏正是在那个环境下成长起来的一代人(有点类似我们国家的85后,95前这批人)。

然而等到他羽翼丰满,才华横溢的时候,日本正在经历些什么呢?
经过几十年的快速发展,日本的社会变化已经翻天覆地。但紧随其后的经济泡沫,让整个国家陷入了低迷和萧条。
而经济发展带来的诸如快节奏的生活方式、社会矛盾、环境污染问题,成为了不可避免的痛点。

善良的宫老爷子,于是乎拿起他的画笔,通过一系列的形象、场景和比喻,来告诫和提醒人们这些问题,这就是为什么在2001年,有了这样一部动画。

动画中的一开始,千寻一家去的主题公园,就是经济增长时期开发,经济萧条时期荒废下来的“鬼城”。类似的场景,还出现在《天空之城》。在《天空之城》的故事中,未来的人们利用科技甚至实现了把拉普达这个城市漂浮在了空中,但却仍然避免不了衰落的命运,这其实就是在告诫人们,要实行一种可持续的生态发展战略。

经济快速发展,带来的精神层面的问题也越来越多。在《千与千寻》里,灯红酒绿的娱乐场(澡堂),形形色色的“妖魔鬼怪”忘了自己的名字,用金钱购买快乐。贪婪的人会变成猪,忘了自己名字的人,成为了别人的傀儡,任人摆布。

这是不是就是所谓的众生相呢?

反观当下,千寻曾经是你,是我,是我们每一个人。但是当我们离开象牙塔走入社会,是否又能一直保持一颗初心,面对世俗的诱惑,能够不为所动,一直记得自己是谁呢?

《千寻》这部电影,对于当下的中国,十分具有警世意义。

四十年的改革开放,让中国经济增速远远超过当初的日本,但是也要警惕经济发展所带来的反噬效应。环境、社会等问题,丝毫不可忽视。(而实际上,很多问题现在已经逐渐开始显现了。)

经济、社会的问题这里暂且按下不表,此篇杂叙只谈电影和文艺。说到文艺,往往时代会成就大师。中国电影的上一个时代,成就了姜文、葛优、冯小刚。而今后,必定也会诞生属于这个时代的一批大师。

想来,等我们这届年轻人老了,应该不会太无聊。

一切有为法,如梦幻泡影,如露亦如电,应作如是观。

金刚经

这是一部不算太烧脑的悬疑电影。导演 奥利奥尔·保罗 是个我非常看好的逻辑鬼才。他的上一部电影,叫做《看不见的客人》。

这部电影说的是家庭主妇在雷暴中通过一台旧电视打通了与1979年的联系,意外地干扰了一起谋杀案,从而引发时空错乱的故事。

导演非常善于运用外部环境为剧情营造氛围,比如雷暴、夜晚等等。构思这样一部剧情严密并又逻辑复杂的电影是需要在剧本上费些心思的。

剧情就不做过多描述了。简单聊一聊这部电影带来的外围思考。

想必很多看过这部电影的人都有这样的想法,觉得人生如梦一场,恍惚一念,可能就会经历n个完全不同的故事。

哈哈,其实这不是宗教里面早就提出来的可能性吗?人生,仿佛梦幻泡影,如露如电。

从工程层面来说,虽然宇宙的空间无穷无尽,但是提高它的利用率大概也是造物主在设计这个系统时需要考虑的一个因素。

就好比,通过时分复用进行串口通信,以及在现代操作系统上,通过段+偏移来寻址,就可以更加巧妙充分地利用总线一样。

相信造物主在设计这个宇宙的时候,应该也是建立了不同的维度,让这个模型更加完美和巧妙,充满了艺术感,不是吗?

造物主为我们准备的刻度显然需要足够精确,在这种精确的维度下实现“时空复用”。

现象就是此时此刻可能有无数个我,有多少个未知的时空,就有多少个我。

那个勇敢说出喜欢你的我,那个加倍努力奋斗上进的我,那个沉迷游戏难以自拔的我,还有这个和你相遇的正在码字的我。

在这个系统里,人生的表达式,不是只有唯一的解,我们的相遇,也许只是一个偶然。电光火石间,刹那与须臾。

我想,那正是我们正在经历着的,盛大如梦幻泡影的,海市蜃楼。

朴树的道

小学的时候,第一次听到一句诗,诗中说“生如夏花之绚烂 死如秋叶之静美”。
那个时候,自己还是一个顽皮的小男孩,根本就不懂,什么叫做生如夏花呐?

后来升入初中,心头有了思绪,听到有一个歌手唱出这句歌词,才知道,生如夏花,是多么幸福的梦想,多么悲怆。

我从远方赶来 赴你一面之约
痴迷流连人间 我为她而狂野
我是这耀眼的瞬间 是划过天边的刹那火焰
我为你来看我不顾一切 我将熄灭永不能再回来

朴树 生如夏花

从那以后,就喜欢上了这个叫做朴树的歌手。开始听他的每一首歌,他是那样特别,看似狂放不羁,却又清新脱俗。
在无尽的靡靡之音中,他就那么干净地伫立。

在希望的田野上,且听风吟。

她在睡梦中,傻子才悲伤。

来不及,送别,平凡之路。

他用每一首歌,悠悠地唱着这世间的悲欢离合。爱情、梦想、风景、旅途都在他的歌声里,优美又深刻。

到后来,听他的《猎户星座》,突然发现,朴树哥(或许应该叫叔),长大了,而彼时那个顽皮的我,也已经长成过了弱冠的小伙。

那个年少轻狂,不知天高地厚的少年,成了一个战战兢兢,如履薄冰的年轻人。二十出头,就失了勇敢。

听着他的《No fear in my heart》,不禁反问自己,在躲避什么,在害怕什么,在挽留什么。

你在躲避什么
你在挽留什么
你想取悦谁呢
你曾经下跪,这冷漠的世界,何曾将你善待
所以你厌恶危险,坠入厄运深渊,输掉一切
你两手紧紧抓着,如同身处悬崖
你小心翼翼地,以为你拥有着,貌似人生圆满
能不能 彻底地放开你的手
敢不敢 这么义无反顾坠落
坠入黑暗中 坠入泥土中的海阔天空
就让我 来次透彻心扉的痛
都拿走 让我再次两手空空
只有奄奄一息过,那个真正的我,他才能够诞生

朴树 No fear in my heart

朴树长大了,他看到了世俗,他无法躲避。

于是,他开始回忆,回忆那个天真的,初心的,清白之年。杨柳依依,衬衣如雪。

故事开始以前,最初的那些春天
阳光洒在杨树上,风吹来,闪银光
街道平静而温暖,钟走得好慢
那是我还不识人生之味的年代

我情窦还不开,你的衬衣如雪
盼着杨树叶落下,眼睛不眨
心里像有一些话,我们先不讲
等待着那将要盛装出场的未来

人随风飘荡,天各自一方
在风尘中遗忘的,清白脸庞
此生多勉强,此身越重洋
轻描时光漫长,低唱语焉不详

朴树 清白之年

唯有初心不忘,方能有始有终。每当怀念起过去,便仰望着星空,看到的是遥远的猎户星座。

你是否,得到了想要的人生?

你还记得吗 那时的夜晚 是如何降临的
什么都不说 像来自天空 轻如指尖的触痛
你是否得到了 期待的人生 梦里的海潮声
他们又如何从 指缝中滑过 像吹在旷野里的风
情长 飘黄 静悄悄的时光
清晨 日暮 何处是我的归宿

朴树 猎户星座

人生如逆旅,我亦是行人。走的路多了,心里的尘埃,也多了。入世太深,困于迷途,则失了道心。

从朴树的歌里,听到的是他心里的清弦,世外的琼音。从生到死,由始至终。

而他的低调,让只有少数人才能静下心来欣赏他的歌,真正地诠释了,什么是大音希声。

许巍的禅

在我的精神世界里,没有太多的人物和元素。

因为我没有太深或太宽泛的音乐素养,对音乐的历史一知半解,对现代的音乐,更是没有时间和精力去了解每一类作品与每一个人。

因此,无法从统计的角度去比较音乐作品的好坏。

我想现代人绝大多数都聪明,当看到一颗芝麻的时候,一定会想着可能还会有西瓜。很少有人会说,这就足够了。

但文艺作品很多不是这样的,没有必要阅尽沧桑再回头。好的作品,就像历史画卷里的珍珠,只需要寥寥数笔,就已经熠熠生辉。

就像李白的诗,时空中不会再有第二个李白。很羡慕活在李白同处一个时代的人,可以见证他的放浪形骸。

而庆幸的是,我们的时代,有许巍。

这就足够了。

相信很多人接触许巍,都是从那句著名的歌词,曾梦想仗剑走天涯。

曾梦想仗剑走天涯
看一看世界的繁华
年少的心总有些轻狂
如今你四海为家
曾让你心疼的姑娘
如今已悄然无踪影
爱情总让你渴望又感到烦恼
曾让你遍体鳞伤

许巍 曾经的你

那首《曾经的你》,不论何时何地,什么样的心境,听起来总有那么深刻的共鸣和感慨。
其实这就是许巍,从早年开始,他的歌曲里就有一种慈悲,用澎湃的鼓点和沧桑的独白,抚慰每一位流浪的路人。

也许是出发太久
我竟然迷失在旅途
我最亲爱的朋友
你让我再一次醒来

许巍 故事

每个人都这样成长,从年轻到老。每个人的经历,都可以写成故事,写成一本书。也常常有人在旅途中迷了路。
许巍在一张题为《爱如少年》的专辑里,说起故事,也说起少年。

时间已过去多少年
如今的你们在哪里
经历着什么样的故事
什么样的幸福伤痛
今天我依然能感到
那清风掠过的春天
掠过了城市掠过村庄
掠过我们年少的胸膛
我依然看到那些少年
站在九月新学期操场
仰望着天空清澈的眼神
向着无限的未来

许巍 少年

他的好歌太多,以致于想认真聊起一些的时候,甚至不知道该从何谈起。他同样是一个低调的人。

有时也觉得很怪,一个玩摇滚玩的很嗨的人,怎么就“佛系”了。但是想来却也很正常,一切都可以归为慧根。

从那首《我们》开始,许巍就已经提起忏悔了。

到了后来的《此时此刻》,那首《救赎之旅》,那些简单的来自阳光的音符,正一声一声地诉说着他自己。

一直以来 在心中的梦想
是用一生 改变这个世界
一直以来 这闪光的心愿
指引我穿行世界

许巍 救赎之旅

穿行之后,便是归途,旅人等在那里。

峰回路转,一念净心,证得万物大千,轮回如梦初醒。

一念净心 花开遍世界
每临绝境 峰回路又转
但凭净信 自在出乾坤
恰似如梦初醒 归途在眼前

许巍 空谷幽兰

走过了旅途,体会了平淡,感悟出人生本就是一刹那的时光,便更加珍惜眼前,喜欢那些纯粹和简单,喜欢平静的喜悦。

命运的使然
我这漂泊的游子
每次思念远方的你们
我会向故乡顶礼
心中升起的喜悦
总在归乡的旅程
当家门在开启时
这世界变得温暖

许巍 喜悦

宗教给人带来了什么?有的是统治,有的是战争,有的是简单和快乐。
许巍就点燃了他满心的慈悲与满腹的才华,为世人化作幽暗道路上的一道光芒,一朵向往自由,无法阻挡的蓝莲花。

没有什么能够阻挡
你对自由的向往
天马行空的生涯
你的心了无牵挂
穿过幽暗的岁月
也曾感到彷徨
当你低头的瞬间
才发觉脚下的路

许巍 蓝莲花

Apache Felix是一个OSGi版本4规范的Apache实现。OSGi是一个基于Java的服务平台规范,其目标是被需要长时间运行、动态更新、对运行环境破坏最小化的系统所使用。
渗透测试过程中也许会遇到Apache Felix,这时可以尝试访问Felix的/system/console/sc路径,并且试试看有没有弱密码。如果能够成功进入Apache Felix Web Console,就可以通过执行Groovy代码,间接执行系统命令,甚至获得系统权限。

例如Groovy用于执行系统命令的代码:

1
2
3
4
5
6
7
8
def execute(cmd){
def proc = cmd.execute();
proc.waitFor();
println proc.text;
}

execute("ipconfig");

获取一些系统信息:

1
2
println System.getProperty("user.dir"); //print local path
println InetAddress.getLocalHost(); //print local ip

Groovy反弹Shell的代码,可以参考:

https://chorder.net/2019/05/29/Groovy%E5%8F%8D%E5%BC%B9Shell%E8%84%9A%E6%9C%AC-Groovy-Reverse-Shell-Script/

CentOS6由于版本过老和源组织不当等原因,成功安装Python3和一些较新的依赖库是一件很幸运的事情。这里记录下遇到的报错和解决过程。
按照惯例,先记录一下报错内容,方便搜索引擎索引:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# pip3 install --upgrade pip
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pip/
Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pip/
Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pip/
Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pip/
Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pip/
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
Requirement already up-to-date: pip in /usr/local/lib/python3.7/site-packages (19.0.3)
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

解决方法:

1.编译安装OpenSSL 1.0.2j版本并配置环境变量

下载OpenSSL源码包:

wget http://www.openssl.org/source/openssl-1.0.2j.tar.gz

解压缩,编译安装:

1
2
3
4
tar -zxvf openssl-1.0.2j.tar.gz
cd openssl-1.0.2j
./config --prefix=/usr/local/openssl-1.0.2j shared zlib
make && make install

2.编译安装Python3,使用自定义的OpenSSL

下载Python3.7.3源码包:

wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz

解压缩,编译安装:

1
2
3
tar -zxvf Python-3.7.3.tgz
cd Python-3.7.3
./configure

在这一步之后,先不要着急运行make命令。先修改Modules/Setup文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Socket module helper for socket(2)
#_socket socketmodule.c

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/openssl-1.0.2j/ #取消这一行的注释,并将原来的/usr/local/ssl改为/usr/local/openssl-1.0.2j/
_ssl _ssl.c \ #取消这一行的注释
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ #取消这一行的注释
-L$(SSL)/lib -lssl -lcrypto #取消这一行的注释

# The crypt module is now disabled by default because it breaks builds
# on many systems (where -lcrypt is needed), e.g. Linux (I believe).

#_crypt _cryptmodule.c # -lcrypt # crypt(3); needs -lcrypt on some systems

修改完成以后,还需要创建两个指向动态链接库的软链接文件:

1
2
ln -s /usr/local/openssl-1.0.2j/lib/libssl.so.1.0.0 /usr/lib64/libssl.so.1.0.0
ln -s /usr/local/openssl-1.0.2j/lib/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.1.0.0

最后编译并安装:

1
make && make install

安装完成以后,再次运行pip3 install --upgrade pip,可以看到原先SSL连接报错的问题已经解决:

1
2
3
4
5
6
7
8
9
[root@localhost Python-3.7.3]# pip3 install --upgrade pip
Collecting pip
Using cached https://files.pythonhosted.org/packages/5c/e0/be401c003291b56efc55aeba6a80ab790d3d4cece2778288d65323009420/pip-19.1.1-py2.py3-none-any.whl
Installing collected packages: pip
Found existing installation: pip 19.0.3
Uninstalling pip-19.0.3:
Successfully uninstalled pip-19.0.3
Successfully installed pip-19.1.1

Linux和Linux是有区别的。

按Boss的要求在一台CentOS 6上面部署业务,我写的程序是一个基于Rails的Web调度页面,下面挂了一个Python写的数据处理程序。

部署时候被几个小问题折腾到现在,头晕脑胀,来这里发发牢骚。

首先是CentOS6的源里面缺少太多必要的软件包,Rails的SASS相关的GEM用不了,好在界面简单,直接砍掉了这些GEM,搞定。

然后CentOS6自带的Python版本是2.6,根本无法通过pip去装我要的包。

于是在源里面找Python3,安装以后,pip3可以装我要的第三方包了,但装好提示无法使用。

因为rh源里的Python3装完是在/opt/rh/XXX目录下的,即使在/usr/bin/建立了软链接,site-packages里的包也照样用不起来。

归根结底还是因为我的Python水平太菜了,不知道怎么处理Python的依赖问题。

再然后,想着不用rh源里的Python3可能会好点,于是下了源码包编译安装。可是加上–with-ssl选项编译后,自己编译的Python仍然没有ssl模块。

而pip3在线安装依赖包时,又需要使用ssl模块去和pypi.org建立连接。

好吧,那就直接去Pypi上直接下载whl回来安装吧,可是安装好以后又报一样的错,提示找不到模块。

到这一步我是很绝望的,并不是因为自己解决不了这个问题,而是因为根本不想和这样简单又没有意义的问题死耗着。

2019.06.13更新:解决方法

首先这种问题是显然可以解决的,我们先从战略上和战术上一起忽略它,但是这个繁琐的纠缠过程引发了我的如下思考。

理论上来说,这种配置层面的问题,是完全可以通过合适的底层平台来避免的,例如使用更新的操作系统。

已经9102年了,再用CentOS6显然是不合理的,然而仍旧有一批干活的人,喜欢死守陈旧的东西。于是,整个生态就全都需要迁就于这个搭建底层系统的人。

工匠的时间,应该花在更值得琢磨的事情上,而不是解决一个又一个这样的脚本层面的脑残问题。浪费时间的同时又不能给自己带来任何成就感。

所以每当有学生和网友,问我很多简单的问题时,我都会劝他们转行。因为IT工程师圈子里,实在不需要更多庸才了,如果没有解决小问题的能力,就行行善别进这个圈子吧,干哪行不能混口饭吃呢。

至于那些能够通过悟性、思考和努力,掌握了计算机特性的人,自然有成为一个出色工程师的天分,他们并不会因为一两句冷嘲热讽就心灰意冷(如果会,同样说明不适合这个圈子)。反而会更加努力地去钻研出答案,以此来证明自己。他们也不会记恨曾经的嘲讽,显然,克服人性,摆脱情绪,是成为任何一个领域的高手所必须要有的修养。否则德不配位,爬的越高,摔的越痛。

说的深了。不过此文本身就是一篇扯淡文,也无妨。

其实,我只是想说,Linux和Linux是不一样的。CentOS这种东西,能称得上是Linux吗?体系怪异,脉络紊乱,必定难成气候,我话就撂这儿了。

未来操作系统的格局,西半球,一定是属于Debian的。

rkhunter是一个Linux下自动检测rookit的脚本,使用时需要依赖数据库。在执行rkhunter --update进行更新操作时,也许会报以下错误:

1
Invalid WEB_CMD configuration option: Relative pathname: "/bin/false"

修复这个错误的方法很简单,编辑/etc/rkhunter.conf文件,找到其中的以下选项:

  • UPDATE_MIRRORS=0
  • MIRRORS_MODE=1
  • WEB_CMD=”/bin/false”

分别将UPDATE_MIRRORS=0改为UPDATE_MIRRORS=1,将MIRRORS_MODE=1改为MIRRORS_MODE=0,以及将WEB_CMD="/bin/false"改为WEB_CMD=""即可。

再次运行rkhunter --update,错误消失。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@debian:~#rkhunter --update
[ Rootkit Hunter version 1.4.2 ]

Checking rkhunter data files...
Checking file mirrors.dat [ No update ]
Checking file programs_bad.dat [ Updated ]
Checking file backdoorports.dat [ No update ]
Checking file suspscan.dat [ No update ]
Checking file i18n/cn [ Skipped ]
Checking file i18n/de [ Skipped ]
Checking file i18n/en [ No update ]
Checking file i18n/tr [ Skipped ]
Checking file i18n/tr.utf8 [ Skipped ]
Checking file i18n/zh [ Skipped ]
Checking file i18n/zh.utf8 [ Skipped ]
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×