【转载】shell 生成指定范围随机数与随机字符串

Linux Shell 【转载】shell 生成指定范围随机数与随机字符串 使用系统的 $RANDOM 变量 $ echo $RANDOM 17617 $RANDOM 的范围是 [0, 32767] 如需要生成超过 32767 的随机数,可以用以下方法实现。 例:生成 400000~500000 的随机数 #!/bin/bash function rand(){ min=$1 max=$(($2-$min+1)) num=$(($RANDOM+1000000000)) #增加一个10位的数再求余 echo $(($num%$max+$min)) } rnd=$(rand 400000 500000) echo $rnd exit 0 或许可以使用:shuf -i 400000-500000 -n 1 使用date +%s%N 例:生成 1~50 的随机数 #!/bin/bash function rand(){ min=$1 max=$(($2-$min+1)) num=$(date +%s%N) echo $(($num%$max+$min)) } rnd=$(rand 1 50) echo $rnd exit 0 使用 /dev/random 和 /dev/urandom /dev/random 存储着系统当前运行环境的实时数据,是阻塞的随机数发生器,读取有时需要等待。 /dev/urandom 非阻塞随机数发生器,读取操作不会产生阻塞。 例:使用 /dev/urandom 生成 100~500 的随机数,使用 urandom 避免阻塞。 ...

【转载】Supervisord 的使用

Linux [[Supervisor]] 【转载】Supervisord 的使用 Supervisor(http://supervisord.org/)是用 Python 开发的一个 client/server 服务,是 Linux/Unix 系统下的一个进程管理工具,不支持 Windows 系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用 Supervisor 管理的进程,当一个进程意外被杀死, supervisort 监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写 shell 脚本来控制。 因为 Supervisor 是 Python 开发的,安装前先检查一下系统否安装了 Python2.4 以上版本。 下面以 Ubuntu 18.04,Python2.7 版本环境下,介绍 Supervisor 的安装与配置步聚: 安装 supervisor sudo apt-get install supervisor supervisor 安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是 supervisor 的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。 配置 运行 supervisord 服务的时候,需要指定 supervisor 配置文件,如果没有显示指定,默认在以下目录查找: # $CWD表示运行supervisord程序的目录。 $CWD/supervisord.conf $CWD/etc/supervisord.conf /etc/supervisord.conf /etc/supervisor/supervisord.conf (since Supervisor 3.3.0) ../etc/supervisord.conf (Relative to the executable) ../supervisord.conf (Relative to the executable) 可以通过运行 echo_supervisord_conf 程序生成supervisor的初始化配置文件,如下所示: mkdir /etc/supervisor echo_supervisord_conf > /etc/supervisor/supervisord.conf 配置文件参数说明 supervisor 的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档介绍。 注:分号(;)开头的配置表示注释 ...

【转载】不要在你的代码里出现User

[[杂谈]] 【转载】不要在你的代码里出现User Never use the word “User” in your code You’re six months into a project when you realize a tiny, simple assumption you made at the start was completely wrong. And now you need to fix the problem while keeping the existing system running—with far more effort than it would’ve taken if you’d just gotten it right in the first place. Today I’d like to tell you about one common mistake, a single word that will cause you endless trouble. I am speaking, of course, about “users”. ...

【转载】不要自称为程序员

[[杂谈]] 【转载】不要自称为程序员 每年都有无数年轻程序员,加入软件行业。 他们在学校里学过编程,但是对这个行业的现实一无所知。 Patrick McKenzie 是美国一家小软件公司的老板,他写了一篇长文,介绍这个行业的一些实际情况。我看了以后很感慨,有些地方很受启发。我选择了一部分,翻译如下。 一、90%的编程工作来自内部软件 计算机专业的学生,可能有一种印象,觉得大部分程序员,都在编写公开出售的软件或者通用软件。 这种看法是不对的。大部分程序员,实际上编写的是不公开的企业内部软件,比如追踪费用的软件、优化装运成本的软件、帮助记账的软件、设计新部件的软件、计算保单价格的软件、识别恶意订单的软件等等。各种各样的商业公司,开发内部软件,解决它们自己的问题。市场上对程序员的大部分需求来源于此,只有极少数程序员直接编写面向外部顾客的软件。 内部软件的开发,通常非常乏味,令人厌倦。因为它们的技术复杂性低、技术决策非常保守、预算很少、缺乏长远考虑。但是,世界上大部分编程工作都是这种。 二、别人雇你的目的,是让你创造利润,不是让你编程 商业公司最关心的(或者说唯一在乎的)事情,就是增加收入、降低成本。因此,它们实际上需要的不是程序员,而是能够帮助它们增加收入、降低成本的人。 开发优美的软件,解决技术难题,编写没有 bug 的代码,这些都不是商业公司的目的。它们雇佣你,是为了让你帮它们完成某个可以增加收入、降低成本的项目,而不是为了让你追求个人的软件成就。 你对于公司的唯一价值,就在于能多大程度上为它们增加收入、降低成本。 三、不要自称为程序员 很多公司的经理不懂计算机,在他们心目中,程序员就是一群高成本的劳动力,只会在一台复杂的机器上干一些难懂的事情。 如果你自称为"程序员",当公司需要压缩成本的时候,某些经理首先就会想到解雇你,因为你的工资高。有一家公司叫 Salesforce,口号是"没有软件",意思就是如果经理们购买了他们的服务,就不再需要别的软件管理销售业务了,也就是说,不再需要自己雇佣程序员了。 正确的做法是,你应该把自己描述成与增加收入、降低成本有关系的人,比如"xx产品的开发者"或"改进者"。有一个 Google Adsense 程序员的自我介绍,是这样写的:“Google 公司97%的收入,与我的代码有关。” 四、不要限定自己 年轻学生经常会问,应该选择哪种语言或平台?Java 是不是比 .NET 容易找工作? 过分强调某一种语言或平台,都是不必要的。如果你把自己限定为 Java 程序员或 .NET 程序员,你就已经输了,因为首先你不应该自称为程序员(理由见上一点),其次这种限定使得你自动被排除在世界上大多数编程工作之外。 现实生活中,学会一种新语言,只需要几个星期,然后再过半年到一年,你就会变成老手。那时,根本没人在乎你以前用什么语言。 天才程序员是很少的,可是需要天才程序员的工作机会却很多很多,大多数场合都是需求远远大于供给。这意味着,即使你不是天才程序员,只要你是一个优秀工程师,那些招聘公司也会立刻录用你,因为它们知道招聘到天才程序员的机会微乎其微。(重复一遍,所谓"优秀工程师",就是你的履历上有一连串增加收入、降低成本的记录。) 某些公司的人事部门,会根据某个关键词(比如 Java 或 .NET)过滤简历。虽然这样的公司根本不值得去,但是如果你真的想过这一关,也很容易:投入几个晚上和周末,在你当前的项目中设法用到这个关键词,然后再把它写进简历就行了。 五、如何提高求职时的谈判能力? 记住你不是在求职,不是在展示编程技巧,而是在推销某种商业问题(增加收入或降低成本)的解决方案。 面试时,要有自信,要平等的对话。你要的是一个互利的录用合同,不要每次对方提出要求,你都说Yes。 雇主可能会问"你的上一份工资是多少",他们其实在说"给我一个理由,压低你的报酬"。你要想好如何适当地回答这个问题。 要还价。这里不仅仅指钱,还指其它你关心的方面。如果你无法要求更高的薪水,那就试着要求更多的假期。 在对方决定录用你以后,才开始讨论薪水。因为那时,他们已经在你身上,投入了大量的时间和金钱,产生了一定的成本,此时他们可能觉得一些小问题已经不值得再纠缠了,比如每年的工资增加几千元。 六、创业公司是否适合应届毕业生? 如果你一毕业就加入创业公司,最可能的结果是,接下来几年你都工作得非常辛苦,然后公司悲惨地失败了,你失业了,不得不又去另一家创业公司工作。 如果你真的想去创业公司,应该首先找一家大公司干上两年,攒一点钱,积累一些经验,然后精心挑选一家创业公司,再去实现自己的梦想。 在创业公司工作,一般情况下,你遇到的都是创业者。他们大多数人没有能力在两年后雇佣你;而在大公司工作,你遇到的都是其他大公司的人,他们中很多人将来有能力雇用你或者帮你介绍工作。 七、沟通技能是最重要的职业技能 前面说过,工程师被雇佣,不是因为会编程,而是因为能够创造商业价值。所以,你得让人们相信你能创造价值,这是帮助你找到工作的最重要的能力。这种能力与你真的能创造多少价值,实际上联系不是很紧密。 我认识的一些最优秀的程序员,往往拙于表达。因此,别人不是不想与他们一起工作,就是低估了他们的价值。相反地,如果你看上去很会编程,并且很善于表达,别人就会真的这样看待你。 (完) 转载链接:不要自称为程序员

【转载】你可能还没有使用过的python3特性---但你应该用

Python 【转载】你可能还没有使用过的python3特性—但你应该用 很多人因为看到了Python EOL而将代码从 python2.x 迁移到了 python3.x。不幸的是,大多数的 python3 代码看起来很像 python2.在下面我将展示一些例子来说明部分 python3 特性,希望它们可以让你用 python 解决问题更简单。 以下的代码将以 Python3.7 书写。 f-Strings(3.6+) 在任何编程语言中,没有字符串结构,都很难以工作。大多数人使用 format 格式化文本,如下所示: user = "Jane Doe" action = "buy" log_message = 'User {} has logged in and did an action {}.'.format( user, action ) print(log_message) # User Jane Doe has logged in and did an action buy. 除此之外,Python3 还提供了一种通过 f-string 进行字符串插值的灵活方法。使用 f-strings 的上述代码如下所示: user = "Jane Doe" action = "buy" log_message = f'User {user} has logged in and did an action {action}.' print(log_message) # User Jane Doe has logged in and did an action buy. 有时候会写一种很蠢的写法,如果用 f-String 就能解决,实例如下: ...

【转载】利用srvctl管理RAC数据库

[[Oracle]] 【转载】利用 srvctl 管理 RAC 数据库 srvctl 即 Server Control,是 Oracle 提供的一个命令行工具,用以用于管理 Oracle 的 RAC 环境。srvctl 在 Oracle 9i 中被引入,Oracle10g、11g 对其功能进行了很大的增强和改进。下面介绍下此命令的简单用法。 一、 查看实例状态(srvctl status) 查询所有实例和服务的状态: [oracle@node-rac1 ~]$ srvctl status database -d racdb Instance racdb2 is running on node node-rac2 Instance racdb1 is running on node node-rac1 查询实例 racdb1 的状态: [oracle@node-rac1 ~]$ srvctl status instance -d racdb -i racdb1 Instance racdb1 is running on node node-rac1 查询实例 racdb2 的状态: [oracle@node-rac1 ~]$ srvctl status instance -d racdb -i racdb2 Instance racdb2 is running on node node-rac2 查询特定节点上应用程序的状态: [oracle@node-rac1 ~]$ srvctl status nodeapps -n node-rac2 VIP is running on node: node-rac2 GSD is running on node: node-rac2 Listener is running on node: node-rac2 ONS daemon is running on node: node-rac2 查询特定节点上 ASM 实例的状态 [oracle@node-rac1 ~]$ srvctl status asm -n node-rac2 ASM instance +ASM2 is running on node node-rac2. 在上面的命令行操作中,都用到的参数是: ...

【转载】在 Oracle 中设置自增列

database Oracle 【转载】在 Oracle 中设置自增列 如果你经常使用 MySQL,你肯定对 AUTO_INCREMENT 非常熟悉,因为经常要用到它。 一、什么是自增列 ? 自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段,这样每次增加一行时,不用指该字段的值,它就会自动增加,而且是唯一的。 当在 MySQL 中定义列时,我们可以指定一个名为 AUTO_INCREMENT 的参数。然后,每当将新值插入此表中时,放入此列的值比最后一个值加 1。 但很不幸,Oracle 没有 AUTO_INCREMENT 功能。 那要如何在Oracle中做到这一点呢? 二、在 Oracle 11g 中设置自增字段 1. 创建表 首先创建一张用于测试的表: CREATE TABLE "TEST" ( ID NUMBER(11) PRIMARY KEY, NAME VARCHAR2(50BYTE) NOT NULL ); 2. 创建序列 然后创建一个名为 TEST_ID_SEQ 的序列(序列名称自己随意设定): CREATE SEQUENCE TEST_ID_SEQ INCREMENT BY 1 START WITH 100 MAXVALUE 999999999 NOCYCLE NOCACHE; 如果要删除序列,可以使用下面的 SQL 命令: DROP SEQUENCE TEST_ID_SEQ; 对 SEQUENCE 的一些说明: INCREMENT BY 用于指定序列增量(默认值:1),如果指定的是正整数,则序列号自动递增,如果指定的是负数,则自动递减。 START WITH 用于指定序列生成器生成的第一个序列号,当序列号顺序递增时默认值为序列号的最小值,当序列号顺序递减时默认值为序列号的最大值。 MAXVALUE 用于指定序列生成器可以生成的组大序列号(必须大于或等于 START WITH,并且必须大于 MINVALUE),默认为 NOMAXVALUE。 MINVALUE 用于指定序列生成器可以生成的最小序列号(必须小于或等于 START WITH,并且必须小于 MAXVALUE),默认值为 NOMINVALUE。 CYCLE 用于指定在达到序列的最大值或最小值之后是否继续生成序列号,默认为 NOCYCLE。 CACHE 用于指定在内存中可以预分配的序列号个数(默认值:20)。 到这一步其实就已经可以实现字段自增,只要插入的时候,将 ID 的值设置为序列的下一个值 TEST_ID_SEQ.NEXTVAL 就可以了: ...

【转载】面向对象(深入)| python描述器详解

Python 【转载】面向对象(深入)| python描述器详解 本文分为如下部分 引言——用 @property 批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法、静态方法和类方法的描述器原理 property 装饰器的原理 描述器的应用 参考资料 引言 前面 python 面向对象的文章中我们讲到过,我们可以用 @property 装饰器将方法包装成属性,这样的属性,相比于其他属性有一个优点就是可以在对属性赋值时,进行变量检查,举例代码如下: class A: def __init__(self, name, score): self.name = name # 普通属性 self._score = score @property def score(self): return self._score @score.setter def score(self, value): print('setting score here') if isinstance(value, int): self._score = value else: print('please input an int') a = A('Bob',90) a.name # 'Bob' a.score # 90 a.name = 1 a.name # 1 ,名字本身不应该允许赋值为数字,但是这里无法控制其赋值 a.score = 83 a.score # 83,当赋值为数值型的时候,可以顺利运行 a.score = 'bob' # please input an int a.score # 83,赋值为字符串时,score没有被改变 当我们有很多这样的属性时,如果每一个都去使用 @property,代码就会过于冗余。如下 ...

ansible tower 的搭建

Linux Ansible ansible tower 的搭建 下载 axel https://releases.ansible.com/ansible-tower/setup-bundle/ansible-tower-setup-bundle-3.7.3-1.tar.gz -n 10 可能会出现:重定向过多 的问题,手动编译 axel 或者使用 wget 即可。 # 下载源码包 wget -O axel-2.16.1.tar.gz https://file.idait.cn/axel-2.16.1.tar.gz # 解压 tar xzvf axel-2.16.1.tar.gz # 进入目录 cd axel-2.16.1/ # 检查编译 ./configure --prefix=/usr/local/axel # 报错 No package 'openssl' found,则 yum install openssl-devel make && make install #报错请安装 gcc 工具 不报错请忽略 yum groupinstall "Development tools" #axel 执行路径 echo 'PATH=/usr/local/axel/bin:$PATH' > /etc/profile.d/axel.sh #使文件生效 . /etc/profile 配置并安装 cd /opt/ tar xf ansible-tower-setup-bundle-3.7.3-1.tar.gz cd ansible-tower-setup-bundle-3.7.3-1/ # 配置密码 vim inventory [tower] localhost ansible_connection=local [database] [all:vars] admin_password='abcdefg' pg_host='' pg_port='' pg_database='awx' pg_username='awx' pg_password='abcdefg' # 安装 ./setup.sh 破解 # 安装 pip cd /tmp axel https://bootstrap.pypa.io/get-pip.py -n 10 python get-pip.py # 安装 uncompyle6 pip install uncompyle6 cd /var/lib/awx/venv/awx/lib/python3.6/site-packages/tower_license ls -al 总用量 12 -rw-r--r-- 1 root root 8348 9月 28 16:00 __init__.pyc drwxr-xr-x 2 root root 37 11月 15 04:02 __pycache__ # 反汇编 init.pyc uncompyle6 __init__.pyc >__init__.py # 修改 __init__.py 文件 def _check_cloudforms_subscription(self): return True #添加这一行 if os.path.exists('/var/lib/awx/i18n.db'): return True else: if os.path.isdir('/opt/rh/cfme-appliance'): if os.path.isdir('/opt/rh/cfme-gemset'): pass try: has_rpms = subprocess.call(['rpm', '--quiet', '-q', 'cfme', 'cfme-appliance', 'cfme-gemset']) if has_rpms == 0: return True except OSError: pass return False .... # 修改 "license_date=253370764800L" 为 "license_date=253370764800" def _generate_cloudforms_subscription(self): self._attrs.update(dict(company_name='Red Hat CloudForms License', instance_count=MAX_INSTANCES, license_date=253370764800, #修改 license_key='xxxx', license_type='enterprise', subscription_name='Red Hat CloudForms License')) ... #------------------------------------------------------------------ #修改完重新编译一下 [root@tower tower_license]# python3 -m py_compile __init__.py [root@tower tower_license]# python3 -O -m py_compile __init__.py #重启服务 [root@tower tower_license]# ansible-tower-service restart

ansible vault 的使用

Linux Ops Ansible ansible vault 的使用 ansible 在某些特殊的操作,例如 become 提取操作,再或者有些配置文件有机密信息,不想明文保存,那么就需要用到 vault 这个工具。它随着 ansible 发行,调用方式为 ansible-vault。 在不是非常保密严格的场合,可以只配置 2-3 个 vault 密码,去加密 ansible 用到的所有文件。 现在假设当前目录下有以下文件: ansible.cfg hosts hello.yml 那么除了 ansible.cfg 不能被加密,其他数据都可以加密。相当于用一个密码隐藏另一堆机密数据。 模块说明 create: 创建一个新文件,并直接对其进行加密 decrypt: 解密文件 edit: 用于编辑 ansible-vault 加密过的文件 encrypy: 加密文件 encrypt_strin: 加密字符串,字符串从命令行获取 view: 查看经过加密的文件 rekey: 重新设置密码 每个模块都很容易理解。 每个模块的作用可以参考: ansible笔记(43):使用 ansible-vault 加密数据 Ansible 加密模块 Vault 使用方式 这里提供两种加密明文密码的使用姿势。 首先,我们需要创造一个 vault 的密码,这个密码可以人工创造,或者交给 openssl 自动生成,存储在特定文件里。 $ openssl rand -base64 100 > vault.pass 接着编辑 ansible.cfg 文件(该文件绝不能被 vault 加密)。 ...