DuplexPipe二三事(一)——有趣的起因:算24

写 DuplexPipe 是因为“无聊”!真的,那天很无聊,想起小时候用扑克牌和姐姐比赛算24,就随手写了一个 Shell 脚本重温一下:

#!/bin/sh
for ((i=0;i<4;i++))
do
((n=$RANDOM%10+1))
echo -n "$n "
done
echo
i=0
while read exp
do
((i++))
((value=$exp))
if [[ $value -ne 24 ]]
then
echo -n "Wrong! "
echo "$exp=$value"
echo "try again!"
else
echo "OK!"
echo "Total use ${i}s"
break
fi
done

最近好像养成一个习惯:能让计算机做则尽量不自己做。才玩了几盘,就开始动歪脑筋要写一个求24的程序来自动计算。方法就是最简单的穷举,下面是一个最初的简陋版本(有兴趣的朋友可以在此再添加五种括号):

#!/bin/sh
s[0]='+'
s[1]='-'
s[2]='*'
s[3]='/'
read a b c d
for ((i=0;i<64;i++))
do
((k=i%4))
x=${s[$k]}
((k=i/4%4))
y=${s[$k]}
((k=i/16))
z=${s[$k]}
e="$a$x$b$y$c$z$d"
r=`echo $e | bc -l | sed -e 's//.0/+$//'`
if [[ "$r" == "24" ]]
then
echo "$e=$r"
fi
done

既然能让计算机自动计算结果,那我先运行程序1,显示4个随机数;运行程序2,输入程序1生成的4个数字,获得结果后再反馈给程序1。但转念一想:我这样手工进行输入输出的工作,不是比算24本身更枯燥、单调?而且是重复的劳动!理所当然应该由计算机自动完成。

为完成这个任务,计算机要做的就是让“程序1”和“程序2”进行聊天:“程序1”的输出作为“程序2”的输入、“程序2”的输出作为“程序1”的输入。这一定义会让人立刻联想到“管道”(exe1 | exe2),但遗憾的是“管道”是单向的——只能满足“程序1”的输出作为“程序2”的输入。

其实这就是一个“进程通信”(IPC)的问题,如果你熟悉 UNIX 的历史,也会和我一样联想到 Socket 。我随即想起了网络瑞士军刀——nc(netcat),并用它顺利解决了这个问题!我会在《DuplexPipe二三事(二)》中介绍这个方法。


版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“redraiment”和主站点地址,方便其他朋友提问和指正。

联系方式

我的邮箱,欢迎来信(redraiment@gmail.com)
我的Blogger(子清行):http://redraiment.blogspot.com/
我的Google Sites(子清行):https://sites.google.com/site/redraiment
我的CSDN博客(梦婷轩):http://blog.csdn.net/redraiment
我的百度空间(梦婷轩):http://hi.baidu.com/redraiment

时间: 2024-09-15 03:55:38

DuplexPipe二三事(一)——有趣的起因:算24的相关文章

DuplexPipe二三事(五)——来自内网的呼唤

穿越防火墙 你是否曾经尝试过去连接一台远程计算机,却因为被防火墙拦截或路由器没有转发而造成无法通信?这是主动式连接的一个弊端:它依赖服务器的状态,而对服务器有生杀大权的只有管理员.如果能让服务器主动尝试连接我们的计算机,那就没问题了!因为防火墙.路由等一般不会过滤向外的连接(反弹式木马就是利用这一原理). 但以往的服务端程序都是采用监听本地端口的方式(比如 Windows 远程桌面程序监听本地 3389 端口),我们需要将它的连接方式改成主动连接外部网络的方式.我想你也一定要将想到(如果你看过<

DuplexPipe二三事(四)——网络连接方式随心换

连接方式 在<DuplexPipe二三事(一)>中提到建立连接有两种方式:监听本地端口,等待其他程序来连接(以下简称"监听方式"):或者主动连接其他程序(以下简称"连接方式").排列组合一下,会得到三种结果:监听-连接.监听-监听.连接-连接.其中只有"监听-连接"方式能正确地建立连接,<DuplexPipe二三事(三)>中介绍的 FPipe 只是在其中添加了一节"监听-连接-监听-连接",其中粗体部分

DuplexPipe二三事(三)——网络中转站:端口映射

端口映射 在<DuplexPipe二三事(二)>中介绍了瑞士军刀 nc 的用法:nc 就像给程序一张飞机票,让原本只能在本地执行的程序也能运行在网络上!但网络和现实交通一样,很多地方需要中转才能到达(比如外网计算机无法直接访问公司内部 Web 服务器). 为实现公网对内部网络的访问,需要对数据进行转发(即端口映射).比如内网"主机A"开启了 Web(port 80)服务,需要在"服务器的网关"上设置:凡来自 Internet 上对 80 端口的请求,全部

DuplexPipe二三事(六)——没有第七

我的设想 在着手编写 DuplexPipe 之前,我规划过我的需求:我想要一个最通用的通信工具,换言之就是能让所有具有输入/输出的程序都可以相互通信.DuplexPipe 本身远没达到这个设想,至少还得具备以下几中模式: -f file # 通过读写文件获得数据 -s # 从 stdio 中获得数据 -e exefile # 从本地程序的输入输出中获得数据 -r url # 这是一个附加功能.如果你玩过几天木马,你可能也渴望将它变成一个强大的后门!通过这个选项可以从URL中获得IP地址和端口,主

DuplexPipe二三事(二)——瑞士军刀再显锋芒:让程序相互聊天

瑞士军刀NC nc(NetCat)是我很喜欢的一个小工具.在我常用的网络小工具中使用频率仅次于 cURL .nc 属于传输层的工具(TCP/IP 四层模型请看这里),它能保证准确无误地发送和接收数据,但并不关心数据的具体含义(这些工作交给应用层的软件).难怪说 nc 是网络的瑞士军刀,因为所有应用层的软件都是通过各自的网络协议来解析来自传输层的数据.所以,只要你了解应用层协议(比如HTTP.POP3等),就可以手工模拟出任何服务端或客户端程序.而且,只要你愿意,以后设计网络程序完全可以只实现一个

黑客二三事:熊猫烧香其实不入流

 本文讲的是 :  黑客二三事:熊猫烧香其实不入流  ,  [IT168 评论]随着李俊二度入狱的消息传来,这个沉寂多年的名字以一种颇具娱乐意味的姿态再度出现,同时随着各种泄露事件和棱镜门的不断升级,黑客和网络安全相关的一系列话题再度登上了话题榜. 360带动了杀毒软件免费潮后,没用再出现类似熊猫烧香的大规模破坏性病毒,互联网世界似乎干净了许多,甚至杀毒软件们开始使用检查软件升级.计算开机时间等方式来寻找一些存在感. 不过"圈里人"看来,网络威胁只是换了一种形式存在,公众的眼界外,存在

2B创业泡泡二三事

过去半年A轮融资死掉的项目名单不断刷新,越刷越长,仿佛资本一夜之间就进入了冬天,与此同时,一群2B的创业者和投资者又在不断鼓吹2B创业春天的到来,矛盾的表象之下,其实是创业的泡泡.作为DBA+周末咖啡时间,随手写下二三事作为开始.  其一,过去几年创业太火了,大众创业万众创新让原本犹豫的也加入进来,火的不在于真正的创新,更多是估值的泡泡,网上流传的各种刷个二维码就是O2O.整个微信公众号就是移动互联网的段子虽然夸张,也是现实!去年上半年智能自行车一夜之间火的不行,赛道论觉得好像不投一个都不是智能

我的女儿二三事(r11笔记第87天)

    最近周末时间终于是自己的了,生活的重心就一下子放在了家庭和孩子上,这么想的时候,胳膊还隐隐发酸.     家里的事情这两个周末也有所进展,孩子方面我也花了不少的心思,没错,今天是要说说我家珊珊,一个风一样的孩子.      我爸今天突然提了一句,好像没怎么见过珊珊好好走路的样子,基本上就是在跑.通过最近我的经历来看,她跑的时候比走的时候确实要多.      对于我来说,最让我期待的无非是晚上下地铁之后,当我走出地铁出口,迎面而来的孩子会一路小跑,一脸的喜悦,然后一下子扑通扑到我的怀里,这

Oracle二三事之 EBS升级

对于初次执行这个过程的人而言,我们需要在规划阶段理清一些问题.许多人经历过以前的Oracle EBS升级,但是R12版本的升级与以前大不相同,需要使用一些不同的方法. 在与许多公司进行经验交流时,有一个问题总是困扰我:创建第一个可用实例,然后解决生产实例部署,都是非常有难度的.我们该如何进行规划,减小创建升级实例的难度呢? 当您获得11i环境的第一个克隆版本时,通常DBA会负责编辑一个检查清单,然后按照检查清单执行技术升级,保证按照正确的顺序完成补丁与升级步骤.与过去的升级相比,很重要的区别在于