bash

bash # -n 选项代表只检查语法,不执行脚本。 bash -n foo.sh # -n 或 --noexec 选项告诉 Bash:只读取并检查脚本的语法是否正确,但不会实际执行脚本中的任何命令。 bash -c 用法: bash -c "cmd string" 通常使用shell去运行脚本,两种方法 bash xxx.sh,另外一种就是bash -c “cmd string” 对于bash xxx.sh, 首先bash 会在当前目录去寻找xxx.sh,如果找到,就直接运行,找不到则按照环境变量$PATH的指定路径,按顺序去找,如果找到,则执行,找不到则报错。 shell 脚本的参数 $0 就是要执行的 shell 脚本 xxx.sh, $1 就是后面紧跟 xxx.sh 的参数,$2 $3依次类推 而对于bash -c “cmd string” 首先我们看看官方的说明解释 -c If the -c option is present, then commands are read from the first non-option argument command_string. If there are arguments after the command_string, they are assigned to the positional parameters, starting with $0. ...

2015-01-06 · 1 min · 174 words · -

爬虫Labin,Nutch,Neritrix介绍和对比

爬虫Labin,Nutch,Neritrix介绍和对比 http://www.open-open.com/bbs/view/1325332257061 Larbin 开发语言: C++ http://larbin.sourceforge.net/index-eng.html larbin是个基于C++的web爬虫工具,拥有易于操作的界面,不过只能跑在LINUX下,在一台普通PC下larbin每天可以爬5百万个页面(当然啦,需要拥有良好的网络) 简介 Larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源。 Larbin只是一个爬虫,也就是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。 Latbin最初的设计也是依据设计简单但是高度可配置性的原则,因此我们可以看到,一个简单的larbin的爬虫可以每天获取500万的网页,非常高效。 功能 larbin 获取单个、确定网站的所有联结,甚至可以镜像一个网站。 larbin建立 url 列表群,例如针对所有的网页进行 url retrive后,进行xml的联结的获取。或者是 mp3 。 larbin 定制后可以作为搜索引擎的信息的来源 (例如可以将抓取下来的网页每2000一组存放在一系列的目录结构里面) 。 问题 Labin的主要问题是,: 仅提供保存网页保存功能,没有进行进一步的网页解析; 不支持分布式系统; 功能相对简单,提供的配置项也不够多; 不支持网页自动重访,更新功能; 从2003年底以后,Labin已经放弃更新,目前处于荒芜长草的状态 ****** Nutch 开发语言: Java http://lucene.apache.org/nutch/ 简介: Apache的子项目之一,属于Lucene项目下的子项目。 Nutch是一个基于Lucene,类似Google的完整网络搜索引擎解决方案,基于Hadoop的分布式处理模型保证了系统的性能,类似Eclipse的插件机制保证了系统的可客户化,而且很容易集成到自己的应用之中。 总体上Nutch可以分为2个部分: 抓取部分和搜索部分。抓取程序抓取页面并把抓取回来的数据做成反向索引,搜索程序则对反向索引搜索回答用户的请求。抓取程序和搜索程序的接口是索引,两者都使用索引中的字段。抓取程序和搜索程序可以分别位于不同的机器上。下面详细介绍一下抓取部分。 抓取部分: 抓取程序是被Nutch的抓取工具驱动的。这是一组工具,用来建立和维护几个不同的数据结构: web database, a set of segments, and the index。下面逐个解释这三个不同的数据结构: The web database, 或者WebDB。这是一个特殊存储数据结构,用来映像被抓取网站数据的结构和属性的集合。WebDB 用来存储从抓取开始 (包括重新抓取) 的所有网站结构数据和属性。WebDB 只是被 抓取程序使用,搜索程序并不使用它。WebDB 存储2种实体: 页面 和 链接。页面 表示 网络上的一个网页,这个网页的Url作为标示被索引,同时建立一个对网页内容的MD5 哈希签名。跟网页相关的其它内容也被存储,包括: 页面中的链接数量 (外链接) ,页面抓取信息 (在页面被重复抓取的情况下) ,还有表示页面级别的分数 score 。链接 表示从一个网页的链接到其它网页的链接。因此 WebDB 可以说是一个网络图,节点是页面,链接是边。 ...

2015-01-05 · 2 min · 301 words · -

做与作

“作”与“做”的区别 “作”和“做”,都是常用字,音同,有时通用,所以使用时让人犯难,不知该用哪个字。 作,是古老的字,甲骨文里就有,最初的含义是“起”,现代汉语里仍然使用的“振作”、“一鼓作气”、“枪声大作”中的“作”,都是“起”的意思。在这个意义上跟“做”不会打架,因为“做”无此含义。 “作”和“做”,都有“从事”、“制作”、“充当”的含义,所以容易混淆。 做,是后造字,最早出现在宋、元时代,当“即使”、“播弄”、“做作”讲。到明代,“做”成了“作”的俗字,渐渐演变成为“作”的同义词。 那么,在使用时怎样区别“作”和“做”呢?20 世纪 80 年代,著名语言文字学家吕叔湘先生认为:“区别的办法基本上还是用‘文’和‘白’做标准,但不是绝对的。那么怎么办呢?我说,遇到没有把握的词,宁可写‘作’不写‘做’。”到了 20 世纪 90 年代,吕先生在《现代汉语八百词》中,对“作”、“做”二字的用法做了如下补充:“习惯上,具体东西的制造一般写成‘做’,如‘做桌子、做衣服、做文章’,抽象一点的、书面语言色彩重一点的词语,特别是成语里,一般都写成‘作’,如‘作罢、作废、作对、作怪、作乱、作价、作曲、作战、装模作样、认贼作父’。” 从吕叔湘先生的论述中,可以找到区分“作”、“做”用法的一般规律: (1)区别的基本标准是“文”和“白”,内容抽象或书面语言色彩重的词语,一般用“作”,成语都用“作”。 (2)做单音节动词用,多数用“做”,少数用“作”的,其宾语内容也比较抽象。宾语是动名词的(如:报告,调查,榜样,处理,动员,贡献),一般也用“作”。 (3)表身份、成绩、行为等义的“作为”,用“作”。 (4)遇到没有把握的词,宁可写“作”不写“做”,但要做到局部(一篇文章或一本书)统一。 基本词义: 作[zuō zuó zuò] 起,兴起,现在起:振~、枪声大~; 从事,做工:工~、~息、~业、合~; 3.举行,进行:~别(分别)、~乱、~案、~战、~报告; 干出,做出,表现出,制造出:~恶(è)、~弊、~梗、~祟、~态、~色、~为、~难、~奸犯科(为非作歹,触犯法令); 当成,充当:~罢、~保、~伐(做媒人)、~壁上观(人家交战,自己站在营垒上看,喻坐观别人成败)、~法自毙、~茧自缚; 写作、创造:创~、写~、~曲、~者; 文艺方面的成品:~品、不朽之~; 同“做”; 9.旧时手工业制造加工的场所:~坊; 10.从事某种活动:~揖、~弄、~死 做 [zuò]字义 1.进行工作或活动:~活、~事、~工、~手脚(暗中进行安排); 写文:~诗、~文章; 加工、制造:~饭、~模型、~衣服; 当,为:~人、~媒、~伴、~主、~客、看~; 5.装,扮:~作、~功、~派; https://zhuanlan.zhihu.com/p/70084978

2015-01-05 · 1 min · 40 words · -

将HTML5封装成android应用APK文件的几种方法

将HTML5封装成android应用APK文件的几种方法 http://mobile.51cto.com/android-386448.htm 越来越多的开发者热衷于使用html5+JavaScript开发移动Web App。不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数。一方面,用户在使用习惯上,不喜欢在浏览器上输入复杂的网址;另一方面,Html5 Web App 存放在服务器端,在每次使用时需要进行数据传递,会造成流量浪费。有些开发者不想接触复杂的JAVA代码,那么,有什么办法,既可以使用HTMl5开发应 用,又可以将其简单封装成APK文件呢? 一、Android SDK中的WebView 1.在要Activity中实例化WebView组件: WebView webView = new WebView(this); 2.调用WebView的loadUrl()方法,设置WevView要显示的网页: 互联网用: webView.loadUrl(“http://www.31358.com”); 本地文件用: webView.loadUrl(“file:///android_asset/XX.html”); 本地文件存放在: assets 文件中 3.调用Activity的setContentView( )方法来显示网页视图 4.用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面 5.需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。 缺点: 如果是载入的是普通网页,没有什么问题,但如果是html5,封装后,在android2.3以上才能正常访问,android2.2及以下,SDK中的WebView还没完全支持HTML5 下面是具体例子: MainActivity.java package com.android.webview.activity; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //实例化WebView对象 webview = new WebView(this); ...

2014-12-30 · 1 min · 134 words · -

smali

smali http://blog.csdn.net/caszhao/article/details/6030425 je或jz //相等则跳 (机器码是74或84) jne或jnz //不相等则跳 (机器码是75或85) 常见的修改就是把对比部分的机器码中74改成75或者84改成85,在反编译的smali文件中,也是类似的。 相等比较符号在smali中的表示 符号 smali语法 Bao力破解修改 == if-eq if-eq改成if-ne != if-ne if-ne 改成 if-eq equals if-eqz if-eqz改成 if-nez !equals if-nez if-nez 改成if-eqz

2014-12-30 · 1 min · 29 words · -

QNAP

QNAP qnap, plex server, apple tv, av1 https://www.reddit.com/r/PleX/comments/12pe5tx/comment/jgrrjnc/ https://github.com/currifi/plex_av1_tvos?tab=readme-ov-file https://support.plex.tv/articles/202915258-where-is-the-plex-media-server-data-directory-located/ https://www.qnap.com/en/how-to/faq/article/how-do-i-access-my-qnap-nas-using-ssh QNAP 启用 ssh 服务 ssh admin@192.168.50.227 # print The exact data directory location getcfg -f /etc/config/qpkg.conf PlexMediaServer Install_path mkdir /share/CACHEDEV1_DATA/.qpkg/PlexMediaServer/Library/Plex Media Server/Profiles # copy file https://github.com/scriptsingh/plex_av1_tvos/blob/main/tvOS.xml to Profiles dir 重启 plex server 威联通 nas web ui> app center> plex server stop start

2014-12-30 · 1 min · 53 words · -

maven-compiler-plugin

maven-compiler-plugin maven-compiler-plugin 用于编译 java 源码, 3.0 以后的版本 默认用 javax.tools.JavaCompiler 编译 maven-compiler-plugin 3.6 和更高版本提供了一种新的配置方法 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>9</release> </configuration> </plugin> jdk 9 以上可以只声明 maven.compiler.release <properties> <maven.compiler.release>17</maven.compiler.release> </properties> <!-- ... --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> </plugins> maven-compiler-plugin 从 3.6 开始可以只配置 <maven.compiler.release>, 来替代 maven.compiler.source and maven.compiler.target maven-compiler-plugin 会从 <properties> 里读取 maven.compiler.release, 可以不配置到 plugin>configuration 下 “maven.compiler.release” as an replacement for source and target http://blog.csdn.net/zhaoyongnj2012/article/details/23970451 在maven的默认配置中, 对于 jdk 的配置是 1.4 版本,那么创建/导入 maven 工程过程中, 工程中未指定 jdk版本。 ...

2014-12-30 · 1 min · 113 words · -

maven cmd utf8 error

maven cmd utf8 error unmappable character for encoding GBK <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> http://stackoverflow.com/questions/3017695/how-to-configure-encoding-in-maven

2014-12-30 · 1 min · 14 words · -

windows 命令行 杀进程

windows 命令行 杀进程 列出进程: tasklist|findstr task TASKKILL /IM taskmgr.exe TASKKILL.exe TASKKILL命令是Microsoft Windows内置的一款命令,可以用来终止进程,具体的命令规则如下: TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T] 参数列表: /S system 指定要连接到的远程系统。 /U [domain]user 指定应该在哪个用户上下文 执行这个命令。 /P [password] 为提供的用户上下文指定密码。如果忽略,提示输入。 /F 指定要强行终止的进程。 /FI filter 指定筛选进或筛选出查询的的任务。 /PID process id 指定要终止的进程的PID。 /IM image name 指定要终止的进程的图像名。通配符 ‘*‘可用来指定所有图像名。 /T Tree kill: 终止指定的进程和任何由此启动的子进程。 /? 显示帮助/用法。 示例 TASKKILL /S system /F /IM notepad.exe /T TASKKILL /PID 1230 /PID 1241 /PID 1253 /T TASKKILL /F /IM QQ.exe ...

2014-12-30 · 1 min · 95 words · -

Android APK反编译

Android APK反编译 http://blog.csdn.net/ithomer/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。 在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件。 本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubuntu 12.04 x86_x64 反编译工具包 下载 (2012-10-10更新) 一、Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具。 apk反编译工具dex2jar,是将apk中的classes.dex转化成jar文件 源码查看工具jdgui,是一个反编译工具,可以直接查看反编译后的jar包源代码 dex2jar 和 jdgui 最新版本下载,分别见google code: dex2jar (google code) jdgui (google code) ,最新版本请见 官方 具体步骤: 首先将apk文件后缀改为zip并解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的,将classes.dex复制到dex2jar.bat所在目录dex2jar-0.0.9.9文件夹。 在命令行下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex 生成 classes_dex2jar.jar 然后,进入jdgui文件夹双击jd-gui.exe,打开上面生成的jar包classes_dex2jar.jar,即可看到源代码了,如下图: HelloAndroid源码在反编译前后的对照如下: 二、apk反编译生成程序的源代码和图片、XML配置、语言资源等文件 如果是汉化软件,这将特别有用 首先还是要下载上述反编译工具包,其中最新的apktool,请到google code下载 apktool (google code) 具体步骤: 下载上述反编译工具包,打开apk2java目录下的apktool1.4.1文件夹,内含三个文件: aapt.exe,apktool.bat,apktool.jar 注: 里面的apktool_bk.jar是备份的老版本,最好用最新的apktool.jar 在命令行下定位到apktool.bat文件夹,输入以下命令: apktool.bat d -f abc123.apk abc123,如下图: 上图中,apktool.bat 命令行解释: apktool.bat d -f [apk文件 ] [输出文件夹] 反编译的文件如下 (AndroidManifest.xml为例) : 将反编译完的文件重新打包成apk,很简单,输入apktool.bat b abc123 (你编译出来文件夹) 即可,命令如下: ...

2014-12-30 · 1 min · 93 words · -

Set JAVA_HOME in windows cmd

Set JAVA_HOME in windows cmd http://kooyee.iteye.com/blog/525068 set JAVA_HOME=jrepath set PATH=%JAVA_HOME%\bin;%PATH% 注意这里没有引号。 这样就不需要在我的电脑属性中修改java_home了,以及重启命令行了。 对于程序会用到多个jre 会比较有用。 linux 修改 JAVA_HOME如下 export JAVA_HOME=jrepath export PATH=$JAVA_HOME\bin;$PATH 如果需要永久修改 则 在.bashrc文件中加入上面的两句话就可以了。

2014-12-29 · 1 min · 24 words · -

windows route, 路由表

windows route, 路由表 打印路由表 route print 显示以10.开始的路由 route print 10.* 1.具体功能 该命令用于在本地IP路由表中显示和修改条目。使用不带参数的ROUTE可以显示帮助。 2.语法详解 route [-f] [-p] [command [destination] [mask netmask] [gateway] [metric metric] [if interface] 3.参数说明 -f 清除所有不是主路由(子网掩码为255.255.255.255的路由)、环回网络路由(目标为127.0.0.0,子网掩码为 255.255.255.0的路由)或多播路由(目标为224.0.0.0,子网掩码为240.0.0.0的路由)的条目的路由表。如果它与命令之一(例如Add、Change或Delete)结合使用,表会在运行命令之前清除。 -p 与Add命令共同使用时,指定路由被添加到注册表并在启动TCP/IP协议的时候初始化IP路由表。默认情况下,启动TCP/IP协议时不会保存添加的路由,与Print命令一起使用时,则显示永久路由列表。所有其他的命令都忽略此参数。永久路由存储在注册表中的位置是 HKEY_LOCAL_MACHSYSTEMCurrentControlSetServicesTcpipParametersPersistentRoutes。 command 指定要运行的命令。下表列出了有效的命令。 destination 指定路由的网络目标地址。目标地址可以是一个IP网络地址(其中网络地址的主机地址位设置为0),对于主机路由是IP地址,对于默认路由是0.0.0.0。mask subnetmask 指定与网络目标地址相关联的网掩码(又称子网掩码)。子网掩码对于IP网络地址可以是一适当的子网掩码,对于主机路由是255.255.255.255 ,对于默认路由是0.0.0.0。如果忽略,则使用子网掩码255.255.255.255。定义路由时由于目标地址和子网掩码之间的关系,目标地址不能比它对应的子网掩码更为详细。换句话说,如果子网掩码的一位是0,则目标地址中的对应位就不能设置为1。 gateway 指定超过由网络目标和子网掩码定义的可达到的地址集的前一个或下一个跃点IP地址。对于本地连接的子网路由,网关地址是分配给连子网接口的IP地址。对于要经过一个或多个路由器才可用到的远程路由,网关地址是一个分配给相邻路由器的、可直接达到的IP地址。 metric metric 为路由指定所需跃点数的整数值(范围是1~9999),它用来在路由表里的多个路由中选择与转发包中的目标地址最为匹配的路由。所选的路由具有最少的跃点数。跃点数能够反映跃点的数量、路径的速度、路径可靠性、路径吞吐量以及管理属性。 if interface 指定目标可以到达的接口的接口索引。使用Route print命令可以显示接口及其对应接口索引的列表。对于接口索引可以使用十进制或十六进制的值。对于十六进制值,要在十六进制数的前面加上0x。忽略if参数时,接口由网关地址确定。 注意: 路由表中跃点数一列的值较大是由于允许TCP/IP根据每个LAN接口的IP地址、子网掩码和默认网关的配置自动确定路由表中路由的跃点数造成的。默认启动的自动确定接口跃点数确定了每个接口的速度,调整了每个接口的路由跃点数,因此最快接口所创建的路由具有最低的跃点数。要删除大跃点数,请在每个 LAN连接的TCP/IP协议的高级属性中禁用自动确定接口跃点数。 如果在systemrootSystem32DriversEtc文件夹的本地网络文件中存在适当的条目,名称可以用于Destination。只要名称可以通过"域名系统"(DNS)查询这样的标准主机名解析技术分解为IP地址,就可以将其用于Gateway,DNS查询使用存储在 systemrootSystem32DriversEtc 文件夹下的本地主机文件和NetBIOS 名称解析。 如果是Print或Delete命令,可以忽略Gateway参数,使用通配符来表示目标和网关。Destination的值可以是由星号()指定的通配符。如果指定目标含有一个星号()或问号(?),它被看作是通配符,只打印或删除匹配的目标路由。星号代表任意一字符序列,问号代表任一字符。例如, 10..1、192.168.、127._和_224_都是星号通配符的有效使用。 使用了无效的目标和子网掩码(网掩码)值的组合,会显示"Route bad gateway address netmask"错误消息。目标中有一位或多位设置为1,而其在子网掩码中的对应位设置为0时会发生这个错误。可以通过二进制表示法表示目标和子网掩码来检查这种情况。以二进制表示的子网掩码包括表示目标网络地址部分的一连串的1和表示目标主机地址部分的一连串的0两个部分。查看目标以确定目标的主机地址部分(由子网掩码所定义) 是否有些位设置成了1。 Windows 98 的Route命令不支持-p参数。 只有当TCP/IP协议在网络连接中安装为网络适配器属性的组件时,该命令才可用。 例子3: 要添加默认网关地址为192.168.12.1的默认路由,执行以下命令: ...

2014-12-25 · 2 min · 313 words · -

Mac OS X 中设置 VPN 静态路由

Mac OS X 中设置 VPN 静态路由, macos route sudo route -n add -net 192.168.5.4 -netmask 255.255.255.0 xxx.xxx.200.1 https://blog.hackroad.com/apple/mac-os/7011.html mac osx Lerpard 中, 使用内置的pptp client端拨号成功后, 所有的网络连接均走vpn路线, 这样校内的网站也走这个了, 导致速度缓慢, 校内连接终端等 解决方法是: 手动设置路由表, 以我的实际情况为例: 在windows下,我需要设置如下3条静态路由(首条0.0.0.0为default) route -p add 0.0.0.0 mask 0.0.0.0 10.13.31.1 (我的校园网网关是这个) route -p add 10.0.0.0 mask 255.0.0.0 10.13.31.1 route -p add 210.32.0.0 mask 255.255.240.0 10.13.31.1 route -p add 222.205.0.0 mask 255.255.128.0 10.13.31.1 在Mac OSX 中, 设置路由的命令稍有不同, 为: route -n add defalut 10.13.31.1 route -n add -net 10.0.0.0/8 10.13.31.1 route -n add -net 210.32.0.0/20 10.13.31.1 route -n add -net 222.205.0.0/17 10.13.31.1 ...

2014-12-25 · 2 min · 244 words · -

BDEV, CDEV

字符设备 提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,键盘、串口、调制解调器都是典型的字符设备。 块设备, block device 块设备也就是存储以“块”为单位数据的设备,比较典型的如磁盘设备, 硬盘、软盘,光盘或者优盘/闪存。在 Linux 系统中,一切皆文件,磁盘设备也是文件 应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。数据的读写只能以块(通常是512B)的倍数进行 与字符设备不同,块设备并不支持基于字符的寻址。 用 ls 查看磁盘分区文件 ls -l /dev/sd* # output ➜ ~ ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Apr 1 07:15 /dev/sda brw-rw---- 1 root disk 8, 1 Apr 1 07:15 /dev/sda1 brw-rw---- 1 root disk 8, 2 Apr 1 07:15 /dev/sda2 brw-rw---- 1 root disk 8, 3 Apr 1 07:15 /dev/sda3 字符设备与块设备的区别 这两种类型的设备的根本区别在于它们是否可以被随机访问——换句话说就是,能否在访问设备时随意地从一个位置跳转到另一个位置。举个例子,键盘这种设备提供的就是一个数据流,当你敲入"fox" 这个字符串时,键盘驱动程序会按照和输入完全相同的顺序返回这个由三个字符组成的数据流。如果让键盘驱动程序打乱顺序来读字符串,或读取其他字符,都是没有意义的。所以键盘就是一种典型的字符设备,它提供的就是用户从键盘输入的字符流。对键盘进行读操作会得到一个字符流,首先是"f",然后是"o",最后是"x",最终是文件的结束(EOF)。当没人敲键盘时,字符流就是空的。硬盘设备的情况就不大一样了。硬盘设备的驱动可能要求读取磁盘上任意块的内容,然后又转去读取别的块的内容,而被读取的块在磁盘上位置不一定要连续,所以说硬盘可以被随机访问,而不是以流的方式被访问,显然它是一个块设备。 内核管理块设备要比管理字符设备细致得多,需要考虑的问题和完成的工作相比字符设备来说要复杂许多。这是因为字符设备仅仅需要控制一个位置—当前位置—而块设备访问的位置必须能够在介质的不同区间前后移动。所以事实上内核不必提供一个专门的子系统来管理字符设备,但是对块设备的管理却必须要有一个专门的提供服务的子系统。不仅仅是因为块设备的复杂性远远高于字符设备,更重要的原因是块设备对执行性能的要求很高;对硬盘每多一分利用都会对整个系统的性能带来提升,其效果要远远比键盘吞吐速度成倍的提高大得多。另外,我们将会看到,块设备的复杂性会为这种优化留下很大的施展空间。 字符设备与块设备的区分 每一个字符设备或者块设备都在/dev目录下对应一个设备文件。读者可以通过查看/dev目录下的文件的属性,来区分设备是字符设备还是块设备。使用cd命令进入/dev目录,并执行ls -l命令就可以看到设备的属性 [root@tom /]# cd /dev /进入/dev目录/ [root@tom dev]# ls -l /列出/dev中文件的信息/、 /*第1字段 2 3 4 5 6 7 8 */ crw-rw—-+ 1 root root 14, 12 12-21 22:56 adsp crw——- 1 root root 10, 175 12-21 22:56 agpgart crw-rw—-+ 1 root root 14, 4 12-21 22:56 audio brw-r—– 1 root disk 253, 0 12-21 22:56 dm-0 brw-r—– 1 root disk 253, 1 12-21 22:56 dm-1 crw-rw—- 1 root root 14, 9 12-21 22:56 dmmidi ...

2014-12-24 · 2 min · 225 words · -

Java 8 函数式接口 functional interface

Java 8 函数式接口 functional interface http://colobu.com/2014/10/28/secrets-of-java-8-functional-interface/ @FunctionalInterface 函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。 这类接口只定义了唯一的抽象方法的接口 (除了隐含的Object对象的公共方法) , 因此最开始也就做SAM类型的接口 (Single Abstract Method) 。 为什么会单单从接口中定义出此类接口呢? 原因是在Java Lambda的实现中, 开发组不想再为Lambda表达式单独定义一种特殊的Structural函数类型,称之为箭头类型 (arrow type) , 依然想采用Java既有的类型系统(class, interface, method等), 原因是增加一个结构化的函数类型会增加函数类型的复杂性,破坏既有的Java类型,并对成千上万的Java类库造成严重的影响。 权衡利弊, 因此最终还是利用SAM 接口作为 Lambda表达式的目标类型。 JDK中已有的一些接口本身就是函数式接口,如Runnable。 JDK 8中又增加了java.util.function包, 提供了常用的函数式接口。 函数式接口代表的一种契约, 一种对某个特定函数类型的契约。 在它出现的地方,实际期望一个符合契约要求的函数。 Lambda表达式不能脱离上下文而存在,它必须要有一个明确的目标类型,而这个目标类型就是某个函数式接口。 当然, Java 8发布快一年了, 你对以上的概念也应该有所了解了,这篇文章也不会介绍这些基础的东西, 而是想深入的探讨函数式接口的定义和应用。 JDK 8之前已有的函数式接口 java.lang.Runnable java.util.concurrent.Callable java.security.PrivilegedAction java.util.Comparator java.io.FileFilter java.nio.file.PathMatcher java.lang.reflect.InvocationHandler java.beans.PropertyChangeListener java.awt.event.ActionListener javax.swing.event.ChangeListener 新定义的函数式接口 java.util.function中定义了几组类型的函数式接口以及针对基本数据类型的子接口。 Predicate - 传入一个参数,返回一个bool结果, 方法为boolean test(T t) Consumer - 传入一个参数,无返回值,纯消费。 方法为void accept(T t) ...

2014-12-24 · 4 min · 824 words · -

WinSCP 的四种协议:SFTP(SSH)、FTP、SCP、WebDAV

WinSCP的四种协议:SFTP(SSH)、FTP、SCP、WebDAV 1、FTP FTP(File Transfer Protocol,文件传输协议),通过端口进行文件传输: 端口21,控制链路,用于发送指令给服务器并等待服务器响应; 端口20,数据链路,用来建立数据传输通道。 使用FTP协议可能会存在一些安全隐患,例如FTP服务器软件的漏洞、明文口令、通过FTP服务器进行端口扫描、数据劫持等。 参考:https://baike.baidu.com/item/FTP协议/7651119?fr=aladdin 2.SFTP(SSH) SSH (SSH File Transfer Protocol) 又称 SFTP(Secret File Transfer Protocol),安全文件传送协议,为传输文件提供一种安全的加密方法。 SFTP是SSH内含的协议,只要SSHD服务器启动了就可用,不需要FTP服务器启动才能用。 对网络安全性要求高时,建议使用SFTP。由于SFTP采用加密传输认证信息和数据,所以SFTP十分安全,但是传输效率就比FTP要低的多。 参考:https://baike.baidu.com/item/SSH文件传输协议?fromtitle=sftp&fromid=1184182 3、SCP SCP(secure copy),用来进行远程文件拷贝,使用和SSH相同的认证方式,提供相同的安全保障。 参考:https://www.cnblogs.com/mxh1099/p/5554823.html 4、WebDAV WebDAV一种基于HTTP1.1的扩展协议, 在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法, 使应用程序对Web Server直接读写,并支持写文件锁定及解锁,还可以支持文件的版本控制。 参考:https://baike.baidu.com/item/WebDAV https://www.cnblogs.com/bors/p/WinSCP.html run winscp from cmd winscp.exe /ini="C:\Users\martin\Documents\myconfig.ini"

2014-12-23 · 1 min · 40 words · -

netdata

netdata pacman -S netdata systemctl start netdata systemctl enable netdata vim /etc/netdata/netdata.conf [web] bind to = 0.0.0.0 [::]

2014-12-23 · 1 min · 18 words · -

nginx proxy_pass

nginx proxy_pass 功能 Nginx 的ngx_stream_proxy_module和ngx_http_proxy_module两个模块中,都有 proxy_pass 指令。其主要功能是为后端做代理,协议转发,请求转发等。 二、 用法和区别 官网介绍 ngx_stream_proxy_module 的 proxy_pass 语法:proxy_pass address; 默认值:— 场景:server 段 说明:设置代理服务器的地址。代理地址可以是域名或者IP加端口,也可以是一个UNIX的socket路径 ngx_http_proxy_module 的 proxy_pass 语法:proxy_pass URL; 默认值:— 场景:location 段,location中的if段,limit_except段 说明:设置后端代理服务器的地址和协议,还可以附加可选的URI映射。协议可以是 http 或者 https。地址可以是域名或者IP,可以附加指定端口,也可以是UNIX的socket路径,路径要放在unix: 和 : 之间 区别 从上面的各自说明可以看出两个 proxy_pass 指令都是做后端的代理配置。 除了应用场景的段不同之外,ngx_stream_proxy_module 的 proxy_pass 只能转发域名或IP加端口的请求,即端口转发。 ngx_http_proxy_module 的 proxy_pass 除了包含前者的功能外,还可以实现协议转发,如 http 和 https 与 UNIX socket 三者的相互转发,另外还有很实用的URI转发 用法示例 3.1 ngx_stream_proxy_module 的 proxy_pass server { listen 8000; proxy_pass 127.0.0.1:8080; # IP+端口转发 } server { listen 8000; proxy_pass test.com:8080; # 域名+端口转发 } ...

2014-12-18 · 1 min · 164 words · -

IDEA无法启动,Failed to create JVM,error code -4

IDEA无法启动,Failed to create JVM,error code -4 http://blog.csdn.net/twlkyao/article/details/24534505 发生该错误的原因是因为IDEA需要使用的连续内存空间没有得到满足,解决方案: 1.减小-Xmx和-XX:PermSize的值 切换到IDE_HOME\bin\目录下,找到.exe.vmoptions文件,尝试减少-Xmx和-XX:PermSize的值,建议以100M为单位,直到IDEA可以启动。 2.开启64位模式 IDEA提供idea64.exe的启动器,该启动器使用64位的JDK (需要单独安装) 。 3.使用.bat启动 使用.bat替代.exe启动IDEA。 4.强制使用64位的JDK .bat脚本默认使用32位的JDK (IDEA安装文件的jre 目录下) ,可以通过环境变量强制使用64位的JDK,变量的值取决于你使用的产品,IDEA_JDK for IntelliJ IDEA, WEBIDE_JDK for PhpStorm and WebStorm, PYCHARM_JDK for PyCharm, RUBYMINE_SDK for RubyMine. 参考选择合适的JDK。 5.卸载不常用的应用程序 通过卸载不常用的应用程序来减少应用分割程地址空间。 参考资料: 点击打开链接

2014-12-10 · 1 min · 40 words · -

线程 工作内存

线程 工作内存 计算机的工作方式是基于冯诺依曼结构的,从磁盘读取数据到内存,再从内存读取数据到cpu内部的三级,二级,一级最后到达寄存器。java中的多线程的主内存就是内存上面的 jvm 堆,程序在运行时的线程所要的数据都是来自内存,读取并最终传入cpu内部寄存器,每个cpu内部都有各自的一套完整寄存器,cpu只能直接操作这些寄存器,比如cpu的加法指令吧两个寄存器里面的数据加起来放入其中一个或者地三个寄存器,计算的结果如需要保存,cpu需要另一个指令吧数据传输到数据总线并保存到内存,最终写回磁盘。在这个过程中,内存数据可能被多个线程同时读取,并在cpu内部形成私有的拷贝,就是本地内存 (内存的cpu内部本地副本) 在线程中体现在 线程栈 区,正是这种分步多指令实现一个操作,在多线程被调度置换过程中数据被多个线程操作,造成数据竞争,所以数据经常用到锁等手段实现同步。 上面从硬件的实现角度看,从软件的角度看,线程可访问的数据就分共享数据,和私有数据,这个在不同的计算机编程语言中体现都不一样,比如java中的类属性就可以是共享的也可以是私有的,当这个类的实例是在方法内部创建的,那属性就是线程私有的,因为整个对象都是线程私有的,如果该对象被传到线程中的方法,该对象就是共享的。这个界限就看数据是在哪里产生和多线程可访问性;线程防范内部产生并不被方法外部可访问的数据都是私有数据,多线程编程称为线程安全。相反线程不安全。 Java 虚拟机规范定义了 Java 内存模型来屏蔽掉各种硬件和操作系统的内存差异,达到跨平台的内存访问效果。 为了获得更好的执行性能,Java 内存模型没有限制执行引擎使用处理器的特定缓存器或缓存来和主内存(可以和 RAM类比,但是是虚拟机内存的一部分)交互,工作内存 (可类比高速缓存,也是虚拟机内存的一部分) 为线程私有。 工作内存和主内存的划分和 Java 堆,栈,方法区的划分不同,两者基本没有关系,如果勉强对应,则主内存可理 解为堆中实例数据部分,工作内存则对应栈中部分区域 –引用 «深入理解 JAVA 虚拟机» 线程栈 Execution stack 每个线程都有一个线程栈,线程的每个方法被执行的时候,都会同时创建一个帧 (Frame) 用于存储 本地变量表、操作栈、动态链接、方法出入口等信息。每一个方法的调用至完成,就意味着一个帧在VM栈中的入栈至出栈的过程。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果VM栈可以动态扩展 (VM Spec中允许固定长度的VM栈) ,当扩展时无法申请到足够内存则抛出 OutOfMemoryError异常。 一个栈帧又分为: 局部变量区、操作数栈和帧数据区。你可以理解 工作内存为局部变量区中的数据。 https://segmentfault.com/q/1010000004885908 https://www.oschina.net/question/1779843_2163094

2014-12-05 · 1 min · 43 words · -