bin: Add some more or less useful bin
parent
09a21b55b7
commit
03fcc1cbae
|
@ -0,0 +1,116 @@
|
||||||
|
#!/usr/bin/ruby
|
||||||
|
|
||||||
|
longest_streak = streak = 0
|
||||||
|
|
||||||
|
# -- Exit gracefully --
|
||||||
|
Signal.trap("INT") {
|
||||||
|
puts "\nLongest streak: #{longest_streak}"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
def print_header
|
||||||
|
puts "----------------------------------------------------------"
|
||||||
|
puts " THE GIT GAME "
|
||||||
|
puts "----------------------------------------------------------"
|
||||||
|
puts "Welcome! The goal of the git game is to guess committers"
|
||||||
|
puts "based on their commit messages.\n\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
def print_help
|
||||||
|
puts "----------------------------------------------------------"
|
||||||
|
puts " USAGE "
|
||||||
|
puts "----------------------------------------------------------"
|
||||||
|
puts "git game [extra git log options]"
|
||||||
|
puts "EX: git game --after={2014-08-08}"
|
||||||
|
puts "(This script already uses --no-merges and --pretty."
|
||||||
|
puts "For more valid options see: http://gitref.org/inspect/)"
|
||||||
|
end
|
||||||
|
|
||||||
|
# -- Usage Text --
|
||||||
|
if ARGV.count > 0 && (input = ARGV.shift) == 'help'
|
||||||
|
print_header
|
||||||
|
print_help
|
||||||
|
exit 0
|
||||||
|
end
|
||||||
|
|
||||||
|
# -- Parse commits --
|
||||||
|
COMMIT_DELIMITER = "XXXCOMMITXXX"
|
||||||
|
FIELD_DELIMITER = "|||"
|
||||||
|
|
||||||
|
commit_format = ["%an", "%ar", "%B"].join(FIELD_DELIMITER)
|
||||||
|
|
||||||
|
raw_commits = `git log --no-merges --pretty="#{COMMIT_DELIMITER}#{commit_format}" #{input if input}`.split("#{COMMIT_DELIMITER}")
|
||||||
|
commits = []
|
||||||
|
raw_commits.each do |c|
|
||||||
|
next if c.strip.empty?
|
||||||
|
|
||||||
|
fields = c.split(FIELD_DELIMITER)
|
||||||
|
commits << {:author => fields[0], :date => fields[1], :message => fields[2]}
|
||||||
|
end
|
||||||
|
|
||||||
|
committers = commits.map { |c| c[:author] }.compact.uniq
|
||||||
|
|
||||||
|
# -- Show welcome message --
|
||||||
|
system('clear')
|
||||||
|
|
||||||
|
print_header
|
||||||
|
puts "You're playing in a repo with #{commits.size} commits and #{committers.size}"
|
||||||
|
puts "distinct committers.\n\n"
|
||||||
|
|
||||||
|
committers.each do |committer|
|
||||||
|
puts committer
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "Ready? PRESS ENTER TO START PLAYING (Ctrl-C to quit)"
|
||||||
|
|
||||||
|
gets
|
||||||
|
|
||||||
|
system('clear')
|
||||||
|
|
||||||
|
# -- Game loop --
|
||||||
|
NUM_CHOICE = 4
|
||||||
|
|
||||||
|
loop do
|
||||||
|
commit = commits.shuffle.pop
|
||||||
|
message = commit[:message]
|
||||||
|
author = commit[:author]
|
||||||
|
|
||||||
|
next if message.nil? || message.empty? || author.nil? || author.empty?
|
||||||
|
|
||||||
|
puts "(#{commit[:date]})\n"
|
||||||
|
puts "#{message.strip}\n\n"
|
||||||
|
puts
|
||||||
|
|
||||||
|
choices = committers.sample(NUM_CHOICE)
|
||||||
|
if !choices.include?(author)
|
||||||
|
choices.pop
|
||||||
|
choices.push author
|
||||||
|
end
|
||||||
|
choices.shuffle!
|
||||||
|
|
||||||
|
choices.each_with_index do |name, index|
|
||||||
|
puts "[#{index + 1}] #{name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
print "Who wrote it (current streak: #{streak})? "
|
||||||
|
|
||||||
|
guess = gets.strip
|
||||||
|
|
||||||
|
while guess.empty? || !guess.to_i.between?(1, NUM_CHOICE)
|
||||||
|
print "Who wrote it (current streak: #{streak})? "
|
||||||
|
guess = gets.strip
|
||||||
|
end
|
||||||
|
|
||||||
|
if choices[guess.to_i - 1] == author
|
||||||
|
streak += 1
|
||||||
|
puts "Got it!"
|
||||||
|
else
|
||||||
|
streak = 0
|
||||||
|
puts "Actually, it was #{author}."
|
||||||
|
end
|
||||||
|
|
||||||
|
longest_streak = [longest_streak, streak].max
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
system('clear')
|
||||||
|
end
|
|
@ -0,0 +1,55 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
require 'date'
|
||||||
|
|
||||||
|
begin
|
||||||
|
require 'cocaine'
|
||||||
|
rescue LoadError
|
||||||
|
puts "Cocaine gem not found, install it: 'gem install cocaine'"
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
|
||||||
|
module Release
|
||||||
|
class Git
|
||||||
|
REMOTE = 'origin'
|
||||||
|
RELEASE_BRANCH = 'master'
|
||||||
|
|
||||||
|
def self.create
|
||||||
|
develop_branch = current_branch
|
||||||
|
|
||||||
|
stash = Cocaine::CommandLine.new('git', 'stash create').run.chomp
|
||||||
|
Cocaine::CommandLine.new('git', 'reset --hard').run
|
||||||
|
|
||||||
|
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: RELEASE_BRANCH)
|
||||||
|
Cocaine::CommandLine.new('git', 'merge --ff-only :branch').run(branch: develop_branch)
|
||||||
|
|
||||||
|
Cocaine::CommandLine.new('git', 'tag -a -m :message :tag').run(
|
||||||
|
message: "Released by #{user}@#{hostname}", tag: "release-#{DateTime.now.strftime('%Y%m%dT%H%M%S')}")
|
||||||
|
|
||||||
|
Cocaine::CommandLine.new('git', 'push --tags :remote :branch').run(
|
||||||
|
remote: REMOTE, branch: "#{RELEASE_BRANCH}:#{RELEASE_BRANCH}")
|
||||||
|
ensure
|
||||||
|
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: develop_branch)
|
||||||
|
Cocaine::CommandLine.new('git', 'stash apply :stash').run(stash: stash) unless stash.to_s.empty?
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.current_branch
|
||||||
|
branch = Cocaine::CommandLine.new('git', 'rev-parse --abbrev-ref HEAD').run.chomp
|
||||||
|
branch == 'HEAD' ? current_commit : branch
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.current_commit
|
||||||
|
Cocaine::CommandLine.new('git', 'rev-parse HEAD').run.chomp
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.user
|
||||||
|
Cocaine::CommandLine.new('id', '-un').run.chomp
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.hostname
|
||||||
|
Cocaine::CommandLine.new('hostname').run.chomp
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Release::Git.create
|
|
@ -0,0 +1,51 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# The MIT License (MIT)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013 Gil Gonçalves
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
# this software and associated documentation files (the "Software"), to deal in
|
||||||
|
# the Software without restriction, including without limitation the rights to
|
||||||
|
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
# the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
# subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in all
|
||||||
|
# copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
COLS="$(tput cols)"
|
||||||
|
if [[ "$COLS" -le 0 ]] ; then
|
||||||
|
COLS="${COLUMNS:-80}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
hr() {
|
||||||
|
local WORD="$1"
|
||||||
|
if [[ -n "$WORD" ]] ; then
|
||||||
|
local LINE=''
|
||||||
|
while (( ${#LINE} < "$COLS" ))
|
||||||
|
do
|
||||||
|
LINE="$LINE$WORD"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "${LINE:0:$COLS}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
hrs() {
|
||||||
|
local WORD
|
||||||
|
|
||||||
|
for WORD in "${@:-#}"
|
||||||
|
do
|
||||||
|
hr "$WORD"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
[ "$0" == "$BASH_SOURCE" ] && hrs "$@"
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
require 'fileutils'
|
||||||
|
require 'tempfile'
|
||||||
|
require 'rss'
|
||||||
|
require 'uri'
|
||||||
|
require 'net/http'
|
||||||
|
|
||||||
|
IMAGE_DIR = File.expand_path '~/pictures/nasa-iotd'
|
||||||
|
FEED_URL = 'http://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss'
|
||||||
|
|
||||||
|
CURRENT_FILE = File.join(IMAGE_DIR, 'current.jpg')
|
||||||
|
PREVIOUS_FILE = File.join(IMAGE_DIR, 'previous.jpg')
|
||||||
|
WALLPAPER_FILE = File.join(IMAGE_DIR, 'wallpaper.jpg')
|
||||||
|
|
||||||
|
def download url, file
|
||||||
|
File.open(file, 'wb') { |f| f.write Net::HTTP.get(URI(url)) }
|
||||||
|
`convert #{file} -resize 1920x1080 -gravity center -background black -extent 1920x1080 #{file}`
|
||||||
|
end
|
||||||
|
|
||||||
|
FileUtils.mkdir_p(IMAGE_DIR) unless File.directory?(IMAGE_DIR)
|
||||||
|
|
||||||
|
feed = RSS::Parser.parse FEED_URL, false
|
||||||
|
today = feed.items.first.enclosure.url.sub('http:', 'https:')
|
||||||
|
|
||||||
|
new = Tempfile.new('nasa-iotd').path
|
||||||
|
|
||||||
|
download today, new
|
||||||
|
|
||||||
|
unless File.exists?(CURRENT_FILE) && FileUtils.cmp(new, CURRENT_FILE)
|
||||||
|
FileUtils.mv CURRENT_FILE, PREVIOUS_FILE if File.exist?(CURRENT_FILE)
|
||||||
|
FileUtils.mv new, CURRENT_FILE
|
||||||
|
end
|
||||||
|
|
||||||
|
download feed.items[1].enclosure.url.sub('http:', 'https:'), PREVIOUS_FILE unless File.exist?(PREVIOUS_FILE)
|
||||||
|
|
||||||
|
`convert #{CURRENT_FILE} #{PREVIOUS_FILE} +append #{WALLPAPER_FILE}`
|
||||||
|
`feh --bg-tile #{WALLPAPER_FILE}`
|
|
@ -0,0 +1,175 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
begin
|
||||||
|
require 'cocaine'
|
||||||
|
rescue LoadError
|
||||||
|
puts "Cocaine gem not found, install it: 'gem install cocaine'"
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
|
||||||
|
require 'yaml'
|
||||||
|
|
||||||
|
module Release
|
||||||
|
class Version
|
||||||
|
attr_accessor :major, :minor, :patch
|
||||||
|
|
||||||
|
VERSION_REGEX = /.*([0-9]+)\.([0-9]+)\.([0-9]+).*/
|
||||||
|
|
||||||
|
def self.load
|
||||||
|
[Ruby, Yaml].detect(&:check?).new
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
read
|
||||||
|
end
|
||||||
|
|
||||||
|
def file
|
||||||
|
self.class::FILE
|
||||||
|
end
|
||||||
|
|
||||||
|
def increment
|
||||||
|
if ENV.key?('VERSION')
|
||||||
|
self.version = ENV['VERSION']
|
||||||
|
elsif ENV.key?('MAJOR')
|
||||||
|
increment_major
|
||||||
|
elsif ENV.key?('MINOR')
|
||||||
|
increment_minor
|
||||||
|
else
|
||||||
|
increment_patch
|
||||||
|
end
|
||||||
|
|
||||||
|
self
|
||||||
|
end
|
||||||
|
|
||||||
|
def increment_major
|
||||||
|
self.patch = 0
|
||||||
|
self.minor = 0
|
||||||
|
self.major += 1
|
||||||
|
end
|
||||||
|
|
||||||
|
def increment_minor
|
||||||
|
self.patch = 0
|
||||||
|
self.minor += 1
|
||||||
|
end
|
||||||
|
|
||||||
|
def increment_patch
|
||||||
|
self.patch += 1
|
||||||
|
end
|
||||||
|
|
||||||
|
def next
|
||||||
|
dup.increment
|
||||||
|
end
|
||||||
|
|
||||||
|
def version
|
||||||
|
"#{major}.#{minor}.#{patch}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def version=(version)
|
||||||
|
match = VERSION_REGEX.match version
|
||||||
|
|
||||||
|
self.major = match[1].to_i
|
||||||
|
self.minor = match[2].to_i
|
||||||
|
self.patch = match[3].to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
def save
|
||||||
|
write
|
||||||
|
version
|
||||||
|
end
|
||||||
|
|
||||||
|
class Ruby < Version
|
||||||
|
FILE = Dir.glob(File.join('lib', '*', 'version.rb')).first
|
||||||
|
REGEX = /VERSION\s*=\s*['"]([0-9]+)\.([0-9]+)\.([0-9]+)['"]/
|
||||||
|
|
||||||
|
def self.check?
|
||||||
|
!FILE.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def read
|
||||||
|
file_version = File.open(FILE, 'r') { |f| f.grep(REGEX).first }
|
||||||
|
self.version = file_version
|
||||||
|
end
|
||||||
|
|
||||||
|
def write
|
||||||
|
content = File.read(FILE).gsub(REGEX, "VERSION = '#{version}'")
|
||||||
|
File.open(FILE, 'w') { |f| f.write content }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Yaml < Version
|
||||||
|
FILE = File.join('config', 'version.yml')
|
||||||
|
|
||||||
|
def self.check?
|
||||||
|
File.exist?(FILE)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def read
|
||||||
|
yaml = YAML.load_file(FILE)
|
||||||
|
|
||||||
|
self.major = yaml['major'].to_i
|
||||||
|
self.minor = yaml['minor'].to_i
|
||||||
|
self.patch = yaml['patch'].to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
def write
|
||||||
|
File.open(FILE, 'w') do |f|
|
||||||
|
f.write YAML.dump('major' => major, 'minor' => minor, 'patch' => patch)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Git
|
||||||
|
REMOTE = 'origin'
|
||||||
|
RELEASE_BRANCH = 'master'
|
||||||
|
|
||||||
|
def self.create
|
||||||
|
develop_branch = current_branch
|
||||||
|
|
||||||
|
Cocaine::CommandLine.new('git', 'fetch :remote').run(remote: REMOTE)
|
||||||
|
|
||||||
|
stash = Cocaine::CommandLine.new('git', 'stash create').run.chomp
|
||||||
|
Cocaine::CommandLine.new('git', 'reset --hard').run
|
||||||
|
|
||||||
|
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: RELEASE_BRANCH)
|
||||||
|
Cocaine::CommandLine.new('git', 'merge --ff-only :branch').run(
|
||||||
|
branch: "#{REMOTE}/#{RELEASE_BRANCH}")
|
||||||
|
|
||||||
|
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: develop_branch)
|
||||||
|
|
||||||
|
version = Version.load
|
||||||
|
version.increment
|
||||||
|
|
||||||
|
version.save
|
||||||
|
|
||||||
|
Cocaine::CommandLine.new('git', 'add :file').run(file: version.file)
|
||||||
|
Cocaine::CommandLine.new('git', 'commit -m :message').run(
|
||||||
|
message: "Bump version to #{version.version}")
|
||||||
|
|
||||||
|
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: RELEASE_BRANCH)
|
||||||
|
Cocaine::CommandLine.new('git', 'merge --no-ff -m :message :branch').run(
|
||||||
|
message: "Merge release #{version.version}", branch: develop_branch)
|
||||||
|
|
||||||
|
Cocaine::CommandLine.new('git', 'tag -a -m :message :tag').run(
|
||||||
|
message: "Release #{version.version}", tag: version.version)
|
||||||
|
ensure
|
||||||
|
Cocaine::CommandLine.new('git', 'checkout :branch').run(branch: develop_branch)
|
||||||
|
Cocaine::CommandLine.new('git', 'stash apply :stash').run(stash: stash) unless stash.to_s.empty?
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.current_branch
|
||||||
|
branch = Cocaine::CommandLine.new('git', 'rev-parse --abbrev-ref HEAD').run.chomp
|
||||||
|
branch == 'HEAD' ? current_commit : branch
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.current_commit
|
||||||
|
Cocaine::CommandLine.new('git', 'rev-parse HEAD').run.chomp
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Release::Git.create
|
|
@ -0,0 +1,108 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# The author of the original script is unknown to me. The first entry I can
|
||||||
|
# find was posted at 2010-03-21 09:50:09 on Arch Linux Forums (doesn't mean the
|
||||||
|
# poster is the author at all):
|
||||||
|
#
|
||||||
|
# https://bbs.archlinux.org/viewtopic.php?pid=728932#p728932
|
||||||
|
#
|
||||||
|
# I, Yu-Jie Lin, made a few changes and additions:
|
||||||
|
#
|
||||||
|
# -p, -t, -R, and -C
|
||||||
|
#
|
||||||
|
# Screenshot: http://flic.kr/p/dRnLVj
|
||||||
|
# Screencast: http://youtu.be/5XnGSFg_gTk
|
||||||
|
#
|
||||||
|
# And push the commits to Gist:
|
||||||
|
#
|
||||||
|
# https://gist.github.com/4689307
|
||||||
|
#
|
||||||
|
# I, Devin Samarin, made a few changes and additions:
|
||||||
|
#
|
||||||
|
# -r can be 0 to mean "no limit".
|
||||||
|
# Reset cursor visibility after done.
|
||||||
|
# Cleanup for those people who want to quit with ^C
|
||||||
|
#
|
||||||
|
# Pushed the changes to https://gist.github.com/4725048
|
||||||
|
|
||||||
|
p=1
|
||||||
|
f=75 s=13 r=2000 t=0
|
||||||
|
w=$(tput cols) h=$(tput lines)
|
||||||
|
# ab -> idx = a*4 + b
|
||||||
|
# 0: up, 1: right, 2: down, 3: left
|
||||||
|
# 00 means going up , then going up -> ┃
|
||||||
|
# 12 means going right, then going down -> ┓
|
||||||
|
sets=(
|
||||||
|
"┃┏ ┓┛━┓ ┗┃┛┗ ┏━"
|
||||||
|
"│╭ ╮╯─╮ ╰│╯╰ ╭─"
|
||||||
|
"│┌ ┐┘─┐ └│┘└ ┌─"
|
||||||
|
"║╔ ╗╝═╗ ╚║╝╚ ╔═"
|
||||||
|
)
|
||||||
|
v="${sets[0]}"
|
||||||
|
RNDSTART=0
|
||||||
|
NOCOLOR=0
|
||||||
|
|
||||||
|
OPTIND=1
|
||||||
|
while getopts "p:t:f:s:r:RCh" arg; do
|
||||||
|
case $arg in
|
||||||
|
p) ((p=(OPTARG>0)?OPTARG:p));;
|
||||||
|
t) ((OPTARG>=0 && OPTARG<${#sets[@]})) && v="${sets[OPTARG]}";;
|
||||||
|
f) ((f=(OPTARG>19 && OPTARG<101)?OPTARG:f));;
|
||||||
|
s) ((s=(OPTARG>4 && OPTARG<16 )?OPTARG:s));;
|
||||||
|
r) ((r=(OPTARG>=0)?OPTARG:r));;
|
||||||
|
R) RNDSTART=1;;
|
||||||
|
C) NOCOLOR=1;;
|
||||||
|
h) echo -e "Usage: $(basename $0) [OPTION]..."
|
||||||
|
echo -e "Animated pipes terminal screensaver.\n"
|
||||||
|
echo -e " -p [1-]\tnumber of pipes (D=1)."
|
||||||
|
echo -e " -t [0-$((${#sets[@]} - 1))]\ttype of pipes (D=0)."
|
||||||
|
echo -e " -f [20-100]\tframerate (D=75)."
|
||||||
|
echo -e " -s [5-15]\tprobability of a straight fitting (D=13)."
|
||||||
|
echo -e " -r LIMIT\treset after x characters, 0 if no limit (D=2000)."
|
||||||
|
echo -e " -R \t\trandom starting point."
|
||||||
|
echo -e " -C \t\tno color."
|
||||||
|
echo -e " -h\t\thelp (this screen).\n"
|
||||||
|
exit 0;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
tput rmcup
|
||||||
|
tput cnorm
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
trap cleanup SIGHUP SIGINT SIGTERM
|
||||||
|
|
||||||
|
for (( i=1; i<=p; i++ )); do
|
||||||
|
c[i]=$((i%8)) n[i]=0 l[i]=0
|
||||||
|
((x[i]=RNDSTART==1?RANDOM*w/32768:w/2))
|
||||||
|
((y[i]=RNDSTART==1?RANDOM*h/32768:h/2))
|
||||||
|
done
|
||||||
|
|
||||||
|
tput smcup
|
||||||
|
tput reset
|
||||||
|
tput civis
|
||||||
|
while ! read -t0.0$((1000/f)) -n1; do
|
||||||
|
for (( i=1; i<=p; i++ )); do
|
||||||
|
# New position:
|
||||||
|
((${l[i]}%2)) && ((x[i]+=-${l[i]}+2,1)) || ((y[i]+=${l[i]}-1))
|
||||||
|
|
||||||
|
# Loop on edges (change color on loop):
|
||||||
|
((${x[i]}>w||${x[i]}<0||${y[i]}>h||${y[i]}<0)) && ((c[i]=RANDOM%8))
|
||||||
|
((x[i]=(x[i]+w)%w))
|
||||||
|
((y[i]=(y[i]+h)%h))
|
||||||
|
|
||||||
|
# New random direction:
|
||||||
|
((n[i]=RANDOM%s-1))
|
||||||
|
((n[i]=(${n[i]}>1||${n[i]}==0)?${l[i]}:${l[i]}+${n[i]}))
|
||||||
|
((n[i]=(${n[i]}<0)?3:${n[i]}%4))
|
||||||
|
|
||||||
|
# Print:
|
||||||
|
tput cup ${y[i]} ${x[i]}
|
||||||
|
[[ $NOCOLOR == 0 ]] && echo -ne "\033[1;3${c[i]}m"
|
||||||
|
echo -n "${v:l[i]*4+n[i]:1}"
|
||||||
|
l[i]=${n[i]}
|
||||||
|
done
|
||||||
|
((r>0 && t*p>=r)) && tput reset && tput civis && t=0 || ((t++))
|
||||||
|
done
|
||||||
|
|
||||||
|
cleanup
|
Loading…
Reference in New Issue