$ls
1
$strace ls
execve("/bin/ls", ["ls"], [/* 38 vars */]) = 0
brk(0) = 0x7ae000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb78ab18000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=136302, ...}) = 0
mmap(NULL, 136302, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb78aae8000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20c\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=142728, ...}) = 0
mmap(NULL, 2246896, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb78a6c8000
mprotect(0x7fb78a6e9000, 2097152, PROT_NONE) = 0
mmap(0x7fb78a8e9000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x21000) = 0x7fb78a8e9000
mmap(0x7fb78a8eb000, 6384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb78a8eb000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libacl.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\37\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=35288, ...}) = 0
mmap(NULL, 2130592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb78a4b8000
mprotect(0x7fb78a4c0000, 2093056, PROT_NONE) = 0
mmap(0x7fb78a6bf000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fb78a6bf000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1729984, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb78ab17000
mmap(NULL, 3836448, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb78a108000
mprotect(0x7fb78a2a7000, 2097152, PROT_NONE) = 0
mmap(0x7fb78a4a7000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19f000) = 0x7fb78a4a7000
mmap(0x7fb78a4ad000, 14880, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb78a4ad000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\27\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=448440, ...}) = 0
mmap(NULL, 2543976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb789e98000
mprotect(0x7fb789f04000, 2097152, PROT_NONE) = 0
mmap(0x7fb78a104000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6c000) = 0x7fb78a104000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14664, ...}) = 0
mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb789c90000
mprotect(0x7fb789c93000, 2093056, PROT_NONE) = 0
mmap(0x7fb789e92000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fb789e92000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\23\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=18640, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb78ab16000
mmap(NULL, 2113912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb789a88000
mprotect(0x7fb789a8c000, 2093056, PROT_NONE) = 0
mmap(0x7fb789c8b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fb789c8b000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20o\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=137440, ...}) = 0
mmap(NULL, 2213008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb789868000
mprotect(0x7fb789880000, 2093056, PROT_NONE) = 0
mmap(0x7fb789a7f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7fb789a7f000
mmap(0x7fb789a81000, 13456, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb789a81000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb78ab15000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb78ab13000
arch_prctl(ARCH_SET_FS, 0x7fb78ab13800) = 0
mprotect(0x7fb78a4a7000, 16384, PROT_READ) = 0
mprotect(0x7fb789a7f000, 4096, PROT_READ) = 0
mprotect(0x7fb789c8b000, 4096, PROT_READ) = 0
mprotect(0x7fb789e92000, 4096, PROT_READ) = 0
mprotect(0x7fb78a104000, 4096, PROT_READ) = 0
mprotect(0x7fb78a6bf000, 4096, PROT_READ) = 0
mprotect(0x7fb78a8e9000, 4096, PROT_READ) = 0
mprotect(0x61b000, 4096, PROT_READ) = 0
mprotect(0x7fb78ab10000, 4096, PROT_READ) = 0
munmap(0x7fb78aae8000, 136302) = 0
set_tid_address(0x7fb78ab13ad0) = 3887
set_robust_list(0x7fb78ab13ae0, 24) = 0
rt_sigaction(SIGRTMIN, {0x7fb78986e9f0, [], SA_RESTORER|SA_SIGINFO, 0x7fb7898778d0}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x7fb78986ea80, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7fb7898778d0}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7fffb8555110) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7fffb8555110) = -1 ENOENT (No such file or directory)
brk(0) = 0x7ae000
brk(0x7cf000) = 0x7cf000
open("/proc/filesystems", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb78ab0f000
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 344
read(3, "", 1024) = 0
close(3) = 0
munmap(0x7fb78ab0f000, 4096) = 0
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=1607936, ...}) = 0
mmap(NULL, 1607936, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb78a980000
close(3) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=126, ws_xpixel=0, ws_ypixel=0}) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 3 entries */, 32768) = 72
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb78ab0f000
write(1, "1\n", 21
) = 2
close(1) = 0
munmap(0x7fb78ab0f000, 4096) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
$
Examining an ELF binary with binutils
$strings a.out /lib64/ld-linux-x86-64.so.2 libc.so.6 printf __libc_start_main __gmon_start__ GLIBC_2.2.5 fffff. []A\A]A^A_ hello ;*3$" GCC: (Debian 4.9.2-10) 4.9.2 GCC: (Debian 4.8.3-13) 4.8.3 hello.c long unsigned int short unsigned int short int GNU C 4.9.2 -mtune=generic -march=x86-64 -g unsigned char long int sizetype main hello.c /home/jeffrin .symtab .strtab .shstrtab .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .text .fini .rodata .eh_frame_hdr .eh_frame .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss .comment .debug_aranges .debug_info .debug_abbrev .debug_line .debug_str crtstuff.c __JCR_LIST__ deregister_tm_clones register_tm_clones __do_global_dtors_aux completed.6661 __do_global_dtors_aux_fini_array_entry frame_dummy __frame_dummy_init_array_entry hello.c __FRAME_END__ __JCR_END__ __init_array_end _DYNAMIC __init_array_start _GLOBAL_OFFSET_TABLE_ __libc_csu_fini _ITM_deregisterTMCloneTable data_start _edata _fini printf@@GLIBC_2.2.5 __libc_start_main@@GLIBC_2.2.5 __data_start __gmon_start__ __dso_handle _IO_stdin_used __libc_csu_init _end _start __bss_start main _Jv_RegisterClasses __TMC_END__ _ITM_registerTMCloneTable _init $
6 Framed photos was added to the collection
6 Framed photos was added to the collection 4 small ones and 2 relatively bigger ones All the photos are related to NATIONAL GEOGRAPHIC
Hacking with listing local system locks
ABOUT lslocks
lslocks lists information about all the currently held file locks in a Linux system. File locking is a mechanism that restricts access to a computer file by allowing only one user or process access at any specific time. Systems implement locking to prevent the classic interceding update scenario (see race condition).
[bash]
$lslocks -p 23897
$lslocks -p 1404
$lslocks -p 15099
$lslocks -p 17229
COMMAND PID TYPE SIZE MODE M START END PATH
chromium 17229 POSIX 68K WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/Web Data
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/Local Extension Settings
chromium 17229 POSIX 140K WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/History
chromium 17229 POSIX 1.5M WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/Favicons
chromium 17229 POSIX 20K WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/Shortcuts
chromium 17229 POSIX 12K WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/Login Data
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/Extension Rules/LOCK
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/File System/Origins/LOCK
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/Session Storage/LOCK
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/Extension State/LOCK
$lslocks
COMMAND PID TYPE SIZE MODE M START END PATH
atd 580 POSIX 0B WRITE 0 0 0 /run
cron 614 FLOCK 0B WRITE 0 0 0 /run
tracker-miner-f 1505 POSIX 27.1M READ 0 1073741826 1073742335 /home/jeffrin/.cache/tracker/meta.db
tracker-miner-f 1505 POSIX 32K READ 0 128 128 /home/jeffrin/.cache/tracker/meta.db-shm
chromium 17229 POSIX 68K WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/Web Data
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/Local Extension Setting
chromium 17229 POSIX 140K WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/History
chromium 17229 POSIX 1.5M WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/Favicons
chromium 17229 POSIX 20K WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/Shortcuts
chromium 17229 POSIX 12K WRITE 0 1073741824 1073742335 /home/jeffrin/.config/chromium/Default/Login Data
(unknown) 543 FLOCK 0B WRITE 0 0 0 /run
lpd 594 FLOCK 0B WRITE 0 0 0 /run
runsv 670 FLOCK 0B WRITE 0 0 0 /
tracker-store 1512 POSIX 27.1M READ 0 1073741826 1073742335 /home/jeffrin/.cache/tracker/meta.db
tracker-store 1512 POSIX 32K READ 0 128 128 /home/jeffrin/.cache/tracker/meta.db-shm
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/Extension Rules/LOCK
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/File System/Origins/LOC
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/Session Storage/LOCK
chromium 17229 POSIX 0B WRITE 0 0 0 /home/jeffrin/.config/chromium/Default/Extension State/LOCK
$
[/bash]
LINKS
http://man7.org/linux/man-pages/man8/lslocks.8.html
https://unix.stackexchange.com/questions/85994/how-to-list-processes-locking-file
Hacking with an arbitrary precision calculator
dc is a reverse-polish desk calculator which supports unlimited preci‐ sion arithmetic. It also allows you to define and call macros. Nor‐ mally dc reads from the standard input; if any command arguments are given to it, they are filenames, and dc reads and executes the contents of the files before reading from standard input. All normal output is to standard output; all error output is to standard error. A reverse-polish calculator stores numbers on a stack. Entering a num‐ ber pushes it on the stack. Arithmetic operations pop arguments off the stack and push the results. To enter a number in dc, type the digits (using upper case letters A through F as "digits" when working with input bases greater than ten), with an optional decimal point. Exponential notation is not supported. To enter a negative number, begin the number with ``_''. ``-'' cannot be used for this, as it is a binary operator for subtraction instead. To enter two numbers in succession, separate them with spaces or new‐ lines. These have no meaning as commands. $dc 1234 f 1234 2322 f 2322 1234 p * 2 2322 f 2 2865348 f 2 2865348 2 * p 4 f 4 2865348 p * 1 4 p 1 p 1 f 1 11461392 dc: dc: stack empty f $
Ultimate Survival Alaska – Competitors :30
[youtube https://www.youtube.com/watch?v=2Z0l5mJ9ls8?rel=0&w=560&h=315]
Introducing The Linux Foundation Certification Program
[youtube https://www.youtube.com/watch?v=Y29qZ71Kicg?rel=0&w=560&h=315]
Example for an Array with processing language
/**
* Array.
*
* An array is a list of data. Each piece of data in an array
* is identified by an index number representing its position in
* the array. Arrays are zero based, which means that the first
* element in the array is [0], the second element is [1], and so on.
* In this example, an array named "coswav" is created and
* filled with the cosine values. This data is displayed three
* separate ways on the screen.
*/
float[] coswave;
void setup() {
size(640, 360);
coswave = new float[width];
for (int i = 0; i < width; i++) {
float amount = map(i, 0, width, 0, PI);
coswave[i] = abs(cos(amount));
}
background(255);
noLoop();
}
void draw() {
int y1 = 0;
int y2 = height/3;
for (int i = 0; i < width; i+=2) {
stroke(coswave[i]*255);
line(i, y1, i, y2);
}
y1 = y2;
y2 = y1 + y1;
for (int i = 0; i < width; i+=2) {
stroke(coswave[i]*255 / 4);
line(i, y1, i, y2);
}
y1 = y2;
y2 = height;
for (int i = 0; i < width; i+=2) {
stroke(255 - coswave[i]*255);
line(i, y1, i, y2);
}
}
Hacking with GNU grep . ( grep ‘[1-9]\$’ price.list )
$emacs price.list $grep '[1-9]$' price.list 1 2 3 4 45 46 78 $54 $cat price.list 1 2 3 4 45 46 78 $54 54$ 31$ 21$ $grep '[1-9]' price.list 1 2 3 4 45 46 78 $54 54$ 31$ 21$ $grep '[1-9]\$' price.list 54$ 31$ 21$ $
A program to solve project euler problem 11
[python]
# This program is copied from http://code.jasonbhill.com/python/project-euler-problem-11/
# Largest product in a grid
# https://projecteuler.net/problem=11
import time
start = time.time()
L = []
L.append("08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08")
L.append("49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00")
L.append("81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65")
L.append("52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91")
L.append("22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80")
L.append("24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50")
L.append("32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70")
L.append("67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21")
L.append("24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72")
L.append("21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95")
L.append("78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92")
L.append("16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57")
L.append("86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58")
L.append("19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40")
L.append("04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66")
L.append("88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69")
L.append("04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36")
L.append("20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16")
L.append("20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54")
L.append("01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48")
M = [i.split() for i in L]
M = [[int(j) for j in i] for i in M]
# there are 20 rows, each containing 20 integers
max_prod = 0
for i in range(20):
for j in range(16):
# right/left products
prod = M[i][j]*M[i][j+1]*M[i][j+2]*M[i][j+3]
if prod > max_prod: max_prod = prod
# up/down products
prod = M[j][i]*M[j+1][i]*M[j+2][i]*M[j+3][i]
if prod > max_prod: max_prod = prod
# diagonal products
for i in range(16):
for j in range(16):
prod = M[i][j]*M[i+1][j+1]*M[i+2][j+2]*M[i+3][j+3]
if prod > max_prod: max_prod = prod
for i in range(3,20):
for j in range(16):
prod = M[i][j]*M[i-1][j+1]*M[i-2][j+2]*M[i-3][j+3]
if prod > max_prod: max_prod = prod
elapsed = (time.time() – start)
print "%s found in %s seconds" % (max_prod,elapsed)
[/python]