Libreria Frammenti di Codice

Una raccolta di utili frammenti di codice e soluzioni

Questo snippet genera un'interfaccia di paginazione usando la sintassi dei template Smarty. Mostra i link precedente/successivo, evidenzia la pagina attuale e aggiunge i puntini di sospensione se ci sono molte pagine.

                    <div class="row">
  {if isset($pages) && $pages>1}
    <nav style=" text-align: center; ">
      <ul class="pagination">
        {if ((int)$page+1)-1 > 0}<li class="page-item"><a class="page-link" href="?pagina={$page-1}">← <span>Precedente</span></a></li>{/if}

        {assign var="foo" value=1}
        {for $foo=max(1, $page-5) to min($pages, $page+5)}
          <li class="page-item {if ($foo-1)==(int)$page}active{/if}"><a class="page-link" href="?pagina={$foo-1}">{$foo}</a></li>
        {/for}

        {if $foo<($pages)}
          <li class="page-item"><a class="page-link disabled" href="#">...</a></li>
          <li class="page-item"><a class="page-link" href="?pagina={$pages-1}">{$pages}</a></li>
        {/if}

        {if ((int)$page+1)+1 <= $pages}<li class="page-item"><a class="page-link" href="?pagina={(int)$page+1}"><span>Successivo</span> → </a></li>{/if}
      </ul>
    </nav>
  {/if}
</div>
                  

Questa funzione PHP calcola la distanza tra due coordinate geografiche usando la formula dell'Haversine e supporta chilometri, miglia nautiche e miglia.

                    function distance_between_two_points($lat1, $lon1, $lat2, $lon2, $unit) {
  if (($lat1 == $lat2) && ($lon1 == $lon2)) {
    return 0;
  }
  else {
    $theta = $lon1 - $lon2;
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515;
    $unit = strtoupper($unit);

    if ($unit == "K") {
      return ($miles * 1.609344);
    } else if ($unit == "N") {
      return ($miles * 0.8684);
    } else {
      return $miles;
    }
  }
}
                  

Questo script termina tutti i processi che corrispondono al nome 'stats_snapshot' usando `pkill`, e controlla poi con `ps` e `grep` se ci sono ancora processi attivi.

                    pkill -f 'stats_snapshot'
ps -aux | grep 'stats_snapshot'
                  

Questo comando rimuove i caratteri di ritorno a capo (`\r`) da un file (di solito provenienti da file formattati per Windows) e scrive il contenuto pulito in un nuovo file. Utile per convertire i ritorni a capo da Windows a formato Unix.

                    sed 's/\r$//' docker/docker-compose.yml > docker/docker-compose2.yml
                  

Questo comando cerca ricorsivamente i file che contengono una parola specifica (in questo caso 'article') e ne elenca i percorsi. È utile per trovare rapidamente dove appare una determinata parola in un progetto o in una cartella di documenti.

                    grep -rln article
                  

Questo snippet PHP controlla se è presente il parametro 'query' nella richiesta e inizializza un array di criteri di ricerca usando l'operatore `$or`. Questa struttura permette di eseguire ricerche flessibili su più campi e può essere estesa per supportare caratteri speciali o pattern di ricerca avanzati.

                    if(!empty($_REQUEST['query'])){
			$criteria['$or'] = [];
			$testRegex = $_REQUEST['query'];
			$diacriticMap = [
				'A'=>'AⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ',
				'AA'=>'Ꜳ',
				'AE'=>'ÆǼǢ',
				'AO'=>'Ꜵ',
				'AU'=>'Ꜷ',
				'AV'=>'ꜸꜺ',
				'AY'=>'Ꜽ',
				'B'=>'BⒷBḂḄḆɃƂƁ',
				'C'=>'CⒸCĆĈĊČÇḈƇȻꜾ',
				'D'=>'DⒹDḊĎḌḐḒḎĐƋƊƉꝹ',
				'DZ'=>'DZDŽ',
				'Dz'=>'DzDž',
				'E'=>'EⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎ',
				'F'=>'FⒻFḞƑꝻ',
				'G'=>'GⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾ',
				'H'=>'HⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ',
				'I'=>'IⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ',
				'J'=>'JⒿJĴɈ',
				'K'=>'KⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ',
				'L'=>'LⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ',
				'LJ'=>'LJ',
				'Lj'=>'Lj',
				'M'=>'MⓂMḾṀṂⱮƜ',
				'N'=>'NⓃNǸŃÑṄŇṆŅṊṈȠƝꞐꞤ',
				'NJ'=>'NJ',
				'Nj'=>'Nj',
				'O'=>'OⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ',
				'OI'=>'Ƣ',
				'OO'=>'Ꝏ',
				'OU'=>'Ȣ',
				'P'=>'PⓅPṔṖƤⱣꝐꝒꝔ',
				'Q'=>'QⓆQꝖꝘɊ',
				'R'=>'RⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ',
				'S'=>'SⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ',
				'T'=>'TⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ',
				'TZ'=>'Ꜩ',
				'U'=>'UⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ',
				'V'=>'VⓋVṼṾƲꝞɅ',
				'VY'=>'Ꝡ',
				'W'=>'WⓌWẀẂŴẆẄẈⱲ',
				'X'=>'XⓍXẊẌ',
				'Y'=>'YⓎYỲÝŶỸȲẎŸỶỴƳɎỾ',
				'Z'=>'ZⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ',
				'a'=>'aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐ',
				'aa'=>'ꜳ',
				'ae'=>'æǽǣ',
				'ao'=>'ꜵ',
				'au'=>'ꜷ',
				'av'=>'ꜹꜻ',
				'ay'=>'ꜽ',
				'b'=>'bⓑbḃḅḇƀƃɓ',
				'c'=>'cⓒcćĉċčçḉƈȼꜿↄ',
				'd'=>'dⓓdḋďḍḑḓḏđƌɖɗꝺ',
				'dz'=>'dzdž',
				'e'=>'eⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇɛǝ',
				'f'=>'fⓕfḟƒꝼ',
				'g'=>'gⓖgǵĝḡğġǧģǥɠꞡᵹꝿ',
				'h'=>'hⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ',
				'hv'=>'ƕ',
				'i'=>'iⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı',
				'j'=>'jⓙjĵǰɉ',
				'k'=>'kⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ',
				'l'=>'lⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇ',
				'lj'=>'lj',
				'm'=>'mⓜmḿṁṃɱɯ',
				'n'=>'nⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥ',
				'nj'=>'nj',
				'o'=>'oⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿɔꝋꝍɵ',
				'oi'=>'ƣ',
				'ou'=>'ȣ',
				'oo'=>'ꝏ',
				'p'=>'pⓟpṕṗƥᵽꝑꝓꝕ',
				'q'=>'qⓠqɋꝗꝙ',
				'r'=>'rⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ',
				's'=>'sⓢsßśṥŝṡšṧṣṩșşȿꞩꞅẛ',
				't'=>'tⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ',
				'tz'=>'ꜩ',
				'u'=>'uⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ',
				'v'=>'vⓥvṽṿʋꝟʌ',
				'vy'=>'ꝡ',
				'w'=>'wⓦwẁẃŵẇẅẘẉⱳ',
				'x'=>'xⓧxẋẍ',
				'y'=>'yⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ',
				'z'=>'zⓩzźẑżžẓẕƶȥɀⱬꝣ'
			];
			foreach($diacriticMap as $kk=>$vv){
				$testRegex = str_replace($kk,"[$vv]",$testRegex);
			}
			/*print_r($testRegex);
			exit;*/
			$criteria['$or'][0]['email'] = new MongoRegex($_REQUEST['query'],'i');
			$criteria['$or'][1]['name'] = new MongoRegex($testRegex,'i');
			$criteria['$or'][2]['surname'] = new MongoRegex($testRegex,'i');
                  

Questo comando Docker cancella il file di log di un container in esecuzione (es. `photoprism`) reindirizzando un input vuoto (`:`) al percorso dei log ottenuto tramite `docker inspect`. È un metodo rapido per ridurre l'uso del disco senza fermare il container, ma va usato con cautela per non perdere log importanti.

                    : > $(docker inspect --format='{{.LogPath}}' photoprism)
                  

Questo comando termina forzatamente tutti i processi in esecuzione con un determinato nome—nel caso specifico `rsync`—utilizzando `kill -9` e `pidof`. È utile per fermare più istanze contemporaneamente, ma `-9` invia SIGKILL, che interrompe subito il processo senza possibilità di pulizia. Usare con cautela.

                    kill -9 $(pidof rsync)
                  

Questo comando utilizza `du` per calcolare l'uso del disco degli elementi nella directory corrente (senza ricorsione), mostrando le dimensioni in megabyte. Poi usa `sort` per ordinarli in ordine decrescente di dimensione. Utile per identificare cosa occupa più spazio.

                    du --max-depth=1 -h -BM | sort -hr
                  

Questo comando ispeziona un container Docker e filtra l'output con `grep` per mostrare l'etichetta `working_dir`. Ti indica la directory della macchina host da cui è stato avviato il container. Utile per il debugging con Docker Compose.

                    docker inspect nginxphpfpm | grep "com.docker.compose.project.working_dir"
                  

Questo script Bash automatizza il processo di creazione di una monorepo combinando più repository esistenti. Crea una directory principale, inizializza Git, clona ogni repo, sposta i contenuti in sottocartelle separate, rinomina i tag, unisce tutto nella monorepo mantenendo la cronologia Git e aggiorna un README con i link a ciascun repo integrato.

                    #!/bin/bash

# List of repository names (update with actual repository names)
repos=("repo-1" "repo-2" "repo-3" "repo-4" "repo-5" "repo-6" "repo-7" "repo-8" "repo-9" "repo-11" "repo-12" "repo-13" "repo-14" "repo-15" "repo-16" "repo-17" "repo-18" "repo-19" "repo-20" "repo-21" "repo-22" "repo-23" "repo-24" "repo-25" "repo-26" "repo-27")

# Step 1: Create the monorepo
mkdir monorepo
cd monorepo
git init

echo "# Monorepo" > README.md
echo -e "\n## Included Repositories\n" >> README.md
git add README.md
git commit -m "Initial commit with README.md structure"

cd ..
mkdir repos

# Step 2: Clone each repo, move files into its own folder, and rename tags
for reponame in "${repos[@]}"; do
    cd repos
    git clone https://github.com/yourgithubaccount/$reponame.git
    cd $reponame
    mkdir -p $reponame
    find . -maxdepth 1 ! -name .git ! -name . -exec mv {} $reponame/ \;
    git add .
    git commit -m "Moved repo content into folder $reponame"
    git tag -l | xargs -I {} git tag "$reponame-{}"
    cd ..
    cd ..
done

# Step 3: Add each repository as a remote, merge into the monorepo, and update README.md
cd monorepo
count=1
for reponame in "${repos[@]}"; do
    git remote add -f $reponame ../repos/$reponame
    git merge $reponame/master --allow-unrelated-histories --no-edit
    echo "$count. [$reponame](./$reponame)" >> README.md
    ((count++))
done

git add README.md
git commit -m "Updated README.md with links to merged repositories"