tcp http 调试, 抓包工具, wireshark, Fiddler

tcp http 调试, 抓包工具, wireshark, Fiddler wireshark wireshark 的前身是Ethereal,2006年因为其创始人Gerald Combs的跳槽而改名为wireshark。它是一个跨平台的软件,可以在unix系列、linux、mac os、windows等多个平台上面进行网络协议抓包工作。同时他也是一个开源软件,有兴趣的话可以下载源码深入了解。我们可以通过wireshark官网进一步了解相关知识及下载该软件。 fiddler fiddler 的定位是网页调试工具,能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据。我们还可以为fiddler安装自己所需的插件,从而更好的利用fiddler的强大功能。详细介绍信息可以通过fiddler官网进一步了解, 做Web开发或者Web分析经常需要查看Http通讯的过程,项目实践中,很多Web相关的各种各样稀奇古怪的问题,最后都能通过分析HTTP流量得以解决。我到现在用过的比较好用的两个Http流量分析工具,一个是HTTP Watch,另外一个是Fiddler。 HTTP Watch HTTP Watch是我最早用过的HTTP流量分析工具。它只能用于IE和Firefox浏览器上。 它有两种使用界面,一种是以插件的形式附加在浏览器上面,供实时分析使用。你可以看到当前窗口中所有的HTTP请求/响应过程。另外它允许把实时分析的结果保存为后缀名为hwl的文件,然后用其自带的Http Watch Studio工具打开,这样既方便了以后对此过程再次进行分析,也方便与其他人共享,易于调试。下面是它的插件界面的截图,非常清新简洁: image 它的界面非常简单,主要分成三部分: 工具栏,HTTP消息概览,HTTP消息细节窗口。 工具栏主要是方便你快速过滤出你想要分析HTTP消息。 image 你可以按照HTTP流量内容类型去筛选,例如只查看图片相关的HTTP流量。或者根据Url是否包含某特定字符串进行过滤,等等。另外工具栏也提供了"清缓存"和"清Cookie"两个非常常见的操作。 HTTP消息概览栏可以让你快速查看当前窗口中的所有HTTP消息,每个HTTP消息花费的时间,以及服务器返回的状态码,请求的Url等等。默认它还会按照HTTP消息发起的页面进行分组,方便查看。 最底部就是每条HTTP消息的详细信息。最后面的Stream标签页显示的是最原始的HTTP请求/响应流。这里记录的信息是最详细的。 image 为了方便分析常见的需求,它将HTTP消息分成几个部分,也就是你上面看到的Headers、Cookies、QueryString、PostData等等标签页所展示的内容。下面的图展示了此次HTTP通讯涉及的Cookie,每个Cookie的键值,作用的主机域以及路径、过期时间等。 image HTTP Watch Studio就不做介绍了,基本和插件版本的一致,只不过可以脱离浏览器直接分析以前保存的HTTP通讯过程。 HTTP Watch提供了基础版本以及专业版本,其中基础版本是免费的。事实上基础版本提供的功能已经能够适用于大多数的情况了。 官方站点: http://www.httpwatch.com Fiddler Fiddler是微软推出的一个免费的HTTP流量分析工具。一开始我以为他只支持IE——毕竟是微软的东西——加之常见的功能HTTP Watch都已经够用了,就没怎么关注。这些天因为要调试Chrome浏览器上的一些问题,而Chrome自带的开发者工具又非常糟糕,搜着搜着又再次找到了Fiddler。 image Fiddler的界面和HTTP Watch差不多,都是分成三部分,工具栏+HTTP通讯总览+HTTP消息细节。只不过默认情况下它把HTTP消息细节窗口放到了右边。 用了一阵子发现,HTTP Watch能做到的,基本在Fiddler上都可以实现。不过Fiddler的界面显得比HTTP Watch要复杂一些,因为它提供了一些HTTP Watch没有的功能。下面主要介绍的是它和HTTP Watch不一样的地方,一样的功能就略过了。 Fiddler能够监视所有本地进程的HTTP消息,而不仅限于IE、Firefox这些浏览器。这比HTTP Watch适用范围更广。下图显示了google talk和Visual Studio发起的HTTP请求. image 安装完Fiddler之后你会发现IE还有Firefox中都多了个Fiddler的插件,Fiddler的原理实际上是在本地启动HTTP代理服务器,因为除了Firefox以外,很多应用程序包括其他浏览器都会应用IE上设置的代理。所以Fiddler只需要设置IE和Firefox这两个浏览器的代理服务器即可。这个插件做的事情实际上就是起到动态切换代理服务器的作用。 选中左侧某条特定的HTTP请求,Fiddler会在右侧帮你统计一下当前选中的HTTP消息的一些性能指标,例如发送/接受字节数,发送/接收时间,还有粗略统计世界各地访问该服务器所花费的时间。 image 在右侧窗口中,你可以采用各种视图去解析同一个HTTP请求/响应。例如以纯文本视图,或者图片视图,十六进制视图等等。它还提供了一个压缩测试工具,告诉你如果启用了Gzip或者deflate等压缩之后能够节省多少传输字节。 image Fiddler会记录下每次HTTP通讯的过程,然后允许你在不将请求发送给服务器的情况下返回之前记录的响应结果。 Fiddler还允许你对HTTP请求下断点,然后你可以根据情况来决定每个请求所返回的响应。 如果你想测试一些特殊的HTTP请求或者修改当前请求一些报头的时候,你不需要自己再写一个小程序去实现这样的功能,因为在Fiddler提供了直接编写HTTP请求的功能。你可以模拟浏览器去发送HTTP消息。 Fiddler支持插件机制,如果你觉得它提供的功能还不够用,那么你可以安装各种插件以增强它的功能或者编写自己的插件。官网上提供了几个不错的插件供免费下载。一个可以用于对HTML和Javascript代码进行语法着色,还有一个可以监视Web应用程序的安全隐患。 官方站点: http://www.fiddler2.com 总结 总的来说,HTTP Watch的使用相比Fiddler更简洁、容易上手。但是只适用于IE和Firefox。Fiddler功能更为强大,适用范围更广,而且还是免费的。具体用哪个就得看实际需求了。 1.为什么是Fiddler? ...

2013-12-13 · 1 min · 139 words · -

cpu 占用分析

cpu瓶颈分析 #系统的平均负载 uptime # 每个 CPU 的使用情况 mpstat # 每个进程 CPU 的使用情况 pidstat stress stress https://www.hi-linux.com/posts/59095.html https://www.infoq.cn/article/5jjIdOPx12RWWvGX_H9J?utm_source=rss&utm_medium=article http://9leg.com/java/2016/08/09/cpu-consumption-analysis.html 通常性能瓶颈的表现是资源消耗过多、外部处理系统的性能不足,或者资源消耗不多,但程序的响应速度却达不到要求。 资源主要消耗在cpu,io (又分文件io和网络io) ,内存方面,机器的资源是有限的,当某资源消耗过多时,通常会造成系统的响应速度变慢。 对于java应用而言,寻找性能瓶颈的方法通常为首先分析资源的消耗,然后结合java的一些工具来查找程序中造成资源消耗过多的代码。 今天先谈一谈cpu消耗如何分析,系统为linux,jdk为sun jdk。 在linux中,cpu主要用于中断、内核和用户进程的任务处理,优先级为中断>内核>用户进程,下面先讲述三个重要的概念。 上下文切换 每个cpu (多核cpu中的每个cpu) 在同一时间只能执行一个线程,linux采用的是抢占式调度。为每个线程分配一定的执行时间, 当到达执行时间、线程中有io阻塞或高优先级的线程要执行时,linux将切换执行的线程,在切换时要存储目前的线程的执行状态, 并恢复要执行的线程的状态,这个过程就是上下文切换。对于java应用而言,典型的是在进行文件io操作、网络io操作、锁等待或者线程sleep时, 当前线程会进入阻塞或休眠状态,从而触发上下文切换,上下文切换过多会造成内核占据较多的cpu使用,从而使应用响应速度变慢。 运行队列 每个cpu核都会维护一个可运行的线程队列,例如一个4核的cpu,java应用里启动了8个线程,且这8个线程都处于可运行状态, 那么在分配平均的情况下每个cpu中的运行队列就会有2个线程。通常而言,系统的load主要由cpu运行队列来决定。 利用率 cpu利用率为cpu在用户进程、内核、中断处理、io等待以及空闲5个部分使用的百分比,这5个值是用来分析cpu消耗的关键指标。 在linux中,可通过top或pidstat方式来查看进程中线程的cpu的消耗状况。 top 输入top命令后既可查看cpu的消耗情况,cpu的信息在top视图的上面几行中 对于多个或多核cpu,上面的显示则会是多个cpu所占用的百分比总合。如需查看每个核的消耗情况,可在进入top视图后按1,就会按核来显示消耗情况。 cpu-top 默认情况下,top视图中显示的为进程的cpu消耗状况,在top视图中按shift + h后,可按线程查看cpu的消耗状况,此时的pid既为线程id。 pidstat sy过高 当sy值过高时,表示linux花费了更多的时间在进行线程切换。java应用造成这种现象的主要原因是启动的线程比较多, 且这些线程多处于不断的阻塞 (例如锁等待,io等待) 和执行状态的变化过程中,这就导致了操作系统要不断的切换执行的线程, 产生大量的上下文切换。在这种情况下,对java应用而言,最重要的是找出不断切换状态的原因, 可采用的方法为通过kill -3 pid 或jstack -l pid的方法dump出java应用程序的线程信息,查看线程的状态信息以及锁信息, 找出等待状态或锁竞争过多的线程。 进程和线程的上下文切换都涉及进出系统内核和寄存器的保存和还原,这是它们的最大开销。但与进程的上下文切换相比,线程还是要轻量一些, 最大的区别是线程上下文切换时虚拟内存地址保持不变,所以像TLB等CPU缓存不会失效。但要注意的是另一份提问 What is the overhead of a context-switch?的中提到了: Intel和AMD在2008年引入的技术可能会使TLB不失效。 ...

2013-12-10 · 1 min · 72 words · -

测试覆盖

测试覆盖 传统的测试覆盖方法常见的有以下几种: 函数覆盖 (Function Coverage) 语句覆盖 (Statement Coverage) 决策覆盖 (Decision Coverage) 条件覆盖 (Condition Coverage) 还有一些其他覆盖方法,如Modified Condition/Decision Coverage,就不在这里讨论了。 函数覆盖: 顾名思义,就是指这个函数是否被测试代码调用了。以下面的代码为例,对函数foo要做到覆盖,只要一个测试——如assertEquals(2, foo(2, 2))——就可以了。如果连函数覆盖都达不到,那应该想想这个函数是否真的需要了。如果需要的话,那又为什么写不了一个测试呢? 语句覆盖: (也称行覆盖) ,指的是某一行代码是否被测试覆盖了。同样的代码要达到语句覆盖也只需要一个测试就够了,如assertEquals(2, foo(2, 2))。但是,如果把测试换成assertEquals(0, foo(2, -1)),那就无法达到所有行覆盖的效果了。通常这种情况是由于一些分支语句导致的,因为相应的问题就是"那行代码 (以及它所对应的分支) 需要吗?",或者"用什么测试可以覆盖那行代码所代表的分支呢?"。 **决策覆盖: **指的是某一个逻辑分支是否被测试覆盖了。如我上面所说,语句覆盖通常和决策覆盖有关系。还是以上面的代码为例,要达到所有的决策覆盖 (即那个if语句为真和假的情况至少出现一次) ,我们需要至少两个测试,如assertEquals(2, foo(2, 2))和assertEquals(0, foo(-1, 2))。如果有一个逻辑分支没有被覆盖 (比如只有测试assertEquals(2, foo(2, 2))) ,那么我们应该问和上面"语句覆盖"小节中相似的问题。 条件覆盖:指的是分支中的每个条件 (即与,或,非逻辑运算中的每一个条件判断) 是否被测试覆盖了。之前的代码要达到全部的条件覆盖 (也就是x>0和y>0这两个条件为真和假的情况均至少出现一次) 需要更多的测试,如assertEquals(2, foo(2, 2)),assertEquals(2, foo(2, -1))和assertEquals(2, foo(-1, -1))。如果有一个条件分支没有被覆盖 (比如缺少测试assertEquals(2, foo(-1, -1))) ,那么大家应该想想"那个条件判断是否还需要呢?",或者"用什么测试可以覆盖那个条件所对应的逻辑呢?"。 通过上面对几种传统的测试覆盖方法的介绍,大家不难发现,这些方法的确可以帮我们找到一些显而易见的代码冗余或者测试遗漏的问题。不过,实践证明,这些传统的方法只能产生非常有限的"学习"代码和测试中问题的机会。很多代码和测试的问题即使在达到100%覆盖的情况下也无法发现。然而,我接下来要介绍的"代码变异测试"这种方法则,它可以很好的弥补传统方法的缺点,产生更加有效的"学习"机会。 http://www.infoq.com/cn/articles/test-coverage-rate-role

2013-12-09 · 1 min · 59 words · -

墨菲定理

墨菲定理 墨菲定律是美国的一名工程师爱德华·墨菲作出的著名论断,亦称莫非定律、莫非定理、或摩菲定理,是西方世界常用的俚语。墨菲定律主要内容是: 事情如果有变坏的可能,不管这种可能性有多小,它总会发生。 “墨菲定律” (英文: Murphy’s Law) ,是一种心理学效应,由一个工程师提出,主要内容有四个方面: 一、任何事都没有表面看起来那么简单;二、所有的事都会比你预计的时间长;三、会出错的事总会出错;四、如果你担心某种情况发生,那么它就更有可能发生。 理论解释 “墨菲定律"的根本内容是"凡是可能出错的事有很大几率会出错”,指的是任何一个事件,只要具有大于零的机率,就不能够假设它不会发生。 在科学和算法方面,它与英文所谓的"worst-case scenario (最劣情形) “同义,数学上用大O符号来表示。例如,对插入排序来说,最劣情形即是要排序的阵列完全倒置,必须进行 n*(n-1) 次的置换才能完成排序。在实验上,证明了最劣情形不会发生,并不代表比它轻微的情形就不可能,除非能够很有信心的推论事件的概率分布是线型的。 在文化方面,它代表一种近似反讽的幽默,当作对日常生活中不满的排解。[1] 什么是墨菲定律?最简单的表达形式是"有可能出错的事情,就会出错 (Anything that can go wrong will go wrong) 。"爱德华·墨菲(Edward A. Murphy)是一名工程师,这句话迅速流传。经过多年,这一"定律"逐渐进入习语范畴,其内涵被赋予无穷的创意,出现了众多的变体,"[1]If anything can go wrong, it will.(会出错的,终将会出错)"、"笑一笑,明天未必比今天好。""东西越好,越不中用"、"别试图教猪唱歌,这样不但不会有结果,还会惹猪不高兴!" 墨菲定律的原句是这样的: If there are two or more ways to do something, and one of those ways can result in a catastrophe, then someone will do it. (如果有两种选择,其中一种将导致灾难,则必定有人会作出这种选择。) 。 简单地说,墨菲定律就是: 看似一件事好与坏的几率相同的时候,事情都会朝着糟糕的方向发生。 墨菲定律的来源,是一个叫墨菲的空军上尉,他有一个经常会遇到倒霉事的同事。1949年的一天,墨菲开玩笑说: “如果一件事情有可能被弄糟,让他去做就一定会弄糟。“举个例子吧,比如你每天出门都带着雨伞,可总也不下雨。当你这一天不想再带伞出门时,则往往会赶上下雨。再比如你去排队买东西,窗口前有几条相同长度的队伍。这时,你所加入的队伍往往是最慢的。 http://baike.baidu.com/subview/440060/9859388.htm?fromtitle=%E5%A2%A8%E8%8F%B2%E6%B3%95%E5%88%99&fromid=3621432&type=syn

2013-12-09 · 1 min · 69 words · -

MACD

MACD 指数平滑移动平均线 (Moving Average Convergence and Divergence) 平滑异同移动平均线即MACD指标。MACD称为指数平滑移动平均线,是从双移动平均线发展而来的,由快的移动平均线减去慢的移动平均线,MACD的意义和双移动平均线基本相同,但阅读起来更方便。当MACD从负数转向正数,是买的信号。当MACD从正数转向负数,是卖的信号。当MACD以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变。 MACD在应用上应先行计算出快速 (一般选12日) 移动平均值与慢速 (一般选26日) 移动平均值。以这两个数值作为测量两者 (快速与慢速线) 间的"差离值"依据。所谓"差离值" (DIF) ,即12日EMA数值减去26日EMA数值。因此,在持续的涨势中,12日EMA在26日EMA之上。其间的正差离值 (+DIF) 会愈来愈大。反之在跌势中,差离值可能变负 (-DIF) ,也愈来愈大。 至于行情开始回转,正或负差离值要缩小到怎样的程度,才真正是行情反转的信号。MACD的反转信号界定为"差离值"的9日移动平均值 (9日EMA) 。 在MACD的指数平滑移动平均线计算公式中,都分别加T+1交易日的份量权值,以现在流行的参数12和26为例,其公式如下: 12日EMA的计算: EMA12 = 前一日EMA12 X 11/13 + 今日收盘 X 2/13 26日EMA的计算: EMA26 = 前一日EMA26 X 25/27 + 今日收盘 X 2/27 差离值 (DIF) 的计算: DIF = EMA12 - EMA26 然后再根据差离值计算其9日的EMA,即"差离平均值",“差离平均值"用DEA来表示。 DEA = (前一日DEA X 8/10 + 今日DIF X 2/10) 计算出的DIF与DEA为正或负值,因而形成在0轴上下移动的两条快速与慢速线。为了方便判断,用DIF减去DEA,用以绘制柱状图。目前国内学习MACD指标的网站有新浪财经,MACD股票论坛,腾讯财经,网易财经,上上若水,里面资源众多,适合大家学习参考用! MACD指标是由两线一柱组合起来形成,快速线为DIF,慢速线为DEA,柱状图为MACD。在各类投资中,有以下方法供投资者参考: 当DIF和MACD均大于0(即在图形上表示为它们处于零线以上)并向上移动时,一般表示为行情处于多头行情中,可以买入开仓或多头持仓; 当DIF和MACD均小于0(即在图形上表示为它们处于零线以下)并向下移动时,一般表示为行情处于空头行情中,可以卖出开仓或观望。 当DIF和MACD均大于0(即在图形上表示为它们处于零线以上)但都向下移动时,一般表示为行情处于下跌阶段,可以卖出开仓和观望; 当DIF和MACD均小于0时(即在图形上表示为它们处于零线以下)但向上移动时,一般表示为行情即将上涨,股票将上涨,可以买入开仓或多头持仓。 指数平滑异同移动平均线,简称MACD,它是一项利用短期指数平均数指标与长期指数平均数指标之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标,电子现货之家有详细介绍。 ...

2013-12-06 · 2 min · 406 words · -

raspberry pi bt

raspberry pi bt http://www.howtogeek.com/142044/how-to-turn-a-raspberry-pi-into-an-always-on-bittorrent-box/

2013-12-01 · 1 min · 4 words · -

linux iwconfig wpasupplicant 命令行配置无线上网,wpa_supplicant

linux iwconfig wpasupplicant 命令行配置无线上网,wpa_supplicant install wpa supplicant sudo apt-get install wpasupplicant wpagui sudo pacman -S wpa_supplicant generate psk password wpa_passphrase SSID PASSWORD ##write to file wpa_passphrase SSID PASSWORD >> /etc/wpa_supplicant.conf ##connect sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf , 询问有关命令行配置无线网络的问题,受到启发,做了一点尝试,在这里留下帖子做个笔记。。 我的状况: Debian lenny , kernel 2.6.26-686 , opebox+tint2 网卡两块 Broadcom NetXtreme BCM5710 和 Intel Pro/Wireless 2200BG 步骤有三个: 连接到路由器 命令行 **代码:**iwconfig essid ap rate freq channel key ...

2013-12-01 · 2 min · 231 words · -

usermod

usermod # add user to docker group sudo usermod -aG docker $USER 禁止用户登录 usermod -s /sbin/nologin user0 应用举例: 将 newuser2 添加到组 staff 中 usermod -G staff newuser2 修改 newuser 的用户名为 newuser1 usermod -l newuser1 newuser 锁定账号 newuser1 usermod -L newuser1 解除对 newuser1 的锁定 usermod -U newuser1 功能说明: 修改用户帐号。 语法: usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s ][-u ][用户帐号] 补充说明: usermod可用来修改用户帐号的各项设定。 参数: ...

2013-12-01 · 1 min · 87 words · -

hostapd

hostapd 主页: http://w1.fi/hostapd/ hostapd是一个_IEEE 802.11的AP和IEEE 802.1X/WPA/WPA2/EAP/RADIUS验证器_.此页面用于怎么在linux系统下使用它.其他操作系统请参考hostapd主页 就Linux而言,老版本只能使用以下3个包 HostAP madwifi prism54 所有新的基于mac80211的驱动实现AP功能被hostapd’s nl80211 驱动支持 The mac80211 子系统将所有的master模式已经移到用户空间.通过hostapd去处理客户端验证,设置加密密钥,建立密钥转化策略,以及无线公共部分的其他方面. 由此,老的使用’iwconfig mode master’的方法已经不能使用了. 用户空间程序像hostapd目前使用netlink (the nl80211 driver)去创建master mode接口实现通信,monitor mode接口实现接收和发送管理框架 获得hostapd Using your distributions hostapd 在编译和安装你的拷贝之前尝试发行版本是很明智的.这将让你以后的干礼轻松,如果你的版本大于0.6.8或更新,你通过简单配置hostapd-minimal.conf文件来进行测试: change wlan0 to your wireless device interface=wlan0 driver=nl80211 ssid=test channel=1 如果上述配置出现以下错误: hostapd $ sudo hostapd ./hostapd-minimal.conf Configuration file: ./hostapd-minimal.conf Line 2: invalid/unknown driver ’nl80211' 1 errors found in configuration file ‘./hostapd-minimal.conf’ 那就意味着你的hostapd不支持nl80211,你将需要按以下操作编译。如果正常,你可以跳转到配置hostapd章节 下载和编译hostpad 使用基于nl80211的hostapd需要你有至少libnl-1.0 pre8或更新的 genl版本,nl80211依赖Generic Netlink. 大多数发行版都自带有这个或者更新的.在fedora或其它开发包和安装包分开发行版编译 _时,你需要libnl-devel 包 ...

2013-12-01 · 4 min · 814 words · -

Raspberry Pi配置为无线路由器

Raspberry Pi配置为无线路由器 http://www.cnblogs.com/DaochenShi/p/3152981.html 因为自己有个RPi,但是之前用的8188CUS芯片的无线网卡不支持,虽然当时买的时候是为了让笔记本连双WiFi的,因此只挑了个最便宜的。后来发现没法在RPi上面做AP,于是就又重新买了个。国内也有树梅派的论坛讨论过哪些无线网卡的支持,发现Ralink的芯片可以,因此就再花了34块钱买了个腾达的W331M,使用最新的Raspbian内核来进行操作 (非最新的话可能需要自己编译驱动) 。 以下是结合上面的参考链接给出的如何将RPi搭建为一个路由器: 首先是必备材料: RaspberryPi B版 (就是带有线网卡的那个版) ,内存512/256都可以,我的是256的。 一个已经可以正常运行的SD卡,这个如何准备我在我的另外一篇随笔当中提到过,所以这里不再赘述。 一个可以支持AP模式的无线网卡。 有线网卡也得联网。 然后是必备技能: 如果你是无显示器运行的,则需要会使用nano (vi也可以) 如果你是有显示器运行的,那么可以在图形界面下面以root或者sudo来运行文本编辑器 总之,就是你得会编辑文本文件才可以进行下面的操作。 感谢原文给出的驱动提示,这里也抄一下。请确认无线网卡支持AP模式或者Master模式,已知下列网卡的具体情况: Edimax 不支持 Access Point AirLink 101 / AWL5088 不支持 Access Point Ralink RT5370 支持 Access Point 想看你使用的是那种芯片?用lsusb吧!(省略了部分输出) pi@raspberrypi ~ $ lsusb … Bus 001 Device 007: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter 呼……一大波前提说完了,下面要干正事了! 先说一下大概步骤: 打开WiFi 指定IP,也就是建立一个WiFi局域网 使用NAT,也就是能让你WiFi网络和有线网络可以通信。 正文开始了: 安装软件 sudo apt-get install hostapd udhcpd 配置DHCP,也就是编辑文件/etc/udhcpd.conf ,基本上按照下列内容来做: <img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /> start 192.168.42.2 # This is the range of IPs that the hostspot will give to client devices. end 192.168.42.20 interface wlan0 # The device uDHCP listens on. remaining yes opt dns 8.8.8.8 4.2.2.2 # The DNS servers client devices will use. opt subnet 255.255.255.0 opt router 192.168.42.1 # The Pi’s IP address on wlan0 which we will set up shortly. opt lease 864000 # 10 day DHCP lease time in seconds ...

2013-12-01 · 2 min · 357 words · -

nl80211 not found

nl80211 not found 加载mac80211模块, modprobe mac80211 http://blog.sina.com.cn/s/blog_64de8a0301018jty.html

2013-12-01 · 1 min · 7 words · -

raspberry pi wn725n driver

raspberry pi wn725n driver http://www.raspberrypi.org/phpBB3/viewtopic.php?t=55779 http://lukin.cn/p/Raspberry_Pi_TP-LINK_WN725N_V2.html wget https://dl.dropboxusercontent.com/u/80256631/8188eu-20130209.tar.gz for 3.6.11+ #538 and #541 use 8188eu-20130830.tar.gz for 3.6.11+ #524, #528 or #532 use 8188eu-20130815.tar.gz for 3.6.11+ #371 up to #520 use 8188eu-20130209.tar.gz sudo install -p -m 644 8188eu.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless sudo depmod -a sudo modprobe 8188eu

2013-11-30 · 1 min · 45 words · -

Scala

Scala 发音为/ˈskɑːlə, ˈskeɪlə/ Java VS Scala 从定义上来说,Java是面向对象的编程语言,而Scala是函数式编程语言,这两门语言之间,本身也有一定的关联。 Scala来源于Java,又“高于”Java,在Java之上增加了一层编码的“API”,让程序员可以通过函数式编程的方式来开发程序。 Scala程序最终被编译为.class文件运行在JVM虚拟机中,所以它是JVM下的语言一种,在实际的大数据开发任务当中,Java和Scala都运行于JVM之上,也能更好地集成。 Scala编程语言近来抓住了很多开发者的眼球。如果你粗略浏览Scala的网站,你会觉得Scala是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格。Christopher Diggins认为: 不太久之前编程语言还可以毫无疑义地归类成"命令式"或者"函数式"。Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。 根据David Rupp在博客中的说法,Scala可能是下下一代Java。这么高的评价让人不禁想看看它到底是什么东西。 Scala有几项关键特性表明了它的面向对象的本质。例如,Scala中的每个值都是一个对象,包括基本数据类型 (即布尔值、数字等) 在内,连函数也是对象。另外,类可以被子类化,而且Scala还提供了基于mixin的组合 (mixin-based composition) 。 与只支持单继承的语言相比,Scala具有更广泛意义上的类重用。Scala允许定义新类的时候重用"一个类中新增的成员定义 (即相较于其父类的差异之处) “。Scala称之为mixin类组合。 Scala还包含了若干函数式语言的关键概念,包括高阶函数 (Higher-Order Function) 、局部套用 (Currying) 、嵌套函数 (Nested Function) 、序列解读 (Sequence Comprehensions) 等等。 Scala是静态类型的,这就允许它提供泛型类、内部类、甚至多态方法 (Polymorphic Method) 。另外值得一提的是,Scala被特意设计成能够与Java和.NET互操作。Scala当前版本还不能在.NET上运行 (虽然上一版可以-_-b) ,但按照计划将来可以在.NET上运行。 Scala可以与Java互操作。它用scalac这个编译器把源文件编译成Java的class文件 (即在JVM上运行的字节码) 。你可以从Scala中调用所有的Java类库,也同样可以从Java应用程序中调用Scala的代码。用David Rupp的话来说, 它也可以访问现存的数之不尽的Java类库,这让 (潜在地) 迁移到Scala更加容易。 这让Scala得以使用为Java1.4、5.0或者6.0编写的巨量的Java类库和框架,Scala会经常性地针对这几个版本的Java进行测试。Scala可能也可以在更早版本的Java上运行,但没有经过正式的测试。Scala以BSD许可发布,并且数年前就已经被认为相当稳定了。 说了这么多,我们还没有回答一个问题: “为什么我要使用Scala?“Scala的设计始终贯穿着一个理念: 创造一种更好地支持组件的语言。 (《The Scala Programming Language》,Donna Malayeri) 也就是说软件应该由可重用的部件构造而成。Scala旨在提供一种编程语言,能够统一和一般化分别来自面向对象和函数式两种不同风格的关键概念。 https://cloud.tencent.com/developer/article/1758874

2013-11-29 · 1 min · 59 words · -

change, alter, vary, modify

change, alter, vary, modify 这组动词的一般含义是"改变"或"变化". change change 指"使改变得与原物完全不同"或"使发生以新代旧的变化",如: The appearance of the town is quite changed. 这个城镇的外观变化颇大。 是通用词,它有两层基本含义: “变"和"换”.“变"可以指和原来的样子或性质稍有不同,也可以指有本质的差异。 At first, she decided to go to the police, but fearing that she would never see Rastus again-the letter had made that quite clear-she changed her mind. 起初,她决定去警察局,但是她由于担心再也见不到拉斯特斯了-那封信说得相当清楚-她改变了主意。 He then changed into overalls and spent the next eight hours as a dustman. 然后他换上工装裤,作为清洁工人度过接下去的八小时。 alter 语气比 change 正式、温和,通常指部分改变,但保留原有核心。 含义:对细节或外观做修改;更偏“调整”或“修正”。 常用于:衣服尺寸、计划细节、文件内容、行为习惯等。 不会造成根本性改变。 alter 指"局部的、外表的变化, 但特点不变”, 如: ...

2013-11-24 · 1 min · 162 words · -

JAVA生成随机汉字

JAVA生成随机汉字 http://blog.csdn.net/smilememory/article/details/8053599 首先我们得知道汉字编码的原理。 在国标GB2312-80中规定,所有的国标汉字及符号分配在一个94行、94列的方阵中,方阵的每一行称为一个"区",编号为01区到94区,每一列称为一个"位",编号为01位到94位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的"区位码"。区位码的前两位是它的区号,后两位是它的位号。用区位码就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一的区位码。例如,汉字"辉"字的区位码是2752,表明它在方阵的27区52位。 所有的汉字和符号所在的区分为一下4个组。 (1) 01区到15区 图形符号区,其中01区到09区为标准符号区,10区到15区为自定义符号区。 (2) 16区到55区 一级常用汉字区,包括了3755个一级汉字。这40个区中的汉字是按汉语拼音排序的,同音字按笔画顺序。其中55区的90~94位未定义汉字。 (3) 56区到87区 二级汉字区,包括了3008个二级汉字,按部首排序。 (4) 88区到94区 自定义汉字区 其中,第10区到15区的自定义符号区和第88区到第94区的自定义汉字区可由用户自定义国标码中未定义的符号和汉字。 与汉字的区位码类似的还有汉字机内码,汉字机内码是在汉字的区码和位码上分别加上A0H (这里的H表示前两位数字为十六进制数) 而得到的。使用机内码表示的一个汉字占用两个字节,分别称为高位节和低位节,这两位字节的机内码按以下规则表示。 高位字节=区码+20H+80H(或区码+A0H) 地位字节=位码+20H+80H(或位码+A0H) 例如,汉字"啊"的区位码为1601, 区码和位码分别用十六进制表示即为1001H,它的机内码的高位字节为B0H,地位字节为A1H, 机内码就是B0A1H。 注意: 汉字的机内码都从第十六区B0开始,并且从区位D7开始以后的汉字都是很难见到的复杂汉字,可以将这些汉字排除掉。所以随机生成的汉字机内码的第一位范围在B C D 之间, 如果第 1 为 是D, 则第二位区位码就不能是7以后的十六进制数。由于每个区的第一个位置和最后一个位置是空的,没有汉字,因此随机生成的区位码的第 3 为如果是A, 第4位就不能是0;第三位如果是F,第四位就不能是F。 (以上来自《java web 程序开发范例宝典》明日科技 王国辉 陈丹丹 潘凯华编著 人民邮电出版社) 获得随机汉字的java代码 //获得随机的汉字 private String getRandomChinese(){ Random random = new Random(); int code1,code2,code3,code4;//分别代表四个位码 String checkCode = “”; String[] rBase = {“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“a”,“b”,“c”,“d”,“e”,“f”}; code1 = random.nextInt(3) +11; ...

2013-11-17 · 1 min · 171 words · -

TCP/IP 网络协议的通俗理解, socket,http,soap

TCP/IP 网络协议的通俗理解, socket,http,soap http://blog.csdn.net/eyeooo/article/details/7438267 前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑。主要是因为对网络协议不太熟悉,对一些概念也没弄清楚。后来我花了一些时间去了解这些网络协议,现在对TCP/IP网络协议有了初步的认识,在这里总结出来,可以梳理一下我对网络协议的理解,加深印象. 话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样。一个只懂英语的人,和一个只懂中文的人由于没有共同的语言 (规则) 就没办法沟通。两台电脑之间进行通讯所共同遵守的规则,就是网络协议。 那么谁来制定这个网络协议? 国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。要制定通讯规则,内容会很多,比如要考虑A电脑如何找到B电脑,A电脑在发送信息给B电脑时是否需要B电脑进行反馈,A电脑传送给B电脑的数据的格式又是怎样的?内容太多太杂,所以OSI模型将这些通讯标准进行层次划分,每一层次解决一个类别的问题,这样就使得标准的制定没那么复杂。OSI模型制定的七层标准模型,分别是: 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。 虽然国际标准化组织制定了这样一个网络协议的模型,但是实际上互联网通讯使用的网络协议是TCP/IP网络协议。 TCP/IP 是一个协议族,也是按照层次划分。共四层: 应用层,传输层,互连网络层,网络接口层。 那么TCP/IP协议和OSI模型有什么区别呢?OSI网络协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。TCP/IP协议参考了OSI模型,但是并没有严格按照OSI规定的七层去划分标准,而只划分了四层,个人觉得这样会更简单点,当划分太多层次时,你很难区分某个协议是属于哪个层次的。TCP/IP协议和OSI模型也并不冲突,TCP/IP协议中的应用层协议,就对应于OSI中的应用层,表示层,会话层。就像以前有工业部和信息产业部,现在实行大部制后只有工业和信息化部一个部门,但是这个部门还是要做以前两个部门一样多的事情,本质上没有多大的差别。TCP/IP中有两个重要的协议,传输层的TCP协议和互连网络层的IP协议,因此就拿这两个协议做代表,来命名整个协议族了,在说TCP/IP协议时,是指整个协议族。 TCP/IP协议分为四个层次,但我们并不需要了解所有层次的协议,我觉得主要关注应用层和传输层的协议就可以了。拿寄送邮件举例, A寄邮件给B,A关心的是用什么格式写什么内容给B (应用层内容) ,是寄挂号信还是寄平信 (传输层内容) ,但是A是不会去关注邮件传送过程中采用了那条路线,邮递员是如何把信件递送到B手里的 (互连网络层,网络接口层) 。 先说传输层,传输层有多个协议,但最主要的是TCP和UDP协议。两则的区别在于TCP协议需要接收方反馈,UDP协议不需要接收方反馈。TCP就像挂号信,A电脑发信息给B电脑后,需要得到B电脑的反馈,这样A电脑就能知道B电脑是否已经收到信息。UDP就像平信,A电脑发信息给B电脑后,B电脑并不给A电脑发聩,A电脑发送信息出去后并不知道B电脑是否已经收到。 因此,TCP传输比UDP传送更可靠,但是TCP传输的效率就不如UDP了。至于,在传送过程中具体选择哪种传送方式,需要具体问题具体分析。在不可靠的网络传送过程中一般选择TCP传送方式。在讲求效率,或者不在乎传送失误的情况下可以选择UDP方式来提高传输速率。 应用层的协议有很多,每一个协议代表一种类型的服务。HTTP协议,万维网服务。FTP协议,文件传送服务。POP3,邮件服务,SOAP协议webService服务。 在理解TCP/IP协议的过程中,我遇到了三个困惑。 1.什么是socket? 以前有听说过socket编程这种说法,也有的说 socket 编程。我在搜索关于socket的资料时,发现有的说socket是指一个连接,有的说socket是一指一个端点。拿打电话做比喻,A电话机和B电话机正在通话,那么socket是指的A和B之间的连接线呢,还是指电话机 (端点) ? 我现在的理解是,socket就是一个连接中的一个端点,一次通讯 (连接) a,b端都会有一个socket。一个socket对应一个连接。 2.http协议属于应用层还是传输层? http 超文本传送协议,听上去像是传输层的协议一样。但事实上大家都知道http和ftp一样都是属于应用层的协议,我先前很纳闷的是,既然是应用层的协议,怎么就取这样一个误导人的名称啊。在对TCP/IP协议还不熟悉的时候,这很容易让人误解和纳闷的。后来,我在wiki上发现这么一段话: http中文译名问题 HTTP 在中国大陆被翻译为"超文本传输协议",因为"transfer"在中文里有"传输"的含意。但依据 HTTP 定制者之一的 Roy Fielding博士的论文[1] (6.5.3节) ,作者专门强调"transfer"表示的是" (表述状态的) 转移" (Representational State Transfer) ,而不是"传输" (transport) 。故其中文译名"超文本传输协议"恰恰引种反映了这种误解。更符合原义的译名应该为"超文本转移协议"。 这段话解除了我的疑惑。那么http协议当然是应用层的协议。 3.SOAP可以使用HTTP协议进行传输吗? 在了解SOAP协议的过程中,看到介绍说soap可以通过tcp,udp,http协议来传送。这也是让人困惑的描述。一看这句话,就会感觉http怎么和tcp,udp协议并列了呢?难道http还是属于传输层的协议?再加上http中文译名的问题,名字听上去像传输层,初学者又要开始头大了。 事实上,http是应用层的协议,这一点可以毫无怀疑。那么现在新的问题来了。soap和http都是应用层协议,怎么说soap能用http协议来传输呢?应用层的协议可以用应用层的协议传送吗? 我查阅了资料,是这样一回事情,soap将信息进行XML的序列化后,再用http协议的方式再打包进行传送,传送的方式还是tcp或者udp。做个比喻就好理解了。tcp 和 udp 都是公路,暂且把tcp认为是一般公路,udp高速公路,soap和http就都是汽车,那么soap和http都可以在tcp和udp上跑。说soap可以通过http来传送,实际就是说soap是小轿车,http是装轿车的卡车,把soap的信息装到http里面,然后再运输,当然走的道路还是tcp或udp。 说soap可以通过http协议来传输,这句话不太准确,比较准确第说法是: soap信息可以通过http协议包装后通过tcp或udp传输。

2013-11-17 · 1 min · 67 words · -

socket, 套接字, 套接口

socket, 套接字, 套接口 应用层通过传输层进行数据通信时,TCP 和 UDP 会遇到同时为多个应用程序进程提供并发服务的问题。多个 TCP 连接或多个应用程序进程可能需要通过同一个 TCP 协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与 TCP/IP 协议交互提供了称为 socket (Socket) 的接口,区分不同应用程序进程间的网络通信和连接。 生成 socket ,主要有3个参数: 通信的目的 IP 地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是"插座"。通过将这3个参数结合起来,与一个"插座"Socket绑定,应用层就可以和传输 层通过 socket 接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。 Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。 Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。 要通过互联网进行通信,至少需要一对 socket ,一个运行于客户机端,称之为ClientSocket,另一个运行于服务器端,称之为serverSocket。 根据连接启动的方式以及本地 socket 要连接的目标, socket 之间的连接过程可以分为三个步骤: 服务器监听,客户端请求,连接确认。 服务器监听: 是服务器端 socket 并不定位具体的客户端 socket ,而是处于等待连接的状态,实时监控网络状态。 客户端请求: 是指由客户端的 socket 提出连接请求,要连接的目标是服务器端的 socket 。为此,客户端的 socket 必须首先描述它要连接的服务器的 socket ,指出服务器端 socket 的地址和端口号,然后就向服务器端 socket 提出连接请求。 连 接确认: 是指当服务器端 socket 监听到或者说接收到客户端 socket 的连接请求,它就响应客户端 socket 的请求,建立一个新的线程,把服务器端 socket 的描述发给客 户端,一旦客户端确认了此描述,连接就建立好了。而服务器端 socket 继续处于监听状态,继续接收其他客户端 socket 的连接请求。 ...

2013-11-17 · 2 min · 260 words · -

Netty

Netty version latest 4.1.68 current 4.1.22 Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo、Rocketmq、Hadoop等 Netty是由JBOSS提供的一个java开源框架. Netty提供异步的, 事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序. 也就是说,Netty 是一个基于NIO的客户,服务器端编程框架, 使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。 “快速"和"简单"并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 netty uml @startuml interface ChannelHandlerContext interface ResourceLeakHint class NioEventLoop{ protected void run() private void processSelectedKeys() private void processSelectedKeysOptimized() private void processSelectedKey(SelectionKey k, AbstractNioChannel ch) } class AbstractNioByteChannel class NioByteUnsafe{ public final void read() } class DefaultChannelPipeline{ AbstractChannelHandlerContext head public final ChannelPipeline fireChannelRead(Object msg) } class HeadContext class AbstractChannelHandlerContext { AbstractChannelHandlerContext next AbstractChannelHandlerContext prev DefaultChannelPipeline pipeline ChannelHandlerContext fireChannelRead(final Object msg) AbstractChannelHandlerContext findContextInbound() void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) void invokeChannelRead(Object msg) boolean invokeHandler() } DefaultAttributeMap<|--AbstractChannelHandlerContext ChannelHandlerContext<|--AbstractChannelHandlerContext ResourceLeakHint<|--AbstractChannelHandlerContext DefaultChannelPipeline <|- AbstractChannelHandlerContext HeadContext <|- DefaultChannelPipeline class SimpleChannelInboundHandler { public void channelRead(ChannelHandlerContext ctx, Object msg) public void channelActive(ChannelHandlerContext ctx) } ChannelInboundHandlerAdapter<|--SimpleChannelInboundHandler class ServerBootstrap class AbstractBootstrap interface Cloneable Cloneable<|--AbstractBootstrap AbstractBootstrap<|--ServerBootstrap @enduml 时序图 @startuml SingleThreadEventExecutor -> NioEventLoop: run() NioEventLoop -> NioByteUnsafe: read() AbstractChannelHandlerContext -> AbstractChannelHandlerContext: ChannelHandlerContext fireChannelRead(final Object msg) AbstractChannelHandlerContext -> AbstractChannelHandlerContext: AbstractChannelHandlerContext findContextInbound(int mask) AbstractChannelHandlerContext -> AbstractChannelHandlerContext: invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) AbstractChannelHandlerContext -> ChannelHandler: invokeChannelRead(Object msg) ChannelHandler --> Handler0: channelRead @enduml https://netty.io/4.1/api/io/netty/channel/ChannelPipeline.html ...

2013-11-17 · 2 min · 273 words · -

Java 强引用, 软引用, 弱引用, 虚引用

Java 强引用, 软引用, 弱引用, 虚引用 强引用 StrongReference 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 Object o=new Object(); // 强引用 如果不使用时,要通过如下方式来弱化引用,如下: o=null; // 帮助垃圾收集器回收此对象 显式地设置o为null,或超出对象的生命周期范围,则gc认为该对象不存在引用,这时就可以回收这个对象。具体什么时候收集这要取决于gc的算法。 在一个方法的内部有一个强引用,这个引用保存在栈中,而真正的引用内容 (Object) 保存在堆中。当这个方法运行完成后就会退出方法栈,则引用内容的引用不存在,这个Object会被回收。 但是如果这个o是全局的变量时,就需要在不用这个对象时赋值为null,因为强引用不会被垃圾回收。 强引用在实际中有非常重要的用处,举个ArrayList的实现源代码: private transient Object[] elementData; public void clear() { modCount++; // Let gc do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0; } 在ArrayList类中定义了一个私有的变量elementData数组,在调用方法清空数组时可以看到为每个数组内容赋值为null。不同于elementData=null,强引用仍然存在,避免在后续调用 add()等方法添加元素时进行重新的内存分配。使用如clear()方法中释放内存的方法对数组中存放的引用类型特别适用,这样就可以及时释放内存。 软引用 SoftReference 如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 它兼有了StrongReference和WeakReference的好处,既能停留在内存中,又能在内存不足时去处理。 String str=new String(“abc”); // 强引用 SoftReference softRef=new SoftReference(str); // 软引用 ...

2013-11-17 · 1 min · 121 words · -

亚马逊土耳其机器人

亚马逊土耳其机器人 亚马逊土耳其机器人 (Amazon Mechanical Turk) 是一个Web服务应用程序接口 (API) ,开发商通过它可以将人的智能整合到远程过程调用 (RPC) 。亚马逊土耳其机器人利用人的网络来执行不适合计算机执行的任务。亚马逊调用那些计算机很难完成但"人工的人工智能"却能很容易执行的任务。执行人工智能任务 (HIT) 的人可能会被要求写产品描述,对移动语音搜索查询作出回应或选择某一主题的最佳照片等等。 下面是它的工作过程: 当用户提出一个要求,应用程序就会将这一请求发送到执行任务的人。人就会对此作出应答,然后服务器将回应传给请求者。土耳其工人的工资是按成功完成人工智能任务来计算的。亚马逊 (Amazon) 通过收取成功完成请求者人工智能任务的百分之十的价格来获利。 土耳其机器人 (Mechanical Turk) 这个名字是从18世纪的一个国际象棋游戏机器人得来的,这个机器人在欧洲参观并与名人比赛下象棋,其中包括拿破仑和本•富兰克林。每场演出之前,观众都可以检查土耳其机器人,以查看它的许多职能齿轮和杠杆。然而,和所有神奇的事物一样,土耳其机器人只是一种幻想。其实在机器人中有一个真人躲在一个秘密隔间中,是他在操纵机器人和玩象棋。 亚马逊 (Amazon) 选择土耳其机器人 (Mechanical Turk) 这个名字来命名他们的网络服务,是因为人类的智慧隐藏在最终用户,这样服务看起来就像是自动进行的。

2013-11-17 · 1 min · 26 words · -