// Main
// Prologo
0x5555523d <+0>: push rbp
0x5555523e <+1>: mov rbp,rsp
0x55555241 <+4>: sub rsp,0x30 // crea spazio nello stack per le variabili locali
0x55555245 <+8>: mov DWORD PTR [rbp-0x24],edi
0x55555248 <+11>: mov QWORD PTR [rbp-0x30],rsi
// malloc per la stringa
0x5555524c <+15>: mov edi,0xf
0x55555251 <+20>: call0x555555555070 <malloc@plt>
0x55555256 <+25>: mov QWORD PTR [rbp-0x8],rax // potrebbe essere quello che ritorna il malloc, un indirizzo, che poi viene assegnato strres
// printf
0x5555525a <+29>: lea rdi,[rip+0xda7] // stringa da passare alla printf
0x55555261 <+36>: mov eax,0x0
0x55555266 <+41>: call0x555555555050 <printf@plt>
// fgets
0x5555526b <+46>: mov rdx,QWORD PTR [rip+0x2dee] // indirizzo stdin <stdin@@GLIBC_2.2.5>
0x55555272 <+53>: lea rax,[rbp-0x17] // variabile str
0x55555276 <+57>: mov esi,0xf // parametro 15
0x5555527b <+62>: mov rdi,rax
0x5555527e <+65>: call0x555555555060 <fgets@plt> // fscanf
// printf
0x55555283 <+70>: lea rdi,[rip+0xd96] # 0x555555556020
0x5555528a <+77>: mov eax,0x0
0x5555528f <+82>: call0x555555555050 <printf@plt>
// scanf
0x55555294 <+87>: lea rax,[rbp-0x18] // variabile ch
0x55555298 <+91>: mov rsi,rax
0x5555529b <+94>: lea rdi,[rip+0xda5] //format string
0x555552a2 <+101>: mov eax,0x0
0x555552a7 <+106>: call0x555555555080 <__isoc99_scanf@plt>
// call removechar
0x555552ac <+111>: movzx eax,BYTE PTR [rbp-0x18] // da 8 bit a 32 bit inserendo 0
0x555552b0 <+115>: movsx edx,al // da 8 bit a 32 bit estendendo il segno
0x555552b3 <+118>: lea rax,[rbp-0x17] // variabile str
0x555552b7 <+122>: mov esi,edx
0x555552b9 <+124>: mov rdi,rax
0x555552bc <+127>: call0x555555555185 <removechar> // chiamata alla funzione removechar
// printf
0x555552c1 <+132>: mov QWORD PTR [rbp-0x8],rax //c'è il valore di ritorno delle funzione?
0x555552c5 <+136>: mov rax,QWORD PTR [rbp-0x8] // perchè rimetterlo in rax?
0x555552c9 <+140>: mov rsi,rax // strres
0x555552cc <+143>: lea rdi,[rip+0xd77] // format string # 0x55555555604a
0x555552d3 <+150>: mov eax,0x0
0x555552d8 <+155>: call0x555555555050 <printf@plt>
// ret
0x555552dd <+160>: mov eax,0x0
0x555552e2 <+165>: leave
0x555552e3 <+166>: ret
// removechar
// Dump of assembler code for function removechar:
// prologo
0x55555185 <+0>: push rbp
0x55555186 <+1>: mov rbp,rsp
0x55555189 <+4>: sub rsp,0x30
0x5555518d <+8>: mov QWORD PTR [rbp-0x28],rdi // rbp-0x28 indirizzo di str
0x55555191 <+12>: mov eax,esi
0x55555193 <+14>: mov BYTE PTR [rbp-0x2c],al // rbp-0x2c c'è il carattere
0x55555196 <+17>: mov DWORD PTR [rbp-0x8],0x0
// strlen
0x5555519d <+24>: mov rax,QWORD PTR [rbp-0x28] // rbp-0x28, str
0x555551a1 <+28>: mov rdi,rax
0x555551a4 <+31>: call0x555555555040 <strlen@plt>
0x555551a9 <+36>: mov DWORD PTR [rbp-0xc],eax // rbp-0xc, n
// malloc
0x555551ac <+39>: mov edi,0xf
0x555551b1 <+44>: call0x555555555070 <malloc@plt>
0x555551b6 <+49>: mov QWORD PTR [rbp-0x18],rax // rbp-0x18, strres
0x555551ba <+53>: mov DWORD PTR [rbp-0x4],0x0 // j=0
0x555551c1 <+60>: jmp 0x555555555213 <removechar+142> // salta a j<n
0x555551c3 <+62>: mov eax,DWORD PTR [rbp-0x4] // valore di i
0x555551c6 <+65>: movsxd rdx,eax // estende da 32 a 64 bit con il segno
0x555551c9 <+68>: mov rax,QWORD PTR [rbp-0x28] // indirizzo di str
0x555551cd <+72>: add rax,rdx // a cui aggiungiamo i, visto che si tratta di char
0x555551d0 <+75>: movzx eax,BYTE PTR [rax] // mette in eax il carattere iesimo
0x555551d3 <+78>: cmp BYTE PTR [rbp-0x2c],al // e lo compara a il ch passato alla funzione
0x555551d6 <+81>: je 0x55555555520f <removechar+138>
// il blocco seguente mette in OR la prima condzione negata con la seconda :
// if (str[i]!=ch && str[i]!='\0') { -> if (str[i]==ch || str[i]=='\0') {
// leggi di De Morgan , una AND di due espressioni negate diventa una OR di due espressioni non negate
0x555551d8 <+83>: mov eax,DWORD PTR [rbp-0x4]
0x555551db <+86>: movsxd rdx,eax
0x555551de <+89>: mov rax,QWORD PTR [rbp-0x28]
0x555551e2 <+93>: add rax,rdx // str + i
0x555551e5 <+96>: movzx eax,BYTE PTR [rax] // contenuto di str[i]
0x555551e8 <+99>: test al,al // confronto con il byte null
0x555551ea <+101>: je 0x55555555520f <removechar+138> // salta all'incremento di i
// blocco di costruzione della nuova stringa senza il carattere da rimuovere, copiando i caratteri dalla
// vecchia stringa
0x555551ec <+103>: mov eax,DWORD PTR [rbp-0x4] // i
0x555551ef <+106>: movsxd rdx,eax // esteso a 64 bit con segno
0x555551f2 <+109>: mov rax,QWORD PTR [rbp-0x28] // str
0x555551f6 <+113>: add rax,rdx // str + i
0x555551f9 <+116>: mov edx,DWORD PTR [rbp-0x8] // j
0x555551fc <+119>: movsxd rcx,edx // esteso a 64 bit con segno in rcx
0x555551ff <+122>: mov rdx,QWORD PTR [rbp-0x18] // strres
0x55555203 <+126>: add rdx,rcx // strres + j
0x55555206 <+129>: movzx eax,BYTE PTR [rax] // valore di str[i]
0x55555209 <+132>: mov BYTE PTR [rdx],al // in strres + j ci metto il carattere str[i]
0x5555520b <+134>: add DWORD PTR [rbp-0x8],0x1 // incremento j
// incremento di i e confronto con n
0x5555520f <+138>: add DWORD PTR [rbp-0x4],0x1 // incrementa i
0x55555213 <+142>: mov eax,DWORD PTR [rbp-0x4] // i
0x55555216 <+145>: cmp eax,DWORD PTR [rbp-0xc] // i<n
0x55555219 <+148>: jl 0x5555555551c3 <removechar+62> // se è minore torno indietro
// blocco che setta l'ultimo carattere della strres a \0
0x5555521b <+150>: mov eax,DWORD PTR [rbp-0x8]
0x5555521e <+153>: movsxd rdx,eax
0x55555221 <+156>: mov rax,QWORD PTR [rbp-0x18]
0x55555225 <+160>: add rax,rdx
0x55555228 <+163>: mov BYTE PTR [rax],0x0
// printf della strres
0x5555522b <+166>: mov rax,QWORD PTR [rbp-0x18]
0x5555522f <+170>: mov rdi,rax
0x55555232 <+173>: call0x555555555030 <puts@plt>
// ret
0x55555237 <+178>: mov rax,QWORD PTR [rbp-0x18] // in reax ci metto l'indirizzo della stringa risultato
0x5555523b <+182>: leave
0x5555523c <+183>: ret
// C Code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* removechar(char* str, char ch)
{
int n,i,j;
j=0;
j++;
strres[j]='\0';
printf("%s\n",strres);
return strres;
}
int main(int argc, char** argv) {
char* strres;
strres=malloc(15*sizeof(char));
scanf("%c",&ch);
printf("la stringa finale è %s",strres);
return 0;
}
Type the following command to see IPv4 port(s), enter:
# lsof -Pnl +M -i4
Type the following command to see IPv6 listing port(s), enter:
# lsof -Pnl +M -i6
• -P : This option inhibits the conversion of port numbers to port names for network files. Inhibiting the conversion may make lsof run a little faster. It is also useful when port name lookup is not working properly.
• -n : This option inhibits the conversion of network numbers to host names for network files. Inhibiting conversion may make lsof run faster. It is also useful when host name lookup is not working properly.
• -l : This option inhibits the conversion of user ID numbers to login names. It is also useful when login name lookup is working improperly or slowly.
• +M : Enables the reporting of portmapper registrations for local TCP and UDP ports.
• -i4 : IPv4 listing only
• -i6 : IPv6 listing only
Type the command as follows:
# netstat -tulpn
OR
# netstat -npl
$ cat /etc/services
$ grep 110 /etc/services
$ less /etc/services
https://www.cyberciti.biz/faq/find-out-which-service-listening-specific-port/
Con Circuit Bending si indica l'arte di modificare in maniera creativa, attraverso semplici cortocircuiti, apparecchi elettronici a bassa tensione o strumenti elettronici alimentati a pile, come giocattoli (il più famoso tra questi è lo Speak & Spell della Texas Instruments, commercializzato in Italia come Grillo Parlante dalla Clementoni), tastiere, batterie elettroniche e effetti per chitarra, allo scopo di generare suoni inediti e curiosi, creare nuovi strumenti musicali e generici generatori di suono.
Generalmente il Circuit Bending viene associato alla musica elettronica sperimentale, al noise e a musicisti alla ricerca di nuovi suoni e di nuove strumentazioni "aleatorie". I suoni generati da tali apparecchiature sono, infatti, per lo più casuali, caotici o comunque non canonicamente collegabili all'idea di suono emesso da uno strumento musicale.
Articolo Punto Informatico
Instead of using the nail and file, you can clip the leads to two paperclips, washers, coins, aluminum pop-tabs, or loops of copper wire that you place inside the speaker cone. The cone jumps when contact is made, breaking the contact for a moment, then the metal bits fall against each other and the process starts all over—a mechanical oscillator and the beginning of what Bowers calls "The Victorian Synthesizer"
The Victorian Synthesizer
L'interferenza dei fili sul sensore ad ultrasuoni ha prodotto questa melodia impazzita di suoni, dovuta alla presenza dei fili e al mio corpo che si avvicinava e allontanava dal sensore;
I sensori ad ultrasuoni non forniscono direttamente la misura della distanza dell’oggetto più vicino, ma misurano il tempo impiegato da un segnale sonoro a raggiungere l’oggetto e ritornare al sensore. L’impulso ad ultrasuoni inviato dal HC-SR04 è di circa 40KHz il tempo viene misurato in microsecondi, la tensione di funzionamento è di 5V
Il sensore HC-SR04 dispone di 4 pin: Vcc (+5V), Trigger, Echo, GND. Si invia un impulso alto sul pin Trigger per almeno 10 microsecondi, a questo punto il sensore invierà il ping sonoro e aspetterà il ritorno delle onde riflesse, il sensore risponderà sul pin Echo con un impulso alto della durata corrispondente a quella di viaggio delle onde sonore, dopo 38 millisecondi si considera che non sia stato incontrato alcun ostacolo. Per sicurezza si aspettano in genere 50-60 millisec per far si che non vi siano interferenze con la misura successiva.
Progetto originale : link
Hardware
330Ω Resistor
470Ω Resistor
Solderless Breadboard
Ultrasonic Distance Sensor
3 x Male to Male Jumper Leads
4 x Male to Female Jumper Leads
Software
sudo apt update && sudo apt upgrade -y
sudo pip3 install python-osc
Python :
from gpiozero import DistanceSensor
from time import sleep
from pythonosc import osc_message_builder
from pythonosc import udp_client
sensor = DistanceSensor(echo=17, trigger=4)
sender = udp_client.SimpleUDPClient('127.0.0.1', 4559)
while True:
pitch = round(sensor.distance * 100 + 30)
sender.send_message('/play_this', pitch)
sleep(0.1)
------
Sonic Pi :
live_loop :listen do
message = sync "/play_this"
note = message[:args][0]
play note
end