Uruchomienie w konsoli:
streamlit run --server.headless=true <app.py>
Uruchomienie w konsoli:
streamlit run --server.headless=true <app.py>
W projekcie Next.js prawidłowy plik .gitignore może wyglądać następująco:
Czytaj dalej nextjs – plik .gitignore
Aby zintegrować bazę danych MySQL z aplikacją Next.js, musisz wykonać kilka kroków. Next.js działa w środowisku Node.js, więc możesz użyć popularnych bibliotek, takich jak mysql2 lub ORM-ów typu `Prisma` czy TypeORM. Poniżej opisuję dwa podejścia: prostsze (z mysql2) i bardziej zaawansowane (z Prisma).
Apache2 nie obsługuje natywnie Node.js, więc musisz zainstalować środowisko uruchomieniowe dla Next.js:
Silnik WKHTMLTOPDF: https://wkhtmltopdf.org/downloads.html
Plugin CakePDF: https://github.com/FriendsOfCake/CakePdf
Instalacja pakietu pod konkretną wersję pythona:
Domyślna wersja:
# python -V
Python 3.13.0
SELECT "Nazwa Firmy", "Płeć", "Imię", "Nazwisko", "Stanowisko", "Tel", "Email", "Komórka" UNION SELECT c.name, CASE cc.is_man WHEN 2 THEN "K" WHEN 1 THEN 'M' ELSE '-' END, cc.firstname, cc.lastname, IFNULL(cc.stanowisko, "-"), IFNULL(cc.tel, "-"), IFNULL(cc.email,"-"), IFNULL(cc.kom,"-") FROM company_contacts cc INNER JOIN companies c ON c.id = cc.company_id ORDER BY cc.company_id, cc.lastname, cc.firstname LIMIT 20 INTO OUTFILE '/tmp/company_contacts.csv' CHARACTER SET CP1250 FIELDS ENCLOSED BY "" TERMINATED BY ';' ESCAPED BY '\\' LINES TERMINATED BY '\n' ;
$products_table = $this->fetchTable("Products");
CMD as administrator # ipconfig/displaydns - wyświetli wszystkie odwiedzane strony # ipconfig/flushdns - kasuje wpisy
Obiekt iterujemy jak tablicę
function delay(ms) { return new Promise(resolve => { setTimeout(resolve, ms); }); }
await delay(3000);
1. Excell zapisujemy w formacie .csv UTF-8
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
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() ); });
Instrukcja instalacji https://mariadb.org
Mechanizm przeglądania w aplikacji plików graficznych i pdf
Exportuje dane z tabeli do pliku csv
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.
Wyliczanie wartości całkowitej ze wszystkich podrzędnych modeli.
Czytaj dalej total calculated – wyliczanie podrzędnych wartości
Utworzenie etykiety do złożonych list
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
$article = $articles->get($id, contain: ['Comments']);
$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 finder do akceptacji logowania
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'));
$article->user_id = $this->request->getAttribute('identity')->getIdentifier(); $this->request->getAttribute('authentication');
Wywołanie findera
public function tags(...$tags) { $articles = $this->Articles->find('tagged', tags: $tags)->all(); }
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; }
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
Table – def. Parents
$this->belongsTo('Parent', [
'className' => 'EventTypes',
'foreignKey' => 'parent_id'
]);