summaryrefslogtreecommitdiff
path: root/ruby
diff options
context:
space:
mode:
Diffstat (limited to 'ruby')
-rwxr-xr-xruby/binom.rb17
-rwxr-xr-xruby/binom.sh6
-rwxr-xr-xruby/blocks.rb15
-rwxr-xr-xruby/call_by_reference.rb14
-rwxr-xr-xruby/class_method.rb36
-rwxr-xr-xruby/cmp.rb29
-rwxr-xr-xruby/extend_array.rb12
-rwxr-xr-xruby/lowercase.rb10
-rwxr-xr-xruby/maildir-to-imap41
-rw-r--r--ruby/module.rb20
-rwxr-xr-xruby/modules.rb16
-rwxr-xr-xruby/multinom.rb21
-rw-r--r--ruby/multinom.sh4
-rwxr-xr-xruby/named-pipe-a.rb12
-rwxr-xr-xruby/named-pipe-b.rb8
-rwxr-xr-xruby/proc-in-out-in-out.rb17
-rw-r--r--ruby/rand-strings.rb11
-rwxr-xr-xruby/spawn.rb10
-rwxr-xr-xruby/spawn_with_timeout.rb17
-rwxr-xr-xruby/split_range.rb27
-rwxr-xr-xruby/threads.rb37
-rwxr-xr-xruby/threads1.rb17
-rwxr-xr-xruby/timeout.rb18
23 files changed, 415 insertions, 0 deletions
diff --git a/ruby/binom.rb b/ruby/binom.rb
new file mode 100755
index 0000000..1a2dc1b
--- /dev/null
+++ b/ruby/binom.rb
@@ -0,0 +1,17 @@
+#!/usr/bin/env ruby
+
+def binom n, k
+ prod = 1
+ (1..k).each { |j|
+ prod *= (n+1-j)/j
+ }
+
+ return prod
+end
+
+def bdist k, p, n
+ binom(n, k)*(p**k)*(1-p)**(n-k)
+end
+
+puts bdist(ARGV[0].to_f, ARGV[1].to_f, ARGV[2].to_f)
+
diff --git a/ruby/binom.sh b/ruby/binom.sh
new file mode 100755
index 0000000..da84f03
--- /dev/null
+++ b/ruby/binom.sh
@@ -0,0 +1,6 @@
+#!/bin/zsh
+
+for i in {0..10}; do
+ echo "k=$i p=0.1 n=10 : $(./binom.rb $i 0.1 10)"
+done
+
diff --git a/ruby/blocks.rb b/ruby/blocks.rb
new file mode 100755
index 0000000..9cea44f
--- /dev/null
+++ b/ruby/blocks.rb
@@ -0,0 +1,15 @@
+#!/usr/bin/env ruby
+
+
+def a
+ i = 0
+ while line = STDIN.gets
+ yield i, line
+ i += 1
+ end
+end
+
+a { |i,j|
+ puts "#{i} #{j}"
+}
+
diff --git a/ruby/call_by_reference.rb b/ruby/call_by_reference.rb
new file mode 100755
index 0000000..12dc933
--- /dev/null
+++ b/ruby/call_by_reference.rb
@@ -0,0 +1,14 @@
+#!/usr/bin/env ruby
+
+
+def fun w
+ w << "x"
+end
+
+
+w = [1,3,4,5]
+
+fun w
+
+puts w.to_s
+
diff --git a/ruby/class_method.rb b/ruby/class_method.rb
new file mode 100755
index 0000000..447a477
--- /dev/null
+++ b/ruby/class_method.rb
@@ -0,0 +1,36 @@
+#!/usr/bin/env ruby
+
+
+class A
+ attr_accessor :z
+
+ def initialize
+ self.z = 'a'
+ end
+
+ def self.a
+ r = self.new
+ return r
+ end
+end
+
+class B < A
+
+ def initialize
+ self.z = 'b'
+ end
+
+ def b
+ "b"
+ end
+end
+
+a = A.new
+b = B.new
+
+puts a.z
+puts b.z
+puts
+x = B.a
+puts x.z
+
diff --git a/ruby/cmp.rb b/ruby/cmp.rb
new file mode 100755
index 0000000..65e5c5f
--- /dev/null
+++ b/ruby/cmp.rb
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+
+
+class A
+ attr_accessor :a
+
+ def initialize a
+ @a = a
+ end
+
+ def == other
+ @a.size == other.a.size
+ end
+ alias :eql? :==
+
+ def hash
+ @a.hash
+ end
+end
+
+a = A.new 'a'
+b = A.new 'b'
+ax = A.new 'a'
+
+puts a == ax
+
+l = [a, b, ax]
+puts l.uniq.size
+
diff --git a/ruby/extend_array.rb b/ruby/extend_array.rb
new file mode 100755
index 0000000..9b00917
--- /dev/null
+++ b/ruby/extend_array.rb
@@ -0,0 +1,12 @@
+#!/usr/bin/env ruby
+
+
+class Array
+ def sum
+ self.inject(:+)
+ end
+end
+
+a = [1,2,3]
+puts a.sum
+
diff --git a/ruby/lowercase.rb b/ruby/lowercase.rb
new file mode 100755
index 0000000..52c1097
--- /dev/null
+++ b/ruby/lowercase.rb
@@ -0,0 +1,10 @@
+#!/usr/bin/env ruby
+
+STDIN.set_encoding 'utf-8'
+STDOUT.set_encoding 'utf-8'
+
+
+while line = STDIN.gets
+ STDOUT.write line.downcase
+end
+
diff --git a/ruby/maildir-to-imap b/ruby/maildir-to-imap
new file mode 100755
index 0000000..24d6194
--- /dev/null
+++ b/ruby/maildir-to-imap
@@ -0,0 +1,41 @@
+#!/usr/bin/env ruby
+# source: http://wiki.colar.net/ruby_script_to_upload_convert_a_maildir_inbox_to_an_imap_server
+
+require 'net/imap'
+
+if ARGV.length < 5 then
+ STDERR.write "args: <host> <user> <pass> <maildir> <imapdir> [test]"
+ exit
+end
+
+imap_host = ARGV[0]
+imap_user = ARGV[1]
+imap_pass = ARGV[2]
+mail_dir = ARGV[3]+"/"
+imap_dir = ARGV[4]
+TEST_MODE = ARGV[5]!=nil
+
+def upload_dir(imap, mail_dir, imap_dir)
+ imap.examine(imap_dir)
+ msgs = Dir.entries(mail_dir).each_with_index do |f,j|
+ if !File.directory?(f) then
+ STDERR.write "adding #{mail_dir+f} to: #{imap_dir}\n"
+ if !TEST_MODE then
+ imap.append(imap_dir, File.open(mail_dir+f).read,[:Seen])
+ STDERR.write "##{j}\n"
+ end
+ end
+ end
+end
+
+imap = Net::IMAP.new(imap_host, ssl:true)
+imap.authenticate('PLAIN', imap_user, imap_pass)
+
+begin
+ imap.create(imap_dir)
+rescue
+ STDERR.write "failed creating: #{imap_dir}, that's probably ok\n"
+end
+
+upload_dir(imap, mail_dir, imap_dir)
+
diff --git a/ruby/module.rb b/ruby/module.rb
new file mode 100644
index 0000000..b25d603
--- /dev/null
+++ b/ruby/module.rb
@@ -0,0 +1,20 @@
+module Aaa
+ class Bbb
+ def initialize
+ puts "BBB"
+ end
+ end
+
+ def Aaa.q
+ puts "xxx"
+ end
+
+ def Aaa.bla
+ q
+ end
+end
+
+Aaa.bla
+
+a = Aaa::Bbb.new
+
diff --git a/ruby/modules.rb b/ruby/modules.rb
new file mode 100755
index 0000000..673bd82
--- /dev/null
+++ b/ruby/modules.rb
@@ -0,0 +1,16 @@
+#!/usr/bin/env ruby
+
+
+module X
+ def self.f
+ return 42
+ end
+
+ def X::g
+ return 23
+ end
+end
+
+puts X::f
+puts X::g
+
diff --git a/ruby/multinom.rb b/ruby/multinom.rb
new file mode 100755
index 0000000..afee4b7
--- /dev/null
+++ b/ruby/multinom.rb
@@ -0,0 +1,21 @@
+#!/usr/bin/env ruby
+
+def fak n
+ r = 1
+ (1).upto(n) { |i| r = r*i }
+ return r
+end
+
+def multinom n, ks, ps
+ b = fak(n)
+ prod = 1
+ ks.each { |k| prod = prod*fak(k) }
+ b = b/prod
+ ps.each_with_index { |p,j|
+ b = b*p**ks[j]
+ }
+ return b
+end
+
+puts multinom(ARGV[0].to_f, ARGV[1].split.map{|i| i.to_f}, ARGV[2].split.map{|i| i.to_f})
+
diff --git a/ruby/multinom.sh b/ruby/multinom.sh
new file mode 100644
index 0000000..f78d4d5
--- /dev/null
+++ b/ruby/multinom.sh
@@ -0,0 +1,4 @@
+#!/bin/zsh -x
+
+./multinom.rb 10 "0 10" "0.1 0.9"
+
diff --git a/ruby/named-pipe-a.rb b/ruby/named-pipe-a.rb
new file mode 100755
index 0000000..23e260c
--- /dev/null
+++ b/ruby/named-pipe-a.rb
@@ -0,0 +1,12 @@
+#!/usr/bin/env ruby
+
+`mkfifo #{ARGV[0]}`
+f = File.new "#{ARGV[0]}", 'w'
+
+while line = STDIN.gets
+ f.write line+"\n"
+ f.flush
+end
+
+`rm #{ARGV[0]}`
+
diff --git a/ruby/named-pipe-b.rb b/ruby/named-pipe-b.rb
new file mode 100755
index 0000000..0ea2f61
--- /dev/null
+++ b/ruby/named-pipe-b.rb
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+
+f = File.new ARGV[0], 'r'
+
+while line = f.gets
+ puts line
+end
+
diff --git a/ruby/proc-in-out-in-out.rb b/ruby/proc-in-out-in-out.rb
new file mode 100755
index 0000000..645d620
--- /dev/null
+++ b/ruby/proc-in-out-in-out.rb
@@ -0,0 +1,17 @@
+#!/usr/bin/env ruby
+
+require 'expect'
+require 'open3'
+
+Open3.popen3("/bin/bash") do
+ | input, output, error, wait_thr |
+ input.sync = true
+ output.sync = true
+
+ input.puts "ls /tmp"
+ puts output.expect("\n", 5)
+
+ input.puts "ls /etc"
+ puts output.expect("\n", 5)
+end
+
diff --git a/ruby/rand-strings.rb b/ruby/rand-strings.rb
new file mode 100644
index 0000000..6552d0b
--- /dev/null
+++ b/ruby/rand-strings.rb
@@ -0,0 +1,11 @@
+#!/usr/bin/env ruby
+
+s = ""
+alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
+(0).upto(1000) {
+ n = Random.rand(10)
+ w = alphabet.sample(n).join("")
+ s += w+" "
+}
+puts s
+
diff --git a/ruby/spawn.rb b/ruby/spawn.rb
new file mode 100755
index 0000000..8ee810a
--- /dev/null
+++ b/ruby/spawn.rb
@@ -0,0 +1,10 @@
+#!/usr/bin/env ruby
+
+
+cmd = "for i in {1..30}; do echo '123456789'; done"
+pipe_in, pipe_out = IO.pipe
+pid = Process.spawn(cmd, :out => pipe_out, :err => pipe_out)
+Process.wait pid
+pipe_out.close
+puts pipe_in.read
+
diff --git a/ruby/spawn_with_timeout.rb b/ruby/spawn_with_timeout.rb
new file mode 100755
index 0000000..a884673
--- /dev/null
+++ b/ruby/spawn_with_timeout.rb
@@ -0,0 +1,17 @@
+#!/usr/bin/env ruby
+
+require 'timeout'
+
+
+cmd = "for i in {1..2000000}; do echo '123456789'; done"
+pipe_in, pipe_out = IO.pipe
+pid = Process.spawn(cmd, :out => pipe_out, :err => pipe_out)
+begin
+ Timeout.timeout(1) { Process.wait pid }
+rescue Timeout::Error
+ puts 'process not finished in time, killing it'
+ Process.kill('TERM', pid)
+end
+pipe_out.close
+puts pipe_in.read
+
diff --git a/ruby/split_range.rb b/ruby/split_range.rb
new file mode 100755
index 0000000..ee28c75
--- /dev/null
+++ b/ruby/split_range.rb
@@ -0,0 +1,27 @@
+#!/usr/bin/env ruby
+
+
+a = (5..10)
+b = (8..9)
+
+def split_range a, b, index=0
+ return nil if a==b
+ aa = a.to_a
+ begin_split = b.first
+ end_split = b.last
+
+ p1 = aa[0..aa.index([begin_split-1,aa.first].max)]
+ p2 = aa[aa.index([end_split+1, aa.last].min)..aa.last]
+
+ if begin_split > a.first && end_split < a.last
+ return [(p1.first..p1.last), "X#{index}", (p2.first..p2.last)]
+ elsif begin_split == a.first
+ return ["X#{index}", (p2.first..p2.last)]
+ elsif end_split == a.last
+ return [(p1.first..p1.last), "X#{index}"]
+ end
+ return nil
+end
+
+puts split_range(a, b).to_s
+
diff --git a/ruby/threads.rb b/ruby/threads.rb
new file mode 100755
index 0000000..ca2d0b2
--- /dev/null
+++ b/ruby/threads.rb
@@ -0,0 +1,37 @@
+#!/usr/bin/env ruby
+
+require 'thread'
+
+
+prev = 'z'
+('a'..'r').each { |i|
+ Marshal.dump({i=>1,prev=>1,'x'=>1}, File.new("test.#{i}", 'wb'))
+ prev = i
+}
+
+a = []
+threads = []
+mutex = Mutex.new
+('a'..'r').each { |i|
+ threads << Thread.new(i) { |c|
+ mutex.synchronize { puts c }
+ h = Marshal.load(File.new('test.'+c, 'rb'))
+ puts "#{c} x"
+ mutex.synchronize { a << h }
+ }
+}
+threads.each { |t| t.join }
+puts '--'
+threads = []
+while a.size > 1
+ threads << Thread.new {
+ i = j = nil
+ mutex.synchronize { i = a.pop; j = a.pop }
+ i.merge!(j) { |k,v,w| v+w }
+ mutex.synchronize { a << i }
+ }
+ threads.each { |t| t.join }
+end
+
+File.open('counts.merged', 'wb') { |f| Marshal.dump(a[0], f) }
+
diff --git a/ruby/threads1.rb b/ruby/threads1.rb
new file mode 100755
index 0000000..1136621
--- /dev/null
+++ b/ruby/threads1.rb
@@ -0,0 +1,17 @@
+#!/usr/bin/env ruby
+
+require 'thread'
+
+
+a = []
+threads = []
+mutex = Mutex.new
+('a'..'r').each { |i|
+ threads << Thread.new(i) { |c|
+ mutex.synchronize { a << i }
+ }
+}
+threads.each { |t| t.join }
+
+puts a.to_s
+
diff --git a/ruby/timeout.rb b/ruby/timeout.rb
new file mode 100755
index 0000000..f5c1e7e
--- /dev/null
+++ b/ruby/timeout.rb
@@ -0,0 +1,18 @@
+#!/usr/bin/env ruby
+
+require 'timeout'
+
+
+puts 'starting process'
+pid = Process.spawn('sleep 20')
+begin
+ Timeout.timeout(5) do
+ puts 'waiting for the process to end'
+ Process.wait(pid)
+ puts 'process finished in time'
+ end
+rescue Timeout::Error
+ puts 'process not finished in time, killing it'
+ Process.kill('TERM', pid)
+end
+