Wygasły podpisy repozytorium pakietów

Aktualizacja zwraca błąd:

# apt update

Err:6 https://packages.sury.org/php buster InRelease
The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>

Repozytorium pakietów Debiana sury.org zmieniło swój klucz podpisywania pakietów. Aby naprawić błąd, po prostu pobierz nowy klucz:

# apt-key adv --fetch-keys https://packages.sury.org/php/apt.gpg
# apt update && apt upgrade

AI – odnośniki

Gamma App – generowanie prezentacji – gamma.app

Wizard IO – aplikacje na telefon – app.wizard.io/prototypes

Hey Gen Labs – tłumacz

Grog – X (twiter)

Claude 2 – Anthropic

Gemini – Google

 

Skróty klawiszowe

Ctrl + Shift + WIN + Alt – Office

Win + Shift + R – Capture

Win + Shift + S – Capture

Win + Alt + R – Nagrywanie ekranu

Win + G – dostęp do nagrania – Widget / Galeria

Win + D – min/max

 

 

Dodaj / usuń pliki do stage’a

Dodaje wszystkie nienadzorowane pliki

# git add .                        // dodaje wszystko w katalogu
# git add -A                       // dodaje wszystko

Wycofuje ze stage’a wszystko – odwrotne działanie do powyższego

# git reset HEAD -- .

Wycofuje z nadzorowania pojedynczy plik / katalog

# git reset HEAD -- path/to/file

Formatowanie wartości finansowych

Entity – usuwanie spacji, zamiana przecinków na kropki

protected function _setNetto($netto) {
   $netto = str_replace(',', '.', $netto);
   return trim($netto);
}

protected function _setBrutto($brutto) {
   $brutto = str_replace(',', '.', $brutto);
   return trim($brutto);
}

Kontroler  – pobieranie sumy pozycji

$query = $this->Invoices->find();

$query->enableAutoFields()
      ->select([
          'total_netto'  => $query->func()->sum('Positions.netto'),
          'total_brutto' => $query->func()->sum('Positions.brutto'),
          'total_pos'    => $query->func()->count('Positions.id')
       ]);

$query->leftJoinWith('Positions');

$query->group(['Invoices.id']);

$query->order(['Invoices.id' => 'DESC'])
      ->all();

View /

<?= number_format($brutto, 2, ".", " ") ?>

Redis – Node – komunikat z serwera

Konfiguracja redis, redis-connect w node

const {createClient} = require("redis")

let redisClient = createClient({
    url: 'rediss://alice:alicePassword@redis.server:6379',
    logErrors:  true
  })

redisClient.connect().catch(console.error)
const RedisStore = require("connect-redis").default

let redisStore = new RedisStore({
    client: redisClient,
    prefix: "myapp:",
  })

Czytaj dalej Redis – Node – komunikat z serwera

Redis @list

Listy – tablice (indeksowane) ciągów znaków: help @list

# LPUSH users 'ala'  - wstawia na początku tablicy users osobę ala

# RPUSH users 'ola' - wstawia na końcu tablicy osobę ola

# LRANGE users 0 -1 - pobiera wszystkie elementy od indeksu 0 do końca tablicy (-1)

1) "ala"
2) "ola"

Czytaj dalej Redis @list

cakephp 4 – zamiana przecinków na kropki -automat

Wartości finansowe typu decimal(10, 2):

class InvoicePosition extends Entity
{
    protected function _setNetto($netto)
    {
        return str_replace(',', '.', $netto);         // zamienia przecinki na kropki w Invoices.netto
    }
}

Javascript – parseFloat nie akceptuje przecinka ’,’

netto = parseFloat( ($(this).val()).replace(',', '.') );

$("#netto").val( netto.toFixed(2) )

Czytaj dalej cakephp 4 – zamiana przecinków na kropki -automat

cakePHP – dociągnięcie modelu powiązanego

mmm

$quest = $this->Questionnaires->get($id, [
          'contain' => [
               'Answers', 
               'Creators' => function($q) {
                      return $q->select(['id', 'firstname', 'lastname']);
                }]
           ]);

// Dociągamy dodakowe modele dla uprawnionych
if($this->hasAccess()) {
    $this->Questionnaires->loadInto($quest, [
            'Projects' => function($q) { 
                              return $q->select(['id', 'manager_id']); 
                            }
             ]);
}

cakePHP – beforeSave

CompaniesTable,

$this == Companies, $this->Projects - powiązana tabela
use Cake\Event\EventInterface;
use Cake\Database\Expression\QueryExpression;

class CompaniesTable extends Table
{

public function beforeSave(EventInterface $event, $entity, $options)
{
  // zmienione pole manager_id
  if($entity->isDirty('manager_id')) {
      $entity->prev_manager_id = $entity->getOriginal('manager_id') ;  // pole przed zmianę

      // podstawienie innej kolumny, wyrażenia
      $set_prev_manager_id = new QueryExpression('prev_manager_id = manager_id');  

      $this->Projects->updateAll(
        [
          $set_prev_manager_id,
          'manager_id' => $entity->manager_id 
        ], 
        [
          'company_id' => $entity->id 
        ]
      );
  }
}

mysql – UPDATE xxxx INNER JOIN

Aktualizuje rekordy powiązane z inną tabelą

UPDATE projects p
 INNER JOIN companies c ON c.id=p.company_id
SET p.manager_id = c.manager_id
WHERE c.manager_id <> p.manager_id
 AND (p.prev_manager_id <> p.manager_id OR p.prev_manager_id IS NULL);
 AND c.manager_id = 1023;

JS – DATE

Znacznik czasu:

var start_date = $('#start-date').val();     // 2023-02-19
var end_date   = $('#end-date').val();       // 2023-02-20

const start_tz = Date.parse(start_date);    // 1686268800000 
const end_tz   = Date.parse(end_date);      // 1686182400000

if(end_tz < start_tz) {
   alert('Błędna data zakończenia. Popraw !!!');
   $('#end-date').val('');
}