Syra

Votes taken by eXander

  1. .
    Ci sono parecchie cose che non quadrano. Inoltre hai dimenticato i punti e virgola su #left e #right. Inoltre entrambi i float sono a right!
    Per quanto riguarda il menu aside (ul), chrome e gli altri browser assegnano degli stili base agli elementi. In questo caso, Chrome assegna ad ul, un -webkit-padding-start di 40px, che tu annulli con padding: 0, ed un -webkit-margin-before e -webkit-margin-after di 8em che in questo caso a noi non serve annullare.

    Per dividere i titolo di section da tutto il resto, devi contenere tutto in section e il titolo metterlo in un altro tag, meglio uno <span>. Il resto, #left, #right, devi metterli in un altro div interno a <section> in modo da poterli stilizzare senza toccare lo <span> di poco fa. Sempre a questi due, assegni un altezza di n px e al div che li contiene uno spazio di 20px dal titolo di section.
    Per quanto riguarda lo spazio assegnato a #left, #right, è forse la parte più difficile, perché dipende dalla risoluzione. Devi comunque utilizzare un width.

    Guarda qui come l'ho fatto: https://jsfiddle.net/1wxqbe18/1 . Purtroppo c'è quel problema della larghezza.
  2. .
    Nome della release: Simple Telegram Installer
    Linguaggio di programmazione: bash/shell
    Versione: 1
    Descrizione: Scarica, posiziona telegram (sempre ultima versione) e fa lo indicizzare da Linux
    Data di pubblicazione: 25/03/16
    Licenza: Apache License 2.0
    Download: Vai a Github
    Screenshot: Screenshot
    Altro:
    Ho creato questo script per poter installare Telegram su Linux, il quale alla sua attuale versione (0.9.33) è fornito solo sottoforma di eseguibile (assieme ad un updater) che l'utente può scegliere dove mettere. La cosa brutta è che il programma non viene indicizzato, per esempio, dallo "spotlight" di Ubuntu.
    Ho deciso quindi di automatizzare il tutto con questo script bash che scaricherà automaticamente, se non l'avete già scaricata, l'ultima versione di Telegram e sposterà l'index (telegram.desktop) presente nella cartella che scaricherete.
    Tutti i file vanno messi nella stessa posizione, dove verrà anche scaricato Telegram. Il programma vi chiederà se vorrete rimuovere i file, come il download stesso e l'icona al termine dell'esecuzione.
    Telegram viene installato in /usr/local/bin/ (e se non esiste, viene installato in /opt/) e il file telegram.desktop viene creato e spostato in /usr/share/applications/

    Spero possa essere utile a qualcuno. ;)

    N.b. potrebbe essere necessario impostare i permessi del file prima di poterlo avviare. In quel caso entrate nel terminale e scrivete chmod 777 installtelegram.sh

    Edited by eXander - 26/3/2016, 16:22
  3. .
    E' qualcosa di risaputo che oramai i forum della piattaforma Forumfree stiano perdendo sempre più interesse, ma è anche risaputo che i forum di informatica e programmazione tendono a non avere molto spazio e nemmeno molte opportunità a causa dello scarso interesse verso questo argomento. Ricordo che il boom di forum di informatica fu attorno al 2010, quando chiunque ne apriva uno. CHIUNQUE. Molti fallivano e pochi rimanevano in piedi: mi riferisco più precisamente al SoloPC, con i suoi circa 8 anni di vita prima dell'annunciata chiusura, seppur l'inattività risalisse a molto prima. Tutti i forum passano bene o male dei momenti di crisi e Syra non è nuova a questi.
    Le "crisi di utenti" sono le più frequenti, in tutti i forum e sono il motivo per cui prima o poi o i fondatori abbandonano o i forum chiudono. Con questo non voglio annunciare nessuna chiusura, che sia chiaro, ma preoccupati del destino di Syra, che oramai ha già 3 anni e mezzo, vede una situazione di aridità come un terreno desertico. C'è stato un utente che mi chiedeva di entrare nello staff in maniera da poter contribuire e questo mi ha dato da riflettere effettivamente e la mia risposta è stata questa: si può contribuire ad un forum anche senza entrare nello staff; la nostra è una struttura amministrativa aperta, nella quale tutti i membri dello staff hanno potere decisionale e dove non ci sono grossi limiti per contribuire al forum. E' quindi palese che l'entrare nello staff è solamente una scusa.

    La riflessione però non termina qui. E' evidente che Syra sia in crisi e detto sinceramente, tra impegni e quant'altro, lo staff non sa in che direzione andare per continuare. Alcuni ci dicono "aprite contest", altri "postate", altri ancora "usate le newsletter", "spammate" e così via.
    Sono utili suggerimenti, tuttavia è presente un ma: abbiamo provato in passato ad aprire contest ma nessuno si è interessato. Abbiamo provato a postare e comunque l'interesse non è aumentato. Le newsletter non le abbiamo usate mai perché non è mai stato necessario (inoltre sono automatiche alcune!) e lo spam è stato abolito l'anno scorso a causa delle discussioni che venivano uppate in continuazione e le quali erano l'unica effettiva attività del forum in alcuni periodi.

    Infine, l'attività proposta della creazione di recensioni non è stata poi così utile in quanto quelle ricevute non sono state utili in quando erano veramente poche quelle con delle critiche.
    La domanda è quindi: cosa proponete e cosa vorreste migliorare di Syra?

    Vi ringrazio per la lettura e spero che, in quanto open-community, Syra si possa riattivare.
  4. .
    Il return, in questo caso, effettua l'esecuzione di una funzione in un caso oppure della stessa con parametri differenti.
    Affinché l'OR scelga una delle due opzioni, deve esserci almeno una delle due condizioni vere (true). Di conseguenza esegue la prima FINO alla G (dello schema), che è la prima che da un valore False.
    Se al primo posto è presente un valore come null, 0, false stesso o "" (stringa vuota), è come se facessi false || find( ... , ... ); . Tutto chiaro fin qui?
    Tutti i controlli, tranne dalla G in poi, ti dovrebbero portare all'else perché non è rispettata la condizione di uguaglianza (che stampa history). Di conseguenza avrai uno schema a blocchi che risale non appena arriva alla G e che quindi trascina il tuo valore null fino alla A. Dalla A verrà quindi eseguito il B. Notiamo questo: start in B non è stato modificato, quindi riparte da 1 e continua a fare il giro.

    La discussione è stata continuata in privato, dove è stato spiegato il funzionamento del codice:
    da3m0ns: Risposto, vado un passo alla volta se non non capisco, poi vediamo anche l'albero che è quello peggio. Comunque come prima funzione ricorsiva mi sembra un po esagerata, ci sono anche pochi esercizi per testare sul libro ðŸ˜”
    eXander: Sono funzioni semplici, dimostrative

    da3m0ns: A lavoro mi han detto il contrario ðŸ˜‚ Ma nella seconda parte dell'espressione quello è un concatenamento di una stringa?
    eXander: Quelle del libro sono dimostrative, poi ci sono altre applicazioni ma a livello di performance, sono migliori le iterazioni. Quale intendi con "espressione"?

    da3m0ns: "(" + history + ! è 5)" e anche quella sotto
    eXander: Il + fuori dalle virgolette è la concatenazione, si

    da3m0ns: Non capisco come hai determinato che quella a sx è vera
    eXander: dove?

    da3m0ns: Ah no è falsa, ma non capisco come hai fatto, la A
    eXander: Semplicemente il percorso che viene fatto è questo:

    A -> C -> E -> G -> I

    Solo che I restituisce null, quindi viene eseguita M.
    Poiché anche M da null, implicitamente anche G avrà null. Ma siccome G è null, per E avremo la seguente logica:

    null || H.

    Viene quindi eseguita H fino a tornare alla A in pratica con un valore null e siccome A sarà null, verrà eseguita B e si ricomincia finché non si riesce a trovare un punto in cui viene ritornata history.

    da3m0ns: Ma perché 6 == 24 ? x
    eXander: 1+5 che è start nuovo in pratica, cioè, start + 5

    da3m0ns: Cioè, è un calcolo tuo per vedere se è false?
    eXander: no, non è un calcolo mio, è un'istruzione che viene comunque eseguita. X è per dire FALSO.

    da3m0ns: Ah, quindi non viene calcolato se è false, passa i parametri? 🙈
    eXander: Lui comunque fa tutto fino al passaggio G e poi torna indietro passando il Null come risultato

    da3m0ns: Okay, ho capito il flusso, credo, fino al null || null poi che succede?
    eXander: Arriverai al punto in cui avrai A = null e quindi verrà eseguito B. In pratica se vedi il risultato, lui fa B:
    1 * 3
    3 + 5
    8 * 3
    24

    E hai ottenuto il tuo "path". In pratica in B fa lo stesso percorso di A finché non arriva a trovare una soluzione null che lo porta all'altra. Comunque in qualche modo lo trova.

    da3m0ns: Ma B non risulta anche lui null? Non abbiamo ottenuto nulla e ritorna a a find(1, "1")
    eXander: Non risulta null, altrimenti non restituirebbe history la tua funzione ma null. Non è vero che non ottieni nulla: ottieni una stringa con "history".

    da3m0ns: Allora un attimo mi son calcolato questo find(start + 5, "(" + history + " + 5)") ed esce null giusto?
    eXander: Alla fine del percorso si ma non è detto che esca null con tutti i casi. Dovresti analizzare passo per passo tutto il path, però è un lavoro immane e decisamente da non fare per affrontare correttamente la ricorsione.

    da3m0ns: Okay, dici che se ho capito il percorso posso sorvolare?
    eXander: Se hai capito COME FUNZIONA la ricorsione, si, più che altro perché seguire ogni step oltre che una perdita di tempo si trasforma in una cosa inutile e dispendiosa anche per la testa

    da3m0ns: Beh in pratica funzione che chiama funzione all'interno, fine
    eXander: Si praticamente si. Poi dipende dalle condizioni che decidi.


    Edited by eXander - 2/3/2016, 22:47
  5. .
    Si, bene o male va tutto bene. Una cosa: in div3 non serve che mandi a capo le parole con <br/> se hai un box di grandezza massima 300px.
    Per quanto riguarda il CSS del div1, devi affidarti a due bordi diversi (border-left in coppia con border-top e border-right con border-bottom). Inoltre devi fare un po' più grandi i bordi.
    Comunque quanto fai una domanda di questo tipo, oltre al sorgente metti anche uno screen, così non serve che applichiamo l'HTML. :)
  6. .
    Nome della release: Pubblifier
    Linguaggio di programmazione: Javascript
    Versione: v1
    Descrizione: Permette di effettuare un logging più avanzato dei propri script
    Data di pubblicazione: 04/02/16
    Licenza: MIT
    Altro:
    Ho scelto questo nome per lo script perché quando mi serve loggare delle informazioni dentro una funzione anonima a cui voglio accedere dopo tramite console, specie per debugging, uso una variabile chiamata _public.
    Lo script mette a disposizione un logging diciamo più avanzato, seguendo il tappezzamento del codice di console.log() come metodo di debugging. Esso permette di inserire e poi visualizzare tutti i dati.

    Esso è composto da una funzione principale, pubblifier(), che accetta un input che specifica se vogliamo visualizzare i messaggi che possiamo specificare all'interno e da 3 metodi:

    • .set(): come argomenti è possibile specificare quanti oggetti si vogliono secondo la seguente struttura.
      { name: ... , content: ... }, dove name è l'identificativo che potete dare all'oggetto da loggare (per poterlo richiamare dopo) e dove content è il valore che volete memorizzare. Quest'ultimo può essere anche un array.

    • .getAll( message ): è un metodo che stampa tutti i risultati memorizzati. Permette di passare un oggetto contenente le frasi che vogliamo mostrare all'inizio e alla fine della stampa dei nostri dati memorizzati. La struttura che segue è la seguente:
      { start: "", end: "" }

    • .get( key, message ): permette di stampare un elemento preciso, specificando la chiave che avete usato in .add(). Se content è un array, verrà stampato interamente, elemento per elemento. Inoltre permette di stampare i messaggi: la struttura è la stessa di quella qui sopra.


    Per usarlo è necessario incollare pubblifier nel vostro codice; lo potete trovare minified QUI, su PasteBin. E' anche possibile trovare il codice sorgente qui sotto:
    CODICE
    /* * * * * * * * * * * * * * * * * * * * *
    * Pubblifier v1                                                *
    * di Alexander Cerutti                                        *
    * per http://syra.forumcommunity.net        *
    * * * * * * * * * * * * * * * * * * * * */
    var pubblifier = function(messages){
       messages = messages || false;
       window.container = window.container || {};
       return Object.freeze({
           set: function(){
               for(i in arguments){ // posso aggiungere quanti oggetti voglio
                   var m = arguments[i];
                   container[m.name] = m.content; // m.content pu&#242; essere un array o una stringa
               }
               return this;
           },
           getAll: function(message){
               message = message || {};
               messages && message.start ? console.log(message.start+"\n") : false;
               for(var i in Object.keys(container)) console.info("__: "+Object.keys(container)[i]+" --> "+container[Object.keys(container)[i]]);
               messages && message.end ? console.log(message.end+"\n") : false;
               return this;
           },
           get: function(key, message){
               message = message || {};
               messages && message.start ? console.log(message.start+"\n") : false;
               for(var i in Object.keys(container)){
                   var m = Object.keys(container)[i];
                   if(m === key)
                       if(container[m].constructor === Array){
                           console.info("__: \""+m+"\" is an array");
                           for(i in container[m]){
                               console.info(":: ---> "+container[m][i]);
                           }
                       } else {
                           console.info("__: "+m+" --> "+container[m]);
                       }
               }
               messages && message.end ? console.log(message.end+"\n") : false;
               return this;
           }
       });
    };


    Esempi per testare lo script

    Come richiesto, allego degli esempi per dimostrare il funzionamento dello script.

    CODICE
    var memory = pubblifier( [ true | false ] )

    memory.set({
           name: "status_raxell"
           , content: "A Raxell puzzano i piedi"
    }, {
           name: "status_rootkitneo"
           , content: "RootkitNeo puzza male"
    }, {
           name: "status_syra"
           , content: "Syra &#232; bella"
    });

    /* .get() - i messaggi vengono mostrati
    * solo se memory riporta parametro true
    */

    memory.get("Delle", {
           start: " ****** START DEBUG ****** "
           , end: " ****** END DEBUG ****** "
    });

    /* .getAll() - i messaggi vengono mostrati
    * solo se memory riporta parametro true
    */

    memory.getAll({
           start: "****** START DEBUG ******"
           , end: "****** END DEBUGGING ******"
    });

    /* .set() e .get() concatenati.
    * I messaggi vengono mostrati solo se
    * memory riporta parametro true.
    */

    memory.set({
           name: "Demme"
           , content: "oiccic"
    }, {
           name: "Dellem"
           , content: "ossss"
    }, {
           name: "Dekke"
           , content: "abacadabra"
    }).get("Demme", {
           start: "****** START DEBUG ******"
           , end: "****** END DEBUGGING ******"
    });

    /* .set() ed .getAll() concatenati.
    * I messaggi vengono mostrati solo se
    * memory riporta parametro true.
    */

    memory.set({
           name: "Demme", content: "oiccic"
    }, {
           name: "Dellem", content: "ossss"
    }, {
           name: "Dekke", content: "abacadabra"
    }).getAll({
           start: "****** START DEBUG ******"
           , end: "****** END DEBUGGING ******"
    });

    Spero possa essere utile a qualcuno. :)

    Edited by eXander - 9/3/2016, 13:27
  7. .
    Benvenuto su Syra, Valentino! ;)
  8. .
    Ho spostato in Javascript.
    Tu puoi effettuare una qualsiasi richiesta asincrona (Ajax) verso una pagina PHP. Ti verrà restituito il contenuto della pagina stessa in una variabile che potrai poi inserire tramite Javascript o jQuery stesso. Quando si tratta di fare le Ajax, è consigliato usare jQuery in quanto le sue soluzioni semplificano nettamente la vicenda, specie sulla questione dell'asincronia.

    Il metodo .load() effettua una richiesta GET asincrona verso un elemento preciso, accettando dagli uno ai tre parametri: una stringa, degli eventuali dati che vuoi mandare alla pagina nell'URL ed una funzione di callback (che viene eseguita al termine). La stringa deve contenere l'URL della pagina e, contemporaneamente, può contenere anche un eventuale selettore CSS, un ID. Essendo gli ID considerati univoci (identificativi di un elemento) in una pagina, il metodo "parsa" la stringa oltre l'URL e carica esclusivamente l'elemento che tu indichi.

    Tra gli esempi proposti jQuery, vi è questo, alla quale io ho aggiunto una callback:

    CODICE
    $( "#result" ).load( "ajax/test.html #container" , function(){ /* il tuo codice qui*/ });


    Questo cosa farà? Caricherà il blocco container nella tua pagina, andando a sostituire il contenuto tramite il metodo .html() di jQuery, dell'elemento specificato tramite il contenuto della funzione jQuery $( selettore ).

    Ora, nel tuo caso potresti fare anche una semplice richiesta GET ($.get();) oppure usare load... penso che a te non cambierebbe nulla.
  9. .
    Grazie mille!! :)
  10. .
    Per loro natura, i <div> vengono messi automaticamente uno sotto l'altro. Guarda (fatti con CSS):




    Questo perché l'oggetto <div> possiede come user-agent style (quindi stile predefinito) la proprietà display: block che li manda a capo.
  11. .

    Forum più veloce



    Per la gioia di grandi e piccini (?) l'homepage è diventata più veloce al caricamento attraverso la completa riscrittura dello script delle tabs delle sezioni in Javascript (e non più in jQuery) a opera del nostro raxell. Ora lo script non sfrutta più un foglio esterno, quindi è anche un peso minore da caricare. Inoltre il codice è stato compresso ed evita l'aggiunta di elementi (i quali risultano già integrati nell'HTML). Il risultato è che ora il caricamento delle sezioni è praticamente istantaneo e non ci sono più ritardi. Le operazioni di miglioramento delle prestazioni del forum sono in continua evoluzione e verranno rilasciati ulteriori aggiornamenti appena possibile.


    Edited by eXander - 13/1/2016, 00:43
  12. .
    Leggendo in giro, UNION permette di unire i risultati di due query DML (Data Manipulation Language - ovvero quell'insieme di istruzioni che servono per MANIPOLARE i dati, tra cui anche SELECT). Più specificamente unisce i risultati non uguali (effettua una selezione DISTINCT), a meno di non specificare UNION ALL, unendo anche i campi che possiedono una FOREIGN KEY (chiave esterna) se presenti. Se unisci due query con campi selezionati diversi, verrà apposto il valore NULL dove non presente alcun valore.

    Per quanto riguarda il SQL Injection, non sono assolutamente la persona più adatta.


    Fonti: www.w3schools.com/sql/sql_union.asp, www.tutorialspoint.com/sql/sql-unions-clause.htm
  13. .
    Direi di no, a cosa ti servono?
  14. .
    Abbiamo provveduto a posizionarlo lì per la sua visibilità. Stilizzato nella stessa maniera ma posizionato in fondo alla barra, non fa un bell'effetto ed è comunque meno visibile a mio parere.
  15. .
    Si, se tu esegui quella query ogni volta che carichi il foglio PHP, sprechi risorse perché è come se interrogassi il database, controllando se la tabella esiste oppure no ogni volta. Che senso ha? Creala una sola volta e rimuovi il pezzo di codice da lì. Piuttosto, un mio consiglio è quello di crearti un foglio di estensione .sql, dove contieni tutte le query come quella lì (la stringa), così una volta che dovrai configurare il db non locale, puoi usarlo tu stesso. In alternativa, se non hai voglia di farlo manualmente, PHPMyAdmin ti permette di esportare il database (sempre se usi questa piattaforma) sempre in un foglio .sql, il quale lo potrai quindi importare nel nuovo database.

    Edited by eXander - 3/1/2016, 23:23
118 replies since 28/1/2010
.
Top