Obiekt iterujemy jak tablicę
Autor: jornathan
Javascript delay()
function delay(ms) { return new Promise(resolve => { setTimeout(resolve, ms); }); }
await delay(3000);
LoadData – import danych z csv do mysql
1. Excell zapisujemy w formacie .csv UTF-8
miniConda – installacaj i konfiguracja
https://repo.anaconda.com/miniconda/ – repozytorium pakietów miniconda
Miniconda3-latest-Windows-x86_64.exe
Anaconda Prompt
> conda list
Konfiguracja:
// Tworzy nowe środowisko od_zera_do_ai > conda create --name <od_zera_do_ai> python=3.11
// aktywuje środowisko od_zera_do_ai > conda activate <od_zera_do_ai>
// sprawdzamy jakie mamy środowiska i które jest aktywne (*) > conda env list
// Instalujemy aplikację jupyterlab i pakiety > conda install jupyterlab > conda install matplotlib > conda install seaborn > conda install plotly
// pakiet date-a-scientist nie jest obsługiwany przez miniconda, // instalujemy z poziomu pythona > pip install date-a-scientist
Przejście do katalogu roboczego projektu:
> cd C:\Users\john\Desktop\od_zera_do_ai
// Uruchamia aplikację webową jupyter lab > jupyter lab Odpali: https://localhost:8888/lab
Debouncing – opóźnienie wykonania funkcji
Przy wpisywaniu nazwy podczas wyszukiwania – opóźniamy wysłanie zapytania do momentu zakończenia wprowadzania tekstu – zwykle 400ms.
Definicja funkcji debounce w pliku – /js/common.js
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) function debounce(func, timeout = 400){ let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, args); }, timeout); }; }
Użycie debounce w kodzie js
// Zmieniono domyślne opóźnienie 400 na 500ms const debounceName = debounce((str) => liveSearchCompanyByName(str), 500); $("#fullname").on('keyup', function(){ var name_str = $(this).val().trim(); var name_len = name_str.length; if( name_len >= 3 ) { debounceName(name_str); } else{ clearNameResults(); } });
Obsługa wyszukiwania / filtrowania (url.searchParams)
// Uruchomienie debouncera z timeoutem 600ms // Jeśli jest fraza ustaw searchParam, jeśli nie usuń const debounceNumber = debounce( (s_number) => { if(s_number) { url.searchParams.delete('page'); url.searchParams.set('s_number', s_number); } else { url.searchParams.delete('s_number'); } location.href = url.toString(); }, 600); // wpisywanie w pole wyszukiwania (s_number) $("#s_number").on('keyup', function(){ debounceNumber( $(this).val() ); });
MariaDB instalacja najnowszej wersji
Instrukcja instalacji https://mariadb.org
Przeglądanie załączników
Mechanizm przeglądania w aplikacji plików graficznych i pdf
Export CSV
Exportuje dane z tabeli do pliku csv
Month Year Picker
Tworzymy 2 kontrolki z zakresem wyboru miesiąca i roku. Pierwsza kontrolka ustawia początek miesiąca druga koniec. Przy ustawieniu dwóch kontrolek automatycznie przeładowuje się strona.
total calculated – wyliczanie podrzędnych wartości
Wyliczanie wartości całkowitej ze wszystkich podrzędnych modeli.
Czytaj dalej total calculated – wyliczanie podrzędnych wartości
Label – display field
Utworzenie etykiety do złożonych list
Grant – Revoke
Przydzielanie, sprawdzanie i wycofywanie uprawnień
CREATE USER bob@'165.129.76.20' IDENTIFIED BY 'superpassword';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON myDb.* TO bob@'165.129.76.20'
SHOW GRANTS FOR bob@'165.129.76.20';
REVOKE ALL PRIVILEGES ON myDb.* FROM bob@'165.129.76.20';
get, find, list – parameters
get
$article = $articles->get($id, contain: ['Comments']);
Sortowanie, Limity
$this->paginate = [ 'limit' => 200, 'maxLimit' => 200, 'sortableFields' => [ 'date', 'netto', 'brutto', 'termin_platnosci', 'is_payed', 'Brands.name', 'Projects.number', 'numer', 'position', 'Companies.name', 'Companies.nip', 'Companies.bank_number', ], 'order' => ['CostInvoices.date' => 'DESC'] ];
Auth custom finder
Auth finder do akceptacji logowania
Różne: Tabela, wyszukiwanie Ajax,
Referer – redirect – queryParams
if($this->request->referer()) { return $this->redirect($this->request->referer()); } else { return $this->redirect(['action' => 'articles', '?' => $this->request->getQueryParams()]); }
get Table object
$project = $this->fetchTable("Projects")->get($id); // załaduj Model
URL
let url = new URL(location.href); $('#s_brand_id').on('change', function(){ var s_brand_id = $(this).val(); if(s_brand_id) { url.searchParams.set('s_brand_id', s_brand_id); } else { url.searchParams.delete('s_brand_id'); } location.href = url.toString(); });
$s_brand_id = (int) $this->request->getQuery('s_brand_id', null); if($s_brand_id) { $query->where(['brand_id' => $s_brand_id]); } $this->set(compact('s_brand_id'));
Authentication
$article->user_id = $this->request->getAttribute('identity')->getIdentifier(); $this->request->getAttribute('authentication');
Finder
Wywołanie findera
public function tags(...$tags) { $articles = $this->Articles->find('tagged', tags: $tags)->all(); }
Wirtualne pola
Pobranie największej/najwcześniejszej lub namniejszej/najpóźniejszej wartości
protected $_accessible = [ ...... 'schedule_first_date' => true, // Pierwsza data w harmonogramie 'schedule_last_date' => true, // Ostatnia data w harmonogramie ]; // Dla projektu pobiera ostatnią datę z harmonogramu (schedules - tablica powiązanych rekordów) protected function _getScheduleLastDate() { if (isset($this->_fields['schedule_last_date'])) { return $this->_fields['schedule_last_date']; } if (empty($this->schedules)) { return ; } $last_day = (new Collection($this->schedules))->max('date_to')->date_to; return $last_day; } // Dla projektu pobiera ostatnią datę z harmonogramu (schedules) protected function _getScheduleFirstDate() { if (isset($this->_fields['schedule_first_date'])) { return $this->_fields['schedule_first_date']; } if (empty($this->schedules)) { return ; } $first_fday = (new Collection($this->schedules))->min('date_from')->date_from; return $first_fday; }
Tabele z elementami podrzędnymi – pogrupowanymi
Tabela powinna posiadać parent_id
Controller / index
$query = $this->EventTypes->find()->find('threaded')->all(); $eventTypes = $this->paginate($query); $this->set(compact('eventTypes'));
Czytaj dalej Tabele z elementami podrzędnymi – pogrupowanymi
Listy opcji z grupowaniem
Table – def. Parents
$this->belongsTo('Parent', [ 'className' => 'EventTypes', 'foreignKey' => 'parent_id' ]);
Paginator
Controller – sortowanie po powiązanych modelach
$this->paginate = [ 'sortableFields' => [ 'Posts.title', 'Authors.name', ], ];
Połączenie z zewnętrzną bazą danych
Jeden z kontrolerów używa bazy danych na zdalnym serwerze
AJAX
Model obsługi Ajax
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
Umieszczanie tekstu w obrazku
CMD
# copy /b obrazek.jpg + piosenka.txt plik_wynikowy.jpg
Files – upload
Wgranie pliku na serwer
$project= $this->fetchTable("Projects")->get($id); // zamiast loadModel