So, you have a list of IP addresses you would like to quickly check against several black lists such as Abuse.ch 's Zeus Tracker, Spy Eye Tracker, Palevo Tracker, Feodo Tracker or the Malware Domain List. Here is a small tool in Google's go language that does exactly that: it takes a file containing a list of IP addresses (one per line) and checks each of them into these lists. Given that the black lists are defined in a configuration file, it is very easy to add or remove specific lists.
I keep adding new features, so feel free to check the GitHub repository from time to time.
News about linux, computer, computer science, mathematics and white hot chocolate, the most beautiful drink in this world.
Thursday, May 29, 2014
Monday, May 19, 2014
Happy Birthday Fortran!
For some of us, the name "Fortran" or "FORTRAN" evokes a computer language closely associated with massive super computers and complex mathematical models. For others, it is reminiscent of a war with C++ for the supremacy in the scientific computing world.
It has been continuously developed since its initial publication in 1957, and the latest revision came out in 2010, with another minor revision planned for 2015. Fortran is not dead, far from that, even if it has a though competition from other languages such as Haskell, Clojure or even Python.
Wikipedia has an extensive history of the language.
The first example of code in Fortran I will present is the determination of the fraction that generates a given pattern.
Let's take 0.1278, where the underlined part repeats ad infinitum. The fraction needed to obtain this value is 211/1650. For the rest of this post, I will call the part that repeats the repeated part and the part that does not repeat the prefix. The algorithm to find the fraction is well known, let's focus on the code.
It contains three parts: computing the non reduced fraction, computing the greatest common denominator (gcd) of the numerator and denominator and reducing the fraction to a numerator and a denominator that are relatively prime. Let's start with the gcd.
For this, I use Euclid's algorithm. The code in Fortran 95 to achieve this is
It consists of a few parts: having u contains the largest value, l the smallest then looping until u modulo l is 0. The simplification subroutine is even simpler.
Now, the core of the problem is solved by two other functions - one that takes care of fractions with a prefix, the other one of fractions without a prefix. There are some issues in the code presented, but at this point and for a simple presentation, this is not important.
Lastly, the main part of the program, used to read the various information and call the necessary subroutines.
Many thanks go to Rae Simpson for the help she provided with some of the terms in this post!
It has been continuously developed since its initial publication in 1957, and the latest revision came out in 2010, with another minor revision planned for 2015. Fortran is not dead, far from that, even if it has a though competition from other languages such as Haskell, Clojure or even Python.
Wikipedia has an extensive history of the language.
The first example of code in Fortran I will present is the determination of the fraction that generates a given pattern.
Let's take 0.1278, where the underlined part repeats ad infinitum. The fraction needed to obtain this value is 211/1650. For the rest of this post, I will call the part that repeats the repeated part and the part that does not repeat the prefix. The algorithm to find the fraction is well known, let's focus on the code.
It contains three parts: computing the non reduced fraction, computing the greatest common denominator (gcd) of the numerator and denominator and reducing the fraction to a numerator and a denominator that are relatively prime. Let's start with the gcd.
For this, I use Euclid's algorithm. The code in Fortran 95 to achieve this is
function gcd(a, b) result(c)
! Returns the GCD of a and b
integer :: a,b,c,u,l,m
if ( a > b ) then
u = a
l = b
else
u = b
l = a
end if
do while (l > 0)
m = modulo(u,l)
u=l
l=m
end do
c=u
return
end function
It consists of a few parts: having u contains the largest value, l the smallest then looping until u modulo l is 0. The simplification subroutine is even simpler.
subroutine simplify(a, b, c, d)
! Returns the fraction a/b in its simplified form
! c/d where c and d are relatively prime
integer, intent(in) :: a,b
integer, intent(out) :: c,d
integer :: n,gcd
n=gcd(a,b)
c=a/n
d=b/n
return
end subroutine
Now, the core of the problem is solved by two other functions - one that takes care of fractions with a prefix, the other one of fractions without a prefix. There are some issues in the code presented, but at this point and for a simple presentation, this is not important.
subroutine findfractionpref(pref, rept, mpref, a, b)
! Returns the fraction a/b such as its division gives the pattern prefreptreptrept ! ....
! With the necessary multiplier
integer, intent(in) :: pref, rept, mpref
integer, intent(out) :: a, b
integer :: d1, d2, num, den
d1=1+floor(log10(real(pref)))
d2=1+floor(log10(real(rept)))
num=((pref*10**(d2)+rept)-pref)
den=10**(d1+d2)-10**(d1)
if ( mpref > 0) then
den=den*10**mpref
else
num=num*10**mpref
end if
call simplify(num, den,a , b)
return
end subroutine
subroutine findfractionnopref(rept, a,b)
! Returns the fraction a/b such as its division gives the pattern reptreptrept...
integer, intent(in) :: rept
integer, intent(out) :: a,b
integer :: d1, num, den
d1=1+floor(log10(real(rept)))
num=rept
den=10**d1-1
call simplify(num,den,a,b)
return
end subroutine
program fractionfinder
implicit none
integer :: pref,rept,a,b
character :: c
do
print *, 'Does your fraction include a prefix (yY/nN) or Q to quit (qQ)?'
read(*,'(A1)'), c
if ((c == 'y').or.(c == 'Y')) then
print *, 'Prefix part?'
read(*, '(I12)'), pref
print *, 'Repeated part?'
read(*,'(I12)'), rept
call findfractionpref(pref,rept,0, a,b)
print *, 'The requested fraction is ', a, '/', b
else if ((c == 'n').or.(c == 'N')) then
print *, 'Repeated part?'
read(*, '(I8)'), rept
call findfractionnopref(rept,a,b)
print *, 'The requested fraction is ', a, '/', b
else if ((c == 'q').or.(c == 'Q')) then
goto 100
end if
end do
100 print *, 'Bye bye!'
stop
end program
Many thanks go to Rae Simpson for the help she provided with some of the terms in this post!
Subscribe to:
Posts (Atom)