Gentoo

Gentoo Gentoo是一个基于Linux的自由操作系统,它能为几乎任何应用程序或需求自动地作出优化和定制。追求极限的配置、性能,以及顶尖的用户和开发者社区,都是Gentoo体验的标志特点。 Gentoo的哲学是自由和选择。得益于一种称为Portage的技术,Gentoo能成为理想的安全服务器、开发工作站、专业桌面、游戏系统、嵌入式解决方案或者别的东西——你想让它成为什么,它就可以成为什么。由于它近乎无限的适应性,可把Gentoo称作元发行版 简介 Gentoo已经停止发布新的编译版,最近一次发布的是10.0,之所以发行是为了纪念发行十周年。之所以不发行编译版,是因为没有这个必要,Gentoo不提供传统意义的安装程序,他的安装CD只是提供一个Linux环境,从分区,挂载硬盘,下载编译内核,书写Grub等等都需要手动命令行一步步来。复杂的安装过程往往会让很多新手觉得沮丧,但是它确实能更好的帮你了解Linux的构建。 当然,Gentoo的意义不仅仅在于它所提供的软件。它是围绕着一个发行版建立起来的社区,由300多名开发人员和数以千记的用户共同驱动。发行版项目为用户提供各种途径来享用Gentoo: 文档、基础设施 (邮件列表、站点、论坛……) 、版本发布工程、软件移植、质量保证、安全跟进、强化等等。 为了商讨和协助Gentoo的全局开发,每年推选出一个7人议会,对Gentoo项目中的全局性问题、方针政策和发展进步做出决定。 核心 Portage是Gentoo的核心,履行许多关键的职责。其一,Portage是Gentoo的软件发行系统。Gentoo 下要获取最新的软件,打一个命令: emerge-sync。这个命令告诉Portage从网上更新你本地的"Portage树"。本地Portage树包含一份完整的脚本集合,Portage以之创建和安装最新的Gentoo软件包。当前,我们的Portage树中拥有超过10000个软件包,软件包更新和新软件包每时每刻都在加入中。Portage也是一个软件包构建和安装系统。当你想安装一个软件包时,你输入"emerge 软件包名",此时Portage按照你作的具体配置自动构建一个软件包的定制版本。请根据自己的硬件优化配置,确保启用了软件包中你想要的一些可选特性——同时确保未启用那些你不想要的。 Portage还使系统保持在持续更新状态。输入emerge -uDN world——一个命令——能确保系统中你想要的所有软件包得到自动更新。 优点 与大多数GNU/Linux发行版本不同,Gentoo Linux为用户提供了大量的应用程序源代码。Gentoo Linux的每一部分都可以在最终用户的系统上重新编译建造,甚至包括最基本的系统库和编译器自身。 通过依赖关系描述和源代码镜像的形式提供软件,Gentoo Linux提供了大量软件供用户选择。 标准的源代码镜像包括30G的数据。 选择不仅在软件整体方面,也存在于软件的内部。由于可以在本地编译软件,参数和变量的选择可以由用户自己指定。 指定参数的优势不仅在于用户了解了设置,更多是增加了针对硬件进行性能提升的余地。 而且用户可以使用自己喜欢的补丁或插件对软件功能进行调整,比如当前的Gentoo Linux内核发布包括35种。 由于系统及应用软件的安装方法差异显著,Gentoo Linux社区对安装内容的探讨相当深入。即便不使用 Gentoo Linux的用户也可以通过了解参数选择明白软件内部的设定。应用软件的配置设定都记录在ebuild文件中,由ebuild、emerge命令管理。 gentoo mount /dev/sda3 /mnt/gentoo mount /dev/sda1 /mnt/gentoo/boot chmod 1777 /mnt/gentoo/tmp mount -t proc proc /mnt/gentoo/proc mount -rbind /sys /mnt/gentoo/sys mount -make-rslave /mnt/gentoo/sys mount -rbind /dev /mnt/gentoo/dev mount -make-rslave /mnt/gentoo/dev mount -t tmpfs -o nosuid,nodev,noexec shm /dev/shm chmod 1777 /dev/shm chroot /mnt/gentoo /bin/bash source /etc/profile export PS1="(chroot) $PS1" the minimal install cds have the ability to run isohybrid on them and then you can dd that image to a removable device. ...

2011-11-26 · 2 min · 412 words · -

slackware

slackware Slackware Linux http://baike.baidu.com/view/10899.htm Slackware Linux是由Patrick Volkerding制作的GNU/Linux发行版,它是世界上依然存活的最久的Linux发行版,在它的辉煌时期,曾经在所有发行版中拥有最多的用户数量。但是,随着 Linux商业化的浪潮,Redhat、Mandrake 和Suse 这些产品通过大规模的商业推广,占据了广大的市场;Debian作为一个社区发行版,也拥有很大的用户群。相比之下,Slackware的不事声张,使得它从许多人(尤其是使用Linux的新用户)的视野中消失了。 Slackware是Patrick Volkerding制作的Linux发行版本。Slackware 走了一条同其他的发行版本 (Red Hat、Debian、Gentoo、SuSE、 Mandriva、Ubuntu等) 不同的道路,它力图成为"UNIX风格"的Linux发行版本。它的方针是只吸收稳定版本的应用程序,并且缺少其他linux版本中那些为发行版本定制的配置工具。 Slackware的历史 第一个 Slackware 的版本1.00 在1993年 Slackware 7月16日由创立者和开发领导者Patrick Volkerding发布。 它是基于SLS Linux并以软盘为镜像在匿名FTP上发行。Slackware是现存的最古老的发行版本,在2003年度过了它的十周年纪念。 "Slackware"这个名字借用自Church of the SubGenius中的术语"Slack"。 在早期的发布版本中,发行版本带有三个用户帐号: "satan", "gonzo" 和 "snake"。它们是作为示例被提供,但是后来的版本中去除了这些帐号,因为它们有潜在的安全漏洞。 在1999年,Slackware的发布版本号从4一下子跨越到了 7。Patrick Volkerding 作出解释 : 这是出于市场推广的考虑,为了告诉人们 Slackware 和别的 Linux 发行版本一样"新" (up-to-date) ,当时许多其他发行版本的版本号为 6 。 在2004年,Patrick Volkerding 得了严重的疾病,Slackware 未来的开发变得不可预测。 在他痊愈后很快恢复了Slackware 的开发。 在2005年,GNOME桌面环境被从待发布的版本中删除,移交给了社群进行支持。GNOME的删除被Linux社群中的一些人认为是一个警讯,因为GNOME在各种Linux发行版本中都可以找到,一些由社群建立的支援计划也因此诞生。 贯穿Slackware的历史,出现一些在Slackware基础上制作的发行版本和LiveCD。一些流行的发行版本就起源于 Slackware ,包括SUSE, College Linux 和 Slax。 Slackware X86发布名称 Slackware 主要为x86 PC 开发。然而曾经存在一些官方的移植 ,像针对DEC Alpha 和 SPARC 架构的。从2005年起,开始出现针对System/390架构的官方移植。同时也存在一些非官方的移植,ARM,Alpha,SPARC,PowerPC 和 x86-64。 Slackware 13.0,官方首次提供64位的版本下载。 Slackware 最新稳定发布的版本是 13.37 (直到2011年4月27日) ,其中包括了2.6.37.6和2.6.38.4版本内核, Slackware的测试/开发版本称为 '-current' ,这是为了可以使用更多超前的配置。 KISS, 代表"保持简洁,笨拙" (Keep it Simple, Stupid) ,是一个可以解释很多Slackware中设计选择的概念。在这个文本中,"简洁" ('simple') 指系统设计的观点,而不是指易用性。与大多数其他的发行版不同,KISS(Keep it simple,stupid)是Slackware一贯坚持的原则,尽量保持系统的简洁,从而实现稳定、高效和安全。在KISS哲学里面,简单(Simple)指的是系统设计的简洁性,而不是用户友好(User friendly)。这可能会在一定程度上牺牲了系统的易用性,但却提高了系统的透明性和灵活性。 正是一直以来对KISS原则的坚持,Slackware赢得了简洁、安全、稳定、高效的名声,也赢得了一大批的忠实用户。 启动脚本 Slackware 使用BSD风格的初始化脚本,其他的Linux发行版本大多使用 System V 风格的初始化脚本。基本上 System V 风格的每个运行级都是存放初始化脚本的子目录,而BSD 风格仅为每个运行级提供一个脚本。BSD 风格的拥护者认为这样更佳,因为系统可以更容易找到,读取,编辑,和维护脚本。System V的拥护者认为System V 的结构强大和灵活。 但这些都无关紧要,System V初始化兼容在7.0版本之后被引入了 Slackware 中。 软件套件管理 Slackware的软件套件管理系统很独特。它的软件套件管理系统和别的发行版本一样可以很容易的安装、升级、移除包。但是它不会试着去追踪或者管理涉及哪些依赖关系 (也就是保证系统拥有所有的安装包内的程序需要的系统库) 。如果所需要的先决条件不能满足,在程序执行之前不会有提醒和指示。 包都经过gzip压缩和tarball打包,但文件扩展名是.tgz,而不是.tar.gz。他们的结构是这样的: 当在根目录下解压缩和释放,其中的文件会放置于它们的安装位置。因此可以不使用 Slackware的包工具来安装包,而仅仅使用 tar 和 gzip命令,如果包中有doinst.sh脚本,一定要运行它。 相对的,Red Hat的RPM是CPIO档案,Debian的.deb文件是ar档案。他们都包括一些依赖关系的信息,包管理器工具可以使用这些信息来寻找和安装先决条件。他们在先决条件满足前是不会安装新包的 (虽然可以强制进行) 。 关于追踪或者无视依赖关系孰优孰劣的争论并不很热闹,这多少让人想起了持续甚久的"vi 对 Emacs" 的"宗教战争"。 Slackware解决问题的方法被技巧熟练的用户群很好的接受了。 简单灵活的软件包管理机制 Slackware在软件包管理上的独树一帜也是KISS原则的体现。 Slackware的tgz安装包实际上是经过用tar打包、gzip压缩的文件,和常见的tar.gz 在格式上完全一致,所不同的是tgz包额外包含了软件描述文件和脚本文件。安装软件时, Slackware的包管理工具将安装包解压到指定的目录(默认为根目录), 解压完之后, 如若存在脚本文件, 则运行此脚本文件。 需要特别指出的是,Slackware的软件包管理系统,并没有提供自动的检测依赖机制,用户需要手动检测软件的依赖性问题。Slackware的理由则是: 系统管理员应该知道自己系统里有什么东西,也应该知道要安装什么东西。既然各种软件包管理工具都不可能从根本上杜绝dependency hell的恶梦,不如干脆由用户自己来决定。 由于tgz格式的软件相对来说比较少,使用Slackware时经常需要从源代码自行编译软件。但有趣的是,尽管在软件包管理上Slackware基本上采取的是"放任自流"的方式,但编译软件时极少遇到缺这个库、少那个库的问题,大多数情况下是非常顺利的。 从Slackware-13.0版本开始, Slackware的安装包开始改为txz格式, 即用tar打包、经过xz压缩的文件。但Slackware的管理器也同时兼容以前的tgz格式。 为了满足一些用户对自动解决软件依赖性的需求, 目前已出现了Swaret、Slapt-get和SlackUpdate等等第三方项目。 Slackware 的中文化支持 能否很好地支持中文,是中文用户选择Linux发行版的一个重要标准。 在很多人的印象中,Slackware对中文的支持不好,这也是Slackware的中文用户比较少的原因之一。实际上, Slackware系统中包含了所有Linux国际化支持的内容,只不过默认安装时,Slackware并没有提供针对国际化内容进行设置的选项。这需要用户手动配置符合自己语言的桌面环境。 历史上,Slackware确实存在对中文支持不太好的问题,但这是在Linux国际化程度比较差的大环境下,几乎所有发行版都存在的普遍问题。在当时,这促成市场上涌现出了几种以中文处理为优势的"国产"Linux。 为了方便解决中文处理的问题,海峡对岸的同胞发起了对Linux进行汉化的Chinese Linux Extension(CLE) 项目,把一些零散的中文处理技术整合成一个比较完整的解决方案。CLE的工作成果移植到Slackware之后,确实大大方便了中文用户。但是,随着 glibc、X Window对国际化支持的进步,系统及应用程序的国际化支持程度也大幅度提高,几乎所有的中文化支持都可以在系统默认配置的基础上通过较为简单的设置而实现,不再需要像过去那样安装特殊的中文应用程序。 Slackware的当前版本已经可以做到通过安装中文字体、修改配置文件、安装中文输入法这几个简单的步骤,就很容易地实现中文显示和输入。系统级的中文打印和LaTeX的中文支持,也能够用比较简单的步骤实现。 总结 在历史上, Slackware曾经对中文支持方面较差, 结果是Slackware的中文用户数量远远低于其他名气大的发行版。国内 的用户数量少,使得Slackware被蒙上了一层神秘的面纱,直至今日, 一些不准确的传言,如难安装、中文支持不好、易用性差等等,依然让很多用户不敢轻易尝试。 但实际上,Slackware一直以来是以简洁、安全和稳定所著称的,在世界范围内拥有广大的忠实用户,其地位在各大发行版中始终保持着稳定的排名。 在软件包的选择上,Slackware不贪多求全,只安装一些常用的软件。软件版本不一定选最新的,而是对安全性和稳定性的考虑更多一些,目的也是减轻系统管理工作的负担。 在系统的配置方面, Slackware 不遮掩内部细节, 它将系统"真实"的一面毫不隐藏的呈现给用户,让人们看到"真正的"Linux。 这要求用户需要拥有一定量的基础知识, 才能跨过使用Slackware的门槛, 否则难以驾驭此系统。 对此, 批评者认为, 这让很多事做起来太费劲;而支持者回应到这提高了系统的灵活性和透明性, 使得系统趋向于简洁。在一些人眼中,Slackware似乎没有对Linux社区做出什么贡献,它只是把现有的软件绑在一起。但是,Slackware既然能成为目前存活时间最长的发行版,拥有一批忠实的用户,是它一直坚持KISS原则、保持自己独特的风格的结果,这种坚持给用户带来一个简洁、高效和稳定的系统。 Slackware打包时,对内核和软件的改动尽可能少,除非发现安全漏洞才会打补丁,最大限度地保持了内核和应用软件的原汁原味。 由于Slackware在系统管理上的简单、透明,以及"不太友好"的配置工具,用户在进行系统管理时,需要对系统有更加深入的了解,更容易真正理解Linux的运行机制。 正是由于上述的原因,从Slackware入手学习Linux,虽然门槛稍为有点高,但是更容易接触到Linux系统的本质。在Slackware社区,最经常被引用的一句话就是: "When you know Slackware you know Linux. When you know Red Hat, all you know is Red Hat."

2011-11-26 · 1 min · 207 words · -

Hostname, 主机名

Hostname 主机名里不能用 ., 遇到 . 会被截断, 也不能用下划线, 下划线会被忽略掉. hostnamectl, 查看主机信息, 查看主机名, 查看机器名, 查 hostname # 查看 hostnamectl hostnamectl status # 设置主机名 sudo hostnamectl set-hostname host0 hostnamectl -static hostnamectl -transient hostnamectl -pretty sudo hostnamectl set-hostname new-host-name redhat 改主机名 /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=YOURHOSTNAME /etc/hosts 127.0.0.1 YOURHOSTNAME localhost # 在linux下查看主机名的命令 hostname http://soft.zdnet.com.cn/software_zone/2007/0831/481970.shtml 什么是主机名: 无论在局域网还是INTERNET上,每台主机都有一个IP地址,是为了区分此台主机和彼台主机,也就是说IP地址就是主机的门牌号。但IP地址不方便记忆,所以又有了域名。域名只是在公网 (INtERNET)中存在(以实验为目的的局域网域网实验性除外) ,每个域名都对应一个IP地址,但一个IP地址可有对应多个域名。域名类型 Linuxsir.org 这样的; 主机名是用于什么的呢?在一个局域网中,每台机器都有一个主机名,用于主机与主机之间的便于区分,就可以为每台机器设置主机名,以便于以容易记忆的方法来相互访问。比如我们在局域网中可以为根据每台机器的功用来为其命名。 主机名相关的配置文件: /etc/hosts; 主机名配置文件; 主机名的配置文件大多是/etc/hosts ; hosts – The static table lookup for host name (主机名查询静态表) ; ...

2011-11-26 · 2 min · 327 words · -

generate delete sql

generate delete sql select ‘delete from ’ || ut.table_name || ‘;’ from user_tables ut;

2011-11-25 · 1 min · 14 words · -

Go Synchronization, 同步

Go Synchronization, 同步 Go语言在设计上对同步 (Synchronization,数据同步和线程同步)提供大量的支持,比如 goroutine和channel同步原语,库层面有 sync:提供基本的同步原语 (比如Mutex、RWMutex、Locker)和 工具类 (Once、WaitGroup、Cond、Pool、Map) sync/atomic:提供变量的原子操作 (基于硬件指令 compare-and-swap)

2011-11-24 · 1 min · 13 words · -

linux shutdown

’linux shutdown' shutdown是最安全的关机和重启命令,平时使用时推荐使用shutdown命令关机和重启。 shutdown 【语法】shutdown [选项] [参数] 【详解】shutdown是最安全的关机和重启命令,平时使用时推荐使用shutdown命令关机。而且该命令支持定时操作。 【选项】 选项 相应功能 -a 指定权限 -r 重启计算器 (和reboot) 命令一样 -k 模拟关机 (只向用户发出警告信息,但不关机) -h 关闭计算机并关闭电源 (常用) -n 不调用init进程关闭计算机 (不推荐) -c 取消正在执行的关机命令 -f 重启计算机,但不进行磁盘检测 -F 重启计算机,进行磁盘检测 -t(秒) 指定发出警告信息与删除信息时要延迟的秒数 【附加参数】 参数 相应介绍 时间 指关闭计算机的时间。 可以为详细时间,如22: 00,晚上10点关闭计算机 也可以作为详细分钟,如"+5",则5分钟后关机。 警告信息 可以是任意文本,信息,需要引号括起来才能使用。 例子: (1)、通过shutdown命令重启计算机 (加now则是立即重启) shutdown -r now (2)、设置1分钟以后关闭计算机,并在SSH中提示"1 minute after shutdown" shutdown -h +1 “1 minute after shutdown” shutdown1.jpg (3)、取消关机 若需要取消关机、重启操作,在SSH中可按Ctrl+C快捷键取消正在执行的命令。当然若重新登陆了SSH或其它情况,可通过一下代码取消 (定时) 关机。 http://www.kwx.gd/LinuxBase/Linux-shutdown.html http://blog.csdn.net/aloie/article/details/3141336 有点linux基础知识的,或者是系统的学习过计算机知识的人,没用过也能猜到,关机命令十有八九可能是shutdown。没错,实际上shutdown确实是liunx的关机命令,再配合各种选项,实现不同的关机效果。 然而在此之前,我却从没成功运行过shutdown。我是用普通用户登录,在终端下输入shutdown命令,结果显示 command not found。这就奇怪了,难道我的linux不支持这个命令?man了一下shutdown,大篇幅的说明告诉我,我的linux中是有这个命令的。但是什么执行无效呢? ...

2011-11-24 · 1 min · 91 words · -

ssh-keygen

ssh-keygen, linux 生成 ssh 密钥 ssh-keygen 是用于为 SSH 创建新的身份验证密钥对的工具。此类密钥对用于自动登录,单点登录和验证主机。 目前广泛的用在 linux 服务验证、git 身份验证上。 执行 ssh-keygen 可以生成一个密钥对, 这个密钥对称为公钥文件和私钥文件 ,例如: 使用 rsa 算法:id_rsa(私钥), id_rsa.pub(公钥) 使用 dsa 算法:id_dsa(私钥), id_dsa.pub(公钥) 在 ~/.ssh 目录下生成私钥 id_rsa 和公钥 id_rsa.pub 文件 # 优先使用 ed25519 # 默认的密钥目录 /home/user_0/.ssh, .ssh 目录不存在的话会自动创建. ssh-keygen -t ed25519 -C "foo" ssh-keygen -t ed25519 -C "foo" -f ~/tmp/foo # RSA 算法 ssh-keygen -t rsa -C "foo" ssh-keygen -t rsa -C "foo" -f ~/tmp/foo ssh-keygen -t ed25519 -f foo -C "bar" # -t 选择加密算法, -t ed25519 使用加密算法 ed25519, 可选值: ed25519, rsa, dsa # -f foo, 生成的密钥文件名, 不指定文件名的话, ed25519 算法默认的文件名是 id_ed25519, 也可以指定完整的路径, 如 /home/user_0/tmp/foo # -C "bar" 在公钥文件中添加注释,即为这个公钥“起个别名”(不是 id,可以更改)。 # 公钥放到服务器的这个文件里 vim ~/.ssh/authorized_keys # 打印公钥指纹, The -l option instructs to show the fingerprint in the public key # while the -f option specifies the file of the key to list the fingerprint for. ssh-keygen -l -f id_ed25519 # 从私钥生成公钥 # -y This option will read a private OpenSSH format file and print an OpenSSH public key to stdout. ssh-keygen -y -f id_ed25519 > id_ed25519.pub ssh-keygen -t rsa ssh-keygen -t rsa -b 4096 ssh-keygen -t ecdsa -b 521 # -t type 指定要创建的密钥类型。可以使用: "rsa1"(SSH-1) "rsa"(SSH-2) "dsa"(SSH-2) ssh-keygen -t rsa -C "Michael Ledin" -b 4096 -m "PEM" # -C comment # -b key 长度 # -t 类型: dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa scp /root/.ssh/id_rsa.pub root@192.168.10.184:/root ssh 192.168.10.184 cat /root/id_rsa.pub >> /root/.ssh/authorized_keys # ok,you will login 192.168.10.184 without input password. 推送公钥到服务器 ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.0.2 print SHA256 fingerprint # retrieve the SHA256 fingerprint ssh-keygen -lf /path/to/ssh/key # GitHub (MD5) fingerprint format ssh-keygen -E md5 -lf <fileName> ssh-keygen -A public key file: authorized_keys ...

2011-11-24 · 3 min · 543 words · -

initcwnd

initcwnd initial congestion window parameter (initcwnd) Changing initcwnd Adjusting the value of the initcwnd setting on Linux is simple. Assuming we want to set it to 10: Step 1: check route settings. sajal@sajal-desktop:$ ip route show 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 1 169.254.0.0/16 dev eth0 scope link metric 1000 default via 192.168.1.1 dev eth0 proto static sajal@sajal-desktop:$ Make a note of the line starting with default. ...

2011-11-22 · 1 min · 140 words · -

Closure Tools

Closure Tools Google已经基于Apache License 2.0把Closure Stylesheets开源,这种工具属于Closure Tools包之内,在处理CSS的时候很有用。Closure Stylesheets是一个Java程序,它向CSS中添加了变量、函数、条件语句以及混合类型,使得我们更易于处理大型的CSS文件。开发者可以使用Google stylesheets (GSS)这种工具来生成web应用程序或者网站所使用的真正的CSS文件。 http://www.infoq.com/cn/news/2011/11/Google-Closure-Stylesheets

2011-11-21 · 1 min · 11 words · -

Gradle basic, command

Gradle basic, command create project structure gradle init --type java-application --dsl kotlin command gradle build install # archlinux sudo pacman -S gradle # mac brew install gradle windows install gradle scoop install main/gradle-bin download latest version of gradle from http://www.gradle.org/downloads.html extract the gradle package sudo emacs ~/.bashrc add the gradle to path. set PATH=$JAVA_HOME/bin:/home/wiloon/program/gradle-1.0-milestone-3/bin:$PATH export PATH restart the system # 更新依赖包 gradle build --refresh-dependencies # publish to maven gradle publish # create project structure mkdir java21 gradle init \ --type java-application \ --dsl kotlin \ --test-framework junit-jupiter \ --package com.wiloon.java21 \ --project-name java21 \ --no-split-project \ --java-version 21 gradle init --type java-library --project-name jvm-library --dsl kotlin gradle init --type java-library gradle init --type java-application #check module dependency gradle dependencies --configuration compileClasspath gradle :core:dependencies #specifies the build file. gradle -b xxx/xxx/build.gradle #The Application Plugin #apply plugin: 'application' # 打包-tar gradle distTar gradle distZip # 安装到本地 gradle installDist #convert maven project to gradle project gradle init --type pom #eclipse gradle eclipse gradle cleanEclipse #idea gradle idea gradle cleanIdea #skip test gradle build -x test #load local jars compile files('libs/jfx-2.3.8.jar') // project dependency dependencies { compile project(":project-name") } ...

2011-11-20 · 1 min · 212 words · -

STDIN STDOUT, STDERR

STDIN STDOUT, STDERR Unix/Linux/BSD 都有三个特别文件,分别 标准输入 即 STDIN , 在 /dev/stdin , 一般指键盘输入, shell里代号是 0 标准输出 STDOUT, 在 /dev/stdout, 一般指终端(terminal), 就是显示器, shell里代号是 1 标准错误 STDERR, 在 /dev/stderr 也是指终端(terminal), 不同的是, 错误信息送到这里 shell里代号是 2 stdout和stderr 有人说stdio是带缓冲的,stderr是不带缓冲的,这并不是指fd=1和fd=2这两个设备文件,这两个设备是字符设备,本身没有缓存。并且你看一个进程的1和2两个fd指向的其实是同一个终端设备文件 ls -l /proc/8669/fd/ total 0 lrwx------ 1 root root 64 4月 25 20:57 0 -> /dev/pts/7 lrwx------ 1 root root 64 4月 25 20:57 1 -> /dev/pts/7 lrwx------ 1 root root 64 4月 25 20:57 2 -> /dev/pts/7 所以,细想一下就知道,向1或2两个fd写东西,在内核里走的是完全相同的路径,不可能存在一会儿缓存一会儿不缓存的情况。 ...

2011-11-19 · 1 min · 169 words · -

TimeUnit

TimeUnit http://chenjumin.iteye.com/blog/2182171 //关于秒的常用方法 TimeUnit.SECONDS.toMillis(1) 1秒转换为毫秒数 TimeUnit.SECONDS.toMinutes(60) 60秒转换为分钟数 TimeUnit.SECONDS.sleep(5) 线程休眠5秒 TimeUnit.SECONDS.convert(1, TimeUnit.MINUTES) 1分钟转换为秒数 //TimeUnit.DAYS 日的工具类 //TimeUnit.HOURS 时的工具类 //TimeUnit.MINUTES 分的工具类 //TimeUnit.SECONDS 秒的工具类 //TimeUnit.MILLISECONDS 毫秒的工具类 http://www.importnew.com/7219.html TimeUnit是什么 TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换 Thread.sleep(),在很长一段时间里 Thread的sleep() 方法作为暂停线程的标准方式,几乎所有Java程序员都熟悉它,事实上sleep方法本身也很常用而且出现在很多面试中。如果你已经使用过 Thread.sleep(),当然我确信你这样做过,那么你一定熟知它是一个静态方法,暂停线程时它不会释放锁,该方法会抛出 InterrupttedException 异常 (如果有线程中断了当前线程) 。但是我们很多人并没有注意的一个潜在的问题就是它的可读性。Thread.sleep() 是一个重载方法,可以接收长整型毫秒和长整型的纳秒参数,这样对程序员造成的一个问题就是很难知道到底当前线程是睡眠了多少秒、分、小时或者天。看看下面这个Thread.sleep()方法: Thread.sleep (2400000) 粗略一看,你能计算出当前线程是等待多长时间吗?可能有些人可以,但是对于大多数程序员来说这种写法的可读性还是很差的,你需要把毫秒转换成秒和分,让我们来看看另外一个例子,这个例子比前面那个例子可读性稍微好一点: Thread.sleep(4_60_1000); 这比前面那个例子已经好多了,但是仍然不是最好的,你注意到睡眠时间用毫秒,不容易猜出当前线程将等待4分钟。TimeUnit类解决了这个问题,通过指定DAYS、HOURS、MINUTES,SECONDS、MILLISECONDS和NANOSECONDS。java.utils.concurrent .TimeUnit 是Java枚举应用场景中最好的例子之一,所有TimeUnit都是枚举实例,让我们来看看线程睡眠4分钟用TimeUnit是如何使用的。 TimeUnit.MINUTES.sleep(4); // sleeping for 4 minutes 类似你可以采用秒、分、小时级别来暂停当前线程。你可以看到这比Thread的sleep方法的可读的好多了。记住TimeUnit.sleep()内部调用的Thread.sleep()也会抛出InterruptException。你也可以查看JDK源代码去验证一下。下面是一个简单例子,它展示如果使用TimeUnit.sleep()方法。 public class TimeUnitTest { public static void main(String args[]) throws InterruptedException { System.out.println("Sleeping for 4 minutes using Thread.sleep()"); Thread.sleep(4 * 60 * 1000); System.out.println("Sleeping for 4 minutes using TimeUnit sleep()"); TimeUnit.SECONDS.sleep(4); TimeUnit.MINUTES.sleep(4); TimeUnit.HOURS.sleep(1); TimeUnit.DAYS.sleep(1); } } 除了sleep的功能外,TimeUnit还提供了便捷方法用于把时间转换成不同单位,例如,如果你想把秒转换成毫秒,你可以使用下面代码: ...

2011-11-19 · 1 min · 93 words · -

commons-logging Log4J

commons-logging Log4J commons-logging vs Log4J Log4J是一个功能很强大的日志记录组件,它提供了丰富的日志记录功能,它本身和commons-logging没有什么关系,也就是说一个项目中可以单独使用Log4J来记录日志,而不需要引入commons-logging包,这样也能实现记录日志的功能,但是这样有一个不太好的地方就是如果你想使用其他的Logging组建,比如jdk1.4自带的logging框架,就不得不修改原有文件中所有使用了Log4J组建的代码。 这时,commons-logging就派上用场了,说白了commons-logging就是一个记录日志的统一接口,它定义了一套抽象的记录日志的接口,用户可以通过配置,来使用任何一个符合该接口的Logging组建。而commons-logging组建本身仅仅提供了一个很简单的记录日志的类SimpleLog,这个类的记录日志功能很有限。因此,通常情况下,会将Log4J组建与commons-logging组建一块儿使用,在程序代码中,使用commons-logging的接口方法来记录日志,而后台实际使用的是Log4J组建。 commons-logging组建使用具体的Log组建的顺序如下 如果定义了org.apache.commons.logging.Log系统参数,则使用指定的Logging实现; 如果在CLASSPATH里发现了Log4J,则使用Log4J; 如果使用的是JDK1.4,则使用JDK1.4内置的Logging框架; 如果都没有找到,则使用Commons Logging内置的简单Log实现。 我们在做项目时,日志的记录是必不可少的一项任务,而我们通常是使用 apache 的 log4j 日志管理工具。然而,在项目中,我们经常会看到两个 jar 包: commons-logging.jar 和 log4j.rar。为什么我们在使用 log4j 的同时还要引入 commons-logging.jar 呢,或者说不用 commons-logging.jar 可不可以,这两者之间到底是怎么的一种关系呢? 作为记录日志的工具,它至少应该包含如下几个组成部分(组件): Logger 记录器组件负责产生日志,并能够对日志信息进行分类筛选,控制什么样的日志应该被输出,什么样的日志应该被忽略。它还有一个重要的属性 - 日志级别。不管何种日志记录工具,大概包含了如下几种日志级别: DEBUG, INFO, WARN, ERROR 和 FATAL。 Level 日志级别组件。 Appender 日志记录工具基本上通过 Appender 组件来输出到目的地的,一个 Appender 实例就表示了一个输出的目的地。 Layout Layout 组件负责格式化输出的日志信息,一个 Appender 只能有一个 Layout。 我们再来看看 log4j.jar,打开 jar 包,我们可以看到 Logger.class(Logger),Level.class(Level), FileAppender.class(Appender), HTMLLayout.class(Layout)。其它的我们先忽略不看,这几个字节码文件正好是记录日志必不可少的几个组件。 接下来看看 commons-logging 中的 org.apache.commons.logging.Log.java 源码: Java代码 package org.apache.commons.logging; public interface Log { ...

2011-11-18 · 2 min · 331 words · -

Debian/Ubuntu 系统 Update-rc.d

Debian/Ubuntu 系统 Update-rc.d https://wangyan.org/blog/ubuntu-update-rc-d.html Ubuntu或者Debian系统中update-rc.d命令,是用来更新系统启动项的脚本。这些脚本的链接位于/etc/rcN.d/目录,对应脚本位于/etc/init.d/目录。在了解update-rc.d命令之前,你需要知道的是有关Linux 系统主要启动步骤,以及Ubuntu中运行级别的知识。 一、Linux 系统主要启动步骤 读取 MBR 的信息,启动 Boot Manager。 加载系统内核,启动 init 进程, init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。 init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别。通常情况下 /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是/etc/rcN.d/ 目录。 根据 /etc/rcS.d/ 文件夹中对应的脚本启动 Xwindow 服务器 xorg,Xwindow 为 Linux 下的图形用户界面系统。 启动登录管理器,等待用户登录。 二、运行级别 Ubuntu中的运行级别 0 (关闭系统) 1 (单用户模式,只允许root用户对系统进行维护。) 2 到 5 (多用户模式,其中3为字符界面,5为图形界面。) 6 (重启系统) 切换运行级别 init [0123456Ss] 例如: init 0 命令关机; init 6 命令重新启动 启动项管理工具 sudo apt-get install sysv-rc-conf //或者使用带gui的工具bum sudo sysv-rc-conf 三、update-rc.d命令详解 ...

2011-11-18 · 1 min · 119 words · -

分布式ID, 雪花算法

分布式ID, 雪花算法 https://zhuanlan.zhihu.com/p/85837641 雪花算法这一在分布式架构中很常见的玩意,但一般也不需要怎么去深入了解,一方面一般个人项目用不到分布式之类的大型架构,另一方面,就算要用到,市面上很多ID生成器也帮我们完成了这项工作。 分布式ID的特点 全局唯一性 不能出现有重复的ID标识,这是基本要求。 递增性 确保生成ID对于用户或业务是递增的。 高可用性 确保任何时候都能生成正确的ID。 高性能性 在高并发的环境下依然表现良好。 分布式ID的常见解决方案 UUID Java自带的生成一串唯一随机36位字符串 (32个字符串+4个“-”)的算法。它可以保证唯一性,且据说够用N亿年,但是其业务可读性差,无法有序递增。 SnowFlake 今天的主角雪花算法,它是Twitter开源的由64位整数组成分布式ID,性能较高,并且在单机上递增。 具体参考: https://github.com/twitter-archive/snowflake UidGenerator UidGenerator是百度开源的分布式ID生成器,其基于雪花算法实现。 具体参考: https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md Leaf Leaf是美团开源的分布式ID生成器,能保证全局唯一,趋势递增,但需要依赖关系数据库、Zookeeper等中间件。 具体参考: https://tech.meituan.com/MT_Leaf.html 雪花算法的概要 SnowFlake是Twitter公司采用的一种算法,目的是在分布式系统中产生全局唯一且趋势递增的ID。 组成部分 (64bit) 1.第一位 占用1bit,其值始终是0,没有实际作用。 2.时间戳 占用41bit,精确到毫秒,总共可以容纳约69年的时间。 3.工作机器id 占用10bit,其中高位5bit是数据中心ID,低位5bit是工作节点ID,做多可以容纳1024个节点。 4.序列号 占用12bit,每个节点每毫秒0开始不断累加,最多可以累加到4095,一共可以产生4096个ID。 SnowFlake算法在同一毫秒内最多可以生成多少个全局唯一ID呢:: 同一毫秒的ID数量 = 1024 X 4096 = 4194304

2011-11-12 · 1 min · 49 words · -

shell逻辑运算符

shell逻辑运算符 -d 常用!侦测『目录』是否存在 -b 侦测是否为一个『 block 档案』 -c 侦测是否为一个『 character 档案』 -S 侦测是否为一个『 socket 标签档案』 -L 侦测是否为一个『 symbolic link 的档案』 -e 侦测『某个东西』是否存在! 2. 关于程序的逻辑卷标! -G 侦测是否由 GID 所执行的程序所拥有 -O 侦测是否由 UID 所执行的程序所拥有 -p 侦测是否为程序间传送信息的 name pipe 或是 FIFO (老实说,这个不太懂!) 3. 关于档案的属性侦测! -r 侦测是否为可读的属性 -w 侦测是否为可以写入的属性 -x 侦测是否为可执行的属性 -s 侦测是否为『非空白档案』 -u 侦测是否具有『 SUID 』的属性 -g 侦测是否具有『 SGID 』的属性 -k 侦测是否具有『 sticky bit 』的属性 4. 两个档案之间的判断与比较 ;例如[ test file1 -nt file2 ] -nt 第一个档案比第二个档案新 -ot 第一个档案比第二个档案旧 -ef 第一个档案与第二个档案为同一个档案 ( link 之类的档案) 5. 逻辑的『和(and)』『或(or)』 && 逻辑的 AND 的意思 || 逻辑的 OR 的意思 运算符号 代表意义 = 等于 应用于: 整型或字符串比较 如果在[] 中,只能是字符串 != 不等于 应用于: 整型或字符串比较 如果在[] 中,只能是字符串 < 小于 应用于: 整型比较 在[] 中,不能使用 表示字符串 > 大于 应用于: 整型比较 在[] 中,不能使用 表示字符串 -lt 小于 应用于: 整型比较 -gt 大于 应用于: 整型比较 -le 小于或等于 应用于: 整型比较 -ge 大于或等于 应用于: 整型比较 -a 双方都成立 (and) 逻辑表达式 –a 逻辑表达式 -o 单方成立 (or) 逻辑表达式 –o 逻辑表达式 -z 空字符串 -n 非空字符串

2011-11-12 · 1 min · 149 words · -

missing LSB tags and overrides

missing LSB tags and overrides update-rc.d tomcat defaults pop out warning message missing LSB tags and overrides add the following lines into the script BEGIN INIT INFO Provides: tomcat Required-Start: $remote_fs $syslog Required-Stop: $remote_fs $syslog Default-Start: 2 3 4 5 Default-Stop: 0 1 6 Short-Description: Start tomcat at boot time Description: Enable service provided by tomcat. END INIT INFO

2011-11-12 · 1 min · 59 words · -

Jakarta

Jakarta http://zh.wikipedia.org/zh-cn/Jakarta%E9%A1%B9%E7%9B%AE Jakarta项目是在Apache软件基金会营运的开放源代码开发项目之一。开发着面向对象编程语言Java的程序库,框架等。 Jakarta是Apache组织下的一套Java解决方案的开源软件的名称,它包括了很多子项目。Tomcat、Ant、Struts等等现在是Apache下的开源项目,也曾是Jakarta的关联项目。 Jakarta的名称是想把与Jakarta关系非常深的爪哇岛关联起来。编程语言Java的命名源自这个岛的名字 (印尼语: Jawa、英语: Java) ,而城市雅加达 (Jakarta) 正是这个岛上的第一大城市,也是印度尼西亚的首府。 子项目 其中,Jakarta项目所包括的相关工具、库以及框架等罗列如下: BCEL - 处理Java字节码的类库 BSF - 脚本程序框架 Cactus - 服务器端Java类测试工具框架 ECS - The Element Construction Set is a Java API for generating elements for various markup anguages. HttpComponents- 超文本传输协议. JCS - 分布式缓存系统. JMeter - 压力测试工具 ORO - Java类库,提供与Perl5兼容的正则表达式功能 Regexp - 纯Java正则表达式包 Slide - a content repository primarily using WebDAV. Taglibs - 一个代码库,用于支持开发定制化的JSP tag lib 以前隶属于Jakarta项目,但现在作为Apache软件基金的单独项目,有: Ant - 构建工具 Commons - 一组使用类的合集,主要作为Java标准库的补充 HiveMind - a services and configuration microkernel ...

2011-11-12 · 1 min · 111 words · -

守护进程, 守护线程

守护进程, 守护线程 守护进程详解及创建,daemon() 使用 守护进程概述 Linux Daemon (守护进程) 是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux 系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程 syslogd、 web 服务器 httpd、邮件服务器 sendmail 和数据库服务器 MySQLd 等。 守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户 (root) 权限运行,因为它们要使用特殊的端口 (1-1024) 或访问某些特殊的资源。 一个守护进程的父进程是 init 进程,因为它真正的父进程在 fork 出子进程后就先于子进程 exit 退出了,所以它是一个由 init 继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备 stdout 还是标准出错设备 stderr 的输出都需要特殊处理。 守护进程的名称通常以 d 结尾,比如 sshd、xinetd、crond 等 二,创建守护进程步骤 首先我们要了解一些基本概念: 进程组 : 每个进程也属于一个进程组 每个进程主都有一个进程组号,该号等于该进程组组长的 PID 号. 一个进程只能为它自己或子进程设置进程组 ID 号 会话期: 会话期(session)是一个或多个进程组的集合。 setsid()函数可以建立一个对话期: 如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。 (1)此进程变成该对话期的首进程 (2)此进程变成一个新进程组的组长进程。 (3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除。 如果该进程是一个进程组的组长,此函数返回错误。 (4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行 现在我们来给出创建守护进程所需步骤: 编写守护进程的一般步骤步骤: 在父进程中执行fork并exit推出; 在子进程中调用setsid函数创建新的会话; 在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录; 在子进程中调用umask函数,设置进程的umask为0; 在子进程中关闭任何不需要的文件描述符 说明: 在后台运行。 为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。 if(pid=fork()) exit(0);//是父进程,结束父进程,子进程继续 脱离控制终端,登录会话和进程组 有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系: 进程属于一个进程组,进程组号 (GID) 就是进程组长的进程号 (PID) 。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长: setsid(); 说明: 当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。 禁止进程重新打开控制终端 现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端: if(pid=fork()) exit(0);//结束第一子进程,第二子进程继续 (第二子进程不再是会话组长) 关闭打开的文件描述符 进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们: for(i=0;i 关闭打开的文件描述符close(i);> 改变当前工作目录 进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如/tmpchdir("/") 重设文件创建掩模 进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除: umask(0); 处理SIGCHLD信号 处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程 (zombie) 从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。 signal(SIGCHLD,SIG_IGN); 这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。 创建守护进程 在创建之前我们先了解setsid()使用: ...

2011-11-12 · 6 min · 1278 words · -

正整数

正整数 整数是不包括小数部分的数,正整数是指大于0整数。例如1,2,3……等可以用来表示完整计量单位的对象个数的数,是正整数。

2011-11-12 · 1 min · 2 words · -